From c808b1dd4a0d724bcc03063269ce824ca90dc4d0 Mon Sep 17 00:00:00 2001 From: Bill Barman Date: Thu, 22 Nov 2018 19:21:13 +0800 Subject: [PATCH] add circular checks in resolver --- src/utils/DIDResolved.ts | 14 ++++++++++++++ src/utils/DIDResolver.ts | 13 ++++++++++++- test/keeper/DIDResolver.test.ts | 13 +++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/utils/DIDResolved.ts b/src/utils/DIDResolved.ts index 859ddac..7c6b0db 100644 --- a/src/utils/DIDResolved.ts +++ b/src/utils/DIDResolved.ts @@ -43,6 +43,11 @@ export default class DIDResolved { return item && item.valueType === "DDO" } + public isDID(): boolean { + const item = this.getLastItem() + return item && (item.valueType === "DID" || item.valueType === "DIDRef") + } + public getValue(): string { const item = this.getLastItem() let result: string = null @@ -55,4 +60,13 @@ export default class DIDResolved { } return result } + + public isDIDIdVisited(didId: string): boolean { + for ( let item of this.items) { + if ( item.didId === didId ) { + return true + } + } + return false + } } diff --git a/src/utils/DIDResolver.ts b/src/utils/DIDResolver.ts index 3734c4d..f120ea3 100644 --- a/src/utils/DIDResolver.ts +++ b/src/utils/DIDResolver.ts @@ -30,14 +30,22 @@ export default class DIDResolver { } public async resolve(did: string, maxHopCount?: number): Promise { - + maxHopCount = maxHopCount ? maxHopCount : 0 let didId = DIDTools.didToId(did) const resolved = new DIDResolved() + let data: DIDRecord = await this.getDID(didId) while ( data && (maxHopCount === 0 || resolved.hopCount() < maxHopCount) ) { + // need to search after the result + if ( resolved.isDIDIdVisited(data.didId) ) { + // error circular ref + // TODO: raise an error + break + } resolved.addData(data) + didId = null if (data.valueType === "URL" || data.valueType === "DDO" ) { data = null @@ -57,6 +65,9 @@ export default class DIDResolver { if ( didId ) { data = await this.getDID(didId) } + else { + data = null + } } } return resolved diff --git a/test/keeper/DIDResolver.test.ts b/test/keeper/DIDResolver.test.ts index 5013b30..dd3a6f4 100644 --- a/test/keeper/DIDResolver.test.ts +++ b/test/keeper/DIDResolver.test.ts @@ -82,9 +82,22 @@ describe("DIDResolver", () => { assert(didResolved) assert(didResolved.isURL()) assert(didResolved.getValue() === testURL) + + // test circular link + const didIdFirst = DIDTools.didToId(didList[0]) + + const receiptLastCircular = await didRegistry.registerAttribute(didIdLast, ValueType.DID, providerKey, + didIdFirst, ownerAccount.getId()) + assert(receiptLastCircular) + + // resolve from the first DID in the chain + const didResolvedCircular = await didResolver.resolve(didList[0]) + assert(didResolvedCircular) + assert(didResolvedCircular.isDID()) }) + }) })