Adding some 'group' features
Added addGroupMembers, rmGroupMember, deleteGroup
This commit is contained in:
parent
fbdf303aa1
commit
e2c38c0bea
481
app/app.js
481
app/app.js
@ -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,26 +326,25 @@ function userDataStartUp() {
|
|||||||
console.log(result);
|
console.log(result);
|
||||||
getContactsfromIDB().then(result => {
|
getContactsfromIDB().then(result => {
|
||||||
contacts = result;
|
contacts = result;
|
||||||
getGroupsfromIDB().then(result => {
|
getSuperNodeListfromIDB().then(result => {
|
||||||
groups = result;
|
console.log(result)
|
||||||
console.log(groups);
|
superNodeList = result;
|
||||||
getSuperNodeListfromIDB().then(result => {
|
kBucketObj.launchKBucket().then(result => {
|
||||||
console.log(result)
|
console.log(result)
|
||||||
superNodeList = result;
|
getuserID().then(result => {
|
||||||
kBucketObj.launchKBucket().then(result => {
|
console.log(result);
|
||||||
console.log(result)
|
selfID = result;
|
||||||
getuserID().then(result => {
|
if (superNodeList.includes(selfID))
|
||||||
console.log(result);
|
modSuperNode = true;
|
||||||
selfID = result;
|
alert(`${selfID}\nWelcome ${contacts[selfID].name}`)
|
||||||
if (superNodeList.includes(selfID))
|
getGroupsfromIDB().then(result => {
|
||||||
modSuperNode = true;
|
groups = result;
|
||||||
alert(`${selfID}\nWelcome ${contacts[selfID].name}`)
|
|
||||||
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,
|
||||||
time: time,
|
directMsg: {
|
||||||
secret: msgEncrypt.secret,
|
time: time,
|
||||||
sign: sign,
|
msgCipher: floOpt.encryptData(msg, contacts[receiverID].pubKey),
|
||||||
pubVal: msgEncrypt.senderPublicKeyString
|
sign: sign
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
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,
|
||||||
group: receiverID,
|
groupMsg: {
|
||||||
time: time,
|
group: receiverID,
|
||||||
secret: msgEncrypt.secret,
|
time: time,
|
||||||
sign: sign,
|
msgCipher: floOpt.encryptData(msg, groups[receiverID].pubKey),
|
||||||
pubVal: msgEncrypt.senderPublicKeyString
|
sign: sign
|
||||||
|
}
|
||||||
};
|
};
|
||||||
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));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user