UNPKG

@identity.com/dsr

Version:

The Dynamic Scope Request (DSR) javascript library provides capability around securely requesting credential information between an ID Requester and an ID Holder

382 lines (288 loc) 19.7 kB
const fs = require('fs'); const Resolver = require('../../../src/resolver/Resolver'); const {ScopeRequest} = require('../../../src/ScopeRequest'); const {schemaLoader, CVCSchemaLoader} = require('@identity.com/credential-commons'); const config = { partner: { id: 'TestPartnerId', signingKeys: { xpub: '04378df3e480e626541daec66c4bbad532430d28e1ecb6b70a03313fc07fbad5c0d8b26410eac8f0b1a448898cbed9d714fd9cab2a8d1a7885bfbb48bd673da03c', xprv: 'f728fed0153f3b46a0fccdd9ed9954ad56fd4e8af016fe59075655aa9feb9a59', }, }, app: { id: 'TestPartnerApp', name: 'TestPartnerApp', logo: 'https://s-media-cache-ak0.pinimg.com/originals.png', description: 'TestPartnerApp', primaryColor: 'A80B00', secondaryColor: 'FFFFFF', }, channels: { eventsURL: 'https://localhost/sr/events', payloadURL: 'https://localhost/sr/payload', }, }; describe('DSR Filtering and Constraints Tests', () => { beforeAll(() => { schemaLoader.addLoader(new CVCSchemaLoader()); }); it('Shoud know how to convert', () => { const resolver = new Resolver(); expect(resolver.convertMongoOperatorToJavascript('$gt')).toBe('>'); expect(resolver.convertMongoOperatorToJavascript('$gte')).toBe('>='); expect(resolver.convertMongoOperatorToJavascript('$lt')).toBe('<'); expect(resolver.convertMongoOperatorToJavascript('$lte')).toBe('<='); }); it('Should return two cities from an DSR requesting all VC that contains address.city', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestCitySimple.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/address1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/address2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(2); }); it('Should read an simple DSR that contains an constraint for VCs that contains city', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestCityOneConstraint.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/address1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/address2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); }); it('Should read an simple DSR that contains multiple constraint for VCs that contains city', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestCityMultipleConstraint.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/address1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/address2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); }); it('Should read an simple DSR that contains a global identifier for claim of an aka for firstName', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestFirstNameAka.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/address1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/genericId1.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); }); it('Should read an simple DSR that contains a global identifier for claim of without aka', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestFirstNameWithoutAka.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/address1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/genericId1.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); }); it('Should read an simple DSR that contains a global identifier for claim of without aka returning more than one', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestFirstNameInDocument.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/genericId1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/genericId2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/genericId3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(3); }); it('Should read an simple DSR with a wrongly created global identifier and return nothing', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestWrongGlobalIdentifier.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/genericId1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/genericId2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/genericId3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(0); }); it('Should read an simple DSR with a Identity:name request and return one credential', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestIdentityName.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/genericId1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/address1.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); }); it('Should read an simple DSR with a Identity:name and a constraint request and return one credential', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestIdentityNameOneConstraint.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/genericId1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/genericId2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/genericId3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); const vc = filtered.credentials[0]; expect(vc.claim.document.name.givenNames).toBe('JRbSLu3809'); }); it('Should filter out credentials that have the same issuer as the DSR constraint', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestMetaIssuer.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/identity2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/identity3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); const vc = filtered.credentials[0]; expect(vc.issuer).toBe('jest:test:2d516330-d2cc-11e8-b214-99085237d65e'); }); it('Should filter out credentials that have the issued date greater than the DSR constraint', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestMetaIssued.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/identity2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/identity3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(3); }); it('Should filter out credentials that have the expiry date lesser than the DSR constraint', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestMetaIssued.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/identity2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/identity3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(3); }); it('Should filter out credentials with a complete meta constraint', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestMetaComplete.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/identity2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/identity3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); const vc = filtered.credentials[0]; expect(vc.issuer).toBe('jest:test:2d516330-d2cc-11e8-b214-99085237d65e'); }); it('Should not give any errors on filtering an empty array of credential items', async () => { const dsr = await ScopeRequest.create('abcd', [], config.channels, config.app, config.partner); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(dsr, []); expect(filtered.credentials.length).toBe(0); }); it('Should not give any errors on filtering DSR with only aggregate tags', async () => { const dsr = await ScopeRequest.create('abcd', [ { identifier: 'credential-cvc:Covid19-v1', aggregate: [ { $limit: 3, }, ], }], config.channels, config.app, config.partner); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(dsr, []); expect(filtered.credentials.length).toBe(0); }); it('Should filter only by constraints tag and ignore the aggregate tag', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/aggregation/dsrAggregationLimit.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/identity2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/identity3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); const vc = filtered.credentials[0]; expect(vc.issuer).toBe('jest:test:2d516330-d2cc-11e8-b214-99085237d65e'); }); it('Should filter out credentials that have the expiry date lesser than the DSR constraint by using simple mode', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestMetaIssuedSimpleMode.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/identity1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/identity2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/identity3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(3); }); it('Should read an simple DSR with a Identity:name and a constraint request and return one credential with Simple Mode', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestIdentityNameOneConstraintSimpleMode.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/genericId1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/genericId2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/genericId3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); const vc = filtered.credentials[0]; expect(vc.claim.document.name.givenNames).toBe('JRbSLu3809'); }); it('Should read an simple DSR that contains a global identifier for claim filtering by simple mode', async () => { const unresolvedFileContents = fs.readFileSync('test/fixtures/filtering/requestFirstNameInDocumentSimpleMode.json', 'utf8'); const unresolvedRequest = JSON.parse(unresolvedFileContents); const credential1FileContent = fs.readFileSync('test/fixtures/filtering/genericId1.json', 'utf8'); const credential1 = JSON.parse(credential1FileContent); const credential2FileContent = fs.readFileSync('test/fixtures/filtering/genericId2.json', 'utf8'); const credential2 = JSON.parse(credential2FileContent); const credential3FileContent = fs.readFileSync('test/fixtures/filtering/genericId3.json', 'utf8'); const credential3 = JSON.parse(credential3FileContent); const resolver = new Resolver(); const filtered = await resolver.filterCredentials(unresolvedRequest, [credential1, credential2, credential3]); expect(filtered.credentials.length).toBe(1); }); });