Skip to content

Commit

Permalink
fix(aens): more accurate name check in isNameValid
Browse files Browse the repository at this point in the history
  • Loading branch information
davidyuk committed Jun 13, 2023
1 parent 01546ed commit b62dcc6
Show file tree
Hide file tree
Showing 2 changed files with 305 additions and 5 deletions.
45 changes: 40 additions & 5 deletions src/tx/builder/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,39 @@ export function oracleQueryId(
return encode(b2bHash, Encoding.OracleQueryId);
}

const AENS_SUFFIX = '.chain';

export function nameToPunycode(maybeName: string): AensName {
const [name, suffix, ...other] = maybeName.split('.');
if (other.length !== 0) throw new ArgumentError('aens name', 'including only one dot', maybeName);
if (suffix !== AENS_SUFFIX.slice(1)) {
throw new ArgumentError('aens name', `suffixed with ${AENS_SUFFIX}`, maybeName);
}
if (/\p{Emoji_Presentation}/u.test(name)) {
throw new ArgumentError('aens name', 'not containing emoji', maybeName);
}
let punycode;
try {
const u = new URL(`http://${name}.${suffix}`);
if (u.username + u.password + u.port + u.search + u.hash !== '' || u.pathname !== '/') {
throw new ArgumentError('aens name', 'valid', maybeName);
}
punycode = u.host;
} catch (error) {
if (error instanceof TypeError && error.message.includes('Invalid URL')) {
throw new ArgumentError('aens name', 'valid', maybeName);
}
throw error;
}
if (!/^[a-z0-9.-]+$/i.test(punycode)) {
throw new ArgumentError('aens name', 'without illegal chars', maybeName);
}
if (punycode.length > 63 + AENS_SUFFIX.length) {
throw new ArgumentError('aens name', 'not too long', maybeName);
}
return punycode as AensName;
}

