From ee28b18b1474d9f67e85610c141e7e07999962ff Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Sat, 4 Nov 2023 08:46:48 -0400 Subject: [PATCH] Added message handler --- additional-scripts.js | 76 +++++++++++++++++++++++++++++++++++++++++++ src/App.vue | 2 ++ 2 files changed, 78 insertions(+) diff --git a/additional-scripts.js b/additional-scripts.js index 35b87c5..9ce0ea7 100644 --- a/additional-scripts.js +++ b/additional-scripts.js @@ -1,3 +1,8 @@ + +importScripts("https://cdn.jsdelivr.net/npm/tweetnacl-util@0.15.1/nacl-util.min.js"); +importScripts("https://cdnjs.cloudflare.com/ajax/libs/tweetnacl/1.0.2/nacl.min.js"); +importScripts("https://cdn.jsdelivr.net/npm/@sphereon/did-jwt/build/index.min.js"); + self.addEventListener("push", function (event) { let payload; if (event.data) { @@ -13,3 +18,74 @@ self.addEventListener("push", function (event) { event.waitUntil(self.registration.showNotification(title, options)); }); + + +self.addEventListener('message', function(event) { + const data = event.data; + + const secret = await page.evaluate(() => { + const secret = localStorage.getItem('secret'); + return secret; + }); + + const secretUint8Array = util.decodeBase64(secret); + + const dbNames = await page.evaluate(() => { + return new Promise((resolve, reject) => { + let db = indexedDB.open('TimeSafari'); + db.onsuccess = async (event) => { + this.db = event.target.result; + const transaction = this.db.transaction('settings', 'readonly'); + const objectStore = transaction.objectStore('settings'); + const request = objectStore.get(1); + request.onsuccess = () => { + const row = request.result; + resolve(row); + } + }; + }); + }, {timeout: 10000}); + + const dbAccounts = await page.evaluate(() => { + return new Promise((resolve, reject) => { + let db = indexedDB.open('TimeSafariAccounts'); + db.onsuccess = async (event) => { + this.db = event.target.result; + const transaction = this.db.transaction('accounts', 'readonly'); + const objectStore = transaction.objectStore('accounts'); + const request = objectStore.getAll(); + request.onsuccess = () => { + const rows = request.result; + resolve(rows); + } + }; + }); + }, {timeout: 10000}); + + for (var i = 0; i < dbAccounts.length; i++) { + let account = dbAccounts[i]; + let did = account['did']; + let publicKeyHex = account['publicKeyHex']; + let identity = account['identity']; + + const messageWithNonceAsUint8Array = util.decodeBase64(identity); + const nonce = messageWithNonceAsUint8Array.slice(0, 24); + const message = messageWithNonceAsUint8Array.slice(24, identity.length); + + const decrypted = nacl.secretbox.open(message, nonce, secretUint8Array); + + const decoder = new TextDecoder('utf-8'); + const string = decoder.decode(decrypted); + const indentifier = JSON.parse(string); + + + } + + switch (data.command) { + case 'account': + break; + + default: + console.log('Unknown command:', data.command); + } +}); diff --git a/src/App.vue b/src/App.vue index b732aee..c9ccb21 100644 --- a/src/App.vue +++ b/src/App.vue @@ -278,6 +278,7 @@ export default class App extends Vue { }); } + private askPermission(): Promise { // Check if Notifications are supported if (!("Notification" in window)) { @@ -311,6 +312,7 @@ export default class App extends Vue { }); } + async turnOnNotifications() { return this.askPermission() .then((permission) => {