12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112 |
- diff --git app/ionic.config.json app/ionic.config.json
- index d2e1d8f..1b487ce 100644
- --- app/ionic.config.json
- +++ app/ionic.config.json
- @@ -1,7 +1,9 @@
- {
- "name": "Hybric OSN",
- - "integrations": {
- - "cordova": {}
- + "integrations":
- + {
- + "cordova":
- + {}
- },
- - "type": "ionic-angular"
- -}
- \ No newline at end of file
- + "type": "angular"
- +}
- diff --git app/package-lock.json app/package-lock.json
- index e686dba..d53d9e7 100644
- --- app/package-lock.json
- +++ app/package-lock.json
- @@ -1,6 +1,6 @@
- {
- - "name": "HybridOSN",
- - "version": "0.5.1",
- + "name": "hybrid-osn",
- + "version": "1.0.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- @@ -829,8 +829,7 @@
- "bn.js": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
- - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
- - "dev": true
- + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
- },
- "body": {
- "version": "5.1.0",
- @@ -2469,7 +2468,8 @@
- },
- "ansi-regex": {
- "version": "2.1.1",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- },
- "aproba": {
- "version": "1.2.0",
- @@ -2487,11 +2487,13 @@
- },
- "balanced-match": {
- "version": "1.0.0",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "bundled": true,
- + "optional": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- @@ -2504,15 +2506,18 @@
- },
- "code-point-at": {
- "version": "1.1.0",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- },
- "concat-map": {
- "version": "0.0.1",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- },
- "core-util-is": {
- "version": "1.0.2",
- @@ -2615,7 +2620,8 @@
- },
- "inherits": {
- "version": "2.0.3",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- },
- "ini": {
- "version": "1.3.5",
- @@ -2625,6 +2631,7 @@
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- + "optional": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- @@ -2637,17 +2644,20 @@
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- + "optional": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "0.0.8",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- },
- "minipass": {
- "version": "2.2.4",
- "bundled": true,
- + "optional": true,
- "requires": {
- "safe-buffer": "^5.1.1",
- "yallist": "^3.0.0"
- @@ -2664,6 +2674,7 @@
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- + "optional": true,
- "requires": {
- "minimist": "0.0.8"
- }
- @@ -2736,7 +2747,8 @@
- },
- "number-is-nan": {
- "version": "1.0.1",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- @@ -2746,6 +2758,7 @@
- "once": {
- "version": "1.4.0",
- "bundled": true,
- + "optional": true,
- "requires": {
- "wrappy": "1"
- }
- @@ -2821,7 +2834,8 @@
- },
- "safe-buffer": {
- "version": "5.1.1",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- @@ -2851,6 +2865,7 @@
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- + "optional": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- @@ -2868,6 +2883,7 @@
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- + "optional": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- @@ -2906,11 +2922,13 @@
- },
- "wrappy": {
- "version": "1.0.2",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- },
- "yallist": {
- "version": "3.0.2",
- - "bundled": true
- + "bundled": true,
- + "optional": true
- }
- }
- },
- @@ -3649,6 +3667,11 @@
- "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
- "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
- },
- + "imurmurhash": {
- + "version": "0.1.4",
- + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- + },
- "in-publish": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
- @@ -4367,8 +4390,7 @@
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- - "dev": true
- + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- },
- "minimalistic-crypto-utils": {
- "version": "1.0.1",
- @@ -4566,6 +4588,14 @@
- "vm-browserify": "0.0.4"
- }
- },
- + "node-localstorage": {
- + "version": "1.3.1",
- + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz",
- + "integrity": "sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==",
- + "requires": {
- + "write-file-atomic": "^1.1.4"
- + }
- + },
- "node-rsa": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.0.2.tgz",
- @@ -4838,6 +4868,33 @@
- "wrappy": "1"
- }
- },
- + "openpgp": {
- + "version": "4.7.1",
- + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-4.7.1.tgz",
- + "integrity": "sha512-UX4AXpjxUiIHfReStsBvbAcL5XyIWSb3sh7uleGlKdg1VWK/4LOncNd+89fYur6fbjZXORVR6m6YELupeWT1Iw==",
- + "requires": {
- + "asn1.js": "^5.0.0",
- + "node-fetch": "^2.1.2",
- + "node-localstorage": "~1.3.0"
- + },
- + "dependencies": {
- + "asn1.js": {
- + "version": "5.2.0",
- + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.2.0.tgz",
- + "integrity": "sha512-Q7hnYGGNYbcmGrCPulXfkEw7oW7qjWeM4ZTALmgpuIcZLxyqqKYWxCZg2UBm8bklrnB4m2mGyJPWfoktdORD8A==",
- + "requires": {
- + "bn.js": "^4.0.0",
- + "inherits": "^2.0.1",
- + "minimalistic-assert": "^1.0.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=="
- + }
- + }
- + },
- "optjs": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz",
- @@ -5009,9 +5066,9 @@
- "dev": true
- },
- "path-to-regexp": {
- - "version": "1.7.0",
- - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
- - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
- + "version": "1.8.0",
- + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
- + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
- "requires": {
- "isarray": "0.0.1"
- },
- @@ -5774,6 +5831,11 @@
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
- "dev": true
- },
- + "slide": {
- + "version": "1.1.6",
- + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
- + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc="
- + },
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- @@ -7405,6 +7467,16 @@
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- + "write-file-atomic": {
- + "version": "1.3.4",
- + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
- + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
- + "requires": {
- + "graceful-fs": "^4.1.11",
- + "imurmurhash": "^0.1.4",
- + "slide": "^1.1.5"
- + }
- + },
- "ws": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.2.tgz",
- diff --git app/src/app/app.component.ts app/src/app/app.component.ts
- index d35471a..761f19e 100644
- --- app/src/app/app.component.ts
- +++ app/src/app/app.component.ts
- @@ -21,7 +21,7 @@ export class MyApp {
- nav: Nav;
-
- rootPage: any;
- - pages: Array<{ title: string; icon: string; component: any }>;
- + pages: Array < { title: string;icon: string;component: any } > ;
- user: any;
-
- constructor(
- @@ -53,17 +53,20 @@ export class MyApp {
-
- async initApp() {
- const isLoggedIn = await this.authProvider.isLoggedIn();
- -
- + console.log('isLoggedin var is:', isLoggedIn);
- + this.rootPage = LoginPage;
- if (isLoggedIn) {
- this.rootPage = HomePage;
- await this.setUser();
- } else {
- + console.log('redirecting to login page');
- this.rootPage = LoginPage;
- }
- }
-
- async setUser() {
- const userId = await this.storage.get("userId");
- + console.log('fetching user');
- this.user = await this.twitter.fetchUser(userId);
- }
-
- diff --git app/src/components/profile-header/profile-header.ts app/src/components/profile-header/profile-header.ts
- index e2ce94b..e29ffe0 100644
- --- app/src/components/profile-header/profile-header.ts
- +++ app/src/components/profile-header/profile-header.ts
- @@ -13,7 +13,24 @@ export class ProfileHeaderComponent {
- constructor(
- private twitter: TwitterApiProvider,
- private photoViewer: PhotoViewer
- - ) {}
- + ) {
- +
- + // if (typeof Worker !== 'undefined') {
- + // // Create a new
- + // const worker = new Worker('./profile-header.worker');
- + // let message = "fuckgi";
- + // worker.onmessage = (ev: MessageEvent) => {
- + // worker.terminate();
- + // };
- + // worker.postMessage(message);
- + // } else {
- + // console.log('webworkers are not supported');
- + // return;
- + // // Web Workers are not supported in this environment.
- + // // You should add a fallback so that your program still executes correctly.
- + // }
- +
- + }
-
- get banner() {
- if (this.user.profile_banner_url) {
- diff --git app/src/index.html app/src/index.html
- index c4b4376..64fb4d5 100644
- --- app/src/index.html
- +++ app/src/index.html
- @@ -1,51 +1,44 @@
- <!DOCTYPE html>
- <html lang="en" dir="ltr">
- +
- <head>
- <meta charset="UTF-8">
- <title>Ionic App</title>
- <meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
- <meta name="format-detection" content="telephone=no">
- <meta name="msapplication-tap-highlight" content="no">
- -
- <link rel="icon" type="image/x-icon" href="assets/icon/favicon.ico">
- <link rel="manifest" href="manifest.json">
- <meta name="theme-color" content="#4e8ef7">
- -
- <!-- add to homescreen for ios -->
- <meta name="apple-mobile-web-app-capable" content="yes">
- <meta name="apple-mobile-web-app-status-bar-style" content="black">
- -
- <!-- cordova.js required for cordova apps (remove if not needed) -->
- <script src="cordova.js"></script>
- <script src="assets/scripts/openpgp.js"></script>
- <script src="assets/scripts/openpgp.worker.js"></script>
- -
- - <!-- un-comment this code to enable service worker
- - <script>
- - if ('serviceWorker' in navigator) {
- - navigator.serviceWorker.register('service-worker.js')
- - .then(() => console.log('service worker installed'))
- - .catch(err => console.error('Error', err));
- - }
- - </script>-->
- -
- + <!-- un-comment this code to enable service worker-->
- + <!-- <script>
- + if ('serviceWorker' in navigator) {
- + navigator.serviceWorker.register('service-worker.js')
- + .then(() => console.log('service worker installed'))
- + .catch(err => console.error('Error', err));
- + }
- +
- + </script> -->
- <link href="build/main.css" rel="stylesheet">
- -
- </head>
- -<body>
-
- +<body>
- <!-- Ionic's root component and where the app will load -->
- <ion-app></ion-app>
- -
- <!-- The polyfills js is generated during the build process -->
- <script src="build/polyfills.js"></script>
- -
- <!-- The vendor js is generated during the build process
- It contains all of the dependencies in node_modules -->
- <script src="build/vendor.js"></script>
- -
- <!-- The main bundle js is generated during the build process -->
- <script src="build/main.js"></script>
- -
- </body>
- +
- </html>
- diff --git app/src/pages/login/login.html app/src/pages/login/login.html
- index fb8f719..6da6d64 100644
- --- app/src/pages/login/login.html
- +++ app/src/pages/login/login.html
- @@ -10,4 +10,4 @@
- <button ion-button outline block (click)="login()">Login</button>
- <a href="#" (click)="showAbout()">Learn more</a>
- </div>
- -</ion-content>
- \ No newline at end of file
- +</ion-content>
- diff --git app/src/pages/login/login.ts app/src/pages/login/login.ts
- index 691edbc..fac836e 100644
- --- app/src/pages/login/login.ts
- +++ app/src/pages/login/login.ts
- @@ -35,8 +35,7 @@ export class LoginPage {
- login() {
- const alertText = {
- title: "Login failed",
- - subTitle:
- - "Somthing went wrong while trying to log you in. Please try again.",
- + subTitle: "Somthing went wrong while trying to log you in. Please try again.",
- buttons: ["OK"]
- };
-
- diff --git app/src/pages/settings/settings.html app/src/pages/settings/settings.html
- index 9e1eba0..8143601 100644
- --- app/src/pages/settings/settings.html
- +++ app/src/pages/settings/settings.html
- @@ -24,6 +24,8 @@
- generate
- a pair of keys. If you run the app on multiple devices, please enter everywhere the same pair of keys.</p>
- <button ion-button block (click)="generateKeys()">Generate keys</button>
- + <ion-label color="primary" stacked required>Enter Passphrase:</ion-label>
- + <ion-textarea [(ngModel)]="passphrase"></ion-textarea>
- <ion-label color="primary" stacked>Private Key:</ion-label>
- <ion-textarea [(ngModel)]="privateKey"></ion-textarea>
- <ion-label color="primary" stacked>Public Key:</ion-label>
- @@ -35,4 +37,4 @@
- </ion-card>
-
- <button ion-button block (click)="save()">Save settings</button>
- -</ion-content>
- \ No newline at end of file
- +</ion-content>
- diff --git app/src/pages/settings/settings.ts app/src/pages/settings/settings.ts
- index c2f6bfd..1d966e9 100644
- --- app/src/pages/settings/settings.ts
- +++ app/src/pages/settings/settings.ts
- @@ -17,6 +17,7 @@ export class SettingsPage {
- keywords: string;
- privateKey: string;
- publicKey: string;
- + passphrase: string;
-
- constructor(
- public navCtrl: NavController,
- @@ -33,6 +34,7 @@ export class SettingsPage {
- async loadValuesFromStorage() {
- this.privateKey = await this.storage.get("privateKey");
- this.publicKey = await this.storage.get("publicKey");
- + this.passphrase = await this.storage.get("passphrase");
- this.keywords = await this.storage.get("keywords");
- }
-
- @@ -63,7 +65,8 @@ export class SettingsPage {
- }
-
- private async startKeyGeneration() {
- - const keys = await this.cryptoUtils.generateRsaKeys();
- + // const keys = await this.cryptoUtils.generateRsaKeys();
- + const keys = await this.cryptoUtils.generateKeys(this.passphrase);
-
- this.publicKey = await this.cryptoUtils.extractPublicKey(keys);
- this.privateKey = await this.cryptoUtils.extractPrivateKey(keys);
- @@ -73,6 +76,7 @@ export class SettingsPage {
- this.storage.set("publicKey", this.publicKey);
- this.storage.set("privateKey", this.privateKey);
- this.storage.set("keywords", this.keywords ? this.keywords.trim() : "");
- + this.storage.set("passphrase", this.passphrase);
-
- this.showToast("Successfully saved!");
- }
- diff --git app/src/pages/write-tweet/write-tweet.ts app/src/pages/write-tweet/write-tweet.ts
- index f468d43..4b9c8f7 100644
- --- app/src/pages/write-tweet/write-tweet.ts
- +++ app/src/pages/write-tweet/write-tweet.ts
- @@ -35,9 +35,10 @@ export class WriteTweetPage {
- openpgp;
- privateKey;
- publicKey;
- - pk: any[]=[];
- - passp = 'super long and hard to guess secret' ;
- -
- + revocationCertificate;
- + pk: any[] = [];
- + passp = 'super long and hard to guess secret';
- +
-
- constructor(
- public navCtrl: NavController,
- @@ -64,100 +65,108 @@ export class WriteTweetPage {
- }
-
-
- - public async encryptDecryptFunction () {
- - await openpgp.initWorker({path:'assets/scripts/openpgp.worker.js'});
- - let a = await this.generateKeys();
- - console.log('a is:',a.publicKeyArmored);
- - let b = await this.generateKeys();
- - console.log('b is:',b.publicKeyArmored);
- - let c = await this.generateKeys();
- - this.privateKey =c.privateKeyArmored;
- + public async encryptDecryptFunction() {
- + await openpgp.initWorker({ path: 'assets/scripts/openpgp.worker.js' });
- + let a = await this.generateKeys();
- + console.log('a is:', a.publicKeyArmored);
- + let b = await this.generateKeys();
- + console.log('b is:', b.publicKeyArmored);
- + let c = await this.generateKeys();
- + this.privateKey = c.privateKeyArmored;
- this.publicKey = c.publicKeyArmored;
- -
- + await this.uploadPubKeytoServer(this.publicKey);
- + this.revocationCertificate = c.revocationCertificate;
- this.pk.push(a.publicKeyArmored);
- this.pk.push(b.publicKeyArmored);
- -// this.pk = [`----BEGIN PGP PUBLIC KEY BLOCK-----
- -// Version: OpenPGP.js v4.7.1
- -// Comment: https://openpgpjs.org
- -
- -// xjMEXfAn1xYJKwYBBAHaRw8BAQdAAMVNOABw8MBtrtYR8KC3tSro3wITyApT
- -// TVjKVCppD+DNG0pvbiBTbWl0aCA8am9uQGV4YW1wbGUuY29tPsJ3BBAWCgAf
- -// BQJd8CfXBgsJBwgDAgQVCAoCAxYCAQIZAQIbAwIeAQAKCRD+efBRXzuMsfA7
- -// AQCEgoToFzv2hT9BREdiQp531/AHSyoZWmWvSZSvmga40gD8C+zwbCySnkhQ
- -// pb4L0DCKtSDa7pLg2g0OcxJlbSZWHQ3OOARd8CfXEgorBgEEAZdVAQUBAQdA
- -// p4mVY17dPWf6VCBqW10Ybk5JgUO6FK0OsETWw3gG2zcDAQgHwmEEGBYIAAkF
- -// Al3wJ9cCGwwACgkQ/nnwUV87jLFHbAD9GyoL7dcTDGQoqtrhKozdgnzfugTb
- -// er0bwU15WNMjefkA/jEqK9YUNcRrFKIuac9PVibGgutL8ak7ukysw6iTcCsM
- -// =fmhE
- -// -----END PGP PUBLIC KEY BLOCK-----`,
- -// `-----BEGIN PGP PUBLIC KEY BLOCK-----
- -// Version: OpenPGP.js v4.7.1
- -// Comment: https://openpgpjs.org
- -
- -// xjMEXfAn1hYJKwYBBAHaRw8BAQdAsF1ivpd0HU8ogj02LDv6BTOxNMWGZaEc
- -// OyZBwqoYJPrNG0pvbiBTbWl0aCA8am9uQGV4YW1wbGUuY29tPsJ3BBAWCgAf
- -// BQJd8CfWBgsJBwgDAgQVCAoCAxYCAQIZAQIbAwIeAQAKCRDEruv77flRJ32B
- -// AP93GIBcUW2okROoZZhdPVeqjRD72Ft64imXpdZ0jx4ohgEA5Kv9vs2kV73q
- -// k6fcdf7qD/i5gMExU0+vV05c9VxBYwfOOARd8CfWEgorBgEEAZdVAQUBAQdA
- -// 1J7E03ZopUnsIeNzeiZvba6qxhhUbpmBZ1aN1HhWUlEDAQgHwmEEGBYIAAkF
- -// Al3wJ9YCGwwACgkQxK7r++35USdTqQD/ZEg8X5tMx75nQe4mGlyiRjmmtWLw
- -// n9bslTdjBIszs/EA/R1WIm6ji4Ru1dJWc3ISisz78xTM2H8U7fnP8yjFcWcD
- -// =hgnW
- -// -----END PGP PUBLIC KEY BLOCK-----`];
- - console.log('array of pub keys is :',this.pk);
- - this.pk = this.pk.map(async (key) => {
- + console.log('array of pub keys is :', this.pk);
- + this.pk = this.pk.map(async (key) => {
- return (await openpgp.key.readArmored(key)).keys[0]
- });
-
- - console.log('priv key: ',this.privateKey,'this.pubkey',this.pk);
- + console.log('priv key: ', this.privateKey, 'this.pubkey', this.pk);
- let encrypted;
- const privKeyObj = (await openpgp.key.readArmored(this.privateKey)).keys[0];
- - console.log('privKeyObj',privKeyObj);
- - const bla = await privKeyObj.decrypt(this.passp);
- -
- - // const options = {
- - // message: openpgp.message.fromText('Hello, World!'), // input as Message object
- - // publicKeys: (await openpgp.key.readArmored(this.publicKey)).keys, // for encryption
- - // privateKeys: [privKeyObj] // for signing (optional)
- - // }
- -
- + console.log('privKeyObj', privKeyObj);
- const options = {
- - message: openpgp.message.fromText('Hello, World!'), // input as Message object
- - publicKeys: await Promise.all(this.pk), // for encryption
- - privateKeys: [privKeyObj] // for signing (optional)
- + message: openpgp.message.fromText('Hello, World!'), // input as Message object
- + publicKeys: await Promise.all(this.pk), // for encryption
- + privateKeys: [privKeyObj] // for signing (optional)
- }
-
- const ciphertext = await openpgp.encrypt(options);
- - encrypted = ciphertext.data; // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
- - console.log('encrypted is:',encrypted);
- -
- - let aprivKeyObj = (await openpgp.key.readArmored(a.privateKeyArmored)).keys[0];
- - await aprivKeyObj.decrypt(this.passp);
- + encrypted = ciphertext.data; // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
- + console.log('encrypted is:', encrypted);
- +
- + let aprivKeyObj = (await openpgp.key.readArmored(a.privateKeyArmored)).keys[0];
- + await aprivKeyObj.decrypt(this.passp);
-
- const options2 = {
- - message: await openpgp.message.readArmored(encrypted), // parse armored message
- - privateKeys: [aprivKeyObj] // for decryption
- + message: await openpgp.message.readArmored(encrypted), // parse armored message
- + privateKeys: [aprivKeyObj] // for decryption
- }
- - console.log('options2 is: ',options2);
- + console.log('options2 is: ', options2);
- let plaintext = await openpgp.decrypt(options2);
- - console.log('decrypted text is:',plaintext,plaintext.data);
- + console.log('decrypted text is:', plaintext, plaintext.data);
- +
- + //lookup key
- + await this.lookupKeys();
- + await this.test();
- return plaintext.data // 'Hello, World!'
-
- }
-
- - public async generateKeys(){
- + public async test(){
- + console.log("----------------INSIDE TEST-----------------");
- + await this.revokeKey();
- + await this.lookupKeys();
- + }
- +
- + public async generateKeys() {
- let options = {
- - userIds: [{ name:'Jon Smith', email:'jon@example.com' }], // multiple user IDs
- - curve: "ed25519", // ECC curve name
- - passphrase: this.passp // protects the private key
- + userIds: [{ name: 'Rohit Gowda', email: 'rohit.s.gowda91@gmail.com' }], // multiple user IDs
- + curve: "ed25519", // ECC curve name
- + passphrase: this.passp // protects the private key
- };
- -
- - let a = await openpgp.generateKey(options);
- - return a;
- - // console.log('resolved a = ',a);
- - // this.privateKey =a.privateKeyArmored;
- - // this.publicKey = a.publicKeyArmored;
- - // this.encryptDecryptFunction();
- +
- + let a = await openpgp.generateKey(options);
- + return a;
- + }
- +
- + public async uploadPubKeytoServer(pubkey){
- + var hkp = new openpgp.HKP('https://pgp.mit.edu');
- + hkp.upload(pubkey).then(function() {
- + console.log("pubkey succesfully uploaded");
- + });
- + }
- +
- + public async lookupKeys(){
- + var hkp = new openpgp.HKP(); // Defaults to https://keyserver.ubuntu.com, or pass another keyserver URL as a string
- +
- + var options = {
- + query: 'rohit.s.gowda91@gmail.com'
- + };
- +
- + let armoredPubkey = await hkp.lookup(options);
- + let pubkey = await openpgp.key.readArmored(armoredPubkey);
- + console.log('Found public key:',pubkey);
- + }
- +
- + public async revokeKey(){
- + //using revocation certificate
- + var options = {
- + key: openpgp.key.readArmored(this.publicKey).keys[0],
- + revocationCertificate: this.revocationCertificate
- + };
- +
- + //alternatively revoke using private key
- + let options2 = {
- + key: openpgp.key.readArmored(this.privateKey).keys[0]
- + };
- +
- + openpgp.revokeKey(options2).then(function(key) {
- + var pubkey = key.publicKeyArmored; // '-----BEGIN PGP PUBLIC KEY BLOCK ... '
- + console.log("public key revoked");
- + });
- }
-
-
- @@ -171,7 +180,8 @@ export class WriteTweetPage {
- }
-
- private containsTriggerWord(triggerWords: string): ValidatorFn {
- - return (control: AbstractControl): { [key: string]: any } | null => {
- + return (control: AbstractControl): {
- + [key: string]: any } | null => {
- if (triggerWords) {
- const regexList = triggerWords
- .toLowerCase()
- @@ -179,9 +189,9 @@ export class WriteTweetPage {
- .join("|");
- const regex = new RegExp(regexList);
- const containsTriggerWord = regex.test(control.value.toLowerCase());
- - return containsTriggerWord
- - ? { containsTriggerWord: { value: control.value } }
- - : null;
- + return containsTriggerWord ?
- + { containsTriggerWord: { value: control.value } } :
- + null;
- } else {
- return null;
- }
- @@ -219,8 +229,7 @@ export class WriteTweetPage {
- this.alertCtrl
- .create({
- title: "Watch Out!",
- - message:
- - "Your tweet contains words you have previously defined to only share securely via P2P. Currently P2P mode is not selected.",
- + message: "Your tweet contains words you have previously defined to only share securely via P2P. Currently P2P mode is not selected.",
- buttons: ["OK"]
- })
- .present();
- @@ -238,12 +247,11 @@ export class WriteTweetPage {
- ) {
- loading.setContent("Publish private tweet...");
- await this.tweetPrivate();
- - } else {
- + } else {
- loading.dismiss();
- const alert = this.alertCtrl.create({
- title: "Oooops...",
- - message:
- - "Please verify that you have set a private and public key in the settings and that your latest public key was published."
- + message: "Please verify that you have set a private and public key in the settings and that your latest public key was published."
- });
- alert.present();
- return;
- @@ -319,7 +327,7 @@ export class WriteTweetPage {
- } catch (err) {
- console.error(
- "There is no user signed up to twitter with username: " +
- - mention.screenName
- + mention.screenName
- );
- }
- return mention;
- diff --git app/src/providers/crypto/crypto.ts app/src/providers/crypto/crypto.ts
- index 8714a1d..98a67e8 100644
- --- app/src/providers/crypto/crypto.ts
- +++ app/src/providers/crypto/crypto.ts
- @@ -2,6 +2,7 @@ import { Injectable } from "@angular/core";
- import { TwitterApiProvider } from "../twitter-api/twitter-api";
- import { P2pStorageIpfsProvider } from "../p2p-storage-ipfs/p2p-storage-ipfs";
- import { Storage } from "@ionic/storage";
- +import * as openpgp from 'openpgp';
- import NodeRSA from "node-rsa";
- declare var TextDecoder: any;
- declare var TextEncoder: any;
- @@ -10,6 +11,7 @@ export class CryptoProvider {
- ownUserId: string;
- IV_LENGTH = 12;
- HYBRID_OSN_AES_KEY = "Z1vxAULQnZdoWhJOvv+hWEvVpyUHzNjD/ichEE2c8i4=";
- + openpgp;
-
- constructor(
- private twitter: TwitterApiProvider,
- @@ -46,13 +48,19 @@ export class CryptoProvider {
- };
- }
-
- - // Ecnrypt key history
- - const encryptedPublicKeyHistory = await this.aesEncrypt(
- - JSON.stringify(publicKeyHistory)
- - );
- + //encrypt key history with openpgp with published public key
- + const options = {
- + message: openpgp.message.fromText(JSON.stringify(publicKeyHistory)), // input as Message object
- + publicKeys: (await openpgp.key.readArmored(key)).keys, // for encryption
- + }
- +
- + let encryptedPublicKeyHistory = await openpgp.encrypt(options);
- + let encrypted = await encryptedPublicKeyHistory.data // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
- + console.log('encrypted public key history', encrypted);
- +
-
- // Publish updated key history...
- - const res = await this.ipfs.storePublicKey(encryptedPublicKeyHistory);
- + const res = await this.ipfs.storePublicKey(encrypted);
-
- // tweet ipfs link
- const tweetResponse = await this.twitter.tweet(
- @@ -85,9 +93,21 @@ export class CryptoProvider {
- // Fetch public key history
- if (link.length) {
- const encryptedKeyHistory = await this.ipfs.fetchJson(link);
- - // Decrypt key history
- - const keyHistory = await this.aesDecrypt(encryptedKeyHistory.toString());
- - return JSON.parse(keyHistory);
- +
- + let privateKey = await this.storage.get("privateKey");
- + const privKeyObj = (await openpgp.key.readArmored(privateKey)).keys[0];
- + console.log('privKeyObj', privKeyObj);
- + const options = {
- + message: await openpgp.message.readArmored(encryptedKeyHistory.toString()), // parse armored message
- + // publicKeys: (await openpgp.key.readArmored(pubkey)).keys, // for verification (optional)
- + privateKeys: [privKeyObj] // for decryption
- + }
- +
- + openpgp.decrypt(options).then(plaintext => {
- + console.log('decrypted key history: ', plaintext.data)
- + return plaintext.data // 'Hello, World!'
- + })
- +
- } else {
- return null;
- }
- @@ -123,8 +143,7 @@ export class CryptoProvider {
- * Generates a RSA key pair object
- */
- public async generateRsaKeys() {
- - return await crypto.subtle.generateKey(
- - {
- + return await crypto.subtle.generateKey({
- name: "RSA-OAEP",
- modulusLength: 1024,
- publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
- @@ -135,36 +154,40 @@ export class CryptoProvider {
- );
- }
-
- + /**
- + * Generates an openPGP key pair object
- + */
- +
- + public async generateKeys(passp: string) {
- + let options = {
- + userIds: [{ name: 'Rohit Gowda', email: 'rohit.s.gowda91@gmail.com' }], // multiple user IDs
- + curve: "ed25519", // ECC curve name
- + passphrase: passp // protects the private key
- + };
- +
- + return await openpgp.generateKey(options);
- + }
- +
- /**
- * extracts the private key from the key object and transforms it to readable text
- * @param keys key object
- */
- - public async extractPrivateKey(keys): Promise<string> {
- - return btoa(
- - String.fromCharCode.apply(
- - null,
- - new Uint8Array(await crypto.subtle.exportKey("pkcs8", keys.privateKey))
- - )
- - );
- + public async extractPrivateKey(keys): Promise < string > {
- + return keys.privateKeyArmored;
- }
-
- /**
- * extracts the public key from the key object and transforms it to readable text
- * @param keys key object
- */
- - public async extractPublicKey(keys): Promise<string> {
- - return btoa(
- - String.fromCharCode.apply(
- - null,
- - new Uint8Array(await crypto.subtle.exportKey("spki", keys.publicKey))
- - )
- - );
- + public async extractPublicKey(keys): Promise < string > {
- + return keys.publicKeyArmored;
- }
-
- /**
- * checks if the latest published key is the same as the one saved in app settings
- */
- - public async isPublicKeyPublished(): Promise<boolean> {
- + public async isPublicKeyPublished(): Promise < boolean > {
- const publicKey = await this.storage.get("publicKey");
- const keyHistory = await this.getKeyHistory(this.ownUserId);
-
- @@ -179,7 +202,7 @@ export class CryptoProvider {
- /**
- * checks if a private key is already set
- */
- - public async isPrivateKeySet(): Promise<boolean> {
- + public async isPrivateKeySet(): Promise < boolean > {
- const privateKey = await this.storage.get("privateKey");
- return privateKey;
- }
- @@ -212,7 +235,7 @@ export class CryptoProvider {
- * Fetches the public key history for a given user id
- * @param userId user id
- */
- - public async fetchPublicKeyHistoryForUser(userId: string): Promise<object[]> {
- + public async fetchPublicKeyHistoryForUser(userId: string): Promise < object[] > {
- const keyHistory = await this.getKeyHistory(userId);
- return keyHistory["keys"].reverse();
- }
- diff --git app/src/providers/feed/feed.ts app/src/providers/feed/feed.ts
- index e87a22f..d4a3cc8 100644
- --- app/src/providers/feed/feed.ts
- +++ app/src/providers/feed/feed.ts
- @@ -28,20 +28,23 @@ export class FeedProvider {
- */
- public async loadUserTimeline(
- userId,
- - oldestPublicTweet?,
- - oldestPrivateTweet?
- + oldestPublicTweet ? ,
- + oldestPrivateTweet ?
- ) {
- + console.log('fetch usertimeline');
- const maxId = oldestPublicTweet ? oldestPublicTweet["id_str"] : undefined;
- // Fetch tweets from Twitter
- let tweets = await this.twitter.fetchUserTimeline(userId, maxId);
- + console.log('tweets are:',tweets);
- if (tweets.length === 0) return tweets;
- tweets = tweets.filter(tweet => tweet.id_str != maxId);
-
- // Determine start and end of time interval to look for private tweets
- - const intervalStart: Date = oldestPrivateTweet
- - ? new Date(oldestPrivateTweet["created_at"])
- - : new Date();
- + const intervalStart: Date = oldestPrivateTweet ?
- + new Date(oldestPrivateTweet["created_at"]) :
- + new Date();
- const intervalEnd: Date = this.getOldestTweetTimestamp(tweets);
- + console.log('intervalEnd',intervalEnd);
-
- // Fetch private tweet hashs from P2P DB for corresponding interval
- const privateTweetHashs: object[] = await this.gun.fetchPrivateTweetHashsForUserInInterval(
- @@ -68,16 +71,16 @@ export class FeedProvider {
- * @param oldestPublicTweet oldest public tweet
- * @param oldestPrivateTweet oldest private tweet
- */
- - public async loadHomeTimeline(oldestPublicTweet?, oldestPrivateTweet?) {
- + public async loadHomeTimeline(oldestPublicTweet ? , oldestPrivateTweet ? ) {
- // Fetch tweets from Twitter
- const maxId = oldestPublicTweet ? oldestPublicTweet["id_str"] : undefined;
- let tweets = await this.twitter.fetchHomeFeed(maxId);
- tweets = tweets.filter(tweet => tweet.id_str != maxId);
-
- // Determine start and end of time interval to look for private tweets
- - const intervalStart: Date = oldestPrivateTweet
- - ? new Date(oldestPrivateTweet["created_at"])
- - : new Date();
- + const intervalStart: Date = oldestPrivateTweet ?
- + new Date(oldestPrivateTweet["created_at"]) :
- + new Date();
- const intervalEnd: Date = this.getOldestTweetTimestamp(tweets);
-
- // Fetch user's friends
- @@ -89,7 +92,7 @@ export class FeedProvider {
- .concat([this.userId]);
-
- // Fetch ipfs hashs for period
- - const promises: Promise<object[]>[] = friendsAndUserIds.map(accountId => {
- + const promises: Promise < object[] > [] = friendsAndUserIds.map(accountId => {
- return this.gun.fetchPrivateTweetHashsForUserInInterval(
- accountId,
- intervalStart,
- @@ -169,12 +172,12 @@ export class FeedProvider {
- return "";
- }
-
- - private async addUserToTweet(tweet: object): Promise<object> {
- + private async addUserToTweet(tweet: object): Promise < object > {
- tweet["user"] = await this.twitter.fetchUser(tweet["user_id"]);
- return tweet;
- }
-
- - private async addQuotedStatusToTweet(tweet: object): Promise<object> {
- + private async addQuotedStatusToTweet(tweet: object): Promise < object > {
- if (!tweet["quoted_status_id"]) return tweet;
- const quoted_status = await this.twitter.fetchTweet(
- tweet["quoted_status_id"]
- @@ -183,13 +186,13 @@ export class FeedProvider {
- return tweet;
- }
-
- - private async addOriginalStatusToTweet(tweet: object): Promise<object> {
- + private async addOriginalStatusToTweet(tweet: object): Promise < object > {
- if (!tweet["in_reply_to_status_id"]) return tweet;
- const originalTweet = await this.twitter.fetchTweet(
- tweet["in_reply_to_status_id"]
- );
- tweet["in_reply_to_screen_name"] =
- - originalTweet["data"]["user"]["screen_name"];
- + originalTweet["data"]["user"]["screen_name"];
- return tweet;
- }
-
- diff --git app/src/providers/p2p-database-gun/p2p-database-gun.ts app/src/providers/p2p-database-gun/p2p-database-gun.ts
- index 213173e..8d80de1 100644
- --- app/src/providers/p2p-database-gun/p2p-database-gun.ts
- +++ app/src/providers/p2p-database-gun/p2p-database-gun.ts
- @@ -15,7 +15,7 @@ export class P2pDatabaseGunProvider {
- * Hashtags are stored without reference to the users to provide these information on an extra dashboard to twitter
- * @param hashtagEntity extracted hashtags
- */
- - public async publishHashtags(hashtagEntity): Promise<void> {
- + public async publishHashtags(hashtagEntity): Promise < void > {
- const timestamp = new Date().setHours(0, 0, 1, 0);
- const hashtagsSeparated = hashtagEntity
- .map(el => el.hashtag)
- @@ -29,10 +29,10 @@ export class P2pDatabaseGunProvider {
- .put({ hashtags: hashtagsSeparated });
-
- this.gun
- - .get(this.osnPrefix)
- - .get("hashtags")
- - .get(timestamp)
- - .set(hashtags);
- + .get(this.osnPrefix)
- + .get("hashtags")
- + .get(timestamp)
- + .set(hashtags);
- }
-
- /**
- @@ -63,7 +63,7 @@ export class P2pDatabaseGunProvider {
- userId,
- intervalStart,
- intervalEnd
- - ): Promise<object[]> {
- + ): Promise < object[] > {
- const privateTweets = await this.gun
- .get(this.osnPrefix)
- .get("tweets")
- @@ -73,8 +73,8 @@ export class P2pDatabaseGunProvider {
- if (privateTweets) {
- const entries = await Promise.all(
- Object.keys(privateTweets)
- - .filter(key => key !== "_")
- - .map(key => this.gun.get(key).then())
- + .filter(key => key !== "_")
- + .map(key => this.gun.get(key).then())
- );
-
- return entries
- diff --git app/tsconfig.json app/tsconfig.json
- index 5d53142..2ce1629 100644
- --- app/tsconfig.json
- +++ app/tsconfig.json
- @@ -1,5 +1,6 @@
- {
- - "compilerOptions": {
- + "compilerOptions":
- + {
- "allowSyntheticDefaultImports": true,
- "declaration": false,
- "emitDecoratorMetadata": true,
- @@ -22,7 +23,8 @@
- "src/**/__tests__/*.ts"
- ],
- "compileOnSave": false,
- - "atom": {
- + "atom":
- + {
- "rewriteTsconfig": false
- }
- }
- diff --git app/tslint.json app/tslint.json
- index dd8e8d8..9754821 100644
- --- app/tslint.json
- +++ app/tslint.json
- @@ -1,5 +1,6 @@
- {
- - "rules": {
- + "rules":
- + {
- "no-duplicate-variable": true,
- "no-unused-variable": [
- true
|