/**
* Encode an AENS name
* @category AENS
Expand Down Expand Up @@ -100,16 +133,18 @@ export function readInt(buf: Buffer = Buffer.from([])): string {
return new BigNumber(Buffer.from(buf).toString('hex'), 16).toString(10);
}

const AENS_SUFFIX = '.chain';

/**
* Is AENS name valid
* @category AENS
* @param name - AENS name
*/
export function isNameValid(name: string): name is AensName {
// TODO: probably there are stronger requirements
return name.endsWith(AENS_SUFFIX);
export function isNameValid(maybeName: string): maybeName is AensName {
try {
nameToPunycode(maybeName);
return true;
} catch (error) {
return false;
}
}

const encodingToPointerKey = [
Expand Down
265 changes: 265 additions & 0 deletions test/unit/aens.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,265 @@
import { describe, it } from 'mocha';
import { expect } from 'chai';
import { nameToPunycode } from '../../src/tx/builder/helpers';

const tests = [{
unicodeAsHex: 'ED8CB62E636861696E',
punycode: 'xn--hb8b.chain',
}, {
unicodeAsHex: 'E8BFA9E4B993E99CA7EC9295F0988480F0A0AEB4F0A4AB8FF0ADAAA2F0AD97992E636861696E',
punycode: 'xn--ijqv21n7sef34cz41nd6lg9kod1p6k88i.chain',
}, {
unicodeAsHex: 'F0A2929F2E636861696E',
punycode: 'xn--et8i.chain',
}, {
unicodeAsHex: 'E49582EA95BAF0A19C8DF0AA9E96F0ADB981EBB195F0AB809FF0A39B932E636861696E',
punycode: 'xn--6moy67vslo8503abh7aun7jbrman70g.chain',
}, {
unicodeAsHex: 'F0A2808DE7A8A2E9B094F09782BBF0AEA784EC9191F0A683A3E78696EB8CA8F0ADB3B6E481A2E49686F0A483A9E5B992E891BC2E636861696E',
punycode: 'xn--jmn31letzutrtyjotp432bpu0buj6a3k44ay9mnmowcn43dj9uszekb.chain',
}, {
unicodeAsHex: 'F09796B7E39393EA93B7F0A2ABA2F0A8B4A9F0A5BDA3F0AB9681F0979383F0A3BD99F0A4A4A0F0AB889EEBA396F0AD9DBCE5B4AE2E636861696E',
punycode: 'xn--z6k806ify1cnvqyy8s0gb4652esh8awnsh24c1h9f5x3d6gj023j.chain',
}, {
unicodeAsHex: 'E7BC87E19782E18084F097BFA3EB8691F0988F9AF0AA9AB4ECA89BEC98A92E636861696E',
punycode: 'xn--rid350a5v8hyixbfsveiffz17abwgm422e.chain',
}, {
unicodeAsHex: 'F0A6A0AAEBB282F0A18BB6E3AD8BF0A3A986EC8CAAF0ABB6AD2E636861696E',
punycode: 'xn--bkmz887adgeoy60b0cmb3s5cmd3g.chain',
}, {
unicodeAsHex: 'F0928A8CE490AAF0A79781E8A3B4F0AC8FA3F0A7B5BDF0A18AA2F0909A89F0AB8E83ED9092F0A58EBE2E636861696E',
punycode: 'xn--6eou47okd9bpg0bmj3aob0zxiidb49bgtoro1knwpb.chain',
}, {
unicodeAsHex: 'F0ADB199E78181F0A5A69FED8CBCF0AE819A2E636861696E',
punycode: 'xn--omxo52sg0uowjwdsge.chain',
}, {
unicodeAsHex: 'E7889AF09798A6F0AA92A7F0A99086E98C8EE4A99F2E636861696E',
punycode: 'xn--lpp818gd4vd33q4y2k03ua.chain',
}, {
unicodeAsHex: 'F0AA93ADF0928DB8F0A4ADA2F0A2A2BCF09292B5EBA6A9EA9583E4958EF0A7A6A2E4A9A4F0AD9589F0A4B2B8F0A7B2B82E636861696E',
punycode: 'xn--jnoy3k6t8g1brt34jmtbn744fo61bescdz7nmdhz29jtn0f.chain',
}, {
unicodeAsHex: 'F0AD8AA9E88A95F0A7B0A0F0A7829AF0AA84A4E5B1B3E588B6F09D9BBEF0A889BCF096A0892E636861696E',
punycode: 'xn--oxa1131bwogwx3bs09ruzxl83qaiul7h1e5qxf.chain',
}, {
unicodeAsHex: 'EB99ABE791B2F0AE838BF0A19094F0A688ADF0A5BF9FE28492E5AF83F096AC9D2E636861696E',
punycode: 'xn--l-cf2b124efk4dn29jc43hv43d33d8557a.chain',
}, {
unicodeAsHex: 'E9BB87F09080A1E88581E592B8E9BEABF0A7BA9AEB9D81E18D99E6B6B1E98397F09794A7F0A7A89F2E636861696E',
punycode: 'xn--46d3854a9wpj2rd0rs9sxnbew1hfc7iwt2j25lvdila.chain',
}, {
unicodeAsHex: 'F097A4BC2E636861696E',
punycode: 'xn--tz2f.chain',
}, {
unicodeAsHex: 'E69E9BE981A0F0938297F0A483A72E636861696E',
punycode: 'xn--ftvn12gur0idw3j.chain',
}, {
unicodeAsHex: 'F0A88AA5EA9693E78B96E981A4F0A3A681F092929B2E636861696E',
punycode: 'xn--k5xm44d1qowe0jtlzmzy7c.chain',
}, {
unicodeAsHex: 'F0A78AA7F0A79D83E0B88C2E636861696E',
punycode: 'xn--d3c76742af5c.chain',
}, {
unicodeAsHex: 'EC82A6E2B5A5F0AE93972E636861696E',
punycode: 'xn--nnj7428b6xur.chain',
}, {
unicodeAsHex: 'F0A6B0B7F0A5BCBDE7A58DE1A98AE49EB1E3A390F0A68291E0B0B02E636861696E',
punycode: 'xn--rpc333e1zxkgniq2dyk70be7bp70b.chain',
}, {
unicodeAsHex: 'EBB9B0E59EA1F0A8A58CE897BC2E636861696E',
punycode: 'xn--khss29hyn9a7t61a.chain',
}, {
unicodeAsHex: 'E98D9FF0A2A89BE5B497F0ABB68EF0A4B798F0A292802E636861696E',
punycode: 'xn--imt167j7q5u7xeb73crcxj.chain',
}, {
unicodeAsHex: 'E5B5BAE9A087E88DB8E886BAF0ABAC87E59999F0A2ABB02E636861696E',
punycode: 'xn--66rt9np16a7pb359bd194cm1yg.chain',
}, {
unicodeAsHex: 'E597822E636861696E',
punycode: 'xn--v2r.chain',
}, {
unicodeAsHex: 'E4A493F0A49D95F0978982F0A0B195F0AD8F84E0AAB9E1B688F0A7BDA92E636861696E',
punycode: 'xn--1ec447goz5a0o2uz8ufh8xclbzd690g.chain',
}, {
unicodeAsHex: 'F0ACB0B7F0A89BB1F0A6B08BF0AA99AAE2BCA2E58D96F0AE9680F0ABBA9FF0A388B5F0ADB5A6F0AC8E89F0A298B2F0AEA5B5E4A3A82E636861696E',
punycode: 'xn--vept0yeref257cjtmad15fgmvbwv0cus4bqjkeixpe1cj9vmvm.chain',
}, {
unicodeAsHex: 'E5AC9BF0AA9684F0A9BC9AF0A18C85F0A3B38FF0A5AD9BF0AB87A3F0A2A184F096AC9AF0ABBF82F0A6B3A5E59F9CE1938EED9A8DEFB88EF0AE80862E636861696E',
punycode: 'xn--sie5445ahbczu3qwhxggt9h2c5abm8a4p7c6wubmo5h7cqapy0bqu3bef3g.chain',
}, {
unicodeAsHex: 'F09F88A4F0A2849BF0A7BEA0E99E98F0ABAEB9E7A186E3B2A6F0A783972E636861696E',
punycode: 'xn--7tm371fvpvlg0ajg52bk8gd5vvavs0i.chain',
}, {
unicodeAsHex: 'F0988FB3F0A08AAE2E636861696E',
punycode: 'xn--674f860s.chain',
}, {
unicodeAsHex: 'E6898BE89E85E7B195F0AD93AFE0BA8AE3B9ABF09294BBF0A29BB4E3A1AF2E636861696E',
punycode: 'xn--y6c465sk0dty5bkh1a79n5o4xq4zp1hrk.chain',
}, {
unicodeAsHex: 'F0AB8D8BF0A1B0B0F0A2B7ACF09886A2F09B89AEF0A296BCF0AB89B0F0A8A987EB9288F0AE888BF0A1A1AAF0A5A4A3EA9E842E636861696E',
punycode: 'xn--w58at0wru4nx1qb0twgrze4nt9np6x5ghy0efl3d6ecr99v.chain',
}, {
unicodeAsHex: 'EBA497F0AD8584E58299F097A793F0A8B7AA2E636861696E',
punycode: 'xn--4zq706wg3ygv1ojcnoc.chain',
}, {
unicodeAsHex: 'E68B9FF0ACAFA7F0A693BCF0A5B89FF0A2ABA4E396A1F0A9A5BAE4ADB7E18D99E789BDF0AB8EB3F0A5B9BAE9BFA8F0A7AFA7F0ADA79A2E636861696E',
punycode: 'xn--46d566of5o0mvikrhj6dc278aywvctxa298bfp3dvf3dri9cf28c1z0b.chain',
}, {
unicodeAsHex: 'F0AC8791F0909B9FF0A4AB8D2E636861696E',
punycode: 'xn--c38cm246crvwc.chain',
}, {
unicodeAsHex: 'ECAC81F0A28186E5809CEB8CBFF09D9190F0978D83F0A2A790F09082BBF0A7A2BAF0ABABAEF0AD9FBFF0A1B1A32E636861696E',
punycode: 'xn--c-uj7am951ab4ta7r3djv5hio5jjrgc8wbm4psg1fh5yc.chain',
}, {
unicodeAsHex: 'F0A398B8F0A1A7BCF0988CA7F0AB9F94E38ABAEA8D93E8BBBBF0A69BA4F0A6A895F0AB9A902E636861696E',
punycode: 'xn--45-rl3gl80ewz9wmevgukpbgn3ed9f950sw5c.chain',
}, {
unicodeAsHex: 'E0A88AF09D90B0F09D989B2E636861696E',
punycode: 'xn--wt-l8f.chain',
}, {
unicodeAsHex: 'F0A284B2E5B4B9F0A69CABEB9B9FECB2ACF0A0AB9DF0938098F0A79A87F0A485ACF0A28592F0A5B1852E636861696E',
punycode: 'xn--hnt499rnxn224gyu2k781atgaz84vnr9b70wa5o1b.chain',
}, {
unicodeAsHex: 'F0AA8EA8F0A4BE96F0A2A986E38D9AE39AAFF097AEBDF0ABB49CF0AB85B8F0A3BD88E8A89A2E636861696E',
punycode: 'xn--2-xww653sthv8q6wr3whzz4a5i1ahe2nq42at00a.chain',
}, {
unicodeAsHex: 'F0A997BEE4B286F0AEA0B3F0A2AA8BF0A1A4B82E636861696E',
punycode: 'xn--c5pz543ie4kavm5hq5wd.chain',
}, {
unicodeAsHex: 'E494A6E39884E79D92E69DBBF0A0AEA4F0A1BFBDEC89B0EAA1ABE4A5A9F0A69AB0F0A8BEB7EBB69AE8B58EF0908E9C2E636861696E',
punycode: 'xn--pglz34bt9c0v3bjtq4e4afx3buo9ajdj8k8nb75z79sbucymhbqe.chain',
}, {
unicodeAsHex: 'F098A0ACE18B9DE49582E7A8BBE7AF8AF0938180EFA995F0ACA3A6F0A3A181F0AA988D2E636861696E',
punycode: 'xn--l3d619wnh7a9hau0dx304cqvuernsm1r6g22sc.chain',
}, {
unicodeAsHex: 'F0ADAEA5F097BAB7F096AC93F0AA8A8AF0A1A985ED829BE58B84E99DB8F0A38E93E4B285F0A2A5A8E48688F09783B8EB83882E636861696E',
punycode: 'xn--xunu90ab3ec93f1p0ar53b174pc4jay83a0c93a818aorzabq51ascwf.chain',
}, {
unicodeAsHex: 'F0AEA898F0A084B7F0A2978FF0A985A5E8818FE3AC8FE6ACA6E68AA0EB9993F09B899BF0A3AF93E1B09D2E636861696E',
punycode: 'xn--80f123khe1ameh2r1avz1e9x0ti3le62wcq91bty2mgpoi.chain',
}, {
unicodeAsHex: 'ED8E8BE9AC88F0A9B98BE39B812E636861696E',
punycode: 'xn--3llx56z9o9a0q61a.chain',
}, {
unicodeAsHex: 'F0A79C95E189A4E7A396F0A7A685E8B196F0A5BCA8F0A1AC80F0A5B48DF0A791A9F0ADA4A8E484862E636861696E',
punycode: 'xn--4zd099ux88askqzt96by2uc0cdz79cy9em2g2t12a.chain',
}, {
unicodeAsHex: 'CFA5F0A384A2F0A39FB7F09B889B2E636861696E',
punycode: 'xn--3ya2831tlwxc5yf.chain',
}, {
unicodeAsHex: 'F0A2BBA8E494BCE5BAB8F09BB09EF0A1BB872E636861696E',
punycode: 'xn--0mo256d2j1wsq0c03qa.chain',
}, {
unicodeAsHex: 'F0AEA2B3F096A7B5F0ACA2AFED8D8AF0938F96F0A0B6A0E69180F096A3A8F0A68594F0A9AEB4E597AFE7A89FF0A1B2892E636861696E',
punycode: 'xn--53rz64a75qzq5f44yectwcysb8v15dwb2aw07lygof21ueg8ud.chain',
}, {
unicodeAsHex: 'F0A485B7E78CACF0A9AB89F0AE9CA4F09099BEF0A4A5A7E5A3872E636861696E',
punycode: 'xn--yps172dwi8hfkvlmkiar76joy1e.chain',
}, {
unicodeAsHex: 'F0ADA9B42E636861696E',
punycode: 'xn--dt6m.chain',
}, {
unicodeAsHex: 'F0A6BF93E1AF84C7AEEA9286F0979BACE88CB2E199A1F0AAB0A8F0A09AB92E636861696E',
punycode: 'xn--rka285hf2dd09j328ar29txmoh0yng0qne.chain',
}, {
unicodeAsHex: 'F0A89EA82E636861696E',
punycode: 'xn--ri9k.chain',
}, {
unicodeAsHex: 'F096A89BE8B0A8E5BE87E7989AF0AAAABCE285A8F0ADA6B0F0AD9997EB8183F09494B4F0A5899FE9A8AB2E636861696E',
punycode: 'xn--ix-gu3dq93fsgzburgl9ah92ubonc1n9zlergnm5dkdj.chain',
}, {
unicodeAsHex: 'F0ADBDBDF09F889FF0AA88BC2E636861696E',
punycode: 'xn--efv6858jbojb.chain',
}, {
unicodeAsHex: 'F0938E94F0A0959B2E636861696E',
punycode: 'xn--cg8dg496a.chain',
}, {
unicodeAsHex: 'F0AD81A6E3B9BEE382BAE9A7A7E4A091F0A6A881F0AC8BA82E636861696E',
punycode: 'xn--0ck072beohjo9f568ztqsdwzta.chain',
}, {
unicodeAsHex: 'F0A6AAB3F0AC9E9EE49F9BF0A28FBEF0A89290F0928DBB2E636861696E',
punycode: 'xn--65o2537cu2wgwd7b690axc8f.chain',
}, {
unicodeAsHex: 'F0ABA6A7E79C84ED8F8CED91BFE9B0842E636861696E',
punycode: 'xn--40y620f8h2bquad239p.chain',
}, {
unicodeAsHex: 'F0AD99A2ED9CADEC9DB4E4AF9CF0AEA792F0A4A283F0949789F0A08986E5B9B4F0A1B38BEA9D822E636861696E',
punycode: 'xn--h0p266bwh7c050a8oqiw5mvz9k2lqb3h4e0q4o8xpb.chain',
}, {
unicodeAsHex: 'F0A3A8A5F0ACA4ACF0A996AAE39A82F0A3BE88E7A3B7E39B90EA80A2E8B8B7F0A19198F0A2A292E1A8A9F0A3AABF2E636861696E',
punycode: 'xn--ymf013kyga923vghwalqwir85ct27ayb7aijb171a735ww65e.chain',
}, {
unicodeAsHex: 'E69096F0ADA998ED8988F0A1AC8BE9A7B3F0A780BDE9A6A4F0AB998BF0A0B88EF0908EBB2E636861696E',
punycode: 'xn--o2u150j0ga537rrxvc263t68sagz9mw09eyl3c.chain',
}, {
unicodeAsHex: 'EBB2A8E9ADAEF0A3AB8AF09B8B99E9B193EBA5B4F09D92A9E9B184F0909BA82E636861696E',
punycode: 'xn--n-o08d8vzbv60tr9d071n5pxm2xxi.chain',
}, {
unicodeAsHex: 'E1A888F0A09CB4F0A7A5ACEC959BF0A899BBF0AEA9A6F0A6ACBBF0A3BBB72E636861696E',
punycode: 'xn--0lf0680fi1vjqvsb3i5b01rw2uww6p.chain',
}, {
unicodeAsHex: 'F09884A8F0A4B19BF0A6B2B6F0A9A8ACF0A399A32E636861696E',
punycode: 'xn--rn4fh701ab1nws3aur1c.chain',
}, {
unicodeAsHex: 'F097819EED87A1F0ABB1982E636861696E',
punycode: 'xn--q07b3110ate2j.chain',
}, {
unicodeAsHex: 'E8B694F0A5B8B5E88892F0A6A28DE48192F0A0B289F0A6A394F0A2BBB9F0A89B94F0938586ED87B7F0A4A790EAB796ECB3A5F0A6A5A82E636861696E',
punycode: 'xn--2ln748orhh3p6a4p6aqmg1t4p6t4o808bhdwcy45b66zap0an3d314r.chain',
}, {
unicodeAsHex: 'F0A18699F0A2B4B0F0ADAE91E597ADE993BFE9A990F0A59C87F0A581A8E9B59FF0AB91B1F0A9BFB2E2B7962E636861696E',
punycode: 'xn--vqj359j745btpe4lel755evmjb546c3pmr65obexb4d2f.chain',
}, {
unicodeAsHex: 'F097BCA9F09B8A92EC9299F098A3BBE59C8FF0A0B1B0E7A997F0AD83942E636861696E',
punycode: 'xn--edsy43fn34cj71igjkfz4dkq0hyl3n.chain',
}, {
unicodeAsHex: 'E7A2B4F09083B2F0AD8194F0A99CB7F0978E89E4AA93F0A3B5BC2E636861696E',
punycode: 'xn--2qp873ito9fu16dv9vj2r5dgtrd.chain',
}, {
unicodeAsHex: 'F0ABBDABF0988D9E2E636861696E',
punycode: 'xn--x34f2333c.chain',
}, {
unicodeAsHex: 'F0A78792F0AEABB2F0A2B4952E636861696E',
punycode: 'xn--9k0jz31i361e.chain',
}, {
unicodeAsHex: 'F0A5948CF0A7A693F09188ABE6B48CF091B198EA9CADF09784ACF0A6A689F0A99887E5978DF0AD94B0F0A4BBA9E8BBBE2E636861696E',
punycode: 'xn--62rv45c55xrhu2s2jv0mi83l5yzp1slaz23ck4xbtm9dxu1i.chain',
}, {
unicodeAsHex: 'E98680F0A5809CE78F9EE4AAB1EC9CA8E99895E98E85F0A38287E9B9A6F0A08ABAF0A99E9D2E636861696E',
punycode: 'xn--xrps71hhxtf0byze92qzq3equ83a7eyc381cin2i.chain',
}, {
unicodeAsHex: 'E69382F0AA96A3E8AC86E9B385F0AC8980F0918A942E636861696E',
punycode: 'xn--l7ut56fo0l0f5imfzs149a.chain',
}, {
unicodeAsHex: 'F0A090B2ECBD86F0A693B5F0ACAC93F0A681BEF096A88FF0AB8E9CF0A590B0EC849D2E636861696E',
punycode: 'xn--3i4bz2xpi5jt3sfru9c7opuehmm4ouevb.chain',
}, {
unicodeAsHex: 'E284B1F0A9A6B3F0A2B5A3F0A888B7E4B0962E636861696E',
punycode: 'xn--f-0u5ao515m35kc2sya.chain',
}, {
unicodeAsHex: 'F0AAAA83E8BCA0F0A98C83F0989EA7F0938DB82E636861696E',
punycode: 'xn--h23a8943ah16bfrtmntya.chain',
}, {
unicodeAsHex: 'E5B2B6E38B99E68E9BF0A28B8AF0A1B7A2E9AA8BE782ABE4B1B2F0A1BFA9F0AAB2B4F0A5A69CF09288A9E68BAF2E636861696E',
punycode: 'xn--tck284f4ele1fsyaj78c850evzwmppornierpj261p9zsj.chain',
}, {
unicodeAsHex: 'F0AA94B5E3A5B1F0A8938DF0A58599F0A98397E9A0A4F0909D84F0A7B283E18980F0ADAC83E6AFBDEA82AA2E636861696E',
punycode: 'xn--3yd971rgu7az5yb15ixh9mf4wu1fkctupvm2au20c06wi.chain',
}, {
unicodeAsHex: 'F0ADAABDF0AFA082F0A0A6A9F0ACAD9AF0A6BBB52E636861696E',
punycode: 'xn--ziq9329h0r9bgixdwcqa.chain',
}, {
unicodeAsHex: 'F09B829EEB89882E636861696E',
punycode: 'xn--mf1bz639b.chain',
}];

describe('AENS utils', () => {
describe('nameToPunycode', () => {
it('encodes', () => {
tests.forEach(({ unicodeAsHex, punycode }) => {
const name = Buffer.from(unicodeAsHex, 'hex').toString();
expect(nameToPunycode(name)).to.be.equal(punycode);
});
});
});
});

0 comments on commit b62dcc6

Please sign in to comment.