diff --git a/lerna.json b/lerna.json index 05e6b4521e..fdf9f330d3 100644 --- a/lerna.json +++ b/lerna.json @@ -3,6 +3,6 @@ "packages": [ "packages/*" ], - "version": "0.9.2", + "version": "0.10.1", "hoist": true } diff --git a/package.json b/package.json index 945a0fac38..6fd1a33d86 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ }, "name": "composer", "description": "You must install [Lerna](https://lernajs.io) to build this multi-package repository.", - "version": "0.9.2", + "version": "0.10.1", "main": "index.js", "private": true, "scripts": { diff --git a/packages/composer-admin/package.json b/packages/composer-admin/package.json index aded8ffafe..487bb5b5d9 100644 --- a/packages/composer-admin/package.json +++ b/packages/composer-admin/package.json @@ -1,6 +1,6 @@ { "name": "composer-admin", - "version": "0.9.2", + "version": "0.10.1", "description": "Hyperledger Composer Admin, code that manages business networks deployed to Hyperledger Fabric", "engines": { "node": ">=6", @@ -42,9 +42,9 @@ "sinon-as-promised": "^4.0.2" }, "dependencies": { - "composer-common": "^0.9.2", - "composer-connector-hlf": "^0.9.2", - "composer-connector-hlfv1": "^0.9.2" + "composer-common": "^0.10.1", + "composer-connector-hlf": "^0.10.1", + "composer-connector-hlfv1": "^0.10.1" }, "license-check-config": { "src": [ diff --git a/packages/composer-cli/package.json b/packages/composer-cli/package.json index 60efd18aa8..3c2daf753b 100644 --- a/packages/composer-cli/package.json +++ b/packages/composer-cli/package.json @@ -1,6 +1,6 @@ { "name": "composer-cli", - "version": "0.9.2", + "version": "0.10.1", "description": "Hyperledger Composer command line interfaces (CLIs)", "engines": { "node": ">=6", @@ -42,10 +42,10 @@ "dependencies": { "chalk": "^1.1.3", "cli-table": "^0.3.1", - "composer-admin": "^0.9.2", - "composer-client": "^0.9.2", - "composer-common": "^0.9.2", - "composer-rest-server": "^0.9.2", + "composer-admin": "^0.10.1", + "composer-client": "^0.10.1", + "composer-common": "^0.10.1", + "composer-rest-server": "^0.10.1", "homedir": "^0.6.0", "npm-paths": "^0.1.3", "nunjucks": "^3.0.0", diff --git a/packages/composer-client/package.json b/packages/composer-client/package.json index ec87a53e1c..14cc531195 100644 --- a/packages/composer-client/package.json +++ b/packages/composer-client/package.json @@ -1,6 +1,6 @@ { "name": "composer-client", - "version": "0.9.2", + "version": "0.10.1", "description": "The node.js client library for Hyperledger Composer, a development framework for Hyperledger Fabric", "engines": { "node": ">=6", @@ -42,9 +42,9 @@ "logError": true }, "dependencies": { - "composer-common": "^0.9.2", - "composer-connector-hlf": "^0.9.2", - "composer-connector-hlfv1": "^0.9.2", + "composer-common": "^0.10.1", + "composer-connector-hlf": "^0.10.1", + "composer-connector-hlfv1": "^0.10.1", "uuid": "^3.0.1" }, "devDependencies": { diff --git a/packages/composer-common/api.txt b/packages/composer-common/api.txt index 11e9c4b445..16d738103f 100644 --- a/packages/composer-common/api.txt +++ b/packages/composer-common/api.txt @@ -42,6 +42,16 @@ class FileWallet extends Wallet { + Promise update(string,string) + Promise remove(string) } +class IdCard { + + String getName() + + String getDescription() + + String getBusinessNetwork() + + Object getImage() + + Object getConnection() + + Map getCredentials() + + Map getTlsCertificates() + + Promise fromArchive(Buffer) +} class BaseModelException extends BaseException { + void constructor(string,string,string) + string getFileLocation() diff --git a/packages/composer-common/changelog.txt b/packages/composer-common/changelog.txt index b3f04ca16c..c82e72c7a7 100644 --- a/packages/composer-common/changelog.txt +++ b/packages/composer-common/changelog.txt @@ -11,6 +11,9 @@ # # Note that the latest public API is documented using JSDocs and is available in api.txt. # +Version 0.10.1 {ac4a5b035d77bfa46eeadf4b312eab8f} 2017-07-21 +- Added IdCard to composer-common package + Version 0.9.2 {60327250ee4f059647020f8aee5ed67b} 2017-07-06 - Added includeOptionalFields option to Factory.newXXX functions diff --git a/packages/composer-common/lib/idcard.js b/packages/composer-common/lib/idcard.js new file mode 100644 index 0000000000..251df11f8e --- /dev/null +++ b/packages/composer-common/lib/idcard.js @@ -0,0 +1,207 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const JSZip = require('jszip'); +const path = require('path'); + +const Logger = require('./log/logger'); +const LOG = Logger.getLog('IdCard'); + +/** + * An ID card. + * @class + * @memberof module:composer-common + */ +class IdCard { + + /** + * Create the BusinessNetworkDefinition. + *
+ * Note: Only to be called by framework code. Applications should + * retrieve instances from {@link IdCard.fromArchive} + * @param {Object} metadata - metadata associated with the card. + * @param {Object} connection - connection properties associated with the card. + * @param {Map} credentials - map of credential filename String keys to credential data Buffer objects. + * @param {Map} tlscerts - map of TLS certificate filename String keys to TLS certificate data Buffer objects. + * @private + */ + constructor(metadata, connection, credentials, tlscerts) { + const method = 'constructor'; + LOG.entry(method); + + this.metadata = metadata; + this.connection = connection; + this.credentials = credentials; + this.tlscerts = tlscerts; + + LOG.exit(method); + } + + /** + * Name of the card. This is typically used for display purposes, and is not a unique identifier. + *
+ * This is a mandatory field. + * @return {String} name of the card. + */ + getName() { + return this.metadata.name; + } + + /** + * Free text description of the card. + * @return {String} description, or {@link undefined} if none exists. + */ + getDescription() { + return this.metadata.description; + } + + /** + * Business network to which the ID card applies. Generally this will be present but may be omitted for system + * cards. + * @return {String} description, or {@link undefined} if none exists. + */ + getBusinessNetwork() { + return this.metadata.businessNetwork; + } + + /** + * Image associated with the card. + * @return {Object} an object of the form { name: imageFileName, data: bufferOfImageData }, + * or {@link undefined} if none exists. + */ + getImage() { + return this.image; + } + + /** + * Connection profile for this card. + * @return {Object} connection profile. + */ + getConnection() { + return this.connection; + } + + /** + * Credentials associated with this card. + * @return {Map} Map of filename {@link String} keys to {@link Buffer} data. + */ + getCredentials() { + return this.credentials; + } + + /** + * TLS certificates used to connect to the business networks. + * @return {Map} Map of filename {@link String} keys to {@link Buffer} data. + */ + getTlsCertificates() { + return this.tlscerts; + } + + /** + * Create an IdCard from a card archive. + * @param {Buffer} buffer - the Buffer to a zip archive + * @return {Promise} Promise to the instantiated IdCard + */ + static fromArchive(buffer) { + const method = 'fromArchive'; + LOG.entry(method, buffer.length); + + return JSZip.loadAsync(buffer).then((zip) => { + let promise = Promise.resolve(); + + let metadata; + let image; + let connection; + const credentials = new Map(); + const tlscerts = new Map(); + + LOG.debug(method, 'Loading connection.json'); + const connectionFile = zip.file('connection.json'); + if (!connectionFile) { + throw Error('Required file not found: connection.json'); + } + + promise = promise.then(() => { + return connectionFile.async('string'); + }).then((connectionContent) => { + connection = JSON.parse(connectionContent); + }); + + LOG.debug(method, 'Loading metadata.json'); + const metadataFile = zip.file('metadata.json'); + if (!metadataFile) { + throw Error('Required file not found: metadata.json'); + } + + promise = promise.then(() => { + return metadataFile.async('string'); + }).then((metadataContent) => { + metadata = JSON.parse(metadataContent); + if (!metadata.name) { + throw Error('Required meta-data field not found: name'); + } + + if (metadata.image) { + LOG.debug(method, 'Loading image ' + metadata.image); + + const imagePromise = zip.file(metadata.image); + if (!imagePromise) { + throw Error('Image file not found: ' + metadata.image); + } + + return imagePromise.async('nodebuffer').then((imageContent) => { + const shortFilename = path.basename(metadata.image); + image = { + name: shortFilename, + data: imageContent + }; + }); + } + }); + + const loadDirectoryToMap = function(directoryName, map) { + // Incude '/' following directory name + const fileIndex = directoryName.length + 1; + // Find all files that are direct children of specified directory + const files = zip.file(new RegExp(`^${directoryName}/[^/]+$`)); + files && files.forEach((file) => { + promise = promise.then(() => { + return file.async('nodebuffer'); + }).then((content) => { + const filename = file.name.slice(fileIndex); + map.set(filename, content); + }); + }); + }; + + LOG.debug(method, 'Loading credentials'); + loadDirectoryToMap('credentials', credentials); + + LOG.debug(method, 'Loading tlscerts'); + loadDirectoryToMap('tlscerts', tlscerts); + + return promise.then(() => { + const idCard = new IdCard(metadata, connection, credentials, tlscerts); + idCard.image = image; + LOG.exit(method, idCard.toString()); + return idCard; + }); + }); + } + +} + +module.exports = IdCard; diff --git a/packages/composer-common/package.json b/packages/composer-common/package.json index c264334181..a0b7efe9a2 100644 --- a/packages/composer-common/package.json +++ b/packages/composer-common/package.json @@ -1,6 +1,6 @@ { "name": "composer-common", - "version": "0.9.2", + "version": "0.10.1", "description": "Hyperledger Composer Common, code that is common across client, admin and runtime.", "engines": { "node": ">=6", diff --git a/packages/composer-common/test/data/id-cards/invalid-metadata-image/connection.json b/packages/composer-common/test/data/id-cards/invalid-metadata-image/connection.json new file mode 100644 index 0000000000..549c63eef9 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/invalid-metadata-image/connection.json @@ -0,0 +1,38 @@ +{ + "type": "hlfv1", + "orderers": [ + { + "url": "grpcs://", + "cert": "orderer1.crt" + }, + { + "url": "grpcs://", + "cert": "orderer2.crt" + } + ], + "ca": { + "url": "https://", + "name": "", + "trustedRoots": "", + "verify": true + }, + "peers": [ + { + "requestURL": "grpcs://", + "eventURL": "grpcs://", + "cert": "peer1.crt" + }, + { + "requestURL": "grpcs://", + "eventURL": "grpcs://", + "cert": "peer2.crt" + } + ], + "keyValStore": "/YOUR_HOME_DIR/.composer-credentials", + "channel": "composerchannel", + "mspID": "Org1MSP", + "timeout": 300, + "globalcert": "", + "maxSendSize": 10, + "maxRecvSize": 15 +} \ No newline at end of file diff --git a/packages/composer-common/test/data/id-cards/invalid-metadata-image/metadata.json b/packages/composer-common/test/data/id-cards/invalid-metadata-image/metadata.json new file mode 100644 index 0000000000..f9ca62bc90 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/invalid-metadata-image/metadata.json @@ -0,0 +1,4 @@ +{ + "name" : "com.example.cards.Minimal", + "image": "NON_EXISTENT_IMAGE_FILENAME" +} diff --git a/packages/composer-common/test/data/id-cards/minimal/connection.json b/packages/composer-common/test/data/id-cards/minimal/connection.json new file mode 100644 index 0000000000..549c63eef9 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/minimal/connection.json @@ -0,0 +1,38 @@ +{ + "type": "hlfv1", + "orderers": [ + { + "url": "grpcs://", + "cert": "orderer1.crt" + }, + { + "url": "grpcs://", + "cert": "orderer2.crt" + } + ], + "ca": { + "url": "https://", + "name": "", + "trustedRoots": "", + "verify": true + }, + "peers": [ + { + "requestURL": "grpcs://", + "eventURL": "grpcs://", + "cert": "peer1.crt" + }, + { + "requestURL": "grpcs://", + "eventURL": "grpcs://", + "cert": "peer2.crt" + } + ], + "keyValStore": "/YOUR_HOME_DIR/.composer-credentials", + "channel": "composerchannel", + "mspID": "Org1MSP", + "timeout": 300, + "globalcert": "", + "maxSendSize": 10, + "maxRecvSize": 15 +} \ No newline at end of file diff --git a/packages/composer-common/test/data/id-cards/minimal/metadata.json b/packages/composer-common/test/data/id-cards/minimal/metadata.json new file mode 100644 index 0000000000..249da19d9b --- /dev/null +++ b/packages/composer-common/test/data/id-cards/minimal/metadata.json @@ -0,0 +1,3 @@ +{ + "name" : "com.example.cards.Minimal" +} diff --git a/packages/composer-common/test/data/id-cards/missing-connection/metadata.json b/packages/composer-common/test/data/id-cards/missing-connection/metadata.json new file mode 100644 index 0000000000..249da19d9b --- /dev/null +++ b/packages/composer-common/test/data/id-cards/missing-connection/metadata.json @@ -0,0 +1,3 @@ +{ + "name" : "com.example.cards.Minimal" +} diff --git a/packages/composer-common/test/data/id-cards/missing-metadata-name/connection.json b/packages/composer-common/test/data/id-cards/missing-metadata-name/connection.json new file mode 100644 index 0000000000..549c63eef9 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/missing-metadata-name/connection.json @@ -0,0 +1,38 @@ +{ + "type": "hlfv1", + "orderers": [ + { + "url": "grpcs://", + "cert": "orderer1.crt" + }, + { + "url": "grpcs://", + "cert": "orderer2.crt" + } + ], + "ca": { + "url": "https://", + "name": "", + "trustedRoots": "", + "verify": true + }, + "peers": [ + { + "requestURL": "grpcs://", + "eventURL": "grpcs://", + "cert": "peer1.crt" + }, + { + "requestURL": "grpcs://", + "eventURL": "grpcs://", + "cert": "peer2.crt" + } + ], + "keyValStore": "/YOUR_HOME_DIR/.composer-credentials", + "channel": "composerchannel", + "mspID": "Org1MSP", + "timeout": 300, + "globalcert": "", + "maxSendSize": 10, + "maxRecvSize": 15 +} \ No newline at end of file diff --git a/packages/composer-common/test/data/id-cards/missing-metadata-name/metadata.json b/packages/composer-common/test/data/id-cards/missing-metadata-name/metadata.json new file mode 100644 index 0000000000..2c63c08510 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/missing-metadata-name/metadata.json @@ -0,0 +1,2 @@ +{ +} diff --git a/packages/composer-common/test/data/id-cards/missing-metadata/connection.json b/packages/composer-common/test/data/id-cards/missing-metadata/connection.json new file mode 100644 index 0000000000..549c63eef9 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/missing-metadata/connection.json @@ -0,0 +1,38 @@ +{ + "type": "hlfv1", + "orderers": [ + { + "url": "grpcs://", + "cert": "orderer1.crt" + }, + { + "url": "grpcs://", + "cert": "orderer2.crt" + } + ], + "ca": { + "url": "https://", + "name": "", + "trustedRoots": "", + "verify": true + }, + "peers": [ + { + "requestURL": "grpcs://", + "eventURL": "grpcs://", + "cert": "peer1.crt" + }, + { + "requestURL": "grpcs://", + "eventURL": "grpcs://", + "cert": "peer2.crt" + } + ], + "keyValStore": "/YOUR_HOME_DIR/.composer-credentials", + "channel": "composerchannel", + "mspID": "Org1MSP", + "timeout": 300, + "globalcert": "", + "maxSendSize": 10, + "maxRecvSize": 15 +} \ No newline at end of file diff --git a/packages/composer-common/test/data/id-cards/valid/connection.json b/packages/composer-common/test/data/id-cards/valid/connection.json new file mode 100644 index 0000000000..549c63eef9 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/connection.json @@ -0,0 +1,38 @@ +{ + "type": "hlfv1", + "orderers": [ + { + "url": "grpcs://", + "cert": "orderer1.crt" + }, + { + "url": "grpcs://", + "cert": "orderer2.crt" + } + ], + "ca": { + "url": "https://", + "name": "", + "trustedRoots": "", + "verify": true + }, + "peers": [ + { + "requestURL": "grpcs://", + "eventURL": "grpcs://", + "cert": "peer1.crt" + }, + { + "requestURL": "grpcs://", + "eventURL": "grpcs://", + "cert": "peer2.crt" + } + ], + "keyValStore": "/YOUR_HOME_DIR/.composer-credentials", + "channel": "composerchannel", + "mspID": "Org1MSP", + "timeout": 300, + "globalcert": "", + "maxSendSize": 10, + "maxRecvSize": 15 +} \ No newline at end of file diff --git a/packages/composer-common/test/data/id-cards/valid/credentials/114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457-priv b/packages/composer-common/test/data/id-cards/valid/credentials/114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457-priv new file mode 100644 index 0000000000..b35cc04c13 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/credentials/114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457-priv @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg00IwLLBKoi/9ikb6 +ZOAV0S1XeNGWllvlFDeczRKQn2uhRANCAARrvCsQUNRpMUkzFaC7+zV4mClo+beg +4VkUyQR5y5Fle5UVH2GigChWnUoouTO2e2acA/DUuyLDHT0emeBMhoMC +-----END PRIVATE KEY----- diff --git a/packages/composer-common/test/data/id-cards/valid/credentials/114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457-pub b/packages/composer-common/test/data/id-cards/valid/credentials/114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457-pub new file mode 100644 index 0000000000..0038541cc4 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/credentials/114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457-pub @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEa7wrEFDUaTFJMxWgu/s1eJgpaPm3 +oOFZFMkEecuRZXuVFR9hooAoVp1KKLkztntmnAPw1Lsiwx09HpngTIaDAg== +-----END PUBLIC KEY----- diff --git a/packages/composer-common/test/data/id-cards/valid/credentials/299acf40adb20268d13881833a0bed90e43e2276f0ed204e26233f906803b6ef-priv b/packages/composer-common/test/data/id-cards/valid/credentials/299acf40adb20268d13881833a0bed90e43e2276f0ed204e26233f906803b6ef-priv new file mode 100644 index 0000000000..1edeb54e3b --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/credentials/299acf40adb20268d13881833a0bed90e43e2276f0ed204e26233f906803b6ef-priv @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgChrXYkGKlYO/Vyit +G7iWx7oYvdDhVZS9FKOUDf9hJzuhRANCAASJpA+8/w8scgjPGJZsvocNPJMT3Y9m +YtavzY9pup/rF7NAocoFEH+oYT9rTO39+92GkJO/7nk3HwWQ0YfocTNZ +-----END PRIVATE KEY----- diff --git a/packages/composer-common/test/data/id-cards/valid/credentials/299acf40adb20268d13881833a0bed90e43e2276f0ed204e26233f906803b6ef-pub b/packages/composer-common/test/data/id-cards/valid/credentials/299acf40adb20268d13881833a0bed90e43e2276f0ed204e26233f906803b6ef-pub new file mode 100644 index 0000000000..df88a7f64a --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/credentials/299acf40adb20268d13881833a0bed90e43e2276f0ed204e26233f906803b6ef-pub @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiaQPvP8PLHIIzxiWbL6HDTyTE92P +ZmLWr82Pabqf6xezQKHKBRB/qGE/a0zt/fvdhpCTv+55Nx8FkNGH6HEzWQ== +-----END PUBLIC KEY----- diff --git a/packages/composer-common/test/data/id-cards/valid/credentials/PeerAdmin b/packages/composer-common/test/data/id-cards/valid/credentials/PeerAdmin new file mode 100644 index 0000000000..7db3ed06a5 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/credentials/PeerAdmin @@ -0,0 +1 @@ +{"name":"PeerAdmin","mspid":"Org1MSP","roles":null,"affiliation":"","enrollmentSecret":"","enrollment":{"signingIdentity":"114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457","identity":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICGjCCAcCgAwIBAgIRANuOnVN+yd/BGyoX7ioEklQwCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjI2MTI0OTI2WhcNMjcwNjI0MTI0OTI2\nWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMS5leGFtcGxlLmNvbTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGu8KxBQ1GkxSTMVoLv7NXiYKWj5t6Dh\nWRTJBHnLkWV7lRUfYaKAKFadSii5M7Z7ZpwD8NS7IsMdPR6Z4EyGgwKjTTBLMA4G\nA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIBmrZau7BIB9\nrRLkwKmqpmSecIaOOr0CF6Mi2J5H4aauMAoGCCqGSM49BAMCA0gAMEUCIQC4sKQ6\nCEgqbTYe48az95W9/hnZ+7DI5eSnWUwV9vCd/gIgS5K6omNJydoFoEpaEIwM97uS\nXVMHPa0iyC497vdNURA=\n-----END CERTIFICATE-----\n"}}} \ No newline at end of file diff --git a/packages/composer-common/test/data/id-cards/valid/credentials/admin b/packages/composer-common/test/data/id-cards/valid/credentials/admin new file mode 100644 index 0000000000..65a81bd84b --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/credentials/admin @@ -0,0 +1 @@ +{"name":"admin","mspid":"Org1MSP","roles":null,"affiliation":"","enrollmentSecret":"","enrollment":{"signingIdentity":"299acf40adb20268d13881833a0bed90e43e2276f0ed204e26233f906803b6ef","identity":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIB8TCCAZegAwIBAgIUYiOMoEQLJjv67ouTyKF/AGQwc30wCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNzA3MDIzMTAwWhcNMTgwNzA3MDIz\nMTAwWjAQMQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBImkD7z/DyxyCM8Ylmy+hw08kxPdj2Zi1q/Nj2m6n+sXs0ChygUQf6hhP2tM7f37\n3YaQk7/ueTcfBZDRh+hxM1mjbDBqMA4GA1UdDwEB/wQEAwICBDAMBgNVHRMBAf8E\nAjAAMB0GA1UdDgQWBBTCXR6ye6azchCpfPqAC2eRoXKgEDArBgNVHSMEJDAigCAZ\nq2WruwSAfa0S5MCpqqZknnCGjjq9AhejItieR+GmrjAKBggqhkjOPQQDAgNIADBF\nAiEA+qTBDKAE/9Hjh0Zn/J4zUgmNwOfhjXKaUKDFWrklbd0CIBIRZRX5z1RDQJAy\nX/LfDmPKGY4uCqTMkUj8ZuuGwqol\n-----END CERTIFICATE-----\n"}}} \ No newline at end of file diff --git a/packages/composer-common/test/data/id-cards/valid/images/conga.png b/packages/composer-common/test/data/id-cards/valid/images/conga.png new file mode 100644 index 0000000000..775c1ef889 Binary files /dev/null and b/packages/composer-common/test/data/id-cards/valid/images/conga.png differ diff --git a/packages/composer-common/test/data/id-cards/valid/metadata.json b/packages/composer-common/test/data/id-cards/valid/metadata.json new file mode 100644 index 0000000000..c1658f09b1 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/metadata.json @@ -0,0 +1,6 @@ +{ + "name" : "com.example.cards.Dan", + "description" : "Dan's Card for Production Network", + "businessNetwork" : "org-acme-biznet", + "image" : "images/conga.png" +} diff --git a/packages/composer-common/test/data/id-cards/valid/tlscerts/ca.crt b/packages/composer-common/test/data/id-cards/valid/tlscerts/ca.crt new file mode 100644 index 0000000000..f779b66377 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/tlscerts/ca.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICSDCCAe+gAwIBAgIQEvXT1R9Bjz16NNZ0lRCnyDAKBggqhkjOPQQDAjB2MQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz +Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjYxMjQ5MjZaFw0yNzA2MjQxMjQ5 +MjZaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH +Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD +VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D +AQcDQgAEXhfzP6un0RG7Ju3xB2L+Z1N3ti7ZWTUcjylvFIo9WH2kdbd2s2MXJAiq +0iWI64FUa4ZRwld9PXr12opwoaf5Q6NfMF0wDgYDVR0PAQH/BAQDAgGmMA8GA1Ud +JQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zApBgNVHQ4EIgQg7ZoAf+CA940a +9UENvzXO2sl4HOaAjzw1c7dI6w3hQqwwCgYIKoZIzj0EAwIDRwAwRAIgLAHv49O1 +uEF96e1m45g5wOsBUDwFnYWg9iy53tJ815kCIAXL7AvDlNHk2eEGOKVi6UZUOrcP +d0fDafkffCmv86mE +-----END CERTIFICATE----- diff --git a/packages/composer-common/test/data/id-cards/valid/tlscerts/server.crt b/packages/composer-common/test/data/id-cards/valid/tlscerts/server.crt new file mode 100644 index 0000000000..30cab191cb --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/tlscerts/server.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICOjCCAeGgAwIBAgIQBJoV3CWCr6nSXQsjv8BgQzAKBggqhkjOPQQDAjB2MQsw +CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy +YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz +Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA2MjYxMjQ5MjZaFw0yNzA2MjQxMjQ5 +MjZaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH +Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29t +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3pLUrkpTc/+Dvk9q64SHYpbg0H14 +dDbqWiIHsdcRSKv1GLgW60Rs4WKcRgKj6jAzzt9qf3sNNyiLg6p4z4ROTaNsMGow +DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM +BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIO2aAH/ggPeNGvVBDb81ztrJeBzmgI88 +NXO3SOsN4UKsMAoGCCqGSM49BAMCA0cAMEQCIH7xbUq9DMhy21bXXb3i8dIta/vV +mxLxZfSuu9+GLkZKAiBIRXd31n9LaoI1dgklt+d9A2ogpHX5+euq3k/fnp57qQ== +-----END CERTIFICATE----- diff --git a/packages/composer-common/test/data/id-cards/valid/tlscerts/server.key b/packages/composer-common/test/data/id-cards/valid/tlscerts/server.key new file mode 100755 index 0000000000..b040bb2cc4 --- /dev/null +++ b/packages/composer-common/test/data/id-cards/valid/tlscerts/server.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgPc3M5x+tOTwF+nKp +t+LfeCHjPdzRGAgEF1PxtyApEnahRANCAATektSuSlNz/4O+T2rrhIdiluDQfXh0 +NupaIgex1xFIq/UYuBbrRGzhYpxGAqPqMDPO32p/ew03KIuDqnjPhE5N +-----END PRIVATE KEY----- diff --git a/packages/composer-common/test/idcard.js b/packages/composer-common/test/idcard.js new file mode 100644 index 0000000000..ee4598be27 --- /dev/null +++ b/packages/composer-common/test/idcard.js @@ -0,0 +1,193 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const fs = require('fs'); +const IdCard = require('../lib/idcard'); +const JSZip = require('jszip'); +const path = require('path'); + +const should = require('chai').should(); + +const readIdCardAsync = function(idCardName) { + const zip = new JSZip(); + const cardDirectory = __dirname + '/data/id-cards/' + idCardName; + const cardRootIndex = cardDirectory.length + 1; + const visitor = new DirectoryVisitor(cardDirectory, (filename) => { + const relativeFilename = filename.slice(cardRootIndex); + const fileData = fs.readFileSync(filename); + zip.file(relativeFilename, fileData); + }); + visitor.visit(); + return zip.generateAsync({ type: 'nodebuffer' }); +}; + +/** + * Helper class that recursively walks a given directory and invoking a callback for each file. + */ +class DirectoryVisitor { + /** + * Constructor. + * @param {String} dirname - directory name. + * @param {Function} callback - callback function with filename parameter. + */ + constructor(dirname, callback) { + this.dirname = dirname; + this.callback = callback; + } + + /** + * Walk the directory structure, invoking the callback for each file. + */ + visit() { + fs.readdirSync(this.dirname).forEach(filename => this.visitDirectoryEntry(filename)); + } + + /** + * Handle a directory entry. + * @param {String} entryName - directory entry name; either a file or sub-directory. + */ + visitDirectoryEntry(entryName) { + const entryPath = path.resolve(this.dirname, entryName); + const stat = fs.statSync(entryPath); + if (stat.isDirectory()) { + const subDirVisitor = new DirectoryVisitor(entryPath, this.callback); + subDirVisitor.visit(); + } else { + this.callback(entryPath); + } + } +} + +describe('IdCard', function() { + describe('#fromArchive', function() { + it('should load a minimal card file without error', function() { + return readIdCardAsync('minimal').then((readBuffer) => { + return IdCard.fromArchive(readBuffer); + }).then((card) => { + card.should.be.an.instanceof(IdCard); + }); + }); + + it('should throw error on missing connection.json', function() { + return readIdCardAsync('missing-connection').then((readBuffer) => { + return IdCard.fromArchive(readBuffer).then(function resolved(card) { + throw Error('Card loaded without error'); + }, function rejected(error) { + error.message.should.include('connection.json'); + }); + }); + }); + + it('should throw error on missing metadata.json', function() { + return readIdCardAsync('missing-metadata').then((readBuffer) => { + return IdCard.fromArchive(readBuffer).then(function resolved(card) { + throw Error('Card loaded without error'); + }, function rejected(error) { + error.message.should.include('metadata.json'); + }); + }); + }); + + it('should throw error on missing name field in metadata', function() { + return readIdCardAsync('missing-metadata-name').then((readBuffer) => { + return IdCard.fromArchive(readBuffer).then(function resolved(card) { + throw Error('Card loaded without error'); + }, function rejected(error) { + error.message.should.include('name'); + }); + }); + }); + + it('should throw error on invalid image field in metadata', function() { + return readIdCardAsync('invalid-metadata-image').then((readBuffer) => { + return IdCard.fromArchive(readBuffer).then(function resolved(card) { + throw Error('Card loaded without error'); + }, function rejected(error) { + error.message.should.include('NON_EXISTENT_IMAGE_FILENAME'); + }); + }); + }); + + it('should load all metadata', function() { + return readIdCardAsync('valid').then((readBuffer) => { + return IdCard.fromArchive(readBuffer); + }).then((card) => { + card.getName().should.equal('com.example.cards.Dan'); + card.getDescription().should.equal('Dan\'s Card for Production Network'); + card.getBusinessNetwork().should.equal('org-acme-biznet'); + card.getImage().should.exist; + }); + }); + + it('should load connection details', function() { + return readIdCardAsync('valid').then((readBuffer) => { + return IdCard.fromArchive(readBuffer); + }).then((card) => { + card.getConnection().should.be.an('Object'); + }); + }); + + it('should load an image named in metadata.json', function() { + return readIdCardAsync('valid').then((readBuffer) => { + return IdCard.fromArchive(readBuffer); + }).then((card) => { + const image = card.getImage(); + image.name.should.be.a('String'); + image.data.should.be.an.instanceof(Buffer); + }); + }); + + it('should refer to an image by short filename', function() { + return readIdCardAsync('valid').then((readBuffer) => { + return IdCard.fromArchive(readBuffer); + }).then((card) => { + const image = card.getImage(); + image.name.should.equal('conga.png'); + }); + }); + + it('should have an undefined image field if no image specified in metadata.json', function() { + return readIdCardAsync('minimal').then((readBuffer) => { + return IdCard.fromArchive(readBuffer); + }).then((card) => { + should.equal(card.getImage(), undefined); + }); + }); + + it('should load credentials', function() { + return readIdCardAsync('valid').then((readBuffer) => { + return IdCard.fromArchive(readBuffer); + }).then((card) => { + const credentials = card.getCredentials(); + credentials.should.be.an.instanceof(Map); + credentials.size.should.equal(6); + credentials.get('PeerAdmin').should.be.an.instanceof(Buffer); + }); + }); + + it('should load tlscerts', function() { + return readIdCardAsync('valid').then((readBuffer) => { + return IdCard.fromArchive(readBuffer); + }).then((card) => { + const tlscerts = card.getTlsCertificates(); + tlscerts.should.be.an.instanceof(Map); + tlscerts.size.should.equal(3); + tlscerts.get('ca.crt').should.be.an.instanceof(Buffer); + }); + }); + + }); +}); \ No newline at end of file diff --git a/packages/composer-connector-embedded/package.json b/packages/composer-connector-embedded/package.json index 83acfc466e..3793132227 100644 --- a/packages/composer-connector-embedded/package.json +++ b/packages/composer-connector-embedded/package.json @@ -1,6 +1,6 @@ { "name": "composer-connector-embedded", - "version": "0.9.2", + "version": "0.10.1", "description": "The embedded client connector for Hyperledger Composer", "engines": { "node": ">=6", @@ -52,9 +52,9 @@ "watchify": "^3.7.0" }, "dependencies": { - "composer-common": "^0.9.2", - "composer-runtime": "^0.9.2", - "composer-runtime-embedded": "^0.9.2" + "composer-common": "^0.10.1", + "composer-runtime": "^0.10.1", + "composer-runtime-embedded": "^0.10.1" }, "nyc": { "exclude": [ diff --git a/packages/composer-connector-hlf/package.json b/packages/composer-connector-hlf/package.json index ce7f76d1e2..983e85147c 100644 --- a/packages/composer-connector-hlf/package.json +++ b/packages/composer-connector-hlf/package.json @@ -1,6 +1,6 @@ { "name": "composer-connector-hlf", - "version": "0.9.2", + "version": "0.10.1", "description": "The Hyperledger Fabric Client connector for Hyperledger Composer", "engines": { "node": ">=6", @@ -40,8 +40,8 @@ "logError": true }, "dependencies": { - "composer-common": "^0.9.2", - "composer-runtime-hlf": "^0.9.2", + "composer-common": "^0.10.1", + "composer-runtime-hlf": "^0.10.1", "fs-extra": "^1.0.0", "hfc": "^0.6.5", "semver": "^5.3.0", diff --git a/packages/composer-connector-hlfv1/package.json b/packages/composer-connector-hlfv1/package.json index bbb882f555..a391d4dd62 100644 --- a/packages/composer-connector-hlfv1/package.json +++ b/packages/composer-connector-hlfv1/package.json @@ -1,6 +1,6 @@ { "name": "composer-connector-hlfv1", - "version": "0.9.2", + "version": "0.10.1", "description": "The Hyperledger Fabric v1.x Client connector for Hyperledger Composer", "engines": { "node": ">=6", @@ -40,8 +40,8 @@ "logError": true }, "dependencies": { - "composer-common": "^0.9.2", - "composer-runtime-hlfv1": "^0.9.2", + "composer-common": "^0.10.1", + "composer-runtime-hlfv1": "^0.10.1", "fabric-ca-client": "^1.0.0", "fabric-client": "^1.0.0", "fs-extra": "^1.0.0", diff --git a/packages/composer-connector-proxy/package.json b/packages/composer-connector-proxy/package.json index 050cd45120..f9242ef45d 100644 --- a/packages/composer-connector-proxy/package.json +++ b/packages/composer-connector-proxy/package.json @@ -1,6 +1,6 @@ { "name": "composer-connector-proxy", - "version": "0.9.2", + "version": "0.10.1", "description": "The proxying client connector for Hyperledger Composer", "engines": { "node": ">=6", @@ -54,7 +54,7 @@ "watchify": "^3.7.0" }, "dependencies": { - "composer-common": "^0.9.2", + "composer-common": "^0.10.1", "socket.io-client": "^1.7.3" }, "nyc": { diff --git a/packages/composer-connector-server/package.json b/packages/composer-connector-server/package.json index 8a18522ed6..d3676fa2e4 100644 --- a/packages/composer-connector-server/package.json +++ b/packages/composer-connector-server/package.json @@ -1,6 +1,6 @@ { "name": "composer-connector-server", - "version": "0.9.2", + "version": "0.10.1", "description": "The remote connector server for Hyperledger Composer", "engines": { "node": ">=6", @@ -44,10 +44,10 @@ "logError": true }, "dependencies": { - "composer-common": "^0.9.2", - "composer-connector-embedded": "^0.9.2", - "composer-connector-hlf": "^0.9.2", - "composer-connector-hlfv1": "^0.9.2", + "composer-common": "^0.10.1", + "composer-connector-embedded": "^0.10.1", + "composer-connector-hlf": "^0.10.1", + "composer-connector-hlfv1": "^0.10.1", "serializerr": "^1.0.3", "socket.io": "^1.7.3", "uuid": "^3.0.1", diff --git a/packages/composer-connector-web/package.json b/packages/composer-connector-web/package.json index 0b90569753..38505fa142 100644 --- a/packages/composer-connector-web/package.json +++ b/packages/composer-connector-web/package.json @@ -1,6 +1,6 @@ { "name": "composer-connector-web", - "version": "0.9.2", + "version": "0.10.1", "description": "The web client connector for Hyperledger Composer", "engines": { "node": ">=6", @@ -62,9 +62,9 @@ "watchify": "^3.7.0" }, "dependencies": { - "composer-common": "^0.9.2", - "composer-runtime": "^0.9.2", - "composer-runtime-web": "^0.9.2", + "composer-common": "^0.10.1", + "composer-runtime": "^0.10.1", + "composer-runtime-web": "^0.10.1", "uuid": "^3.0.1" } } diff --git a/packages/composer-cucumber-steps/package.json b/packages/composer-cucumber-steps/package.json index 96f1bc642b..e8b421d914 100644 --- a/packages/composer-cucumber-steps/package.json +++ b/packages/composer-cucumber-steps/package.json @@ -1,6 +1,6 @@ { "name": "composer-cucumber-steps", - "version": "0.9.2", + "version": "0.10.1", "description": "A library of Cucumber steps for testing Hyperledger Composer", "main": "index.js", "scripts": { @@ -70,10 +70,10 @@ "dependencies": { "browserfs": "^1.1.0", "chai": "^3.5.0", - "composer-admin": "^0.9.2", - "composer-client": "^0.9.2", - "composer-common": "^0.9.2", - "composer-connector-embedded": "^0.9.2", + "composer-admin": "^0.10.1", + "composer-client": "^0.10.1", + "composer-common": "^0.10.1", + "composer-connector-embedded": "^0.10.1", "thenify-all": "^1.6.0" } } diff --git a/packages/composer-playground-api/package.json b/packages/composer-playground-api/package.json index 29d07b98d8..d8b8bb2de0 100644 --- a/packages/composer-playground-api/package.json +++ b/packages/composer-playground-api/package.json @@ -1,6 +1,6 @@ { "name": "composer-playground-api", - "version": "0.9.2", + "version": "0.10.1", "description": "The REST API for the Hyperledger Composer Playground", "engines": { "node": ">=6", @@ -58,8 +58,8 @@ "dependencies": { "async": "^2.5.0", "body-parser": "^1.17.0", - "composer-common": "^0.9.2", - "composer-connector-server": "^0.9.2", + "composer-common": "^0.10.1", + "composer-connector-server": "^0.10.1", "dotenv": "^4.0.0", "express": "^4.15.2", "http-status": "^1.0.1", diff --git a/packages/composer-playground/package.json b/packages/composer-playground/package.json index a869d60663..cd2536a4b4 100644 --- a/packages/composer-playground/package.json +++ b/packages/composer-playground/package.json @@ -1,6 +1,6 @@ { "name": "composer-playground", - "version": "0.9.2", + "version": "0.10.1", "description": "A test harness/UI for the web runtime container for Hyperledger Composer", "engines": { "node": ">=6", @@ -77,8 +77,8 @@ "dependencies": { "@ng-bootstrap/ng-bootstrap": "1.0.0-alpha.24", "cheerio": "^0.22.0", - "composer-common": "^0.9.2", - "composer-playground-api": "^0.9.2", + "composer-common": "^0.10.1", + "composer-playground-api": "^0.10.1", "express": "^4.15.2", "fast-json-patch": "^1.1.8", "file-saver": "^1.3.3", @@ -133,12 +133,12 @@ "chai": "^3.5.0", "codelyzer": "^2.0.1", "codemirror": "5.26.0", - "composer-admin": "^0.9.2", - "composer-client": "^0.9.2", - "composer-connector-proxy": "^0.9.2", - "composer-connector-web": "^0.9.2", - "composer-runtime": "^0.9.2", - "composer-runtime-web": "^0.9.2", + "composer-admin": "^0.10.1", + "composer-client": "^0.10.1", + "composer-connector-proxy": "^0.10.1", + "composer-connector-web": "^0.10.1", + "composer-runtime": "^0.10.1", + "composer-runtime-web": "^0.10.1", "copy-webpack-plugin": "^4.0.1", "core-js": "^2.4.1", "css-loader": "^0.26.1", diff --git a/packages/composer-rest-server/package.json b/packages/composer-rest-server/package.json index 119ac0cad7..fd0637d076 100644 --- a/packages/composer-rest-server/package.json +++ b/packages/composer-rest-server/package.json @@ -1,6 +1,6 @@ { "name": "composer-rest-server", - "version": "0.9.2", + "version": "0.10.1", "description": "Hyperledger Composer REST server that uses the Hyperledger Composer LoopBack connector", "engines": { "node": ">=6", @@ -36,7 +36,7 @@ "chalk": "^1.1.3", "clear": "0.0.1", "clui": "^0.3.1", - "composer-common": "^0.9.2", + "composer-common": "^0.10.1", "compression": "^1.0.3", "connect-ensure-login": "^0.1.1", "cookie-parser": "^1.4.3", @@ -52,7 +52,7 @@ "loopback-boot": "^2.23.0", "loopback-component-explorer": "^4.1.1", "loopback-component-passport": "^3.2.0", - "loopback-connector-composer": "^0.9.2", + "loopback-connector-composer": "^0.10.1", "passport-local": "^1.0.0", "serve-favicon": "^2.0.1", "strong-error-handler": "^1.0.1", @@ -64,9 +64,9 @@ "chai-as-promised": "^6.0.0", "chai-http": "^3.0.0", "clone": "^2.1.1", - "composer-admin": "^0.9.2", - "composer-client": "^0.9.2", - "composer-connector-embedded": "^0.9.2", + "composer-admin": "^0.10.1", + "composer-client": "^0.10.1", + "composer-connector-embedded": "^0.10.1", "eslint": "^3.17.1", "jsdoc": "^3.4.3", "license-check": "^1.1.5", diff --git a/packages/composer-runtime-embedded/package.json b/packages/composer-runtime-embedded/package.json index 2ee4eba539..6fc86aede0 100644 --- a/packages/composer-runtime-embedded/package.json +++ b/packages/composer-runtime-embedded/package.json @@ -1,6 +1,6 @@ { "name": "composer-runtime-embedded", - "version": "0.9.2", + "version": "0.10.1", "description": "The embedded runtime container for Hyperledger Composer", "engines": { "node": ">=6", @@ -52,9 +52,9 @@ "logError": true }, "dependencies": { - "composer-common": "^0.9.2", - "composer-runtime": "^0.9.2", - "composer-runtime-pouchdb": "^0.9.2", + "composer-common": "^0.10.1", + "composer-runtime": "^0.10.1", + "composer-runtime-pouchdb": "^0.10.1", "debug": "^2.6.2", "istanbul-lib-instrument": "^1.7.2", "pouchdb-adapter-memory": "^6.2.0", diff --git a/packages/composer-runtime-hlf/package.json b/packages/composer-runtime-hlf/package.json index 8c061b9b5e..4149e0885c 100644 --- a/packages/composer-runtime-hlf/package.json +++ b/packages/composer-runtime-hlf/package.json @@ -1,6 +1,6 @@ { "name": "composer-runtime-hlf", - "version": "0.9.2", + "version": "0.10.1", "description": "The Hyperledger Fabric runtime container for Hyperledger Composer", "engines": { "node": ">=6", @@ -28,7 +28,7 @@ "babelify": "^7.3.0", "browserify": "^13.3.0", "browserify-replace": "^0.9.0", - "composer-runtime": "^0.9.2", + "composer-runtime": "^0.10.1", "exorcist": "^0.4.0", "fs-extra": "^1.0.0", "uglify-js": "2.7.5" diff --git a/packages/composer-runtime-hlfv1/package.json b/packages/composer-runtime-hlfv1/package.json index 68e8cb2223..13251ee153 100644 --- a/packages/composer-runtime-hlfv1/package.json +++ b/packages/composer-runtime-hlfv1/package.json @@ -1,6 +1,6 @@ { "name": "composer-runtime-hlfv1", - "version": "0.9.2", + "version": "0.10.1", "description": "The Hyperledger Fabric v1.x runtime container for Hyperledger Composer", "engines": { "node": ">=6", @@ -28,7 +28,7 @@ "babelify": "^7.3.0", "browserify": "^13.3.0", "browserify-replace": "^0.9.0", - "composer-runtime": "^0.9.2", + "composer-runtime": "^0.10.1", "exorcist": "^0.4.0", "fs-extra": "^1.0.0", "uglify-js": "2.7.5" diff --git a/packages/composer-runtime-pouchdb/package.json b/packages/composer-runtime-pouchdb/package.json index d055718d82..224e7ec4b6 100644 --- a/packages/composer-runtime-pouchdb/package.json +++ b/packages/composer-runtime-pouchdb/package.json @@ -1,6 +1,6 @@ { "name": "composer-runtime-pouchdb", - "version": "0.9.2", + "version": "0.10.1", "description": "Common PouchDB based runtime container code for Hyperledger Composer", "engines": { "node": ">=6", @@ -52,8 +52,8 @@ "logError": true }, "dependencies": { - "composer-common": "^0.9.2", - "composer-runtime": "^0.9.2", + "composer-common": "^0.10.1", + "composer-runtime": "^0.10.1", "debug": "^2.6.2", "istanbul-lib-instrument": "^1.7.2", "pouchdb-collate": "^6.2.0", diff --git a/packages/composer-runtime-web/package.json b/packages/composer-runtime-web/package.json index 3865735506..7688f33e58 100644 --- a/packages/composer-runtime-web/package.json +++ b/packages/composer-runtime-web/package.json @@ -1,6 +1,6 @@ { "name": "composer-runtime-web", - "version": "0.9.2", + "version": "0.10.1", "description": "The web runtime container for Hyperledger Composer", "engines": { "node": ">=6", @@ -62,9 +62,9 @@ "logError": true }, "dependencies": { - "composer-common": "^0.9.2", - "composer-runtime": "^0.9.2", - "composer-runtime-pouchdb": "^0.9.2", + "composer-common": "^0.10.1", + "composer-runtime": "^0.10.1", + "composer-runtime-pouchdb": "^0.10.1", "pouchdb-adapter-idb": "^6.2.0", "pouchdb-adapter-websql": "^6.2.0", "uuid": "^3.0.1", diff --git a/packages/composer-runtime/package.json b/packages/composer-runtime/package.json index 767bb80026..c9b3af634b 100644 --- a/packages/composer-runtime/package.json +++ b/packages/composer-runtime/package.json @@ -1,6 +1,6 @@ { "name": "composer-runtime", - "version": "0.9.2", + "version": "0.10.1", "description": "The runtime execution environment for Hyperledger Composer", "engines": { "node": ">=6", @@ -62,7 +62,7 @@ "logError": true }, "dependencies": { - "composer-common": "^0.9.2", + "composer-common": "^0.10.1", "debug": "^2.6.2", "fast-json-patch": "^1.1.8", "jsonata": "^1.2.2", diff --git a/packages/composer-systests/package.json b/packages/composer-systests/package.json index 5eae127d61..7b27441662 100644 --- a/packages/composer-systests/package.json +++ b/packages/composer-systests/package.json @@ -1,6 +1,6 @@ { "name": "composer-systests", - "version": "0.9.2", + "version": "0.10.1", "private": true, "description": "System tests and automation for Hyperledger Composer", "engines": { @@ -42,13 +42,13 @@ "chai": "^3.5.0", "chai-as-promised": "^6.0.0", "chai-subset": "^1.3.0", - "composer-admin": "^0.9.2", - "composer-client": "^0.9.2", - "composer-common": "^0.9.2", - "composer-connector-embedded": "^0.9.2", - "composer-connector-proxy": "^0.9.2", - "composer-connector-server": "^0.9.2", - "composer-connector-web": "^0.9.2", + "composer-admin": "^0.10.1", + "composer-client": "^0.10.1", + "composer-common": "^0.10.1", + "composer-connector-embedded": "^0.10.1", + "composer-connector-proxy": "^0.10.1", + "composer-connector-server": "^0.10.1", + "composer-connector-web": "^0.10.1", "eslint": "^3.17.1", "homedir": "^0.6.0", "karma": "^1.3.0", diff --git a/packages/composer-website/package.json b/packages/composer-website/package.json index 7db5815bb9..3b94e5f755 100644 --- a/packages/composer-website/package.json +++ b/packages/composer-website/package.json @@ -1,6 +1,6 @@ { "name": "composer-website", - "version": "0.9.2", + "version": "0.10.1", "private": true, "description": "Hyperledger Composer is a blockchain development framework for Hyperledger Fabric: a library of assets/functions for creating blockchain-based applications.", "engines": { @@ -30,10 +30,10 @@ "author": "Hyperledger Composer", "license": "Apache-2.0", "devDependencies": { - "composer-admin": "^0.9.2", - "composer-client": "^0.9.2", - "composer-common": "^0.9.2", - "composer-runtime": "^0.9.2", + "composer-admin": "^0.10.1", + "composer-client": "^0.10.1", + "composer-common": "^0.10.1", + "composer-runtime": "^0.10.1", "jsdoc": "^3.4.3", "node-plantuml": "^0.5.0", "sanitize-html": "^1.14.1" diff --git a/packages/generator-hyperledger-composer/package.json b/packages/generator-hyperledger-composer/package.json index 584fa4b753..ce6a5c86af 100755 --- a/packages/generator-hyperledger-composer/package.json +++ b/packages/generator-hyperledger-composer/package.json @@ -1,6 +1,6 @@ { "name": "generator-hyperledger-composer", - "version": "0.9.2", + "version": "0.10.1", "description": "Generates projects from Hyperledger Composer business network definitions", "engines": { "node": ">=6", @@ -15,8 +15,8 @@ "liveNetworkTest": "mocha -t 0 test/angular-network.js" }, "dependencies": { - "composer-client": "^0.9.2", - "composer-common": "^0.9.2", + "composer-client": "^0.10.1", + "composer-common": "^0.10.1", "shelljs": "^0.7.7", "underscore.string": "^3.3.4", "yeoman-generator": "^0.24.1" @@ -29,8 +29,8 @@ "license": "Apache-2.0", "devDependencies": { "@angular/cli": "^1.0.0-rc.0", - "composer-admin": "^0.9.2", - "composer-connector-embedded": "^0.9.2", + "composer-admin": "^0.10.1", + "composer-connector-embedded": "^0.10.1", "mocha": "^3.4.2", "typings": "^2.1.0", "yeoman-assert": "^3.0.0", diff --git a/packages/loopback-connector-composer/package.json b/packages/loopback-connector-composer/package.json index aa09d11610..8d0d2ff0d3 100644 --- a/packages/loopback-connector-composer/package.json +++ b/packages/loopback-connector-composer/package.json @@ -1,6 +1,6 @@ { "name": "loopback-connector-composer", - "version": "0.9.2", + "version": "0.10.1", "description": "A Loopback connector for Hyperledger Composer", "engines": { "node": ">=6", @@ -26,8 +26,8 @@ "author": "Hyperledger Composer", "license": "Apache-2.0", "dependencies": { - "composer-client": "^0.9.2", - "composer-common": "^0.9.2", + "composer-client": "^0.10.1", + "composer-common": "^0.10.1", "loopback": "^3.4.0", "loopback-connector": "^4.0.0", "node-cache": "^4.1.1" @@ -35,8 +35,8 @@ "devDependencies": { "chai": "^3.5.0", "chai-as-promised": "^6.0.0", - "composer-admin": "^0.9.2", - "composer-connector-embedded": "^0.9.2", + "composer-admin": "^0.10.1", + "composer-connector-embedded": "^0.10.1", "eslint": "^3.17.1", "jsdoc": "^3.4.3", "license-check": "^1.1.5",