FLO_Twitter/app/web/msg.js
sairajzero 174b9fddf6 Improved user login and stability of funtions
Old prompt based user login and server connect are replaced with login page
Improved stability and simplification of functions
Moved all superNode functions to app.js
Supernode mode will now work in all pages (home,profile,msg) instead of just home
2019-07-24 03:01:29 +05:30

192 lines
7.0 KiB
JavaScript

var profiles;
var receiverID,selfID,privKey,modSuperNode;
var selfwebsocket,receiverWebSocket,recStat;
function initMsgs(){
if( sessionStorage.profiles === undefined || sessionStorage.privKey === undefined || sessionStorage.selfID === undefined || sessionStorage.serverPass === undefined || sessionStorage.superNodeList === undefined ){
alert("Login credentials failed! Returning to login page!");
window.location.href = "index.html";
return;
}
profiles = JSON.parse(sessionStorage.profiles);
console.log(profiles);
privKey = encrypt.retrieveShamirSecret(JSON.parse(sessionStorage.privKey));
selfID = sessionStorage.selfID;
superNodeList = JSON.parse(sessionStorage.superNodeList);
if(superNodeList.includes(selfID))
modSuperNode = true;
kBucketObj.launchKBucket().then(result => {
console.log(result)
initselfWebSocket();
readMsgfromIDB().then(result => {
listProfiles();
document.getElementById("sendMsgInput").addEventListener("keyup",(event) => {
if(event.keyCode === 13){
event.preventDefault();
sendMsg();
}
});
}).catch(error => {
console.log(error);
});
}).catch(error => {
console.log(error);
});
}
function listProfiles(){
console.log("listProfiles");
document.getElementById("profileName").innerHTML=profiles[selfID].name;
document.getElementById("profileFloID").innerHTML='@'+selfID;
var profileList = document.getElementById("profileList");
profileList.innerHTML = "";
for (p in profiles){
var element = document.createElement("div");
element.setAttribute("class", "media");
element.innerHTML = `<a href="javascript:changeReceiver('${p}');"><div class="media-body">
<h5 class="media-heading">${profiles[p].name}</h5>
<small>@${p}</small>
</div></a>`
profileList.appendChild(element);
}
}
function initselfWebSocket(){
selfWebsocket = new WebSocket("ws://"+location.host+"/ws");
selfWebsocket.onopen = (event) => {
console.log("Connecting");
var serverPass = encrypt.retrieveShamirSecret(JSON.parse(sessionStorage.serverPass));
selfWebsocket.send("$"+serverPass);
};
selfWebsocket.onclose = (event) => { console.log("DISCONNECTED") };
selfWebsocket.onmessage = (event) => {
console.log(event.data);
if(event.data[0] == '$')
return;
try{
data = JSON.parse(event.data);
if(data.follow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){
var idb = indexedDB.open("FLO_Tweet");
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("followers", "readwrite").objectStore("followers");
obs.add(data.sign,data.floID);
db.close();
};
selfWebsocket.send(`F${data.floID}-${data.sign}`);
}else if(data.unfollow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){
var idb = indexedDB.open("FLO_Tweet");
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("followers", "readwrite").objectStore("followers");
obs.delete(data.floID);
db.close();
};
selfWebsocket.send(`U${data.floID}`);
}else if(data.message && data.to == selfID){
var msg = encrypt.decryptMessage(data.secret,data.pubVal)
if(encrypt.verify(msg,data.sign,profiles[data.from].pubKey)){
createMsgElement(data.from,data.time,msg,'R')
storeMsg({time:data.time,floID:data.from,text:msg,type:'R'});
}
}else if(modSuperNode){
superNodeMode(data);
}
}catch(error){
console.log(error.message)
}
};
selfWebsocket.onerror = (event) => { console.log(event) };
}
function readMsgfromIDB(){
return new Promise((resolve,reject) => {
var disp = document.getElementById("msgsContainer");
for(floID in profiles){
var element = document.createElement('div');
element.setAttribute("id", floID);
element.style.display = 'none';
disp.appendChild(element);
}
var idb = indexedDB.open("FLO_Tweet");
idb.onerror = (event) => { reject("Error in opening IndexedDB!") };
idb.onsuccess = (event) => {
var db = event.target.result;
var obs = db.transaction("messages", "readwrite").objectStore("messages");
obs.openCursor().onsuccess = (event) => {
var cursor = event.target.result;
if(cursor) {
createMsgElement(cursor.value.floID,cursor.value.time,cursor.value.text,cursor.value.type);
cursor.continue();
} else {
console.log('Entries all displayed.');
resolve("Read Msg from IDB");
}
};
db.close();
};
});
}
function changeReceiver(floID){
try{
if(receiverID !== undefined)
document.getElementById(receiverID).style.display = 'none';
if(receiverWebSocket !== undefined && receiverWebSocket.readyState === WebSocket.OPEN)
receiverWebSocket.close();
}catch(e){
console.log(e);
}
console.log(floID);
receiverID = floID;
document.getElementById('recipient_floID').innerHTML = `${profiles[receiverID].name}<br><small>@${receiverID}<small>`;
recStat = false;
document.getElementById(receiverID).style.display = 'block';
try{
receiverWebSocket = new WebSocket("ws://"+profiles[receiverID].onionAddr+"/ws");
receiverWebSocket.onopen = (event) => { recStat = true; };
receiverWebSocket.onerror = (event) => { recStat = false;};
receiverWebSocket.onclose = (event) => { recStat = false; };
}catch(e){
console.log(e);
}
}
function sendMsg(){
if(receiverID === undefined){
alert("Select a contact and send message");
return;
}
var inp = document.getElementById('sendMsgInput');
var msg = inp.value;
inp.value = "";
console.log(msg);
var time = Date.now();
var sign = encrypt.sign(msg,privKey);
var msgEncrypt = encrypt.encryptMessage(msg,profiles[receiverID].pubKey);
var data = JSON.stringify({message:true,from:selfID,to:receiverID,time:time,secret:msgEncrypt.secret,sign:sign,pubVal:msgEncrypt.senderPublicKeyString});
if(recStat)
receiverWebSocket.send(data);
else{
var SNdata = JSON.stringify({viaSuperNodeMsg:true,from:selfID,to:receiverID,data:data});
sendDataToSuperNode(receiverID,SNdata);
}
console.log(`sentMsg : ${data}`);
createMsgElement(receiverID,time,msg,'S');
storeMsg({time:time,floID:receiverID,text:msg,type:'S'});
}
function createMsgElement(floID,time,msg,type){
var msgField = document.getElementById(floID);
var element = document.createElement("div");
element.setAttribute("class", "media");
element.innerHTML = `
<div class="media-body">
<div class="msg-${type}">
<span class="message-text">${msg}</span><br/>
<small class="timestamp pull-right">${getTime(time)}</small>
</div>
</div>`;
msgField.appendChild(element);
}