Skip to content

Commit

Permalink
Merge pull request #46 from identity-com/feature/CIV-3462_updated_cre…
Browse files Browse the repository at this point in the history
…dential_commons

Updated credential-commons version
  • Loading branch information
explicit-projects authored May 23, 2022
2 parents 4e0fccb + e149715 commit ea67997
Show file tree
Hide file tree
Showing 13 changed files with 3,315 additions and 3,681 deletions.
14 changes: 0 additions & 14 deletions .babelrc

This file was deleted.

1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ node_modules/
npm-debug.log
.DS_Store
.tmp
dist/
1 change: 1 addition & 0 deletions .npmignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ build
__integrations__
__test__
.tmp
.idea
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,10 @@ Some helper functions to easy the DSR and verifiable credentials usage
* @param request - Original ScopeRequest
* @return {boolean}
*/
static credentialsMatchesRequest(credentialItems, request)
static async credentialsMatchesRequest(credentialItems, request)

//Example
ScopeRequest.credentialsMatchesRequest(credentialItems, dsr);
await ScopeRequest.credentialsMatchesRequest(credentialItems, dsr);
```


Expand Down
17 changes: 17 additions & 0 deletions babel.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module.exports = {
env: {
cjs: {
presets: [
['env', {
targets: {
node: '6.10',
},
modules: 'commonjs',
}],
],
},
test: {
plugins: ['@babel/plugin-transform-modules-commonjs'],
},
},
};
6,107 changes: 2,900 additions & 3,207 deletions package-lock.json

Large diffs are not rendered by default.

24 changes: 19 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"name": "@identity.com/dsr",
"version": "1.0.23",
"version": "3.0.0",
"description": "The Dynamic Scope Request (DSR) javascript library provides capability around securely requesting credential information between an ID Requester and an ID Holder",
"main": "dist/cjs/index.js",
"module": "dist/es/index.js",
"browser": "dist/browser/index.js",
"scripts": {
"lint": "eslint ./src/**.js",
"test": "cross-env NODE_ENV=false jest",
"test": "cross-env NODE_ENV=test jest",
"test:watch": "jest --watch",
"check-schemas": "cross-env NODE_ENV=false jest --no-coverage test/integration/schemas/",
"publish-schemas": "node scripts/publishSchemas.js && aws s3 cp ./schemas/public/ $S3_BUCKET_SCHEMA_URL --recursive --acl public-read",
Expand All @@ -25,6 +25,7 @@
"check": "npm run lint && npm run test"
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.17.7",
"ajv": "^6.5.2",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.3",
Expand All @@ -48,8 +49,7 @@
"rimraf": "^2.6.2"
},
"dependencies": {
"@identity.com/credential-commons": "^1.2.7",
"@identity.com/uca": "^1.0.24",
"@identity.com/credential-commons": "^3.0.0",
"bottlejs": "^1.7.1",
"dotenv": "^8.2.0",
"json-stable-stringify": "^1.0.1",
Expand Down Expand Up @@ -82,7 +82,21 @@
"coverageDirectory": "reports/coverage",
"collectCoverage": true,
"testResultsProcessor": "./node_modules/jest-stare",
"verbose": true
"verbose": true,
"transformIgnorePatterns": [
"/node_modules/(?!(@digitalbazaar/did-io|@digitalbazaar/lru-memoize|@digitalbazaar/ed25519-verification-key-2018|@digitalbazaar/did-io|base58-universal))",
"node_modules/(?!(@digitalbazaar/did-io|@digitalbazaar/lru-memoize|@digitalbazaar/ed25519-verification-key-2018|@digitalbazaar/did-io|base58-universal))",
"<rootDir>/node_modules/(?!(@digitalbazaar/did-io|@digitalbazaar/lru-memoize|@digitalbazaar/ed25519-verification-key-2018|@digitalbazaar/did-io|base58-universal))"
],
"moduleNameMapper": {
"@digitalbazaar/did-io": "@digitalbazaar/did-io/lib/main.js",
"@digitalbazaar/lru-memoize": "@digitalbazaar/lru-memoize/lib/main.js",
"@digitalbazaar/ed25519-verification-key-2018": "@digitalbazaar/ed25519-verification-key-2018/src/main.js",
"base58-universal": "base58-universal/main.js"
},
"transform": {
"^.+\\.(js|jsx)$": "babel-jest"
}
},
"jest-stare": {
"resultDir": "reports",
Expand Down
48 changes: 31 additions & 17 deletions src/ScopeRequest.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const _ = require('lodash');
const { isValidGlobalIdentifier, VC } = require('@identity.com/credential-commons');
const { isValidGlobalIdentifier, VCCompat: VC } = require('@identity.com/credential-commons');

const { services, initServices } = require('./services');

Expand Down Expand Up @@ -63,7 +63,7 @@ class ScopeRequest {
* @param request - Original ScopeRequest
* @return {boolean}
*/
static credentialsMatchesRequest(credentialItems, request) {
static async credentialsMatchesRequest(credentialItems, request) {
let result = true;
const requestedItems = _.get(request, 'credentialItems');

Expand All @@ -74,7 +74,8 @@ class ScopeRequest {
throw new Error('empty credentialItems param');
}
// eslint-disable-next-line consistent-return
_.forEach(requestedItems, (requestedItem) => {
await _.reduce(requestedItems, async (promise, requestedItem) => {
await promise;
const credentialItem = _.find(credentialItems, { identifier: requestedItem.credential });
if (!credentialItem) {
// no need to continue breaking and returning false
Expand All @@ -83,7 +84,7 @@ class ScopeRequest {
}

// If is a presentation `credentialItem.granted` nor empty accept partial
const verifiableCredential = VC.fromJSON(credentialItem, !!credentialItem.granted);
const verifiableCredential = await VC.fromJSON(credentialItem, !!credentialItem.granted);

const constraints = _.get(requestedItem, 'constraints');
const match = verifiableCredential.isMatch(constraints);
Expand All @@ -92,7 +93,7 @@ class ScopeRequest {
result = false;
return false;
}
});
}, Promise.resolve());
return result;
}

Expand Down Expand Up @@ -145,7 +146,7 @@ class ScopeRequest {
* @param identifier
* @returns {*}
*/
static isValidCredentialItemIdentifier(identifier) {
static async isValidCredentialItemIdentifier(identifier) {
return isValidGlobalIdentifier(identifier);
}

Expand All @@ -160,26 +161,30 @@ class ScopeRequest {
* @returns {boolean} true for the pattern to be accepted, false otherwise
*/
static isValidCredentialIssuer(issuer) {
return !(!issuer || !issuer.match(/^did:ethr:0x[a-fA-F0-9]{40}$/g));
return !!issuer;
}

/**
* Validate the credential items part of an scope request
* @param credentialItems the array of credential items needed for an dsr
* @returns {boolean} true|false sucess|failure
*/
static validateCredentialItems(credentialItems) {
_.forEach(credentialItems, (item) => {
static async validateCredentialItems(credentialItems) {
await _.reduce(credentialItems, async (promise, item) => {
await promise;

if (_.isString(item)) {
if (!ScopeRequest.isValidCredentialItemIdentifier(item)) {
const valid = await ScopeRequest.isValidCredentialItemIdentifier(item);
if (!valid) {
throw new Error(`${item} is not valid CredentialItem identifier`);
}
} else {
if (_.isEmpty(item.identifier)) {
throw new Error('CredentialItem identifier is required');
}

if (!ScopeRequest.isValidCredentialItemIdentifier(item.identifier)) {
const valid = await ScopeRequest.isValidCredentialItemIdentifier(item.identifier);
if (!valid) {
throw new Error(`${item.identifier} is not valid CredentialItem identifier`);
}

Expand Down Expand Up @@ -226,7 +231,8 @@ class ScopeRequest {
});
}
}
});
}, Promise.resolve());

return true;
}

Expand Down Expand Up @@ -311,7 +317,18 @@ class ScopeRequest {
return true;
}

constructor(uniqueId, requestedItems, channelsConfig, appConfig, partnerConfig, authentication = true, mode = 'ADVANCED') {
static async create(uniqueId, requestedItems, channelsConfig, appConfig, partnerConfig, authentication = true, mode = 'ADVANCED') {
let credentialItems = [].concat(requestedItems);

const valid = await ScopeRequest.validateCredentialItems(credentialItems);
if (valid) {
credentialItems = _.cloneDeep(credentialItems);
}

return new ScopeRequest(uniqueId, requestedItems, credentialItems, channelsConfig, appConfig, partnerConfig, authentication, mode);
}

constructor(uniqueId, requestedItems, credentialItems, channelsConfig, appConfig, partnerConfig, authentication = true, mode = 'ADVANCED') {
this.version = SCHEMA_VERSION;
if (!uniqueId) {
throw Error('uniqueId is required');
Expand All @@ -325,10 +342,7 @@ class ScopeRequest {

this.timestamp = (new Date()).toISOString();

const credentialItems = [].concat(requestedItems);
if (ScopeRequest.validateCredentialItems(credentialItems)) {
this.credentialItems = _.cloneDeep(credentialItems);
}
this.credentialItems = credentialItems;

if (channelsConfig && ScopeRequest.validateChannelsConfig(channelsConfig)) {
this.channels = channelsConfig;
Expand Down
4 changes: 2 additions & 2 deletions src/resolver/Resolver.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const sift = require('sift').default;
const { definitions: ucaDefinitions } = require('@identity.com/uca');
const { schemaLoader } = require('@identity.com/credential-commons');
const { VALIDATION_MODE } = require('../ScopeRequest');

/**
Expand Down Expand Up @@ -108,7 +108,7 @@ function DsrResolver() {
this.filterCredentialsByClaim = (globalIdentifier, credentials, credentialItem, scope, filtered) => {
// for UCAs it can either be a type, or an alsoKnown as
const type = globalIdentifier.substring('claim-'.length, globalIdentifier.lastIndexOf('-'));
const definition = ucaDefinitions.find(def => def.identifier === type);
const definition = schemaLoader.ucaDefinitions.find(def => def.identifier === type);
const tempFiltered = [];
const filterArgArray = [];

Expand Down
Loading

0 comments on commit ea67997

Please sign in to comment.