From 43604c5a51b1ee7b110eeeb22475021190b13c9d Mon Sep 17 00:00:00 2001 From: James Taylor Date: Mon, 24 Jul 2017 14:44:01 +0100 Subject: [PATCH 1/2] Bump version to match master Signed-off-by: James Taylor --- lerna.json | 2 +- package.json | 2 +- packages/composer-admin/package.json | 8 ++++---- packages/composer-cli/package.json | 10 +++++----- packages/composer-client/package.json | 8 ++++---- packages/composer-common/package.json | 2 +- .../composer-connector-embedded/package.json | 8 ++++---- packages/composer-connector-hlf/package.json | 6 +++--- packages/composer-connector-hlfv1/package.json | 6 +++--- packages/composer-connector-proxy/package.json | 4 ++-- .../composer-connector-server/package.json | 10 +++++----- packages/composer-connector-web/package.json | 8 ++++---- packages/composer-cucumber-steps/package.json | 10 +++++----- packages/composer-playground-api/package.json | 6 +++--- packages/composer-playground/package.json | 18 +++++++++--------- packages/composer-rest-server/package.json | 12 ++++++------ .../composer-runtime-embedded/package.json | 8 ++++---- packages/composer-runtime-hlf/package.json | 4 ++-- packages/composer-runtime-hlfv1/package.json | 4 ++-- packages/composer-runtime-pouchdb/package.json | 6 +++--- packages/composer-runtime-web/package.json | 8 ++++---- packages/composer-runtime/package.json | 4 ++-- packages/composer-systests/package.json | 16 ++++++++-------- packages/composer-website/package.json | 10 +++++----- .../package.json | 10 +++++----- .../loopback-connector-composer/package.json | 10 +++++----- 26 files changed, 100 insertions(+), 100 deletions(-) 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/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-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", From 7d5c3347ca272b35b1dcda6ee4220785f5e0e6a9 Mon Sep 17 00:00:00 2001 From: "Mark S. Lewis" Date: Mon, 24 Jul 2017 10:51:36 +0100 Subject: [PATCH 2/2] Add IdCard to composer-common package (#1415) (#1641) Signed-off-by: Mark S. Lewis --- packages/composer-common/api.txt | 10 + packages/composer-common/changelog.txt | 3 + packages/composer-common/lib/idcard.js | 207 ++++++++++++++++++ .../invalid-metadata-image/connection.json | 38 ++++ .../invalid-metadata-image/metadata.json | 4 + .../data/id-cards/minimal/connection.json | 38 ++++ .../test/data/id-cards/minimal/metadata.json | 3 + .../id-cards/missing-connection/metadata.json | 3 + .../missing-metadata-name/connection.json | 38 ++++ .../missing-metadata-name/metadata.json | 2 + .../id-cards/missing-metadata/connection.json | 38 ++++ .../test/data/id-cards/valid/connection.json | 38 ++++ ...8c9423e31568da0c340ca187a9b17aa9a4457-priv | 5 + ...b8c9423e31568da0c340ca187a9b17aa9a4457-pub | 4 + ...bed90e43e2276f0ed204e26233f906803b6ef-priv | 5 + ...0bed90e43e2276f0ed204e26233f906803b6ef-pub | 4 + .../data/id-cards/valid/credentials/PeerAdmin | 1 + .../data/id-cards/valid/credentials/admin | 1 + .../test/data/id-cards/valid/images/conga.png | Bin 0 -> 13483 bytes .../test/data/id-cards/valid/metadata.json | 6 + .../test/data/id-cards/valid/tlscerts/ca.crt | 15 ++ .../data/id-cards/valid/tlscerts/server.crt | 14 ++ .../data/id-cards/valid/tlscerts/server.key | 5 + packages/composer-common/test/idcard.js | 193 ++++++++++++++++ 24 files changed, 675 insertions(+) create mode 100644 packages/composer-common/lib/idcard.js create mode 100644 packages/composer-common/test/data/id-cards/invalid-metadata-image/connection.json create mode 100644 packages/composer-common/test/data/id-cards/invalid-metadata-image/metadata.json create mode 100644 packages/composer-common/test/data/id-cards/minimal/connection.json create mode 100644 packages/composer-common/test/data/id-cards/minimal/metadata.json create mode 100644 packages/composer-common/test/data/id-cards/missing-connection/metadata.json create mode 100644 packages/composer-common/test/data/id-cards/missing-metadata-name/connection.json create mode 100644 packages/composer-common/test/data/id-cards/missing-metadata-name/metadata.json create mode 100644 packages/composer-common/test/data/id-cards/missing-metadata/connection.json create mode 100644 packages/composer-common/test/data/id-cards/valid/connection.json create mode 100644 packages/composer-common/test/data/id-cards/valid/credentials/114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457-priv create mode 100644 packages/composer-common/test/data/id-cards/valid/credentials/114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457-pub create mode 100644 packages/composer-common/test/data/id-cards/valid/credentials/299acf40adb20268d13881833a0bed90e43e2276f0ed204e26233f906803b6ef-priv create mode 100644 packages/composer-common/test/data/id-cards/valid/credentials/299acf40adb20268d13881833a0bed90e43e2276f0ed204e26233f906803b6ef-pub create mode 100644 packages/composer-common/test/data/id-cards/valid/credentials/PeerAdmin create mode 100644 packages/composer-common/test/data/id-cards/valid/credentials/admin create mode 100644 packages/composer-common/test/data/id-cards/valid/images/conga.png create mode 100644 packages/composer-common/test/data/id-cards/valid/metadata.json create mode 100644 packages/composer-common/test/data/id-cards/valid/tlscerts/ca.crt create mode 100644 packages/composer-common/test/data/id-cards/valid/tlscerts/server.crt create mode 100755 packages/composer-common/test/data/id-cards/valid/tlscerts/server.key create mode 100644 packages/composer-common/test/idcard.js 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/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 0000000000000000000000000000000000000000..775c1ef8898ad4c3690721971b58ae2d897898ed GIT binary patch literal 13483 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 NEUzwCE@K|@{{f0k+T{QM literal 0 HcmV?d00001 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