From ad5163102ed763171b51dddccc39650bac47949f Mon Sep 17 00:00:00 2001 From: Refat Date: Wed, 22 Dec 2021 15:19:58 +0200 Subject: [PATCH 1/6] Added validation for domain name and test --- src/Resolution.ts | 37 ++++++++++++++++------------------- src/errors/resolutionError.ts | 3 +++ src/tests/Resolution.test.ts | 12 ++++++++++++ src/utils/isDomainValid.ts | 11 +++++++++++ 4 files changed, 43 insertions(+), 20 deletions(-) create mode 100644 src/utils/isDomainValid.ts diff --git a/src/Resolution.ts b/src/Resolution.ts index 56d103d3..7dbf70e9 100644 --- a/src/Resolution.ts +++ b/src/Resolution.ts @@ -26,6 +26,7 @@ import {findNamingServiceName, signedInfuraLink} from './utils'; import {Eip1993Factories as Eip1193Factories} from './utils/Eip1993Factories'; import {NamingService} from './NamingService'; import Networking from './utils/Networking'; +import {prepareDomain} from "./utils/isDomainValid"; /** * Blockchain domain Resolution library - Resolution. @@ -373,7 +374,7 @@ export default class Resolution { ticker: string, chain: string, ): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); const method = this.getNamingMethodOrThrow(domain); const recordKey = `crypto.${ticker.toUpperCase()}.version.${chain.toUpperCase()}.address`; @@ -388,7 +389,7 @@ export default class Resolution { * @returns A promise that resolves in a verified twitter handle */ async twitter(domain: string): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); const method = this.getNamingMethodOrThrow(domain); return method.twitter(domain); } @@ -419,7 +420,7 @@ export default class Resolution { * @throws [[ResolutionError]] */ async ipfsHash(domain: string): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); return this.getPreferableNewRecord( domain, 'dweb.ipfs.hash', @@ -432,7 +433,7 @@ export default class Resolution { * @param domain - domain name */ async httpUrl(domain: string): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); return this.getPreferableNewRecord( domain, 'browser.redirect_url', @@ -455,7 +456,7 @@ export default class Resolution { * @param domain - domain to look for */ async resolver(domain: string): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); const resolver = await this.getNamingMethodOrThrow(domain).resolver(domain); if (!resolver) { throw new ResolutionError(ResolutionErrorCode.UnspecifiedResolver, { @@ -470,7 +471,7 @@ export default class Resolution { * @returns An owner address of the domain */ async owner(domain: string): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); const method = this.getNamingMethodOrThrow(domain); return (await method.owner(domain)) || null; } @@ -481,7 +482,7 @@ export default class Resolution { * @returns A record value promise for a given record name */ async record(domain: string, recordKey: string): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); const method = this.getNamingMethodOrThrow(domain); return method.record(domain, recordKey); } @@ -492,7 +493,7 @@ export default class Resolution { * @returns A Promise with key-value mapping of domain records */ async records(domain: string, keys: string[]): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); const method = this.getNamingMethodOrThrow(domain); return method.records(domain, keys); } @@ -502,7 +503,7 @@ export default class Resolution { * @returns A Promise of whether or not the domain belongs to a wallet */ async isRegistered(domain: string): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); const method = this.getNamingMethodOrThrow(domain); return method.isRegistered(domain); } @@ -512,7 +513,7 @@ export default class Resolution { * @returns A Promise of whether or not the domain is available */ async isAvailable(domain: string): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); const method = this.getNamingMethodOrThrow(domain); return method.isAvailable(domain); } @@ -528,7 +529,7 @@ export default class Resolution { domain: string, options: NamehashOptions = NamehashOptionsDefault, ): string { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); return this.formatNamehash( this.getNamingMethodOrThrow(domain).namehash(domain), options, @@ -572,7 +573,7 @@ export default class Resolution { * @param hash - hash obtained from the blockchain */ isValidHash(domain: string, hash: string): boolean { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); return this.namehash(domain) === hash; } @@ -582,7 +583,7 @@ export default class Resolution { * @param domain - domain name to be checked */ async isSupportedDomain(domain: string): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); const namingMethod = this.getNamingMethod(domain); return namingMethod ? await namingMethod.isSupportedDomain(domain) : false; } @@ -592,7 +593,7 @@ export default class Resolution { * @param domain - domain name to look for */ serviceName(domain: string): ResolutionMethod { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); return this.getNamingMethodOrThrow(domain).serviceName(); } @@ -602,7 +603,7 @@ export default class Resolution { * @param domain - domain name */ async allRecords(domain: string): Promise { - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); return this.getNamingMethodOrThrow(domain).allRecords(domain); } @@ -619,7 +620,7 @@ export default class Resolution { async dns(domain: string, types: DnsRecordType[]): Promise { const dnsUtils = new DnsUtils(); - domain = this.prepareDomain(domain); + domain = prepareDomain(domain); const method = this.getNamingMethodOrThrow(domain); const dnsRecordKeys = this.getDnsRecordKeys(types); const blockchainData = await method.records(domain, dnsRecordKeys); @@ -743,10 +744,6 @@ export default class Resolution { return method; } - - private prepareDomain(domain: string): string { - return domain ? domain.trim().toLowerCase() : ''; - } } export {Resolution}; diff --git a/src/errors/resolutionError.ts b/src/errors/resolutionError.ts index 62dfe7fd..6ffd6ce4 100644 --- a/src/errors/resolutionError.ts +++ b/src/errors/resolutionError.ts @@ -32,6 +32,7 @@ export enum ResolutionErrorCode { ServiceProviderError = 'ServiceProviderError', InvalidTwitterVerification = 'InvalidTwitterVerification', InconsistentDomainArray = 'InconsistentDomainArray', + InvalidDomainAddress = 'InvalidDomainAddress', } /** @@ -86,6 +87,8 @@ const HandlersByCode = { `Failed to query tokenUri ${params.tokenUri}. Error: ${params.errorMessage}`, [ResolutionErrorCode.UnsupportedService]: (params: {namingService: string}) => `Naming service ${params.namingService} is not supported`, + [ResolutionErrorCode.InvalidDomainAddress]: (params: {domain: string}) => + `Domain address ${params.domain} is invalid`, }; /** diff --git a/src/tests/Resolution.test.ts b/src/tests/Resolution.test.ts index 491ca98e..afa7f166 100644 --- a/src/tests/Resolution.test.ts +++ b/src/tests/Resolution.test.ts @@ -46,6 +46,7 @@ import {Eip1993Factories as Eip1193Factories} from '../utils/Eip1993Factories'; import UnsConfig from '../config/uns-config.json'; import {NullAddress} from '../types'; import Networking from '../utils/Networking'; +import {prepareDomain} from "../utils/isDomainValid"; let resolution: Resolution; let uns: Uns; @@ -1634,5 +1635,16 @@ describe('Resolution', () => { ResolutionErrorCode.UnsupportedMethod, ); }); + + it('should throw exception for invalid domains', async () => { + await expectResolutionErrorCode( + () => prepareDomain('hello.blockchain@#'), + ResolutionErrorCode.InvalidDomainAddress, + ); + }); + + it('should convert domain name to lower case', async () => { + expect(prepareDomain(' HELLO.Blockchain ')).toEqual('hello.blockchain'); + }); }); }); diff --git a/src/utils/isDomainValid.ts b/src/utils/isDomainValid.ts new file mode 100644 index 00000000..2fe46155 --- /dev/null +++ b/src/utils/isDomainValid.ts @@ -0,0 +1,11 @@ +import ResolutionError, {ResolutionErrorCode} from "../errors/resolutionError"; + +export function prepareDomain(domain: string): string { + const retVal: string = domain ? domain.trim().toLowerCase() : ''; + if(!RegExp('^[.a-z\\d-]+$').test(retVal)){ + throw new ResolutionError(ResolutionErrorCode.InvalidDomainAddress, { + domain, + }); + } + return retVal; +} \ No newline at end of file From b120ed3eaa3b05f0e9c8c0fa283139746d6087e4 Mon Sep 17 00:00:00 2001 From: Refat Sherfedinov Date: Thu, 23 Dec 2021 19:56:16 +0200 Subject: [PATCH 2/6] Updated tests for domain validation --- src/Resolution.ts | 34 +++++++++---------- src/tests/Resolution.test.ts | 49 ++++++++++++++++++++++++---- src/tests/prepareAndValidate.test.ts | 28 ++++++++++++++++ src/utils/isDomainValid.ts | 11 ------- src/utils/prepareAndValidate.ts | 17 ++++++++++ 5 files changed, 104 insertions(+), 35 deletions(-) create mode 100644 src/tests/prepareAndValidate.test.ts delete mode 100644 src/utils/isDomainValid.ts create mode 100644 src/utils/prepareAndValidate.ts diff --git a/src/Resolution.ts b/src/Resolution.ts index 7dbf70e9..d73d366e 100644 --- a/src/Resolution.ts +++ b/src/Resolution.ts @@ -26,7 +26,7 @@ import {findNamingServiceName, signedInfuraLink} from './utils'; import {Eip1993Factories as Eip1193Factories} from './utils/Eip1993Factories'; import {NamingService} from './NamingService'; import Networking from './utils/Networking'; -import {prepareDomain} from "./utils/isDomainValid"; +import {prepareAndValidateDomain} from "./utils/prepareAndValidate"; /** * Blockchain domain Resolution library - Resolution. @@ -374,7 +374,7 @@ export default class Resolution { ticker: string, chain: string, ): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); const method = this.getNamingMethodOrThrow(domain); const recordKey = `crypto.${ticker.toUpperCase()}.version.${chain.toUpperCase()}.address`; @@ -389,7 +389,7 @@ export default class Resolution { * @returns A promise that resolves in a verified twitter handle */ async twitter(domain: string): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); const method = this.getNamingMethodOrThrow(domain); return method.twitter(domain); } @@ -420,7 +420,7 @@ export default class Resolution { * @throws [[ResolutionError]] */ async ipfsHash(domain: string): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); return this.getPreferableNewRecord( domain, 'dweb.ipfs.hash', @@ -433,7 +433,7 @@ export default class Resolution { * @param domain - domain name */ async httpUrl(domain: string): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); return this.getPreferableNewRecord( domain, 'browser.redirect_url', @@ -456,7 +456,7 @@ export default class Resolution { * @param domain - domain to look for */ async resolver(domain: string): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); const resolver = await this.getNamingMethodOrThrow(domain).resolver(domain); if (!resolver) { throw new ResolutionError(ResolutionErrorCode.UnspecifiedResolver, { @@ -471,7 +471,7 @@ export default class Resolution { * @returns An owner address of the domain */ async owner(domain: string): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); const method = this.getNamingMethodOrThrow(domain); return (await method.owner(domain)) || null; } @@ -482,7 +482,7 @@ export default class Resolution { * @returns A record value promise for a given record name */ async record(domain: string, recordKey: string): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); const method = this.getNamingMethodOrThrow(domain); return method.record(domain, recordKey); } @@ -493,7 +493,7 @@ export default class Resolution { * @returns A Promise with key-value mapping of domain records */ async records(domain: string, keys: string[]): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); const method = this.getNamingMethodOrThrow(domain); return method.records(domain, keys); } @@ -503,7 +503,7 @@ export default class Resolution { * @returns A Promise of whether or not the domain belongs to a wallet */ async isRegistered(domain: string): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); const method = this.getNamingMethodOrThrow(domain); return method.isRegistered(domain); } @@ -513,7 +513,7 @@ export default class Resolution { * @returns A Promise of whether or not the domain is available */ async isAvailable(domain: string): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); const method = this.getNamingMethodOrThrow(domain); return method.isAvailable(domain); } @@ -529,7 +529,7 @@ export default class Resolution { domain: string, options: NamehashOptions = NamehashOptionsDefault, ): string { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); return this.formatNamehash( this.getNamingMethodOrThrow(domain).namehash(domain), options, @@ -573,7 +573,7 @@ export default class Resolution { * @param hash - hash obtained from the blockchain */ isValidHash(domain: string, hash: string): boolean { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); return this.namehash(domain) === hash; } @@ -583,7 +583,7 @@ export default class Resolution { * @param domain - domain name to be checked */ async isSupportedDomain(domain: string): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); const namingMethod = this.getNamingMethod(domain); return namingMethod ? await namingMethod.isSupportedDomain(domain) : false; } @@ -593,7 +593,7 @@ export default class Resolution { * @param domain - domain name to look for */ serviceName(domain: string): ResolutionMethod { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); return this.getNamingMethodOrThrow(domain).serviceName(); } @@ -603,7 +603,7 @@ export default class Resolution { * @param domain - domain name */ async allRecords(domain: string): Promise { - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); return this.getNamingMethodOrThrow(domain).allRecords(domain); } @@ -620,7 +620,7 @@ export default class Resolution { async dns(domain: string, types: DnsRecordType[]): Promise { const dnsUtils = new DnsUtils(); - domain = prepareDomain(domain); + domain = prepareAndValidateDomain(domain); const method = this.getNamingMethodOrThrow(domain); const dnsRecordKeys = this.getDnsRecordKeys(types); const blockchainData = await method.records(domain, dnsRecordKeys); diff --git a/src/tests/Resolution.test.ts b/src/tests/Resolution.test.ts index afa7f166..f5ff286a 100644 --- a/src/tests/Resolution.test.ts +++ b/src/tests/Resolution.test.ts @@ -46,7 +46,6 @@ import {Eip1993Factories as Eip1193Factories} from '../utils/Eip1993Factories'; import UnsConfig from '../config/uns-config.json'; import {NullAddress} from '../types'; import Networking from '../utils/Networking'; -import {prepareDomain} from "../utils/isDomainValid"; let resolution: Resolution; let uns: Uns; @@ -1636,15 +1635,51 @@ describe('Resolution', () => { ); }); - it('should throw exception for invalid domains', async () => { + it('should check all methods for domain validation', async () => { await expectResolutionErrorCode( - () => prepareDomain('hello.blockchain@#'), + () => resolution.twitter('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => resolution.ipfsHash('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => resolution.httpUrl('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => resolution.resolver('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => resolution.owner('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => resolution.isRegistered('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => resolution.isAvailable('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => resolution.namehash('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => resolution.isSupportedDomain('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => resolution.serviceName('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => resolution.allRecords('hello#blockchain'), ResolutionErrorCode.InvalidDomainAddress, ); - }); - - it('should convert domain name to lower case', async () => { - expect(prepareDomain(' HELLO.Blockchain ')).toEqual('hello.blockchain'); }); }); }); diff --git a/src/tests/prepareAndValidate.test.ts b/src/tests/prepareAndValidate.test.ts new file mode 100644 index 00000000..0b9d7c2e --- /dev/null +++ b/src/tests/prepareAndValidate.test.ts @@ -0,0 +1,28 @@ +import {expectResolutionErrorCode} from "./helpers"; +import {prepareAndValidateDomain} from "../utils/prepareAndValidate"; +import {ResolutionErrorCode} from "../errors/resolutionError"; + +it('should throw exception for invalid domains', async () => { + await expectResolutionErrorCode( + () => prepareAndValidateDomain('hello.blockchain@#'), + ResolutionErrorCode.InvalidDomainAddress, + ); +}); + +it('should throw exception for invalid domains', async () => { + await expectResolutionErrorCode( + () => prepareAndValidateDomain('hello@.blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); +}); + +it('should throw exception for invalid domains', async () => { + await expectResolutionErrorCode( + () => prepareAndValidateDomain('hello$blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); +}); + +it('should convert domain name to lower case', async () => { + expect(prepareAndValidateDomain(' HELLO.Blockchain ')).toEqual('hello.blockchain'); +}); \ No newline at end of file diff --git a/src/utils/isDomainValid.ts b/src/utils/isDomainValid.ts deleted file mode 100644 index 2fe46155..00000000 --- a/src/utils/isDomainValid.ts +++ /dev/null @@ -1,11 +0,0 @@ -import ResolutionError, {ResolutionErrorCode} from "../errors/resolutionError"; - -export function prepareDomain(domain: string): string { - const retVal: string = domain ? domain.trim().toLowerCase() : ''; - if(!RegExp('^[.a-z\\d-]+$').test(retVal)){ - throw new ResolutionError(ResolutionErrorCode.InvalidDomainAddress, { - domain, - }); - } - return retVal; -} \ No newline at end of file diff --git a/src/utils/prepareAndValidate.ts b/src/utils/prepareAndValidate.ts new file mode 100644 index 00000000..c730a423 --- /dev/null +++ b/src/utils/prepareAndValidate.ts @@ -0,0 +1,17 @@ +import ResolutionError, {ResolutionErrorCode} from "../errors/resolutionError"; + +/** + * Checks domain name for special symbols and returns address in lowercase without spaces + * @throws Will throw an error if domain address contains special symbols + * @param domain - a domain address + */ +const reg = RegExp('^[.a-z\\d-]+$'); +export function prepareAndValidateDomain(domain: string): string { + const retVal: string = domain ? domain.trim().toLowerCase() : ''; + if(!reg.test(retVal)){ + throw new ResolutionError(ResolutionErrorCode.InvalidDomainAddress, { + domain, + }); + } + return retVal; +} \ No newline at end of file From 1978ce6d3e90f6820a4a9fabf3e8695f74cd0733 Mon Sep 17 00:00:00 2001 From: Refat Sherfedinov Date: Wed, 29 Dec 2021 14:41:19 +0200 Subject: [PATCH 3/6] Fixed regexp --- src/tests/prepareAndValidate.test.ts | 34 ++++++++++++++++------------ src/utils/prepareAndValidate.ts | 16 ++++++------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/tests/prepareAndValidate.test.ts b/src/tests/prepareAndValidate.test.ts index 0b9d7c2e..5b08c7f5 100644 --- a/src/tests/prepareAndValidate.test.ts +++ b/src/tests/prepareAndValidate.test.ts @@ -1,28 +1,34 @@ -import {expectResolutionErrorCode} from "./helpers"; -import {prepareAndValidateDomain} from "../utils/prepareAndValidate"; -import {ResolutionErrorCode} from "../errors/resolutionError"; +import {expectResolutionErrorCode} from './helpers'; +import {prepareAndValidateDomain} from '../utils/prepareAndValidate'; +import {ResolutionErrorCode} from '../errors/resolutionError'; it('should throw exception for invalid domains', async () => { await expectResolutionErrorCode( - () => prepareAndValidateDomain('hello.blockchain@#'), + () => prepareAndValidateDomain('#hello@.blockchain'), ResolutionErrorCode.InvalidDomainAddress, ); -}); - -it('should throw exception for invalid domains', async () => { await expectResolutionErrorCode( - () => prepareAndValidateDomain('hello@.blockchain'), + () => prepareAndValidateDomain('hello123#.blockchain'), ResolutionErrorCode.InvalidDomainAddress, ); -}); - -it('should throw exception for invalid domains', async () => { await expectResolutionErrorCode( - () => prepareAndValidateDomain('hello$blockchain'), + () => prepareAndValidateDomain('hello#blockchain'), + ResolutionErrorCode.InvalidDomainAddress, + ); + await expectResolutionErrorCode( + () => prepareAndValidateDomain('helloblockchain#'), ResolutionErrorCode.InvalidDomainAddress, ); }); it('should convert domain name to lower case', async () => { - expect(prepareAndValidateDomain(' HELLO.Blockchain ')).toEqual('hello.blockchain'); -}); \ No newline at end of file + expect(prepareAndValidateDomain(' HELLO.Blockchain ')).toEqual( + 'hello.blockchain', + ); + expect(prepareAndValidateDomain(' HELLO123.Blockchain ')).toEqual( + 'hello123.blockchain', + ); + expect(prepareAndValidateDomain(' HELLO1.Blockchain1 ')).toEqual( + 'hello1.blockchain1', + ); +}); diff --git a/src/utils/prepareAndValidate.ts b/src/utils/prepareAndValidate.ts index c730a423..e172eb9e 100644 --- a/src/utils/prepareAndValidate.ts +++ b/src/utils/prepareAndValidate.ts @@ -1,17 +1,17 @@ -import ResolutionError, {ResolutionErrorCode} from "../errors/resolutionError"; +import ResolutionError, {ResolutionErrorCode} from '../errors/resolutionError'; /** - * Checks domain name for special symbols and returns address in lowercase without spaces - * @throws Will throw an error if domain address contains special symbols - * @param domain - a domain address - */ -const reg = RegExp('^[.a-z\\d-]+$'); + * Checks domain name for special symbols and returns address in lowercase without spaces + * @throws Will throw an error if domain address contains special symbols + * @param domain - a domain address + */ +const reg = RegExp('^[.a-z0-9-]+$'); export function prepareAndValidateDomain(domain: string): string { const retVal: string = domain ? domain.trim().toLowerCase() : ''; - if(!reg.test(retVal)){ + if (!reg.test(retVal)) { throw new ResolutionError(ResolutionErrorCode.InvalidDomainAddress, { domain, }); } return retVal; -} \ No newline at end of file +} From 5c553b06c92776142a5500307683573fb2b6f8fc Mon Sep 17 00:00:00 2001 From: Refat Sherfedinov Date: Tue, 4 Jan 2022 16:08:49 +0200 Subject: [PATCH 4/6] Version changes --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52260168..377e2d83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 7.1.0 + +- Added regular expression check of domain name before preparing +- Changed method prepareDomain to prepareAndValidateDomain ## 7.0.0 - ENS support is completely removed diff --git a/package.json b/package.json index e11ee304..c46a7eaa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@unstoppabledomains/resolution", - "version": "7.0.2", + "version": "7.1.0", "description": "Domain Resolution for blockchain domains", "main": "./build/index.js", "directories": { From 8c8ce31f00b07992ef1a4bfc5858869533883b2d Mon Sep 17 00:00:00 2001 From: Kirill Beresnev Date: Tue, 4 Jan 2022 20:22:42 +0300 Subject: [PATCH 5/6] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 377e2d83..b9757456 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## 7.1.0 -- Added regular expression check of domain name before preparing -- Changed method prepareDomain to prepareAndValidateDomain +- Throw `ResolutionErrorCode.InvalidDomainAddress` error if domain contains special characters + - Domain name is being validated accordint to the following regular expression: `^[.a-z0-9-]+$` ## 7.0.0 - ENS support is completely removed From 30a7e3b1034babcbdf9148dca3b049f443e300d9 Mon Sep 17 00:00:00 2001 From: Kirill Beresnev Date: Tue, 4 Jan 2022 20:56:01 +0300 Subject: [PATCH 6/6] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9757456..915bb916 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## 7.1.0 - Throw `ResolutionErrorCode.InvalidDomainAddress` error if domain contains special characters - - Domain name is being validated accordint to the following regular expression: `^[.a-z0-9-]+$` + - Domain name is being validated according to the following regular expression: `^[.a-z0-9-]+$` ## 7.0.0 - ENS support is completely removed