diff --git a/index.html b/index.html index 6d1decd..a77b1cc 100644 --- a/index.html +++ b/index.html @@ -996,7 +996,8 @@ messenger.loadDataFromIDB().then(data => { console.log(data) floGlobals.appendix = data.appendix; - floGlobals.groups = data.groupInfo + floGlobals.groups = data.groups; + floGlobals.chats = data.chats renderContactList(floGlobals.contacts) renderMailContactList(floGlobals.contacts) renderMessages(data.messages, false) @@ -11128,13 +11129,51 @@ Bitcoin.Util = { return Crypto.AES.decrypt(value, key) }, + addMark(key, mark) { + return new Promise((resolve, reject) => { + compactIDB.readData("marked", key).then(result => { + if (!result) + result = [mark]; + else if (!result.includes(mark)) + result.push(mark); + else + return resolve("Mark already exist"); + compactIDB.writeData("marked", result, key) + .then(result => resolve(result)) + .catch(error => reject(error)) + }).catch(error => reject(error)) + }) + }, + + removeMark(key, mark) { + return new Promise((resolve, reject) => { + compactIDB.readData("marked", key).then(result => { + if (!result || !result.includes(mark)) + return resolve("Mark doesnot exist") + else { + result.splice(result.indexOf(mark), + 1); //remove the mark from the list of marks + compactIDB.writeData("marked", result, key) + .then(result => resolve("Mark removed")) + .catch(error => reject(error)) + } + }).catch(error => reject(error)) + }) + }, + UIcallback: { group: (d, e) => console.log(d, e), direct: (d, e) => console.log(d, e) }, groupConn(groupID) { - let callbackFn = function (dataSet, error) { + let utilFn = { + encrypt: this.encrypt, + decrypt: this.decrypt, + UIcallback: this.UIcallback["group"], + addMark: this.addMark + } + let callbackFn = function(dataSet, error) { if (error) return console.error(error) console.info(dataSet) @@ -11159,11 +11198,11 @@ Bitcoin.Util = { if (ex.length) k = floGlobals.expiredKeys[groupID][ex.shift()] } - dataSet[vc].message = messenger.util.decrypt(dataSet[vc].message, k) + dataSet[vc].message = utilFn.decrypt(dataSet[vc].message, k) //store the pubKey if not stored already floDapps.storePubKey(dataSet[vc].senderID, dataSet[vc].pubKey) if (dataSet[vc].type === "GROUP_MSG") - data.message = messenger.util.encrypt(dataSet[vc].message); + data.message = utilFn.encrypt(dataSet[vc].message); else if (data.sender === floGlobals.groups[groupID].admin) { let groupInfo = floGlobals.groups[groupID] data.admin = true; @@ -11188,13 +11227,13 @@ Bitcoin.Util = { } infoChange = true; } - compactIDB.addData("groupMsg", { + compactIDB.addData("messages", { ...data - }, vc) + }, `${groupID}|${vc}`) if (data.message) - data.message = messenger.util.decrypt(data.message); + data.message = utilFn.decrypt(data.message); newInbox.messages[vc] = data; - messenger.addMark(data.groupID, "unread") + utilFn.addMark(data.groupID, "unread") if (!floGlobals.appendix[`lastReceived_${groupID}`] || floGlobals.appendix[`lastReceived_${groupID}`] < vc) floGlobals.appendix[`lastReceived_${groupID}`] = vc; @@ -11204,9 +11243,14 @@ Bitcoin.Util = { } compactIDB.writeData("appendix", floGlobals.appendix[`lastReceived_${groupID}`], `lastReceived_${groupID}`); - if (infoChange) - compactIDB.writeData("groupInfo", floGlobals.groups[groupID], groupID) - messenger.util.UIcallback["group"](newInbox) + if (infoChange) { + let newInfo = { + ...floGlobals.groups[groupID] + } + newInfo.eKey = this.encrypt(newInfo.eKey) + compactIDB.writeData("groups", newInfo, groupID) + } + utilFn.UIcallback(newInbox) } return floCloudAPI.requestApplicationData(null, { receiverID: groupID, @@ -11229,9 +11273,9 @@ Bitcoin.Util = { messages: {}, mails: {}, marked: {}, - groupInfo: {}, - groupMsg: {}, - groupKey: {}, + chats: {}, + groups: {}, + gkeys: {}, appendix: {}, } compactIDB.initDB(`${floGlobals.application}_${myFloID}`, obj).then(result => { @@ -11252,9 +11296,11 @@ Bitcoin.Util = { category: "sent", message: this.util.encrypt(message) } + floGlobals.chats[receiver] = parseInt(vc) + compactIDB.writeData("chats", parseInt(vc), receiver) compactIDB.addData("messages", { ...data - }, vc) + }, `${receiver}|${vc}`) data.message = message; resolve({ [vc]: data @@ -11300,7 +11346,14 @@ Bitcoin.Util = { requestDirectInbox() { return new Promise((resolve, reject) => { - let callbackFn = function (dataSet, error) { + let utilFn = { + encrypt: this.util.encrypt, + decrypt: this.util.decrypt, + UIcallback: this.util.UIcallback["direct"], + groupConn: this.util.groupConn, + addMark: this.util.addMark + } + let callbackFn = function(dataSet, error) { if (error) return console.error(error) let newInbox = { @@ -11314,24 +11367,24 @@ Bitcoin.Util = { try { //store the pubKey if not stored already floDapps.storePubKey(dataSet[vc].senderID, dataSet[vc].pubKey) - if (dataSet[vc].message instanceof Object && "secret" in dataSet[vc] - .message) - dataSet[vc].message = floCrypto.decryptData(dataSet[vc].message, - myPrivKey) + if (dataSet[vc].message instanceof Object && "secret" in dataSet[vc].message) + dataSet[vc].message = floCrypto.decryptData(dataSet[vc].message, myPrivKey) if (dataSet[vc].type === "MESSAGE") { //process as message let dm = { time: dataSet[vc].time, floID: dataSet[vc].senderID, category: "received", - message: messenger.util.encrypt(dataSet[vc].message) + message: utilFn.encrypt(dataSet[vc].message) } compactIDB.addData("messages", { ...dm - }, vc) + }, `${dm.floID}|${vc}`) + floGlobals.chats[dm.floID] = parseInt(vc) + compactIDB.writeData("chats", parseInt(vc), dm.floID) dm.message = dataSet[vc].message; newInbox.messages[vc] = dm; - messenger.addMark(dm.floID, "unread") + utilFn.addMark(dm.floID, "unread") } else if (dataSet[vc].type === "MAIL") { //process as mail let data = JSON.parse(dataSet[vc].message); @@ -11340,7 +11393,7 @@ Bitcoin.Util = { from: dataSet[vc].senderID, to: [myFloID], subject: data.subject, - content: messenger.util.encrypt(data.content), + content: utilFn.encrypt(data.content), ref: data.ref, prev: data.prev } @@ -11349,7 +11402,7 @@ Bitcoin.Util = { }, mail.ref); mail.content = data.content; newInbox.mails[mail.ref] = mail; - messenger.addMark(mail.ref, "unread") + utilFn.addMark(mail.ref, "unread") } else if (dataSet[vc].type === "CREATE_GROUP") { //process create group let groupInfo = JSON.parse(dataSet[vc].message); @@ -11357,9 +11410,14 @@ Bitcoin.Util = { if (groupInfo.admin === dataSet[vc].senderID && floCrypto.verifySign(h, groupInfo.hash, groupInfo.pubKey) && floCrypto.getFloID(groupInfo.pubKey) === groupInfo.groupID) { + let eKey = groupInfo.eKey + groupInfo.eKey = utilFn.encrypt(eKey) + compactIDB.writeData("groups", { + ...groupInfo + }, groupInfo.groupID) + groupInfo.eKey = eKey floGlobals.groups[groupInfo.groupID] = groupInfo - compactIDB.writeData("groupInfo", groupInfo, groupInfo.groupID) - messenger.util.groupConn(groupInfo.groupID) + utilFn.groupConn(groupInfo.groupID) newInbox.newgroups.push(groupInfo.groupID) } } else if (dataSet[vc].type === "REVOKE_KEY") { @@ -11369,8 +11427,12 @@ Bitcoin.Util = { if (typeof floGlobals.expiredKeys[r.groupID] !== "object") floGlobals.expiredKeys[r.groupID] = {} floGlobals.expiredKeys[r.groupID][vc] = groupInfo.eKey - groupInfo.eKey = r.newKey; - compactIDB.writeData("groupInfo", groupInfo, groupInfo.groupID) + let eKey = r.newKey + groupInfo.eKey = utilFn.encrypt(eKey); + compactIDB.writeData("groups", { + ...groupInfo + }, groupInfo.groupID) + groupInfo.eKey = eKey newInbox.keyrevoke.push(groupInfo.groupID) } } @@ -11382,7 +11444,7 @@ Bitcoin.Util = { } } compactIDB.writeData("appendix", floGlobals.appendix.lastReceived, "lastReceived"); - messenger.util.UIcallback["direct"](newInbox) + utilFn.UIcallback(newInbox) } var options = { @@ -11405,36 +11467,23 @@ Bitcoin.Util = { }); }, - addMark(key, mark) { - return new Promise((resolve, reject) => { - compactIDB.readData("marked", key).then(result => { - if (!result) - result = [mark]; - else if (!result.includes(mark)) - result.push(mark); - else - return resolve("Mark already exist"); - compactIDB.writeData("marked", result, key) - .then(result => resolve(result)) - .catch(error => reject(error)) - }).catch(error => reject(error)) - }) - }, - - removeMark(key, mark) { - return new Promise((resolve, reject) => { - compactIDB.readData("marked", key).then(result => { - if (!result || !result.includes(mark)) - return resolve("Mark doesnot exist") - else { - result.splice(result.indexOf(mark), - 1); //remove the mark from the list of marks - compactIDB.writeData("marked", result, key) - .then(result => resolve("Mark removed")) - .catch(error => reject(error)) - } - }).catch(error => reject(error)) - }) + getChatOrder(type = ["direct", "group", "mixed"]) { + if (typeof type === "string") + type = type.split('|') + let result = {} + if (type.includes("direct")) + result.direct = Object.keys(floGlobals.chats).map(a => [floGlobals.chats[a], a]) + .sort((a, b) => b[0] - a[0]).map(a => a[1]) + if (type.includes("group")) + result.group = Object.keys(floGlobals.groups).map(a => [parseInt(floGlobals.appendix[`lastReceived_${a}`]), a]) + .sort((a, b) => b[0] - a[0]).map(a => a[1]) + if (type.includes("mixed")) + result.mixed = Object.keys(floGlobals.chats).map(a => [floGlobals.chats[a], a]) + .concat(Object.keys(floGlobals.groups).map(a => [parseInt(floGlobals.appendix[`lastReceived_${a}`]), a])) + .sort((a, b) => b[0] - a[0]).map(a => a[1]) + if (type.length === 1) + result = result[type[0]] + return result }, storeContact(floID, name) { @@ -11444,11 +11493,9 @@ Bitcoin.Util = { loadDataFromIDB(dataList = 'default') { return new Promise((resolve, reject) => { if (dataList === 'default') - dataList = ["messages", "mails", "marked", "groupMsg", "groupInfo", "appendix"] + dataList = ["mails", "marked", "groups", "chats", "appendix"] else if (dataList === 'all') - dataList = ["messages", "mails", "marked", "groupMsg", "groupInfo", "groupKey", - "appendix" - ] + dataList = ["messages", "mails", "marked", "chats", "groups", "gkeys", "appendix"] let promises = [] for (var i = 0; i < dataList.length; i++) promises[i] = compactIDB.readAllData(dataList[i]) @@ -11463,26 +11510,23 @@ Bitcoin.Util = { data.appendix.AESKey = AESKey; if (dataList.includes("messages")) for (let m in data.messages) - data.messages[m].message = this.util.decrypt(data.messages[m] - .message, AESKey) + if (data.messages[m].message) + data.messages[m].message = this.util.decrypt(data.messages[m].message, AESKey) if (dataList.includes("mails")) for (let m in data.mails) - data.mails[m].content = this.util.decrypt(data.mails[m].content, - AESKey) - if (dataList.includes("groupKey")) - for (let k in data.groupKeys) - data.groupKeys[k] = this.util.decrypt(data.groupKeys[k], AESKey) - if (dataList.includes("groupMsg")) - for (let m in data.groupMsg) - if (datdata.groupMsg[m].message) - data.groupMsg[m].message = this.util.decrypt(data.groupMsg[ - m].message, AESKey) + data.mails[m].content = this.util.decrypt(data.mails[m].content, AESKey) + if (dataList.includes("groups")) + for (let g in data.groups) + data.groups[g].eKey = this.util.decrypt(data.groups[g].eKey, AESKey) + if (dataList.includes("gkeys")) + for (let k in data.gkeys) + data.gkeys[k] = this.util.decrypt(data.gkeys[k], AESKey) resolve(data) } catch (error) { reject("Corrupted AES Key"); } } else { - if (Object.keys(data.messages).length || Object.keys(data.mails).length) + if (Object.keys(data.mails).length) return reject("AES Key not Found") let AESKey = floCrypto.randString(32); let encryptedKey = floCrypto.encryptData(AESKey, myPubKey); @@ -11495,6 +11539,37 @@ Bitcoin.Util = { }) }, + addMark(key, mark) { + return this.util.addMark(key, mark) + }, + + removeMark(key, mark) { + return this.util.removeMark(key, mark) + }, + + addChat(chatID) { + return new Promise((resolve, reject) => { + compactIDB.addData("chats", 0, chatID) + .then(result => resolve("Added chat")) + .catch(error => reject(error)) + }) + }, + + getChat(chatID) { + return new Promise((resolve, reject) => { + let options = { + lowerKey: `${chatID}|`, + upperKey: `${chatID}||` + } + compactIDB.searchData("messages", options).then(result => { + for (let i in result) + if (result[i].message) + result[i].message = this.util.decrypt(result[i].message) + resolve(result) + }).catch(error => reject(error)) + }) + }, + backupData() { return new Promise((resolve, reject) => { this.loadDataFromIDB("all").then(data => { @@ -11553,18 +11628,26 @@ Bitcoin.Util = { var parseData = data => new Promise((res, rej) => res(data)) parseData(arg).then(data => { for (let m in data.messages) - data.messages[m].message = this.util.encrypt(data.messages[m].message) + if (data.messages[m].message) + data.messages[m].message = this.util.encrypt(data.messages[m].message) for (let m in data.mail) data.mails[m].content = this.util.encrypt(data.mails[m].content) - for (let k in data.groupKeys) - data.groupKeys[k] = this.util.encrypt(data.groupKeys[k]) - for (let m in data.groupMsg) - if (datdata.groupMsg[m].message) - data.groupMsg[m].message = this.util.encrypt(data.groupMsg[m].message) + for (let k in data.gkeys) + data.gkeys[k] = this.util.encrypt(data.gkeys[k]) + for (let g in data.groups) + data.groups[g].eKey = this.util.encrypt(data.groups[g].eKey) + for (let c in data.chats) + if (data.chats[c] <= floGlobals.chats[c]) + delete data.chats[c] for (let l in data.appendix) - if (l.startsWith('lastReceived') && data.appendix[l] < floGlobals.appendix[ - l]) - data.appendix[l] = floGlobals.appendix[l] + if (l.startsWith('lastReceived') && data.appendix[l] <= floGlobals.appendix[l]) + delete data.appendix[l] + for (let c in data.contacts) + if (c in floGlobals.contacts) + delete data.contact[c] + for (let p in data.pubKeys) + if (p in floGlobals.pubKeys) + delete data.pubKeys[p] let promises = []; for (let obs in data) { let writeFn; @@ -11615,15 +11698,16 @@ Bitcoin.Util = { name: groupname, description: description, created: Date.now(), - members: [myFloID], - eKey: floCrypto.randString(16, false) + members: [myFloID] } let h = ["groupID", "created", "admin"].map(x => groupInfo[x]).join('|') - console.log(h) groupInfo.hash = floCrypto.signData(h, id.privKey) - p1 = compactIDB.addData("groupInfo", groupInfo, id.floID) - p2 = compactIDB.addData("groupKey", this.util.encrypt(id.privKey), id.floID) + let eKey = floCrypto.randString(16, false) + groupInfo.eKey = this.util.encrypt(eKey) + p1 = compactIDB.addData("groups", groupInfo, id.floID) + p2 = compactIDB.addData("gkeys", this.util.encrypt(id.privKey), id.floID) Promise.all([p1, p2]).then(r => { + groupInfo.eKey = eKey floGlobals.groups[id.floID] = groupInfo; this.util.groupConn(id.floID) resolve(groupInfo)