diff --git a/package-lock.json b/package-lock.json index ebfd324..f603bc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,8 @@ "@angular/platform-browser-dynamic": "~10.2.0", "@angular/router": "~10.2.0", "@angular/service-worker": "~10.2.0", + "@cicnet/cic-client-meta": "^0.0.11", + "@cicnet/crdt-meta": "^0.0.10", "@cicnet/schemas-data-validator": "*", "@popperjs/core": "^2.5.4", "bootstrap": "^4.5.3", @@ -1974,6 +1976,178 @@ "to-fast-properties": "^2.0.0" } }, + "node_modules/@cicnet/cic-client-meta": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@cicnet/cic-client-meta/-/cic-client-meta-0.0.11.tgz", + "integrity": "sha512-RL9CPXkWQBQzaqMoldnENC/xqinIMyWNSsejs9+qkFOWbAvC4inLdpjjCaooyvLpIZGHF9cLjxHiAdBMR9L8sQ==", + "dependencies": { + "@cicnet/crdt-meta": "^0.0.10", + "@ethereumjs/tx": "^3.0.0-beta.1", + "automerge": "^0.14.1", + "colors": "^1.4.0", + "ethereumjs-wallet": "^1.0.1", + "ini": "^1.3.8", + "openpgp": "^4.10.8", + "pg": "^8.4.2", + "sqlite3": "^5.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "meta-get": "bin/get.js", + "meta-set": "bin/set.js" + }, + "engines": { + "node": ">=14.16.1" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@cicnet/cic-client-meta/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/@cicnet/cic-client-meta/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@cicnet/cic-client-meta/node_modules/yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@cicnet/crdt-meta": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@cicnet/crdt-meta/-/crdt-meta-0.0.10.tgz", + "integrity": "sha512-f+H6BQA2tE718KuNYiNzrDJN4wY00zeuhXM6aPKJUX6nryzX9g2r0yf8iDhkz+Fts1R6M7Riz73MfFEa8fgvsw==", + "dependencies": { + "automerge": "^0.14.2", + "ini": "^1.3.8", + "openpgp": "^4.10.8", + "readline-sync": "^1.4.10" + }, + "engines": { + "node": ">=14.16.1" + } + }, "node_modules/@cicnet/schemas-data-validator": { "version": "1.0.0-alpha.3", "resolved": "https://registry.npmjs.org/@cicnet/schemas-data-validator/-/schemas-data-validator-1.0.0-alpha.3.tgz", @@ -15000,6 +15174,14 @@ "node": ">=8.10.0" } }, + "node_modules/readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -21828,6 +22010,134 @@ "to-fast-properties": "^2.0.0" } }, + "@cicnet/cic-client-meta": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@cicnet/cic-client-meta/-/cic-client-meta-0.0.11.tgz", + "integrity": "sha512-RL9CPXkWQBQzaqMoldnENC/xqinIMyWNSsejs9+qkFOWbAvC4inLdpjjCaooyvLpIZGHF9cLjxHiAdBMR9L8sQ==", + "requires": { + "@cicnet/crdt-meta": "^0.0.10", + "@ethereumjs/tx": "^3.0.0-beta.1", + "automerge": "^0.14.1", + "colors": "^1.4.0", + "ethereumjs-wallet": "^1.0.1", + "ini": "^1.3.8", + "openpgp": "^4.10.8", + "pg": "^8.4.2", + "sqlite3": "^5.0.0", + "yargs": "^16.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" + } + } + }, + "@cicnet/crdt-meta": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@cicnet/crdt-meta/-/crdt-meta-0.0.10.tgz", + "integrity": "sha512-f+H6BQA2tE718KuNYiNzrDJN4wY00zeuhXM6aPKJUX6nryzX9g2r0yf8iDhkz+Fts1R6M7Riz73MfFEa8fgvsw==", + "requires": { + "automerge": "^0.14.2", + "ini": "^1.3.8", + "openpgp": "^4.10.8", + "readline-sync": "^1.4.10" + } + }, "@cicnet/schemas-data-validator": { "version": "1.0.0-alpha.3", "resolved": "https://registry.npmjs.org/@cicnet/schemas-data-validator/-/schemas-data-validator-1.0.0-alpha.3.tgz", @@ -32902,6 +33212,11 @@ "picomatch": "^2.2.1" } }, + "readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==" + }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", diff --git a/package.json b/package.json index 6cbf408..38faef8 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,8 @@ "@angular/platform-browser-dynamic": "~10.2.0", "@angular/router": "~10.2.0", "@angular/service-worker": "~10.2.0", + "@cicnet/cic-client-meta": "^0.0.11", + "@cicnet/crdt-meta": "^0.0.10", "@cicnet/schemas-data-validator": "*", "@popperjs/core": "^2.5.4", "bootstrap": "^4.5.3", @@ -85,5 +87,8 @@ "hooks": { "pre-commit": "pretty-quick --staged & ng lint" } + }, + "browser":{ + "child_process": false } } diff --git a/set-env.ts b/set-env.ts index d53c85c..07bf1c1 100644 --- a/set-env.ts +++ b/set-env.ts @@ -29,7 +29,7 @@ export const environment = { function setConfigs(configs): void { writeFile(targetPath, configs, err => { if (err) { - throw console.error(err); + console.error(err); } else { console.log(colors.green(`Wrote variables to '${targetPath}`)); } diff --git a/src/app/_pgp/index.ts b/src/app/_pgp/index.ts deleted file mode 100644 index 3544957..0000000 --- a/src/app/_pgp/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from '@app/_pgp/pgp-key-store'; -export * from '@app/_pgp/pgp-signer'; diff --git a/src/app/_pgp/pgp-key-store.spec.ts b/src/app/_pgp/pgp-key-store.spec.ts deleted file mode 100644 index d91331c..0000000 --- a/src/app/_pgp/pgp-key-store.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { MutablePgpKeyStore } from '@app/_pgp/pgp-key-store'; - -describe('PgpKeyStore', () => { - it('should create an instance', () => { - expect(new MutablePgpKeyStore()).toBeTruthy(); - }); -}); diff --git a/src/app/_pgp/pgp-key-store.ts b/src/app/_pgp/pgp-key-store.ts deleted file mode 100644 index 51eef35..0000000 --- a/src/app/_pgp/pgp-key-store.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { KeyStore } from 'cic-client-meta'; -// TODO should we put this on the mutable key store object -import * as openpgp from 'openpgp'; -const keyring = new openpgp.Keyring(); - -interface MutableKeyStore extends KeyStore { - loadKeyring(): void; - importKeyPair(publicKey: any, privateKey: any): Promise; - importPublicKey(publicKey: any): void; - importPrivateKey(privateKey: any): Promise; - getPublicKeys(): Array; - getTrustedKeys(): Array; - getTrustedActiveKeys(): Array; - getEncryptKeys(): Array; - getPrivateKeys(): Array; - getPrivateKey(): any; - isValidKey(key: any): Promise; - isEncryptedPrivateKey(privateKey: any): Promise; - getFingerprint(): string; - getKeyId(key: any): string; - getPrivateKeyId(): string; - getKeysForId(keyId: string): Array; - getPublicKeyForId(keyId: string): any; - getPrivateKeyForId(keyId: string): any; - getPublicKeyForSubkeyId(subkeyId: string): any; - getPublicKeysForAddress(address: string): Array; - removeKeysForId(keyId: string): Array; - removePublicKeyForId(keyId: string): any; - removePublicKey(publicKey: any): any; - clearKeysInKeyring(): void; - sign(plainText: string): Promise; -} - -class MutablePgpKeyStore implements MutableKeyStore { - async loadKeyring(): Promise { - await keyring.load(); - await keyring.store(); - } - - async importKeyPair(publicKey: any, privateKey: any): Promise { - await keyring.publicKeys.importKey(publicKey); - await keyring.privateKeys.importKey(privateKey); - } - - importPublicKey(publicKey: any): void { - keyring.publicKeys.importKey(publicKey); - } - - async importPrivateKey(privateKey: any): Promise { - await keyring.privateKeys.importKey(privateKey); - } - - getPublicKeys(): Array { - return keyring.publicKeys.keys; - } - - getTrustedKeys(): Array { - return keyring.publicKeys.keys; - } - - getTrustedActiveKeys(): Array { - return keyring.publicKeys.keys; - } - - getEncryptKeys(): Array { - return []; - } - - getPrivateKeys(): Array { - return keyring.privateKeys.keys; - } - - getPrivateKey(): any { - return keyring.privateKeys && keyring.privateKeys.keys[0]; - } - - async isValidKey(key): Promise { - // There is supposed to be an openpgp.readKey() method but I can't find it? - const testKey = await openpgp.key.readArmored(key); - return !testKey.err; - } - - async isEncryptedPrivateKey(privateKey: any): Promise { - const imported = await openpgp.key.readArmored(privateKey); - for (const key of imported.keys) { - if (key.isDecrypted()) { - return false; - } - } - return true; - } - - getFingerprint(): string { - // TODO Handle multiple keys - return ( - keyring.privateKeys && - keyring.privateKeys.keys[0] && - keyring.privateKeys.keys[0].keyPacket && - keyring.privateKeys.keys[0].keyPacket.fingerprint - ); - } - - getKeyId(key: any): string { - return key.getKeyId().toHex(); - } - - getPrivateKeyId(): string { - // TODO is there a library that comes with angular for doing this? - return ( - keyring.privateKeys && - keyring.privateKeys.keys[0] && - keyring.privateKeys.keys[0].getKeyId().toHex() - ); - } - - getKeysForId(keyId: string): Array { - return keyring.getKeysForId(keyId); - } - - getPublicKeyForId(keyId): any { - return keyring.publicKeys.getForId(keyId); - } - - getPrivateKeyForId(keyId): any { - return keyring.privateKeys.getForId(keyId); - } - - getPublicKeyForSubkeyId(subkeyId): any { - return keyring.publicKeys.getForId(subkeyId, true); - } - - getPublicKeysForAddress(address): Array { - return keyring.publicKeys.getForAddress(address); - } - - removeKeysForId(keyId): Array { - return keyring.removeKeysForId(keyId); - } - - removePublicKeyForId(keyId): any { - return keyring.publicKeys.removeForId(keyId); - } - - removePublicKey(publicKey: any): any { - const keyId = publicKey.getKeyId().toHex(); - return keyring.publicKeys.removeForId(keyId); - } - - clearKeysInKeyring(): void { - keyring.clear(); - } - - async sign(plainText): Promise { - const privateKey = this.getPrivateKey(); - if (!privateKey.isDecrypted()) { - const password = window.prompt('password'); - await privateKey.decrypt(password); - } - const opts = { - message: openpgp.message.fromText(plainText), - privateKeys: [privateKey], - detached: true, - }; - const signatureObject = await openpgp.sign(opts); - return signatureObject.signature; - } -} - -export { MutablePgpKeyStore, MutableKeyStore }; diff --git a/src/app/_pgp/pgp-signer.spec.ts b/src/app/_pgp/pgp-signer.spec.ts deleted file mode 100644 index d3e6469..0000000 --- a/src/app/_pgp/pgp-signer.spec.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PGPSigner } from '@app/_pgp/pgp-signer'; -import { MutableKeyStore, MutablePgpKeyStore } from '@app/_pgp/pgp-key-store'; -const keystore: MutableKeyStore = new MutablePgpKeyStore(); - -describe('PgpSigner', () => { - it('should create an instance', () => { - expect(new PGPSigner(keystore)).toBeTruthy(); - }); -}); diff --git a/src/app/_pgp/pgp-signer.ts b/src/app/_pgp/pgp-signer.ts deleted file mode 100644 index 990a923..0000000 --- a/src/app/_pgp/pgp-signer.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { MutableKeyStore } from '@app/_pgp/pgp-key-store'; -import { LoggingService } from '@app/_services/logging.service'; - -const openpgp = require('openpgp'); - -interface Signable { - digest(): string; -} - -interface Signature { - engine: string; - algo: string; - data: string; - digest: string; -} - -interface Signer { - onsign(signature: Signature): void; - onverify(flag: boolean): void; - fingerprint(): string; - prepare(material: Signable): boolean; - verify(digest: string, signature: Signature): void; - sign(digest: string): Promise; -} - -class PGPSigner implements Signer { - engine = 'pgp'; - algo = 'sha256'; - dgst: string; - signature: Signature; - keyStore: MutableKeyStore; - onsign: (signature: Signature) => void; - onverify: (flag: boolean) => void; - loggingService: LoggingService; - - constructor(keyStore: MutableKeyStore) { - this.keyStore = keyStore; - this.onsign = (signature: Signature) => {}; - this.onverify = (flag: boolean) => {}; - } - - public fingerprint(): string { - return this.keyStore.getFingerprint(); - } - - public prepare(material: Signable): boolean { - this.dgst = material.digest(); - return true; - } - - public verify(digest: string, signature: Signature): void { - openpgp.signature - .readArmored(signature.data) - .then((sig) => { - const opts = { - message: openpgp.cleartext.fromText(digest), - publicKeys: this.keyStore.getTrustedKeys(), - signature: sig, - }; - openpgp.verify(opts).then((v) => { - let i = 0; - for (i = 0; i < v.signatures.length; i++) { - const s = v.signatures[i]; - if (s.valid) { - this.onverify(s); - return; - } - } - this.loggingService.sendErrorLevelMessage( - `Checked ${i} signature(s) but none valid`, - this, - { error: '404 Not found!' } - ); - this.onverify(false); - }); - }) - .catch((e) => { - this.loggingService.sendErrorLevelMessage(e.message, this, { error: e }); - this.onverify(false); - }); - } - - public async sign(digest: string): Promise { - const m = openpgp.cleartext.fromText(digest); - const pk = this.keyStore.getPrivateKey(); - if (!pk.isDecrypted()) { - const password = window.prompt('password'); - await pk.decrypt(password); - } - const opts = { - message: m, - privateKeys: [pk], - detached: true, - }; - openpgp - .sign(opts) - .then((s) => { - this.signature = { - engine: this.engine, - algo: this.algo, - data: s.signature, - // TODO: fix for browser later - digest, - }; - this.onsign(this.signature); - }) - .catch((e) => { - this.loggingService.sendErrorLevelMessage(e.message, this, { error: e }); - this.onsign(undefined); - }); - } -} - -export { Signable, Signature, Signer, PGPSigner }; diff --git a/src/app/_services/auth.service.ts b/src/app/_services/auth.service.ts index d29bc43..d6d57c9 100644 --- a/src/app/_services/auth.service.ts +++ b/src/app/_services/auth.service.ts @@ -3,7 +3,7 @@ import { hobaParseChallengeHeader } from '@src/assets/js/hoba.js'; import { signChallenge } from '@src/assets/js/hoba-pgp.js'; import { environment } from '@src/environments/environment'; import { LoggingService } from '@app/_services/logging.service'; -import { MutableKeyStore, MutablePgpKeyStore } from '@app/_pgp'; +import { MutableKeyStore, MutablePgpKeyStore } from '@cicnet/crdt-meta'; import { ErrorDialogService } from '@app/_services/error-dialog.service'; import { HttpClient } from '@angular/common/http'; import { HttpError, rejectBody } from '@app/_helpers/global-error-handler'; diff --git a/src/app/_services/transaction.service.ts b/src/app/_services/transaction.service.ts index d822354..ceb0ff1 100644 --- a/src/app/_services/transaction.service.ts +++ b/src/app/_services/transaction.service.ts @@ -2,7 +2,8 @@ import { Injectable } from '@angular/core'; import { first } from 'rxjs/operators'; import { BehaviorSubject, Observable } from 'rxjs'; import { environment } from '@src/environments/environment'; -import { Envelope, User } from 'cic-client-meta'; +import {User} from '@cicnet/cic-client-meta'; +import {Envelope} from '@cicnet/crdt-meta'; import { UserService } from '@app/_services/user.service'; import { Keccak } from 'sha3'; import { utils } from 'ethers'; diff --git a/src/app/_services/user.service.ts b/src/app/_services/user.service.ts index 2ee24ca..af8ac68 100644 --- a/src/app/_services/user.service.ts +++ b/src/app/_services/user.service.ts @@ -3,12 +3,12 @@ import { BehaviorSubject, Observable, Subject } from 'rxjs'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { environment } from '@src/environments/environment'; import { first } from 'rxjs/operators'; -import { ArgPair, Envelope, Phone, Syncable, User } from 'cic-client-meta'; +import {Phone, User} from '@cicnet/cic-client-meta'; +import {ArgPair, Envelope, Syncable, MutableKeyStore, PGPSigner, Signer} from '@cicnet/crdt-meta'; import { AccountDetails } from '@app/_models'; import { LoggingService } from '@app/_services/logging.service'; import { TokenService } from '@app/_services/token.service'; import { AccountIndex } from '@app/_eth'; -import { MutableKeyStore, PGPSigner, Signer } from '@app/_pgp'; import { RegistryService } from '@app/_services/registry.service'; import { CICRegistry } from 'cic-client'; import { AuthService } from '@app/_services/auth.service'; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 9c0c7b3..82bea42 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -12,7 +12,7 @@ import { AuthGuard } from '@app/_guards'; import { LoggerModule } from 'ngx-logger'; import { environment } from '@src/environments/environment'; import { ErrorInterceptor, HttpConfigInterceptor, LoggingInterceptor } from '@app/_interceptors'; -import { MutablePgpKeyStore } from '@app/_pgp'; +import { MutablePgpKeyStore } from '@cicnet/crdt-meta'; import { ServiceWorkerModule } from '@angular/service-worker'; @NgModule({