-

+
+
+
+
-
-
- TWEETS
- -
-
+
+
+ TWEETS
+
+
+
+
+
-
-
-
diff --git a/app/web/home.js b/app/web/home.js
index 0b88dad..fc08346 100644
--- a/app/web/home.js
+++ b/app/web/home.js
@@ -1,5 +1,5 @@
var profiles = []
-var tweeterID;
+var selfID;
var selfWebsocket,followingWebSockets = [];
var privKey;
var following;
@@ -20,28 +20,44 @@ function userDataStartUp(){
profiles = arrayToObject(result);
console.log(profiles);
sessionStorage.profiles = JSON.stringify(profiles);
- getuserID().then(function(result){
- console.log(result);
- tweeterID = result;
- sessionStorage.privKey = privKey;
- sessionStorage.selfID = tweeterID;
- alert(`${tweeterID}\nWelcome ${profiles[tweeterID].name}`)
- initselfWebSocket();
- listProfiles();
- getFollowinglistFromIDB().then(function(result){
- following = result;
- console.log(following);
- displayTweetsFromIDB().then(function(result){
- connectToAllFollowing();
+ getSuperNodeListfromIDB().then(function(result){
+ console.log(result)
+ superNodeList = result;
+ sessionStorage.superNodeList = JSON.stringify(superNodeList);
+ kBucketObj.launchKBucket().then(function(result){
+ console.log(result)
+ getuserID().then(function(result){
+ console.log(result);
+ selfID = result;
+ if(superNodeList.includes(selfID))
+ modSuperNode = true;
+ sessionStorage.privKey = JSON.stringify(encrypt.createShamirsSecretShares(privKey,10,10));
+ sessionStorage.selfID = selfID;
+ alert(`${selfID}\nWelcome ${profiles[selfID].name}`)
+ initselfWebSocket();
+ listProfiles();
+ pingSuperNodeforNewMsgs();
+ getFollowinglistFromIDB().then(function(result){
+ following = result;
+ if(!following.includes(selfID))
+ following.push(selfID);
+ console.log(following);
+ displayTweetsFromIDB().then(function(result){
+ connectToAllFollowing();
+ }).catch(function(error){
+ console.log(error.message);
+ })
}).catch(function(error){
console.log(error.message);
})
- }).catch(function(error){
- console.log(error.message);
- })
-
+ }).catch(function (error) {
+ console.log(error.message);
+ });
+ }).catch(function(error){
+ console.log(error.message);
+ });
}).catch(function (error) {
- console.log(error.message);
+ console.log(error.message);
});
}).catch(function (error) {
console.log(error.message);
@@ -86,18 +102,25 @@ function getDatafromAPI(){
};
idb.onupgradeneeded = function(event) {
var db = event.target.result;
+ var objectStore0 = event.target.result.createObjectStore("superNodes");
var objectStore1 = db.createObjectStore("profiles",{ keyPath: 'floID' });
objectStore1.createIndex('onionAddr', 'onionAddr', { unique: false });
objectStore1.createIndex('name', 'name', { unique: false });
objectStore1.createIndex('pubKey', 'pubKey', { unique: false });
var objectStore2 = db.createObjectStore("lastTx");
- var objectStore3 = db.createObjectStore("tweets",{ keyPath: 'id' });
+ var objectStore3 = db.createObjectStore("tweets",{ keyPath: 'tweetID' });
+ objectStore3.createIndex('tid', 'tid', { unique: false });
objectStore3.createIndex('floID', 'floID', { unique: false });
objectStore3.createIndex('time', 'time', { unique: false });
objectStore3.createIndex('data', 'data', { unique: false });
var objectStore4 = db.createObjectStore("lastTweet");
var objectStore5 = db.createObjectStore("followers");
var objectStore6 = db.createObjectStore("following");
+ var objectStore7 = event.target.result.createObjectStore("messages",{ keyPath: 'msgID' });
+ objectStore7.createIndex('time', 'time', { unique: false });
+ objectStore7.createIndex('text', 'text', { unique: false });
+ objectStore7.createIndex('floID', 'floID', { unique: false });
+ objectStore7.createIndex('type', 'type', { unique: false });
};
idb.onsuccess = function(event) {
var db = event.target.result;
@@ -127,18 +150,26 @@ function getDatafromAPI(){
}
response.items.reverse().forEach(function(tx){
try {
- //if (tx.vin[0].addr != addr)
- //return;
- var data = JSON.parse(tx.floData).FLO_Tweet;
- if(data !== undefined){
- if(encrypt.getFLOIDfromPubkeyHex(data.pubKey)!=tx.vin[0].addr)
- throw("PublicKey doesnot match with floID")
- data = {floID : tx.vin[0].addr, onionAddr : data.onionAddr, name : data.name, pubKey:data.pubKey};
- storedata(data).then(function (response) {
- }).catch(function (error) {
- console.log(error.message);
- });
- }
+ if (tx.vin[0].addr == addr){
+ var data = JSON.parse(tx.floData).FLO_Tweet_SuperNode;
+ if(data !== undefined){
+ storeSuperNodeData(data).then(function (response) {
+ }).catch(function (error) {
+ console.log(error.message);
+ });
+ }
+ }else{
+ var data = JSON.parse(tx.floData).FLO_Tweet;
+ if(data !== undefined){
+ if(encrypt.getFLOIDfromPubkeyHex(data.pubKey)!=tx.vin[0].addr)
+ throw("PublicKey doesnot match with floID")
+ data = {floID : tx.vin[0].addr, onionAddr : data.onionAddr, name : data.name, pubKey:data.pubKey};
+ storedata(data).then(function (response) {
+ }).catch(function (error) {
+ console.log(error.message);
+ });
+ }
+ }
} catch (e) {
//console.log(e)
}
@@ -156,11 +187,56 @@ function getDatafromAPI(){
);
}
+function storeSuperNodeData(data){
+ return new Promise(
+ function(resolve, reject) {
+ var idb = indexedDB.open("FLO_Tweet");
+ idb.onerror = function(event) {
+ reject("Error in opening IndexedDB!");
+ };
+ idb.onsuccess = function(event) {
+ var db = event.target.result;
+ var obs = db.transaction('superNodes', "readwrite").objectStore('superNodes');
+ if(data.addNodes)
+ for(var i=0; i
-
-
- ${cursor.value.text}
-
-
- ${getTime(cursor.value.time)}
-
-
- `;
- chat.appendChild(msgdiv);
- }else if(cursor.value.type == "S"){
- var msgdiv = document.createElement('div');
- msgdiv.setAttribute("class", "row message-body");
- msgdiv.innerHTML = `
-
- ${cursor.value.text}
-
-
- ${getTime(cursor.value.time)}
-
-
-
`;
- chat.appendChild(msgdiv);
- }
-
- cursor.continue();
- } else {
- console.log('Entries all displayed.');
- resolve("Read Msg from IDB");
- }
- };
- db.close();
- };
- }
- );
-}
-
function initselfWebSocket(){
selfWebsocket = new WebSocket("ws://"+location.host+"/ws");
selfWebsocket.onopen = function(evt){
console.log("Connecting");
- var pass = sessionStorage.serverPass || prompt("Enter server password :");
+ var pass = (sessionStorage.serverPass !== undefined ? encrypt.retrieveShamirSecret(JSON.parse(sessionStorage.serverPass)): prompt("Enter server password :"));
selfWebsocket.send("$"+pass);
- sessionStorage.serverPass = pass;
+ sessionStorage.serverPass = JSON.stringify(encrypt.createShamirsSecretShares(pass,5,5));
};
selfWebsocket.onclose = function(evt){
console.log("DISCONNECTED");
@@ -296,7 +303,7 @@ function initselfWebSocket(){
if(evt.data == "$Access Denied!"){
var pass = prompt("Access Denied! reEnter server password :");
selfWebsocket.send("$"+pass);
- sessionStorage.serverPass = pass;
+ sessionStorage.serverPass = JSON.stringify(encrypt.createShamirsSecretShares(pass,5,5));
}else if(evt.data == "$Access Granted!")
alert("Access Granted!")
else{
@@ -320,6 +327,47 @@ function initselfWebSocket(){
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))
+ storeMsg({time:data.time,floID:data.from,text:msg,type:'R'});
+ }else if(data.fromSuperNode && following.includes(data.floID)){
+ var tid = data.tid;
+ data = JSON.parse(data.data);
+ if(encrypt.verify(data.tweet,data.sign,profiles[data.floID].pubKey)){
+ storeTweet({floID:data.floID,time:data.time,data:data.tweet},tid);
+ createTweetElement(data.floID,data.time,data.tweet);
+ }
+ }else if(modSuperNode){
+ if(data.reqNewTweets){
+ kBucketObj.determineClosestSupernode(data.floID).then(result=>{
+ if(result[0].floID == selfID)
+ SuperNode_sendTweetsFromIDB(data.floID,data.tid,data.requestor);
+ }).catch(e => {
+ console.log(e.message);
+ });
+ }else if(data.newSuperNodeTweet){
+ kBucketObj.determineClosestSupernode(data.floID).then(result=>{
+ if(result[0].floID == selfID)
+ SuperNode_storeSuperNodeTweet(data.data,data.tid);
+ }).catch(e => {
+ console.log(e.message);
+ });
+ }else if(data.viaSuperNodeMsg){
+ kBucketObj.determineClosestSupernode(data.to).then(result=>{
+ if(result[0].floID == selfID)
+ SuperNode_storeViaSuperNodeMsg(data.from,data.to,data.data);
+ }).catch(e => {
+ console.log(e.message);
+ });
+ }else if(data.viaMsgreq){
+ kBucketObj.determineClosestSupernode(data.floID).then(result=>{
+ if(result[0].floID == selfID)
+ SuperNode_sendviaMsgFromIDB(data.floID);
+ }).catch(e => {
+ console.log(e.message);
+ });
+ }
}
}catch(error){
console.log(error.message);
@@ -331,24 +379,41 @@ function initselfWebSocket(){
};
}
+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 = `