diff --git a/lib/verifier/WellKnownDidVerifier.ts b/lib/verifier/WellKnownDidVerifier.ts index ea3f2f5..16be962 100644 --- a/lib/verifier/WellKnownDidVerifier.ts +++ b/lib/verifier/WellKnownDidVerifier.ts @@ -249,13 +249,17 @@ export class WellKnownDidVerifier { if (!descriptor.serviceEndpoint) return Promise.reject({ status: ValidationStatusEnum.INVALID, message: WDCErrors.PROPERTY_SERVICE_ENDPOINT_NOT_PRESENT_IN_SERVICE }) - // The object serviceEndpoint property can be a string and the value MUST be an origin string - if (new URL(descriptor.serviceEndpoint).origin !== descriptor.serviceEndpoint) - return Promise.reject({status: ValidationStatusEnum.INVALID, message: WDCErrors.PROPERTY_SERVICE_ENDPOINT_NOT_CONTAIN_VALID_ORIGIN}) - if (new URL(descriptor.serviceEndpoint).protocol !== 'https:') return Promise.reject({ - status: ValidationStatusEnum.INVALID, - message: WDCErrors.PROPERTY_ORIGIN_NOT_SECURE - }) + + if (typeof descriptor.serviceEndpoint === 'string') { + // The object serviceEndpoint property can be a string and the value MUST be an origin string + if (new URL(descriptor.serviceEndpoint).origin !== descriptor.serviceEndpoint) + return Promise.reject({ status: ValidationStatusEnum.INVALID, message: WDCErrors.PROPERTY_SERVICE_ENDPOINT_NOT_CONTAIN_VALID_ORIGIN }) + if (new URL(descriptor.serviceEndpoint).protocol !== 'https:') + return Promise.reject({ + status: ValidationStatusEnum.INVALID, + message: WDCErrors.PROPERTY_ORIGIN_NOT_SECURE + }) + } if (typeof descriptor.serviceEndpoint === 'object') { // The object serviceEndpoint property can be an object which MUST contain an origins property @@ -395,7 +399,14 @@ export class WellKnownDidVerifier { * @param descriptor The endpoint descriptor. */ private getOrigins(descriptor: ServiceEndpoint): Array { - return [descriptor.serviceEndpoint] + if (typeof descriptor.serviceEndpoint === 'string') { + return [descriptor.serviceEndpoint] + } else { + // This break with did-resolver@3 + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return descriptor.serviceEndpoint.origins; + } } } diff --git a/test/verifier.spec.ts b/test/verifier.spec.ts index 45a8c3e..8ec218a 100644 --- a/test/verifier.spec.ts +++ b/test/verifier.spec.ts @@ -125,6 +125,22 @@ describe('Domain Linkage Verifier', () => { expect(result.status).toEqual(ValidationStatusEnum.VALID); }); + it('should verify when serviceEndpoint is an object containing an array of origins', async () => { + nock(ORIGIN).get('/.well-known/did-configuration.json').times(1).reply(200, DID_CONFIGURATION); + + const endpointDescriptor: ServiceEndpoint = { + id: DID, + type: ServiceTypesEnum.LINKED_DOMAINS, + // This breaks the types in did-resolver@4 + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + serviceEndpoint: { origins: [ORIGIN] }, + }; + + const result = await verifier.verifyEndpointDescriptor({ descriptor: endpointDescriptor }); + expect(result.status).toEqual(ValidationStatusEnum.VALID); + }); + it('should verify when serviceEndpoint is of type IServiceEndpoint', async () => { nock(ORIGIN).get('/.well-known/did-configuration.json').times(1).reply(200, DID_CONFIGURATION);