diff --git a/entityBackend/api/controllers/entity.controller.js b/entityBackend/api/controllers/entity.controller.js index d922026..0e6a6f4 100644 --- a/entityBackend/api/controllers/entity.controller.js +++ b/entityBackend/api/controllers/entity.controller.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' ///////////////////////////////////////////////////////// /////// constants /////// @@ -245,10 +245,7 @@ function createCredential(req, res) { entityService.createCredential(identityDID, credentials) .then(credential => { log.info(`${controller_name}[${createCredential.name}] -----> Credentials created`) - let credentialToken = { - verifiableCredential: credential - } - res.status(200).send(credentialToken) + res.status(200).send(credential) }) .catch(error => { log.error(`${controller_name}[${createCredential.name}] -----> ${error}`) @@ -384,20 +381,20 @@ function getSubjectPresentationStatus(req, res) { } function updateReceiverPresentationStatus(req, res){ - log.info(`${controller_name}[${updateReceiverPresentationStatus.name}] -----> IN ...`); - let presentationHash = req.swagger.params.presentationHash.value; - let newStatus = req.swagger.params.status.value.newStatus; + log.info(`${controller_name}[${updateReceiverPresentationStatus.name}] -----> IN ...`) + let presentationHash = req.swagger.params.presentationHash.value + let newStatus = req.swagger.params.status.value.newStatus log.debug(`${controller_name}[${updateReceiverPresentationStatus.name}] -----> Sending params: ${presentationHash}, ${newStatus}`) entityService.updateReceiverPresentationStatus(presentationHash, newStatus) .then(status => { - log.info(`${controller_name}[${updateReceiverPresentationStatus.name}] -----> Successfully updated status presentation`); + log.info(`${controller_name}[${updateReceiverPresentationStatus.name}] -----> Successfully updated status presentation`) let gettedStatus = { presentationStatus: status } - res.status(200).send(gettedStatus); + res.status(200).send(gettedStatus) }) .catch(error => { - log.error(`${controller_name}[${updateReceiverPresentationStatus.name}] -----> ${error}`); + log.error(`${controller_name}[${updateReceiverPresentationStatus.name}] -----> ${error}`) Errmsg.message = error res.status(404).send(Errmsg) }) @@ -413,22 +410,22 @@ function getIssuerPresentationStatus(req, res) { let gettedStatus = { presentationStatus: status } - res.status(200).send(gettedStatus); + res.status(200).send(gettedStatus) }) .catch(error => { - log.error(`${controller_name}[${getIssuerPresentationStatus.name}] -----> ${error}`); + log.error(`${controller_name}[${getIssuerPresentationStatus.name}] -----> ${error}`) Errmsg.message = error res.status(404).send(Errmsg) }) } function recivePresentationData(req, res) { - log.info(`${controller_name}[${recivePresentationData.name}] -----> IN ...`); + log.info(`${controller_name}[${recivePresentationData.name}] -----> IN ...`) let presentationSigned = req.swagger.params.presentation.value log.debug(`${controller_name}[${recivePresentationData.name}] -----> Sending params: ${presentationSigned}`) entityService.getPresentationData(presentationSigned) .then(subjectData => { - log.info(`${controller_name}[${recivePresentationData.name}] -----> Successfully obtained presentation data`); + log.info(`${controller_name}[${recivePresentationData.name}] -----> Successfully obtained presentation data`) io.emit('getPresentationData', {status: 200, message: subjectData}) @@ -439,7 +436,7 @@ function recivePresentationData(req, res) { }) .catch(error => { Errmsg.message = (error == false) ? 'Clave pública no válida' : 'Error obteniendo los datos de la presentación' - log.error(`${controller_name}[${recivePresentationData.name}] -----> ${Errmsg.message}`); + log.error(`${controller_name}[${recivePresentationData.name}] -----> ${Errmsg.message}`) io.emit('error', {status: 400, message: Errmsg.message}) res.status(400).send(Errmsg) diff --git a/entityBackend/api/controllers/user.controller.js b/entityBackend/api/controllers/user.controller.js index 1c70c2d..e504d93 100644 --- a/entityBackend/api/controllers/user.controller.js +++ b/entityBackend/api/controllers/user.controller.js @@ -25,7 +25,8 @@ module.exports = { updateUser, getUser, getCredentialIdentityCatalog, - checkUserAuth + checkUserAuth, + getObjectFromDB } ///////////////////////////////////////////////////////// @@ -119,19 +120,11 @@ function getUser(req, res) { log.debug(`${controller_name}[${getUser.name}] -----> Sending params: ${JSON.stringify(id)}`) userModel.getUser(id) .then(userData => { - if (userData == null) { - log.info(`${controller_name}[${getUser.name}] -----> User not found`) - let msg = { - message: `User not found` - } - res.status(404).send(msg) - } else { - log.info(`${controller_name}[${getUser.name}] -----> User found`) - let userInfo = { - user: userData - } - res.status(200).send(userInfo) + log.info(`${controller_name}[${getUser.name}] -----> User found`) + let userInfo = { + user: userData } + res.status(200).send(userInfo) }) .catch(error => { llog.error(`${controller_name}[${getUser.name}] -----> ${error}`) @@ -158,6 +151,25 @@ function getCredentialIdentityCatalog(req, res) { }) } +function getObjectFromDB(req, res) { + log.info(`${controller_name}[${getObjectFromDB.name}] -----> IN ...`) + let authToken = req.swagger.params.authToken.value + log.debug(`${controller_name}[${getObjectFromDB.name}] -----> Sending params: ${authToken}`) + userModel.getObjectsFromDB(authToken) + .then(object => { + log.info(`${controller_name}[${getObjectFromDB.name}] -----> Getted object from DB`) + userModel.deleteObjectFromDB(authToken) + res.status(200).send(object) + }) + .catch(error => { + Errmsg.message = error + log.error(`${controller_name}[${getObjectFromDB.name}] -----> ${Errmsg.message}`) + io.emit('error', {status: 400, + message: Errmsg.message}) + res.status(400).send(Errmsg) + }) +} + function checkUserAuth(req, res) { log.info(`${controller_name}[${checkUserAuth.name}] -----> IN ...`) let token = req.swagger.params.authToken.value diff --git a/entityBackend/api/models/user.model.js b/entityBackend/api/models/user.model.js index 9f410c9..2e62535 100644 --- a/entityBackend/api/models/user.model.js +++ b/entityBackend/api/models/user.model.js @@ -15,7 +15,8 @@ const moduleName = '[User Model]' const ObjectId = require('mongodb').ObjectID const mongoDatabase = myConfig.mongo.dbName -const mongoCollection = myConfig.mongo.collection +const userCollection = myConfig.mongo.collectionUser +const collectionData = myConfig.mongo.collectionData ///////////////////////////////////////////////////////// /////// MODULE EXPORTS /////// @@ -27,7 +28,10 @@ module.exports = { updateUser, getUser, getCredentialIdentityCatalog, - checkAuth + checkAuth, + saveTempObject, + getObjectsFromDB, + deleteObjectFromDB } ///////////////////////////////////////////////////////// @@ -40,13 +44,12 @@ async function isAuth(data) { let connected = await mongoHelper.connect(myConfig.mongo) log.info(`${moduleName}[${isAuth.name}] -----> Checking if user is authenticated`); let db = connected.db(mongoDatabase) - let found = await db.collection(mongoCollection).findOne({"$or":[{"username": data.user}, {"email": data.user}], "password": data.password}) + let found = await db.collection(userCollection).findOne({"$or":[{"username": data.user}, {"email": data.user}], "password": data.password}) connected.close(); return found } catch(error) { log.error(`${moduleName}[${isAuth.name}] Error -> ${error}`); - connected.close() throw error } } @@ -63,7 +66,7 @@ async function login(params){ let pwd = params.password let connected = await mongoHelper.connect(myConfig.mongo) let db = connected.db(mongoDatabase) - let found = await db.collection(mongoCollection).findOne({"$or":[{"username": username}, {"email": username}], "password": pwd}) + let found = await db.collection(userCollection).findOne({"$or":[{"username": username}, {"email": username}], "password": pwd}) if(found == null) { return found } @@ -83,7 +86,6 @@ async function login(params){ } catch(error) { log.error(`${moduleName}[${login.name}] Error -> ${error}`); - connected.close() throw error } } @@ -104,7 +106,7 @@ async function createUser(params) { titleLegalBlockchain: myConfig.title } let db = connected.db(mongoDatabase) - let created = await db.collection(mongoCollection).insertOne(userData) + await db.collection(userCollection).insertOne(userData) log.info(`${moduleName}[${createUser.name}] -----> User created successfuly`) let msg = { message: 'Created new user correctly' @@ -115,7 +117,6 @@ async function createUser(params) { } catch(error) { log.error(`${moduleName}[${createUser.name}] -----> Error: ${error}`) - connected.close() throw error } } @@ -139,7 +140,7 @@ async function updateUser(params) { update.password = params.password } let db = connected.db(mongoDatabase) - let updated = await db.collection(mongoCollection).updateOne({"_id": new ObjectId(id)},{"$set": update }) + let updated = await db.collection(userCollection).updateOne({"_id": new ObjectId(id)},{"$set": update }) log.info(`${moduleName}[${updateUser.name}] -----> Updated Records: ${updated.result.nModified}`) let gettedUser = await getUser(id) let result = { @@ -152,7 +153,6 @@ async function updateUser(params) { } catch(error) { log.error(`${moduleName}[${updateUser.name}] -----> Error: ${error}`) - connected.close() throw error } } @@ -163,10 +163,12 @@ async function getUser(id) { let find = (id.startsWith('did') == true) ? {"did":id} : {"_id": new ObjectId(id)} let connected = await mongoHelper.connect(myConfig.mongo) let db = connected.db(mongoDatabase) - let user = await db.collection(mongoCollection).findOne(find) + let user = await db.collection(userCollection).findOne(find) if (user == null){ - log.info(`${moduleName}[${getUser.name}] -----> User not found in the DataBase`) - return user + let error = 'User not found in the DataBase' + log.error(`${moduleName}[${getUser.name}] -----> ${error}`) + connected.close() + throw error } else { log.info(`${moduleName}[${getUser.name}] -----> Data obtained`) let loged = await login(user) @@ -177,7 +179,6 @@ async function getUser(id) { } catch(error) { log.error(`${moduleName}[${getUser.name}] -----> Error: ${error}`) - connected.close() throw error } } @@ -226,4 +227,70 @@ async function checkAuth(token) { log.error(`${moduleName}[${checkAuth.name}] -----> Error: ${error}`) throw error } +} + +async function saveTempObject(object, subjectDID) { + try { + log.info(`${moduleName}[${saveTempObject.name}] -----> IN...`) + let connected = await mongoHelper.connect(myConfig.mongo) + let objectData = { + authToken: jwt.sign({data: subjectDID}, myConfig.authKeyToken, { expiresIn: 60 * 60 }), + object: object + } + let db = connected.db(mongoDatabase) + await db.collection(collectionData).insertOne(objectData) + log.info(`${moduleName}[${saveTempObject.name}] -----> Object saved successfuly`) + connected.close() + return objectData.authToken + } + catch(error) { + log.error(`${moduleName}[${saveTempObject.name}] -----> Error: ${error}`) + throw error + } +} + +async function getObjectsFromDB(authToken) { + try { + log.info(`${moduleName}[${getObjectsFromDB.name}] -----> IN...`) + let find = {"authToken": authToken} + let connected = await mongoHelper.connect(myConfig.mongo) + let db = connected.db(mongoDatabase) + let objectFound = await db.collection(collectionData).findOne(find) + if(objectFound == null){ + let error = 'Object not found' + log.error(`${moduleName}[${getObjectsFromDB.name}] -----> ${error}`) + connected.close() + throw error + } + connected.close() + log.info(`${moduleName}[${getObjectsFromDB.name}] -----> Object saved successfuly`) + return objectFound.object + } + catch(error) { + log.error(`${moduleName}[${getObjectsFromDB.name}] -----> Error: ${error}`) + throw error + } +} + +async function deleteObjectFromDB(authToken) { + try { + log.info(`${moduleName}[${deleteObjectFromDB.name}] -----> IN...`) + let deleteOne = {"authToken": authToken} + let connected = await mongoHelper.connect(myConfig.mongo) + let db = connected.db(mongoDatabase) + let objectDeleted = await db.collection(collectionData).deleteOne(deleteOne) + if(objectDeleted == null) { + let error = 'Object not found' + log.error(`${moduleName}[${deleteObjectFromDB.name}] -----> ${error}`) + connected.close() + throw error + } + connected.close() + log.info(`${moduleName}[${deleteObjectFromDB.name}] -----> Object deleted successfuly`) + return + } + catch(error) { + log.error(`${moduleName}[${deleteObjectFromDB.name}] -----> Error: ${error}`) + throw error + } } \ No newline at end of file diff --git a/entityBackend/api/services/entity.service.js b/entityBackend/api/services/entity.service.js index 6a1ffaa..5114b20 100644 --- a/entityBackend/api/services/entity.service.js +++ b/entityBackend/api/services/entity.service.js @@ -114,7 +114,7 @@ async function createAlastriaToken(functionCall) { exp: expDate, ani: myConfig.netID, nbf: currentDate, - jti: Math.random().toString(36).substring(2) + jti: `Alastria/token/${Math.random().toString()}` } let alastriaToken = tokenHelper.createAlastriaToken(alastriaTokenData) let AlastriaTokenSigned = tokenHelper.signJWT(alastriaToken, myConfig.entityPrivateKey) @@ -342,7 +342,7 @@ async function createCredential(identityDID, credentials) { let credentialSubject = {} const currentDate = Math.floor(Date.now()); const expDate = currentDate + 86400000; - let jti = Math.random().toString(36).substring(2) + let jti = `Alastria/credential/${Math.random().toString()}` credentialSubject.levelOfAssurance = credential.levelOfAssurance credentialSubject[credential.field_name] = (credential.field_name == 'fullname') ? `${user.userData.name} ${user.userData.surname}` : user.userData[credential.field_name] @@ -364,7 +364,17 @@ async function createCredential(identityDID, credentials) { }) }) log.info(`${serviceName}[${createCredential.name}] -----> Created Successfully`) - return credentialsJWT + + let credentialObject = { + verifiableCredential: credentialsJWT + } + + let responseToken = await userModel.saveTempObject(credentialObject, identityDID) + let objectTinyURL = { + url: `${myConfig.callbackUrl}objects/db?authToken=${responseToken}` + } + + return objectTinyURL } catch(error){ log.error(`${serviceName}[${createCredential.name}] -----> ${error}`) @@ -428,12 +438,20 @@ async function createPresentationRequest(requestData) { log.info(`${serviceName}[${createPresentationRequest.name}] -----> IN ...`) const currentDate = Math.floor(Date.now()); const expDate = currentDate + 86400000; - let jti = Math.random().toString(36).substring(2) + let jti = `Alastria/request/${Math.random().toString()}` let objectRequest = tokenHelper.createPresentationRequest(myConfig.entityDID, myConfig.entityDID, myConfig.context, myConfig.context[0], `0x${myConfig.procHash}`, requestData, `${myConfig.callbackUrl}alastria/presentation`,expDate, currentDate, jti) let presentationRequest = tokenHelper.signJWT(objectRequest, myConfig.entityPrivateKey) - return presentationRequest + let objectPresentationRequest = { + jwt: presentationRequest + } + + let responseToken = await userModel.saveTempObject(objectPresentationRequest, myConfig.entityDID) + let objectTinyURL = { + url: `${myConfig.callbackUrl}objects/db?authToken=${responseToken}` + } + return objectTinyURL.url } catch(error) { log.error(`${serviceName}[${createPresentationRequest.name}] -----> ${error}`) diff --git a/entityBackend/api/swagger/swagger.yaml b/entityBackend/api/swagger/swagger.yaml index b2f7b14..435907f 100644 --- a/entityBackend/api/swagger/swagger.yaml +++ b/entityBackend/api/swagger/swagger.yaml @@ -41,6 +41,34 @@ paths: description: Error schema: $ref: "#/definitions/ErrorResponse" + /objects/db: + x-swagger-router-controller: user.controller + get: + description: Get available credentials catalog from an issuer + operationId: getObjectFromDB + parameters: + - name: authToken + in: query + type: string + description: Auth Token to validate in tha call to backend + required: true + responses: + "200": + description: Success + schema: + $ref: "#/definitions/createCredentialResponse" + "400": + description: Bad Request + schema: + $ref: "#/definitions/ErrorResponse" + "404": + description: Address not found + schema: + $ref: "#/definitions/ErrorResponse" + default: + description: Error + schema: + $ref: "#/definitions/ErrorResponse" /login: x-swagger-router-controller: user.controller get: @@ -508,7 +536,7 @@ paths: "200": description: Success schema: - $ref: "#/definitions/createCredentialResponse" + $ref: "#/definitions/credentialsURLResponse" "400": description: Bad Request schema: @@ -959,12 +987,10 @@ definitions: type: number alastriaSessionResponse: type: string + credentialsURLResponse: + type: string createCredentialResponse: - properties: - signedCredentials: - type: array - items: - type: string + type: string credentialStatusResponse: properties: status: diff --git a/entityBackend/app.js b/entityBackend/app.js index 8342b1d..1c47609 100644 --- a/entityBackend/app.js +++ b/entityBackend/app.js @@ -78,13 +78,12 @@ loadJsonFile(pathFile) // Auth app.all('*', (req, res, next) => { - let tokenJWT = req.headers['authorization'] + let tokenJWT = (req.headers['authorization']) ? req.headers['authorization'] : req.query.authToken keyManagerUrl = myConfig.keyManagerUrl if(!tokenJWT) { let error = 'It is necessary to provide an authentication token' log.error(`[App] -----> ${error}`) - // res.status(401).send(`Error: ${error}`) - next() + res.status(401).send(`Error: ${error}`) } else { // if(keyManagerUrl == '') { // let error = 'It is necessary to provide a key manager URL' @@ -99,6 +98,10 @@ loadJsonFile(pathFile) log.info(`[App] -----> Server started in http://localhost:${port}`) next() }) + .catch(error => { + log.error(`[App] -----> ${error}`) + res.status(401).send(error) + }) // }) } // } diff --git a/entityBackend/config.json b/entityBackend/config.json index c18a3e3..a3da4b3 100644 --- a/entityBackend/config.json +++ b/entityBackend/config.json @@ -8,7 +8,8 @@ "mongo": { "url": "mongodb://mongo:27017", "dbName": "alastriaUsers", - "collection": "users", + "collectionUser": "users", + "collectionData": "usersObjects", "interceptorElapse": 100 }, "didFormat": { diff --git a/entityBackend/package-lock.json b/entityBackend/package-lock.json index ea1f4cb..3f06bcd 100644 --- a/entityBackend/package-lock.json +++ b/entityBackend/package-lock.json @@ -5,11 +5,11 @@ "requires": true, "dependencies": { "@babel/runtime": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", - "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" } }, "@sailshq/lodash": { @@ -39,9 +39,9 @@ } }, "@types/elliptic": { - "version": "6.4.11", - "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.11.tgz", - "integrity": "sha512-NjpGyjDWsFroeSUidp0CQ77ooabPOm4PoOExkZi80z1Nw0aoa/S6qX4dPFoLOUCFTmA6sSfrEem2AAysP/lE9g==", + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.12.tgz", + "integrity": "sha512-gP1KsqoouLJGH6IJa28x7PXb3cRqh83X8HCLezd2dF+XcAIMKYv53KV+9Zn6QA561E120uOqZBQ+Jy/cl+fviw==", "requires": { "@types/bn.js": "*" } @@ -87,10 +87,11 @@ } }, "alastria-identity-lib": { - "version": "github:alastria/alastria-identity-lib#cd65829aa97788049f2401aa9e6cee81a727be79", - "from": "github:alastria/alastria-identity-lib#develop", + "version": "github:alastria/alastria-identity-lib#ac1a86b34d89de0a220dd4bd4cc5bb758c435d04", + "from": "github:alastria/alastria-identity-lib", "requires": { "@types/node": "12.11.5", + "chai-as-promised": "^7.1.1", "ethereumjs-tx": "^1.3.3", "jsontokens": "2.0.2", "keythereum": "1.0.4", @@ -385,17 +386,46 @@ } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "bson": { @@ -404,9 +434,9 @@ "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" }, "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" @@ -532,6 +562,14 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "requires": { + "check-error": "^1.0.2" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -542,10 +580,15 @@ "supports-color": "^5.3.0" } }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "cipher-base": { "version": "1.0.4", @@ -745,6 +788,15 @@ "randomfill": "^1.0.3" } }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -772,9 +824,9 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", "requires": { "decompress-tar": "^4.0.0", "decompress-tarbz2": "^4.0.0", @@ -873,9 +925,9 @@ } }, "defer-to-connect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.1.tgz", - "integrity": "sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "define-properties": { "version": "1.1.3", @@ -1174,9 +1226,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -1201,11 +1253,40 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1349,13 +1430,6 @@ "requires": { "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" - }, - "dependencies": { - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - } } }, "eth-lib": { @@ -1422,9 +1496,9 @@ }, "dependencies": { "@types/node": { - "version": "10.17.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz", - "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==" + "version": "10.17.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.24.tgz", + "integrity": "sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA==" }, "elliptic": { "version": "6.3.3", @@ -1446,11 +1520,6 @@ "minimalistic-assert": "^1.0.0" } }, - "js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" - }, "setimmediate": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", @@ -1539,6 +1608,21 @@ "vary": "~1.1.2" } }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -1852,14 +1936,14 @@ } }, "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" }, "http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { "version": "1.7.2", @@ -1946,9 +2030,9 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" }, "is-date-object": { "version": "1.0.2", @@ -1981,11 +2065,11 @@ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "requires": { - "has": "^1.0.3" + "has-symbols": "^1.0.1" } }, "is-retry-allowed": { @@ -2035,6 +2119,11 @@ "is-object": "^1.0.1" } }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", @@ -2793,9 +2882,9 @@ } }, "mock-fs": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.10.4.tgz", - "integrity": "sha512-gDfZDLaPIvtOusbusLinfx6YSe2YpQsDT8qdP41P47dQ/NQggtkHukz7hwqgt8QvMBmAv+Z6DGmXPyb5BWX2nQ==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.12.0.tgz", + "integrity": "sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==" }, "mongodb": { "version": "3.5.1", @@ -2866,6 +2955,11 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -3132,9 +3226,9 @@ } }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -3154,9 +3248,9 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pidtree": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", - "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==" }, "pify": { "version": "3.0.0", @@ -3333,9 +3427,9 @@ "integrity": "sha1-4Mk1QsV0UhvqE98PlIjtgqt3xdo=" }, "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" }, "request": { "version": "2.88.0", @@ -3381,9 +3475,9 @@ } }, "resolve": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", - "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "requires": { "path-parse": "^1.0.6" } @@ -3562,45 +3656,6 @@ "express": "^4.14.0", "request": "^2.79.0", "xhr": "^2.3.3" - }, - "dependencies": { - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - } } }, "setimmediate": { @@ -3854,23 +3909,23 @@ } }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -3971,22 +4026,42 @@ "es-abstract": "^1.17.0-next.1" } }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { @@ -4573,6 +4648,11 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -4587,6 +4667,14 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", @@ -4598,9 +4686,9 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "requires": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -5240,17 +5328,8 @@ "integrity": "sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA==", "requires": { "underscore": "1.9.1", - "web3-core-helpers": "1.2.1" - }, - "dependencies": { - "websocket": { - "version": "github:web3-js/WebSocket-Node#905deb4812572b344f5801f8c9ce8bb02799d82e", - "from": "github:web3-js/WebSocket-Node#905deb4812572b344f5801f8c9ce8bb02799d82e", - "requires": { - "debug": "^2.2.0", - "nan": "^2.14.0" - } - } + "web3-core-helpers": "1.2.1", + "websocket": "github:web3-js/WebSocket-Node#ef5ea2f41daf4a2113b80c9223df884b4d56c400" } }, "web3-shh": { @@ -5282,9 +5361,9 @@ }, "dependencies": { "@types/node": { - "version": "10.17.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz", - "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==" + "version": "10.17.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.24.tgz", + "integrity": "sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA==" }, "eth-lib": { "version": "0.2.8", @@ -5308,6 +5387,17 @@ } } }, + "websocket": { + "version": "github:web3-js/WebSocket-Node#ef5ea2f41daf4a2113b80c9223df884b4d56c400", + "from": "github:web3-js/WebSocket-Node#polyfill/globalThis", + "requires": { + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "nan": "^2.14.0", + "typedarray-to-buffer": "^3.1.5", + "yaeti": "^0.0.6" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -5387,6 +5477,11 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/entityBackend/package.json b/entityBackend/package.json index d7a97c6..35eacf0 100644 --- a/entityBackend/package.json +++ b/entityBackend/package.json @@ -8,7 +8,7 @@ "license": "", "main": "app.js", "dependencies": { - "alastria-identity-lib": "github:alastria/alastria-identity-lib#develop", + "alastria-identity-lib": "github:alastria/alastria-identity-lib", "axios": "0.19.2", "cors": "2.8.3", "eth-crypto": "1.5.2", diff --git a/entityFrontend/src/app/components/common/modal-fill-profile/modal-fill-profile.component.ts b/entityFrontend/src/app/components/common/modal-fill-profile/modal-fill-profile.component.ts index dad5c29..32cf5e8 100644 --- a/entityFrontend/src/app/components/common/modal-fill-profile/modal-fill-profile.component.ts +++ b/entityFrontend/src/app/components/common/modal-fill-profile/modal-fill-profile.component.ts @@ -34,7 +34,7 @@ export class ModalFillProfileComponent implements OnInit { constructor(private fb: FormBuilder) { this.form = this.fb.group({ - options: this.fb.array(this.addCheckboxes(), this.maxLengthArray(1, 2)) + options: this.fb.array(this.addCheckboxes(), this.maxLengthArray(1)) }); if (this.options) { @@ -67,7 +67,7 @@ export class ModalFillProfileComponent implements OnInit { return controls; } - maxLengthArray(min: number, max: number) { + maxLengthArray(min: number) { return function validate(formGroup: FormGroup) { let checked = 0; Object.keys(formGroup.controls).forEach(key => { @@ -76,7 +76,7 @@ export class ModalFillProfileComponent implements OnInit { checked++; } }); - if (checked < min || checked > max) { + if (checked < min) { return { limit: true, }; diff --git a/entityFrontend/src/app/components/common/service-form/service-form.component.html b/entityFrontend/src/app/components/common/service-form/service-form.component.html index 5668d83..1a9614f 100644 --- a/entityFrontend/src/app/components/common/service-form/service-form.component.html +++ b/entityFrontend/src/app/components/common/service-form/service-form.component.html @@ -34,9 +34,34 @@ +
+ +
+
+ + +
+
+ Please enter your email +
+
+
+
+ +
+
+ + +
+
+ Please enter your titleLegalBlockchain +
+
+
-
diff --git a/entityFrontend/src/app/components/common/service-form/service-form.component.ts b/entityFrontend/src/app/components/common/service-form/service-form.component.ts index 23c72aa..2a91392 100644 --- a/entityFrontend/src/app/components/common/service-form/service-form.component.ts +++ b/entityFrontend/src/app/components/common/service-form/service-form.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Output, EventEmitter } from '@angular/core'; +import { Component, OnInit, Output, EventEmitter, ɵConsole } from '@angular/core'; import { FormGroup, FormBuilder, Validators } from '@angular/forms'; // SERVICES @@ -44,6 +44,8 @@ export class ServiceFormComponent implements OnInit { setValuesForm(formNewValues: any) { this.serviceForm.get('fullname').setValue(formNewValues.fullname); this.serviceForm.get('address').setValue(formNewValues.address); + this.serviceForm.get('email').setValue(formNewValues.email); + this.serviceForm.get('titleLegalBlockchain').setValue(formNewValues.titleLegalBlockchain); } showModalQr() { @@ -55,10 +57,10 @@ export class ServiceFormComponent implements OnInit { try { let requestData = [ { - '@context': 'JWT', - levelOfAssurance: 3, - required: true, - field_name: 'fullname' + '@context': 'JWT', + levelOfAssurance: 3, + required: true, + field_name: 'fullname' }, { '@context': 'JWT', @@ -66,6 +68,18 @@ export class ServiceFormComponent implements OnInit { required: false, field_name: 'address' }, + { + '@context': 'JWT', + levelOfAssurance: 3, + required: false, + field_name: 'email' + }, + { + '@context': 'JWT', + levelOfAssurance: 3, + required: false, + field_name: 'titleLegalBlockchain' + } ]; const presentationRequest = await this.entityService.createPresentationRequest(requestData); @@ -82,7 +96,9 @@ export class ServiceFormComponent implements OnInit { private generateForm(): void { this.serviceForm = this.fb.group({ fullname: ['', Validators.required], - address: ['', Validators.required] + address: ['', Validators.required], + email: ['', Validators.required], + titleLegalBlockchain: ['', Validators.required] }); } diff --git a/entityFrontend/src/app/components/pages/link-user/link-user.component.ts b/entityFrontend/src/app/components/pages/link-user/link-user.component.ts index 802ffa0..80721c8 100644 --- a/entityFrontend/src/app/components/pages/link-user/link-user.component.ts +++ b/entityFrontend/src/app/components/pages/link-user/link-user.component.ts @@ -192,10 +192,10 @@ export class LinkUserComponent implements OnInit { try { let presentationRequestInfo = [ { - '@context': 'JWT', - levelOfAssurance: 3, - required: true, - field_name: 'fullname' + '@context': 'JWT', + levelOfAssurance: 3, + required: true, + field_name: 'fullname' }, { '@context': 'JWT', @@ -203,6 +203,12 @@ export class LinkUserComponent implements OnInit { required: true, field_name: 'email' }, + { + '@context': 'JWT', + levelOfAssurance: 3, + required: true, + field_name: 'address' + } ]; const presentationRequest = await this.entityService.createPresentationRequest(presentationRequestInfo); this.qrData = presentationRequest; @@ -248,7 +254,8 @@ export class LinkUserComponent implements OnInit { if (data && data.length) { formNewValues = { fullname: (data[0].fullname) ? data[0].fullname : (data[1].fullname) ? data[1].fullname : '', - email: (data[1].email) ? data[1].email : (data[0].email) ? data[0].email : '' + email: (data[1].email) ? data[1].email : (data[0].email) ? data[0].email : '', + address: (!data[2]) ? '' : (data[2].address) ? data[1].address : '' }; } this.userFormComponent.setValuesForm(formNewValues); diff --git a/entityFrontend/src/app/components/pages/profile/profile.component.html b/entityFrontend/src/app/components/pages/profile/profile.component.html index 43cf711..4422ccb 100644 --- a/entityFrontend/src/app/components/pages/profile/profile.component.html +++ b/entityFrontend/src/app/components/pages/profile/profile.component.html @@ -67,8 +67,7 @@

