Adding some 'group' features

Added addGroupMembers, rmGroupMember, deleteGroup
This commit is contained in:
Sai Raj 2019-09-07 01:18:57 +05:30 committed by GitHub
parent fbdf303aa1
commit e2c38c0bea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -119,7 +119,7 @@ var floOpt = {
let secret = Crypto.AES.encrypt(data, senderKey); let secret = Crypto.AES.encrypt(data, senderKey);
return { return {
secret: secret, secret: secret,
senderPublicKeyString: senderECKeyData.senderPublicKeyString pubVal: senderECKeyData.senderPublicKeyString
}; };
}, },
@ -223,7 +223,7 @@ function ajax(method, uri) {
console.log(url) console.log(url)
var result; var result;
request.open(method, url, false); request.open(method, url, false);
request.onload = () => { request.onload = function () {
if (request.readyState == 4 && request.status == 200) if (request.readyState == 4 && request.status == 200)
result = this.response; result = this.response;
else { else {
@ -236,7 +236,6 @@ function ajax(method, uri) {
return result; return result;
} }
function registerID(sender, onionAddr, wif, pubkey, username) { function registerID(sender, onionAddr, wif, pubkey, username) {
var receiver = adminID; var receiver = adminID;
@ -313,11 +312,6 @@ function broadcastTx(signedTxHash) {
return result; return result;
} }
function convertStringToInt(string) {
return parseInt(string, 10);
}
function userDataStartUp() { function userDataStartUp() {
console.log("StartUp"); console.log("StartUp");
@ -332,9 +326,6 @@ function userDataStartUp() {
console.log(result); console.log(result);
getContactsfromIDB().then(result => { getContactsfromIDB().then(result => {
contacts = result; contacts = result;
getGroupsfromIDB().then(result => {
groups = result;
console.log(groups);
getSuperNodeListfromIDB().then(result => { getSuperNodeListfromIDB().then(result => {
console.log(result) console.log(result)
superNodeList = result; superNodeList = result;
@ -346,12 +337,14 @@ function userDataStartUp() {
if (superNodeList.includes(selfID)) if (superNodeList.includes(selfID))
modSuperNode = true; modSuperNode = true;
alert(`${selfID}\nWelcome ${contacts[selfID].name}`) alert(`${selfID}\nWelcome ${contacts[selfID].name}`)
getGroupsfromIDB().then(result => {
groups = result;
readMsgfromIDB().then(result => { readMsgfromIDB().then(result => {
console.log(result); console.log(result);
readGroupMsgfromIDB().then(result => { readGroupMsgfromIDB().then(result => {
console.log(result); console.log(result);
initselfWebSocket(); initselfWebSocket();
pingSuperNodeForMessages(); pingSuperNodeForAwayMessages();
displayContacts(); displayContacts();
const createClock = setInterval(checkStatusInterval, 30000); const createClock = setInterval(checkStatusInterval, 30000);
}).catch(error => { }).catch(error => {
@ -360,7 +353,6 @@ function userDataStartUp() {
}).catch(error => { }).catch(error => {
console.log(error); console.log(error);
}); });
//startChats();
}).catch(error => { }).catch(error => {
console.log(error.message); console.log(error.message);
}); });
@ -671,36 +663,7 @@ function readMsgfromIDB() {
obs.openCursor().onsuccess = (event) => { obs.openCursor().onsuccess = (event) => {
var cursor = event.target.result; var cursor = event.target.result;
if (cursor) { if (cursor) {
var chat = document.getElementById(cursor.value.floID); createMsgElement(cursor.value);
if (cursor.value.type == "R") {
var msgdiv = document.createElement('div');
msgdiv.setAttribute("class", "row message-body");
msgdiv.innerHTML = `<div class="col-sm-12 message-main-receiver">
<div class="receiver">
<span class="message-text">
${cursor.value.text}
</span>
<span class="message-time pull-right">
${getTime(cursor.value.time)}
</span>
</div>
</div>`;
chat.appendChild(msgdiv);
} else if (cursor.value.type == "S") {
var msgdiv = document.createElement('div');
msgdiv.setAttribute("class", "row message-body");
msgdiv.innerHTML = `<div class="col-sm-12 message-main-sender">
<div class="sender">
<span class="message-text">${cursor.value.text}
</span>
<span class="message-time pull-right">
${getTime(cursor.value.time)}
</span>
</div>
</div>`;
chat.appendChild(msgdiv);
}
cursor.continue(); cursor.continue();
} else { } else {
resolve("Read Msg from IDB"); resolve("Read Msg from IDB");
@ -731,39 +694,7 @@ function readGroupMsgfromIDB() {
obs.openCursor().onsuccess = (event) => { obs.openCursor().onsuccess = (event) => {
var cursor = event.target.result; var cursor = event.target.result;
if (cursor) { if (cursor) {
var chat = document.getElementById(cursor.value.groupID); createMsgElement(cursor.value);
if (cursor.value.type == "R") {
var msgdiv = document.createElement('div');
msgdiv.setAttribute("class", "row message-body");
msgdiv.innerHTML = `<div class="col-sm-12 message-main-receiver">
<div class="receiver">
<span class="message-text">
<b>${cursor.value.sender}</b>
<br/>${cursor.value.text}
</span>
<span class="message-time pull-right">
${getTime(cursor.value.time)}
</span>
</div>
</div>`;
chat.appendChild(msgdiv);
} else if (cursor.value.type == "S") {
var msgdiv = document.createElement('div');
msgdiv.setAttribute("class", "row message-body");
msgdiv.innerHTML = `<div class="col-sm-12 message-main-sender">
<div class="sender">
<span class="message-text">
<b>${cursor.value.sender}</b>
<br/>${cursor.value.text}
</span>
<span class="message-time pull-right">
${getTime(cursor.value.time)}
</span>
</div>
</div>`;
chat.appendChild(msgdiv);
}
cursor.continue(); cursor.continue();
} else { } else {
resolve("Read Group Msgs from IDB"); resolve("Read Group Msgs from IDB");
@ -884,70 +815,11 @@ function initselfWebSocket() {
try { try {
var data = JSON.parse(evt.data); var data = JSON.parse(evt.data);
if (data.to == selfID) { if (data.to == selfID) {
console.log('Incoming self') console.log('Incoming data')
if (data.group === undefined) { processIncomingData(data);
var msg = floOpt.decryptData(data.secret, data.pubVal, privKey)
if (!floOpt.verifyData(msg, data.sign, contacts[data.from].pubKey))
return
var time = Date.now();
var disp = document.getElementById(data.from);
var msgdiv = document.createElement('div');
msgdiv.setAttribute("class", "row message-body");
msgdiv.innerHTML = `<div class="col-sm-12 message-main-receiver">
<div class="receiver">
<span class="message-text">
${msg}
</span>
<span class="message-time pull-right">
${getTime(time)}
</span>
</div>
</div>`;
disp.appendChild(msgdiv);
storeMsg({
time: time,
floID: data.from,
text: msg,
type: "R"
});
} else if (data.group in groups && groups[data.group].members.includes(data.from)) {
var msg = floOpt.decryptData(data.secret, data.pubVal, groups[data.group].privKey);
if (!floOpt.verifyData(msg, data.sign, contacts[data.from].pubKey))
return
var time = Date.now();
var disp = document.getElementById(data.group);
var msgdiv = document.createElement('div');
msgdiv.setAttribute("class", "row message-body");
msgdiv.innerHTML = `<div class="col-sm-12 message-main-receiver">
<div class="receiver">
<span class="message-text">
<b>${data.from}</b>
<br/>${msg}
</span>
<span class="message-time pull-right">
${getTime(time)}
</span>
</div>
</div>`;
disp.appendChild(msgdiv);
storeGroupMsg({
time: time,
groupID: data.group,
sender: data.from,
text: msg,
type: "R"
});
}
} else if (data.newGroup) {
var groupInfoStr = floOpt.decryptData(data.groupInfo.secret, data.groupInfo.senderPublicKeyString, privKey)
var groupInfo = JSON.parse(groupInfoStr);
if (floOpt.verifyData(groupInfoStr, data.sign, contacts[groupInfo.creator].pubKey)) {
storeGroup(groupInfoStr, groupInfo.floID);
createGroupDisplay(groupInfo);
}
} else if (modSuperNode) { } else if (modSuperNode) {
if (data.pingNewMsg) if (data.pingAway !== undefined)
sendStoredSuperNodeMsgs(data.floID) sendStoredSuperNodeMsgs(data.pingAway)
else { else {
kBucketObj.determineClosestSupernode(data.to).then(result => { kBucketObj.determineClosestSupernode(data.to).then(result => {
console.log(result) console.log(result)
@ -970,13 +842,100 @@ function initselfWebSocket() {
}; };
} }
function pingSuperNodeForMessages() { function processIncomingData(data) {
if (data.directMsg !== undefined) {
var msg = floOpt.decryptData(data.directMsg.msgCipher.secret, data.directMsg.msgCipher.pubVal, privKey)
if (!floOpt.verifyData(msg, data.directMsg.sign, contacts[data.from].pubKey))
return
var msgInfo = {
time: Date.now(),
floID: data.from,
text: msg,
type: "R"
}
createMsgElement(msgInfo);
storeGroupMsg(msgInfo);
} else if (data.groupMsg !== undefined && data.groupMsg.group in groups) {
if (!(groups[data.groupMsg.group].includes(data.from)))
return
var msg = floOpt.decryptData(data.groupMsg.msgCipher.secret, data.groupMsg.msgCipher.pubVal, groups[data.groupMsg.group].privKey);
if (!floOpt.verifyData(msg, data.groupMsg.sign, contacts[data.from].pubKey))
return
var msgInfo = {
time: Date.now(),
groupID: data.groupMsg.group,
sender: data.from,
text: msg,
type: "R"
}
createMsgElement(msgInfo);
storeGroupMsg(msgInfo);
} else if (data.newGroup !== undefined) {
var groupInfoStr = floOpt.decryptData(data.newGroup.groupInfo.secret, data.newGroup.groupInfo.pubVal, privKey)
var groupInfo = JSON.parse(groupInfoStr);
if (floOpt.verifyData(groupInfoStr, data.newGroup.sign, contacts[groupInfo.creator].pubKey)) {
storeGroup(groupInfoStr, groupInfo.floID);
createGroupDisplay(groupInfo);
}
} else if (data.deleteGroup !== undefined && data.deleteGroup.group in groups) {
if (data.from != groups[data.deleteGroup.group].creator)
return
if (floOpt.verifyData('deleteGroup:' + data.deleteGroup.group, data.deleteGroup.sign, contacts[data.from].pubKey)) {
//remove group
}
} else if (data.addGroupMembers !== undefined && data.addGroupMembers.group in groups) {
if (data.from != groups[data.addGroupMembers.group].creator)
return
if (floOpt.verifyData(data.addGroupMembers.members.join('|'), data.addGroupMembers.sign, contacts[data.from].pubKey)) {
group[data.addGroupMembers.group].members = group[data.addGroupMembers.group].members.concat(data.addGroupMembers.members);
var groupInfoStr = JSON.stringify(group[data.addGroupMembers.group]);
storeGroup(groupInfoStr, data.addGroupMembers.group);
}
} else if (data.rmGroupMembers !== undefined && data.rmGroupMembers.group in groups) {
if (data.from != groups[data.rmGroupMembers.group].creator)
return
if (floOpt.verifyData(data.rmGroupMembers.members.join('|'), data.rmGroupMembers.sign, contacts[data.from].pubKey)) {
groups[data.rmGroupMembers.group].members = groups[data.rmGroupMembers.group].members.filter(x => !data.rmGroupMembers.members.includes(x)); //remove member from group
var groupInfoStr = JSON.stringify(group[data.rmGroupMembers.group]);
storeGroup(groupInfoStr, data.rmGroupMembers.group);
}
}
}
function createMsgElement(msgInfo) {
const type = {
S: 'sender',
R: 'receiver'
};
if (msgInfo.groupID === undefined) {
var msgEl = document.getElementById(msgInfo.floID);
var msghd = '';
} else {
var disp = document.getElementById(msgInfo.groupID);
var msghd = `<b>${msgInfo.sender}</b>`;
}
var msgdiv = document.createElement('div');
msgdiv.setAttribute("class", "row message-body");
msgdiv.innerHTML = `<div class="col-sm-12 message-main-receiver">
<div class="${type[msgInfo.type]}">
<span class="message-text">
${msghd}<br/>${msgInfo.text}
</span>
<span class="message-time pull-right">
${getTime(msgInfo.time)}
</span>
</div>
</div>`;
msgEl.appendChild(msgdiv);
}
function pingSuperNodeForAwayMessages() {
kBucketObj.determineClosestSupernode(selfID).then(result => { kBucketObj.determineClosestSupernode(selfID).then(result => {
var selfSuperNodeWS = new WebSocket("ws://" + contacts[result[0].floID].onionAddr + "/ws"); var selfSuperNodeWS = new WebSocket("ws://" + contacts[result[0].floID].onionAddr + "/ws");
selfSuperNodeWS.onopen = (evt) => { selfSuperNodeWS.onopen = (evt) => {
var data = JSON.stringify({ var data = JSON.stringify({
pingNewMsg: true, pingAway: selfID
floID: selfID
}); });
selfSuperNodeWS.send(data) selfSuperNodeWS.send(data)
console.log('Pinged selfSupernode for new messages') console.log('Pinged selfSupernode for new messages')
@ -1097,25 +1056,27 @@ function sendMsg() {
alert("Select a contact and send message"); alert("Select a contact and send message");
return; return;
} }
if (msgType === 'group') {
sendGroupMsg();
return;
}
var inp = document.getElementById('sendMsgInput') var inp = document.getElementById('sendMsgInput')
var msg = inp.value; var msg = inp.value;
inp.value = ""; inp.value = "";
console.log(msg); console.log(msg);
var time = Date.now(); var time = Date.now();
var sign = floOpt.signData(msg, privKey) var sign = floOpt.signData(msg, privKey);
var msgEncrypt = floOpt.encryptData(msg, contacts[receiverID].pubKey) if (msgType === 'direct')
sendDirectMsg(msg, time, sign);
else if (msgType === 'group')
sendGroupMsg(msg, time, sign);
}
function sendDirectMsg(msg, time, sign) {
var data = JSON.stringify({ var data = JSON.stringify({
from: selfID, from: selfID,
to: receiverID, to: receiverID,
directMsg: {
time: time, time: time,
secret: msgEncrypt.secret, msgCipher: floOpt.encryptData(msg, contacts[receiverID].pubKey),
sign: sign, sign: sign
pubVal: msgEncrypt.senderPublicKeyString }
}); });
if (recStat) { if (recStat) {
@ -1123,45 +1084,25 @@ function sendMsg() {
} else { } else {
receiverSuperNodeWS.send(data); receiverSuperNodeWS.send(data);
} }
var msgInfo = {
console.log(`sentMsg : ${data}`);
var disp = document.getElementById(receiverID);
var msgdiv = document.createElement('div');
msgdiv.setAttribute("class", "row message-body");
msgdiv.innerHTML = `<div class="col-sm-12 message-main-sender">
<div class="sender">
<span class="message-text">${msg}
</span>
<span class="message-time pull-right">
${getTime(time)}
</span>
</div>
</div>`;
disp.appendChild(msgdiv);
storeMsg({
time: time, time: time,
floID: receiverID, floID: receiverID,
text: msg, text: msg,
type: "S" type: "S"
}); }
createMsgElement(msgInfo);
storeMsg(msgInfo);
} }
function sendGroupMsg() { function sendGroupMsg(msg, time, sign) {
var inp = document.getElementById('sendMsgInput');
var msg = inp.value;
inp.value = "";
console.log(msg);
var time = Date.now();
var sign = floOpt.signData(msg, privKey)
var msgEncrypt = floOpt.encryptData(msg, groups[receiverID].pubKey)
var data = { var data = {
from: selfID, from: selfID,
groupMsg: {
group: receiverID, group: receiverID,
time: time, time: time,
secret: msgEncrypt.secret, msgCipher: floOpt.encryptData(msg, groups[receiverID].pubKey),
sign: sign, sign: sign
pubVal: msgEncrypt.senderPublicKeyString }
}; };
console.log(data); console.log(data);
@ -1171,29 +1112,15 @@ function sendGroupMsg() {
data.to = floID; data.to = floID;
sendData(floID, JSON.stringify(data)); sendData(floID, JSON.stringify(data));
}); });
var msgInfo = {
var disp = document.getElementById(receiverID);
var msgdiv = document.createElement('div');
msgdiv.setAttribute("class", "row message-body");
msgdiv.innerHTML = `<div class="col-sm-12 message-main-sender">
<div class="sender">
<span class="message-text">
<b>${selfID}</b>
<br/>${msg}
</span>
<span class="message-time pull-right">
${getTime(time)}
</span>
</div>
</div>`;
disp.appendChild(msgdiv);
storeGroupMsg({
time: time, time: time,
sender: selfID, sender: selfID,
groupID: receiverID, groupID: receiverID,
text: msg, text: msg,
type: "S" type: "S"
}); }
createMsgElement(msgInfo);
storeGroupMsg(msgInfo);
} }
function sendStoredSuperNodeMsgs(floID) { function sendStoredSuperNodeMsgs(floID) {
@ -1243,30 +1170,6 @@ function sendStoredSuperNodeMsgs(floID) {
}; };
} }
function newGroup() {
var members = prompt("Enter Members FLO_ID : ");
var memList = members.split(',');
grpName = prompt("Enter Group Name : ");
createNewGroup(memList, grpName);
}
function createNewGroup(memList, grpName) {
var grpInfo = floOpt.genNewIDpair();
grpInfo.name = grpName;
grpInfo.members = memList;
grpInfo.creator = selfID;
var grpInfoStr = JSON.stringify(grpInfo);
console.log(grpInfoStr);
grpInfo.members.forEach(floID => {
var data = JSON.stringify({
newGroup: true,
groupInfo: floOpt.encryptData(grpInfoStr, contacts[floID].pubKey),
sign: floOpt.signData(grpInfoStr, privKey)
});
sendData(floID, data);
});
}
async function sendData(floID, data) { async function sendData(floID, data) {
try { try {
var recipientWS = new WebSocket("ws://" + contacts[floID].onionAddr + "/ws"); var recipientWS = new WebSocket("ws://" + contacts[floID].onionAddr + "/ws");
@ -1350,3 +1253,109 @@ function storeGroup(groupInfoStr, groupID) {
db.close(); db.close();
}; };
} }
function createGroup() {
var members = prompt("Enter Members FLO_ID : ");
var grpName = prompt("Enter Group Name : ");
var grpInfo = floOpt.genNewIDpair();
grpInfo.name = grpName;
grpInfo.members = members.split(',');
grpInfo.creator = selfID;
var grpInfoStr = JSON.stringify(grpInfo);
console.log(grpInfoStr);
var data = {
from: selfID,
newGroup: {
sign: floOpt.signData(grpInfoStr, privKey)
}
}
grpInfo.members.forEach(floID => {
data.to = floID;
data.newGroup.groupInfo = floOpt.encryptData(grpInfoStr, contacts[floID].pubKey),
sendData(floID, JSON.stringify(data));
});
}
function deleteGroup() {
var flag = confirm("Are you sure you want to delete this group?");
if (flag) {
var data = {
from: selfID,
deleteGroup: {
group: receiverID,
sign: floOpt.signData('deleteGroup:' + receiverID, privKey)
}
};
groups[receiverID].members.forEach(floID => {
data.to = floID;
sendData(floID, JSON.stringify(data));
});
}
}
function addGroupMembers() {
var newMembers = prompt("Enter new Members : ");
newMembers = newMembers.split(',');
var data1 = {
from: selfID,
addGroupMembers: {
group: receiverID,
members: newMembers,
sign: floOpt.signData(newMembers.join('|'), privKey)
}
}
groups[receiverID].members.forEach(floID => {
if (floID == selfID) //dont send to self
return;
data1.to = floID;
sendData(floID, JSON.stringify(data1));
});
groups[receiverID].members = groups[receiverID].members.concat(newMembers);
var grpInfoStr = JSON.stringify(groups[receiverID]);
console.log(grpInfoStr);
var data2 = {
from: selfID,
newGroup: {
sign: floOpt.signData(grpInfoStr, privKey)
}
}
newMembers.forEach(floID => {
data2.to = floID;
data2.newGroup.groupInfo = floOpt.encryptData(grpInfoStr, contacts[floID].pubKey),
sendData(floID, JSON.stringify(data2));
});
storeGroup(grpInfoStr, receiverID);
}
function rmGroupMembers() {
var rmMembers = prompt("Enter Members to remove : ");
rmMembers = rmMembers.split(',');
var data1 = {
from: selfID,
rmGroupMembers: {
group: receiverID,
members: rmMembers,
sign: floOpt.signData(rmMembers.join('|'), privKey)
}
}
groups[receiverID].members = groups[receiverID].members.filter(x => !rmMembers.includes(x)); //remove member from group
storeGroup(JSON.stringify(groups[receiverID]), receiverID);
groups[receiverID].members.forEach(floID => {
if (floID == selfID)
return;
data1.to = floID;
sendData(floID, JSON.stringify(data1));
});
var data2 = {
from: selfID,
deleteGroup: {
group: receiverID,
sign: floOpt.signData('deleteGroup:' + receiverID, privKey)
}
};
rmMembers.forEach(floID => {
data2.to = floID;
sendData(floID, JSON.stringify(data2));
});
}