From 94f32d6f1754d0f27207574a811b463570061996 Mon Sep 17 00:00:00 2001 From: Stanley Jones <49165812+stanleygjones@users.noreply.github.com> Date: Fri, 10 Apr 2020 13:22:05 -0700 Subject: [PATCH] Update: Use seed script to populate profiles (#25) * Update: Use seed script to populate profiles * Fix: keypair will always exist * Fix: pull more from dfx.json * Fix: pull more from dfx.json * Build: Security fixes --- dfx.json | 42 +++++++------- package-lock.json | 141 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 56 +++++++++--------- scripts/data.json | 47 ++++++++++++++++ scripts/seed.js | 74 ++++++++++++++++++++++++ 5 files changed, 301 insertions(+), 59 deletions(-) create mode 100644 scripts/data.json create mode 100644 scripts/seed.js diff --git a/dfx.json b/dfx.json index 434ac12..0a9c724 100644 --- a/dfx.json +++ b/dfx.json @@ -1,26 +1,24 @@ { - "canisters": { - "connectd": { - "main": "src/connectd/main.mo" - }, - "linkedup": { - "main": "src/linkedup/main.mo", - "frontend": { - "entrypoint": "src/linkedup/public/main.js", - "assets": [ - "src/linkedup/public/*.html", - "src/linkedup/public/*.css" - ] - } - } + "canisters": { + "connectd": { + "main": "src/connectd/main.mo" }, - "defaults": { - "build": { - "output": "canisters" - }, - "start": { - "address": "127.0.0.1", - "port": 8000 - } + "linkedup": { + "main": "src/linkedup/main.mo", + "frontend": { + "entrypoint": "src/linkedup/public/main.js", + "assets": ["src/linkedup/public/*.html", "src/linkedup/public/*.css"] + } } + }, + "defaults": { + "build": { + "output": "canisters" + }, + "start": { + "address": "127.0.0.1", + "port": 8000 + } + }, + "dfx": "0.5.5" } diff --git a/package-lock.json b/package-lock.json index 13e424b..cb33792 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,41 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@peculiar/asn1-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-1.0.5.tgz", + "integrity": "sha512-rzzorGYnQNmVHleLvC8gJSbbdNYtg+EB9s075dHvwpxs10teXHYnRmTWhCVuWjbSVSofwdm7IYPtMTWTbcNUWA==", + "dev": true, + "requires": { + "asn1js": "^2.0.26", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + } + } + }, + "@peculiar/json-schema": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.10.tgz", + "integrity": "sha512-kbpnG9CkF1y6wwGkW7YtSA+yYK4X5uk4rAwsd1hxiaYE3Hkw2EsGlbGh/COkMLyFf+Fe830BoFiMSB3QnC/ItA==", + "dev": true, + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + } + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -326,6 +361,15 @@ "minimalistic-assert": "^1.0.0" } }, + "asn1js": { + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.26.tgz", + "integrity": "sha512-yG89F0j9B4B0MKIcFyWWxnpZPLaNTjCj4tkE3fjbAoo0qmpGw0PYYqSbX/4ebnd9Icn8ZgK4K1fvDyEtW1JYtQ==", + "dev": true, + "requires": { + "pvutils": "^1.0.17" + } + }, "assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", @@ -453,7 +497,6 @@ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, - "optional": true, "requires": { "file-uri-to-path": "1.0.0" } @@ -1012,9 +1055,9 @@ } }, "css-loader": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.1.tgz", - "integrity": "sha512-0G4CbcZzQ9D1Q6ndOfjFuMDo8uLYMu5vc9Abs5ztyHcKvmil6GJrMiNjzzi3tQvUF+mVRuDg7bE6Oc0Prolgig==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.2.tgz", + "integrity": "sha512-hDL0DPopg6zQQSRlZm0hyeaqIRnL0wbWjay9BZxoiJBpbfOW4WHfbaYQhwnDmEa0kZUc1CJ3IFo15ot1yULMIQ==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -1468,8 +1511,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true + "dev": true }, "fill-range": { "version": "4.0.0", @@ -2709,9 +2751,9 @@ } }, "jquery": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", - "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", + "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==" }, "json-parse-better-errors": { "version": "1.0.2", @@ -3039,8 +3081,7 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true + "dev": true }, "nanomatch": { "version": "1.2.13", @@ -3073,6 +3114,21 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-crc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-crc/-/node-crc-1.3.0.tgz", + "integrity": "sha512-XSs9gZhZKdiwpJDLSoRQsnn8N9q/KH4bc0ayO6+qnHbtb1YfIrdKfjbOQFCwup4q/D2sNxhbupvrZ3rWmzAk4A==", + "dev": true, + "requires": { + "bindings": "^1.3.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true + }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -3112,6 +3168,33 @@ } } }, + "node-webcrypto-ossl": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-webcrypto-ossl/-/node-webcrypto-ossl-2.0.1.tgz", + "integrity": "sha512-ZUrA7mSNtwMOJGLnqoCbVM6huN0PAdtdB6pTeeycDp3rwET29q+xbUzbazrWpTO8Xli+twqLkExDi9B6gDnn7A==", + "dev": true, + "requires": { + "mkdirp": "^1.0.3", + "nan": "^2.14.0", + "pvtsutils": "^1.0.10", + "tslib": "^1.11.1", + "webcrypto-core": "^1.0.18" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3523,6 +3606,21 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "pvtsutils": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.0.10.tgz", + "integrity": "sha512-8ZKQcxnZKTn+fpDh7wL4yKax5fdl3UJzT8Jv49djZpB/dzPxacyN1Sez90b6YLdOmvIr9vaySJ5gw4aUA1EdSw==", + "dev": true, + "requires": { + "tslib": "^1.10.0" + } + }, + "pvutils": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", + "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==", + "dev": true + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -4458,6 +4556,27 @@ "neo-async": "^2.5.0" } }, + "webcrypto-core": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.0.19.tgz", + "integrity": "sha512-6XHExtfMJrpkFDh9MiJ/y7ptX0dfZi0ogxFyelqxMu1eFowxivHfIp6DKzT+ZjU66xTuNfJkfkUk1bIB3tEOgA==", + "dev": true, + "requires": { + "@peculiar/asn1-schema": "^1.0.5", + "@peculiar/json-schema": "^1.1.10", + "asn1js": "^2.0.26", + "pvtsutils": "^1.0.10", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + } + } + }, "webpack": { "version": "4.41.3", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.3.tgz", diff --git a/package.json b/package.json index 55c5ff5..cc646e6 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,32 @@ { - "author": "Enzo Haussecker", - "dependencies": { - "animate.css": "^3.7.2", - "bootstrap": "^4.4.1", - "copy-webpack-plugin": "^5.1.1", - "font-awesome": "^4.7.0", - "jquery": "^3.4.1", - "popper.js": "^1.16.1", - "showdown": "^1.9.1", - "tweetnacl": "^1.0.3", - "typed.js": "^2.0.11", - "wowjs": "^1.1.3" - }, - "devDependencies": { - "css-loader": "^3.5.1", - "style-loader": "^1.1.3", - "terser-webpack-plugin": "2.2.2", - "webpack": "4.41.3", - "webpack-cli": "3.3.10" - }, - "license": "Apache 2.0 with LLVM Exception", - "name": "linkedup", - "scripts": { - "build": "webpack" - }, - "version": "1.0.0" + "author": "Enzo Haussecker", + "dependencies": { + "animate.css": "^3.7.2", + "bootstrap": "^4.4.1", + "copy-webpack-plugin": "^5.1.1", + "font-awesome": "^4.7.0", + "jquery": "^3.5.0", + "popper.js": "^1.16.1", + "showdown": "^1.9.1", + "tweetnacl": "^1.0.3", + "typed.js": "^2.0.11", + "wowjs": "^1.1.3" + }, + "devDependencies": { + "css-loader": "^3.5.2", + "node-crc": "^1.3.0", + "node-fetch": "^2.6.0", + "node-webcrypto-ossl": "^2.0.1", + "style-loader": "^1.1.3", + "terser-webpack-plugin": "2.2.2", + "webpack": "4.41.3", + "webpack-cli": "3.3.10" + }, + "license": "Apache 2.0 with LLVM Exception", + "name": "linkedup", + "scripts": { + "build": "webpack", + "seed": "node scripts/seed" + }, + "version": "1.0.0" } diff --git a/scripts/data.json b/scripts/data.json new file mode 100644 index 0000000..95fb577 --- /dev/null +++ b/scripts/data.json @@ -0,0 +1,47 @@ +[ + { + "firstName": "Dominic", + "lastName": "Williams", + "title": "Founder & Chief Scientist", + "company": "DFINITY", + "experience": "**President & Chief Scientist**, DFINITY \nJan 2015 – Present \nPalo Alto, CA\n\n**President & CTO**, String Labs, Inc \nJun 2015 – Feb 2018 \nPalo Alto, CA", + "education": "**King's College London** \nBA, Computer Science", + "imgUrl": "https://media-exp1.licdn.com/dms/image/C5603AQHdxGV6zMbg-A/profile-displayphoto-shrink_800_800/0?e=1585180800&v=beta&t=Tnsg560fWry_85AVz6MSkeUqOisiSi0e47Hl5T0Yzxk" + }, + { + "firstName": "Diego", + "lastName": "Prats", + "title": "Director of Product", + "company": "DFINITY", + "experience": "**Director of Product**, DFINITY \nMay 2019 – Present \nPalo Alto, CA\n\n**VP Product Engineering**, Overnight \nFeb 2016 – Aug 2018 \nLos Angeles, CA", + "education": "**Harvard University** \nBA, Economics", + "imgUrl": "https://media-exp1.licdn.com/dms/image/C5603AQEsCX2F2XWSAA/profile-displayphoto-shrink_800_800/0?e=1585180800&v=beta&t=fyvnlBegGsbZSiZcWarxNTBRimRk3vfVTHWb8MH-HLU" + }, + { + "firstName": "Jan", + "lastName": "Camenisch", + "title": "VP of Research", + "company": "DFINITY", + "experience": "**VP of Research**, DFINITY \nSep 2018 – Present \nZurich, CH\n\n**Principal Research Staff Member**, IBM Research \nJul 1999 – Aug 2018 \nZurich, CH", + "education": "**ETH Zurich** \nPhD, Computer Science / Cryptography", + "imgUrl": "https://media-exp1.licdn.com/dms/image/C5603AQFQTQN-Vnp7Lw/profile-displayphoto-shrink_800_800/0?e=1585180800&v=beta&t=_riz0HNQ0NlhTeg3iVcoHjo9oeTM87CrmqTj3ASv518" + }, + { + "firstName": "Sanam", + "lastName": "Saaber", + "title": "General Counsel", + "company": "DFINITY", + "experience": "**General Counsel**, DFINITY \nMay 2019 – Present \nPalo Alto, CA\n\n**VP Legal**, Box \nOct 2012 – May 2019", + "education": "**University of California, Davis** \nJD, Law", + "imgUrl": "https://media-exp1.licdn.com/dms/image/C5603AQFLtjzidPnwDQ/profile-displayphoto-shrink_200_200/0?e=1585180800&v=beta&t=bmJEF9yY3J0lcVYlKFs6U57nGCzF69jd6v3P1lHXC1c" + }, + { + "firstName": "Barack", + "lastName": "Obama", + "title": "President (Retired)", + "company": "United States of America", + "experience": "**President**, USA \nJan 2009 – Jan 2017 \nWashington, DC", + "education": "**Harvard University** \nJD, Law", + "imgUrl": "https://media-exp1.licdn.com/dms/image/C4E03AQF2C6iUecWOnQ/profile-displayphoto-shrink_800_800/0?e=1585180800&v=beta&t=HlFVhKOrVV5QK8AMZb_IDNPSi8oExM9lNIqAoTQ5HKo" + } +] diff --git a/scripts/seed.js b/scripts/seed.js new file mode 100644 index 0000000..69ece83 --- /dev/null +++ b/scripts/seed.js @@ -0,0 +1,74 @@ +const fetch = require("node-fetch"); +const fs = require("fs"); +const os = require("os"); +const path = require("path"); +const { crc8 } = require("node-crc"); +const { Crypto } = require("node-webcrypto-ossl"); + +global.crypto = new Crypto(); + +const { defaults, dfx } = require("../dfx.json"); +const DFX_VERSION = dfx; +const DEFAULT_HOST = `http://${defaults.start.address}:${defaults.start.port}`; +const OUTPUT_DIR = defaults.build.output; + +const userLib = require(path.join( + os.homedir(), + "/.cache/dfinity/versions/", + DFX_VERSION, + "/js-user-library/src" +)); +const { + generateKeyPair, + HttpAgent, + makeActorFactory, + makeAuthTransform, + makeNonceTransform, +} = userLib; + +// Main + +const main = async () => { + console.log("Adding profiles..."); + const profiles = require("./data"); + profiles.forEach(async (profile) => { + const linkedup = await getActor("linkedup"); + const userId = await linkedup.create(profile); + console.log("...profile added", userId); + }); +}; + +// Helpers + +const getActor = ( + canisterName, + host = DEFAULT_HOST, + keypair = generateKeyPair() +) => { + const candid = eval(getCandid(canisterName)); + const canisterId = getCanisterId(canisterName); + const httpAgent = new HttpAgent({ fetch, host }); + httpAgent.addTransform(makeNonceTransform()); + httpAgent.addTransform(makeAuthTransform(keypair)); + return makeActorFactory(candid)({ canisterId, httpAgent }); +}; + +const getCanisterPath = (canisterName) => + path.join(__dirname, "..", OUTPUT_DIR, canisterName); + +const getCandid = (canisterName) => + fs + .readFileSync(`${getCanisterPath(canisterName)}/main.did.js`) + .toString() + .replace("export default ", ""); + +const getCanisterId = (canisterName) => { + let id = fs.readFileSync(`${getCanisterPath(canisterName)}/_canister.id`); + return `ic:${format(id)}${format(crc8(id))}`; +}; + +const format = (canisterId) => canisterId.toString("hex").toUpperCase(); + +// Run main() + +main();