Actions

diff --git a/entityFrontend/src/app/components/pages/profile/profile.component.ts b/entityFrontend/src/app/components/pages/profile/profile.component.ts index 4441cd1..6e58850 100644 --- a/entityFrontend/src/app/components/pages/profile/profile.component.ts +++ b/entityFrontend/src/app/components/pages/profile/profile.component.ts @@ -258,7 +258,7 @@ export class ProfileComponent implements OnInit { this.qrDataFillProfile = JSON.stringify(profileFields); this.initIoConnection(); const credentials = await this.createCredentials(profileFields); - this.qrDataFillProfile = JSON.stringify(credentials); + this.qrDataFillProfile = JSON.stringify(credentials.url); $('#simpleModal').modal('show'); } diff --git a/entityFrontend/src/app/components/pages/service-detail/service-detail.component.ts b/entityFrontend/src/app/components/pages/service-detail/service-detail.component.ts index 32089ab..0360508 100644 --- a/entityFrontend/src/app/components/pages/service-detail/service-detail.component.ts +++ b/entityFrontend/src/app/components/pages/service-detail/service-detail.component.ts @@ -5,7 +5,6 @@ import { ActivatedRoute } from '@angular/router'; // SERVICES import { HomeService } from 'src/app/services/home/home.service'; import { SocketService } from 'src/app/services/socket/socket.service'; -import { AlastriaLibService } from 'src/app/services/alastria-lib/alastria-lib.service'; // COMPONENTS import { ServiceFormComponent } from '../../common/service-form/service-form.component'; @@ -72,7 +71,9 @@ export class ServiceDetailComponent implements OnInit { if (data && data.length) { formNewValues = { fullname: (data[0].fullname) ? data[0].fullname : (data[1].fullname) ? data[1].fullname : '', - address: (!data[1]) ? '' : (data[1].address) ? data[1].address : '' + address: (!data[1]) ? '' : (data[1].address) ? data[1].address : '', + email: (data[2].email) ? data[2].email : (data[1].email) ? data[1].email : '', + titleLegalBlockchain: (data[3].titleLegalBlockchain) ? data[3].titleLegalBlockchain : (data[1].titleLegalBlockchain) ? data[1].titleLegalBlockchain : '', }; } this.serviceFormComponent.setValuesForm(formNewValues);