diff --git a/app.js b/app.js index d2fa83f..298b36c 100644 --- a/app.js +++ b/app.js @@ -229,4 +229,20 @@ function getTime(time){ function logout(){ sessionStorage.clear(); location.reload(); +} + +function listProfiles(){ + console.log("listProfiles"); + var profileList = document.getElementById("profileList"); + profileList.innerHTML = ""; + for (p in profiles){ + var element = document.createElement("div"); + element.setAttribute("class", "media"); + element.innerHTML = `
+
${profiles[p].name}
+ @${p} +
` + profileList.appendChild(element); + } + //document.getElementById("profileInfo").style.display = "none"; } \ No newline at end of file diff --git a/home.html b/home.html index 6d63931..6b7e00b 100644 --- a/home.html +++ b/home.html @@ -54,19 +54,19 @@
TWEETS - 1,545 + -
FOLLOWING - 251 + -
FOLLOWERS - 153 + -
@@ -78,6 +78,7 @@
+
@@ -92,88 +93,24 @@
-
- +
-
-
-

- Who to follow - RefreshView all -

-
-
-
-
- -
-
-

Nome e cognome

- - + - - Follow - -
+ +
+ -
-
- -
-
-

Nome e cognome

- - + - - Follow - -
-
-
-
- -
-
-

Nome e cognome

- - + - - Follow - -
+
- -
-
- +
diff --git a/home.js b/home.js index fc90f38..5ba28e5 100644 --- a/home.js +++ b/home.js @@ -1,6 +1,6 @@ var profiles = [] var receiverID,tweeterID,recStat; -var selfwebsocket,receiverWebSocket; +var selfWebsocket,receiverWebSocket; var privKey; function userDataStartUp(){ @@ -23,10 +23,12 @@ function userDataStartUp(){ console.log(result); tweeterID = result; sessionStorage.privKey = privKey; + sessionStorage.selfID = tweeterID; alert(`${tweeterID}\nWelcome ${profiles[tweeterID].name}`) //readMsgfromIDB().then(function(result){ //console.log(result); initselfWebSocket(); + listProfiles(); //displayprofiles(); //const createClock = setInterval(checkStatusInterval, 30000); //}).catch(function(error){ @@ -77,11 +79,19 @@ function getDatafromAPI(){ reject("Error in opening IndexedDB!"); }; idb.onupgradeneeded = function(event) { - var objectStore = event.target.result.createObjectStore("profiles",{ keyPath: 'floID' }); - objectStore.createIndex('onionAddr', 'onionAddr', { unique: false }); - objectStore.createIndex('name', 'name', { unique: false }); - objectStore.createIndex('pubKey', 'pubKey', { unique: false }); - var objectStore2 = event.target.result.createObjectStore("lastTx"); + var db = event.target.result; + 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' }); + 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"); }; idb.onsuccess = function(event) { var db = event.target.result; @@ -308,26 +318,52 @@ function displayProfiles(){ } function initselfWebSocket(){ - selfwebsocket = new WebSocket("ws://"+location.host+"/ws"); - selfwebsocket.onopen = function(evt){ + selfWebsocket = new WebSocket("ws://"+location.host+"/ws"); + selfWebsocket.onopen = function(evt){ console.log("Connecting"); var pass = sessionStorage.serverPass || prompt("Enter server password :"); - selfwebsocket.send("$"+pass); + selfWebsocket.send("$"+pass); sessionStorage.serverPass = pass; }; - selfwebsocket.onclose = function(evt){ + selfWebsocket.onclose = function(evt){ console.log("DISCONNECTED"); }; - selfwebsocket.onmessage = function(evt){ + selfWebsocket.onmessage = function(evt){ console.log(evt.data); if(evt.data == "$Access Denied!"){ var pass = prompt("Access Denied! reEnter server password :"); - selfwebsocket.send("$"+pass); + selfWebsocket.send("$"+pass); sessionStorage.serverPass = pass; }else if(evt.data == "$Access Granted!") alert("Access Granted!") + else{ + try{ + data = JSON.parse(evt.data); + if(data.follow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){ + var idb = indexedDB.open("FLO_Tweet"); + idb.onsuccess = function(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}`); + }else if(data.unfollow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){ + var idb = indexedDB.open("FLO_Tweet"); + idb.onsuccess = function(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}`); + } + }catch(error){ + console.log(error.message); + } + } }; - selfwebsocket.onerror = function(evt){ + selfWebsocket.onerror = function(evt){ console.log(evt); }; } @@ -364,7 +400,7 @@ function postTweet(){ var sign = encrypt.sign(tweet,privKey); var data = JSON.stringify({floID:tweeterID,time:time,tweet:tweet,sign:sign}); console.log(data); - selfwebsocket.send(data); + selfWebsocket.send(data); } diff --git a/index.html b/index.html new file mode 100644 index 0000000..a8d67df --- /dev/null +++ b/index.html @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/profile.html b/profile.html index 916bba3..6b723f5 100644 --- a/profile.html +++ b/profile.html @@ -51,26 +51,31 @@
+
+
+ +
TWEETS - 1,545 + -
FOLLOWING - 251 + -
-
+
FOLLOWERS - 153 + -
+
@@ -87,81 +92,17 @@
+
-
+ -
-
-
- -
-
-

Nome e cognome

- - + - - Follow - -
-
-
-
- -
-
-

Nome e cognome

- - + - - Follow - -
-
-
-
- -
-
-

Nome e cognome

- - + - - Follow - -
-
-
- -
- -
+
diff --git a/profile.js b/profile.js index d4cf983..66e2406 100644 --- a/profile.js +++ b/profile.js @@ -1,52 +1,44 @@ -var profileWebsocket; +var profileWebsocket, selfWebsocket; var profiles; +var floID, privKey, selfID, serverPass; function viewProfile(){ - if(sessionStorage.profiles) - profiles = JSON.parse(sessionStorage.profiles) - else{ - alert("Profiles not loaded! redirecting to home!"); + if( sessionStorage.profiles === undefined || sessionStorage.privKey === undefined || sessionStorage.selfID === undefined || sessionStorage.serverPass === undefined){ + alert("Login credentials failed! Returning to home page!"); window.location.href = "home.html"; + return; } + profiles = JSON.parse(sessionStorage.profiles); console.log(profiles); + privKey = sessionStorage.privKey; + selfID = sessionStorage.selfID; + serverPass = sessionStorage.serverPass; var url = new URL(window.location.href); - var floID = url.searchParams.get("floID"); - if(floID) - displayProfile(floID); - else - listProfiles(); -} - -function listProfiles(){ - console.log("listProfiles"); - var profileBody = document.getElementById("profileBody"); - profileBody.innerHTML = ""; - for (p in profiles){ - var element = document.createElement("div"); - element.setAttribute("class", "media"); - element.innerHTML = `
-

${profiles[p].name}

- @${p} -
-
` - profileBody.appendChild(element); - } - document.getElementById("profileInfo").style.display = "none"; + floID = url.searchParams.get("floID"); + listProfiles(); + displayProfile(floID); } function displayProfile(floID){ - if(!validateAddr(floID)){ - alert("Invalid FLO ID"); - listProfiles(); - return; - } - if(!(floID in profiles)){ - alert("FLO ID not registered to FLO Tweet"); - listProfiles(); + console.log(floID); + var errorMsg; + if(!floID) + errorMsg = "Select a Profile to display"; + else if(!validateAddr(floID)) + errorMsg = "Invalid FLO ID"; + else if(!(floID in profiles)) + errorMsg = "FLO ID not registered to FLO Tweet"; + + if(errorMsg !== undefined){ + document.getElementById("profileBody").innerHTML = errorMsg; return; } + console.log("displayProfile"); + document.getElementById("profileName").innerHTML=profiles[floID].name; + document.getElementById("profileFloID").innerHTML='@'+floID; + initselfWebSocket(); displayTweetFromIDB(floID).then(function(result){ connectToX(floID).then(function(result){ console.log(result); @@ -62,19 +54,24 @@ function displayProfile(floID){ function displayTweetFromIDB(floID){ return new Promise( function(resolve,reject){ - var idb = indexedDB.open("FLO_Tweet",2); + var idb = indexedDB.open("FLO_Tweet"); idb.onerror = function(event) { reject("Error in opening IndexedDB!"); }; - idb.onupgradeneeded = function(event) { - var objectStore = event.target.result.createObjectStore("tweets",{ keyPath: 'id' }); - objectStore.createIndex('floID', 'floID', { unique: false }); - objectStore.createIndex('time', 'time', { unique: false }); - objectStore.createIndex('data', 'data', { unique: false }); - var objectStore2 = event.target.result.createObjectStore("lastTweet"); - }; idb.onsuccess = function(event) { var db = event.target.result; + var obj = db.transaction("following", "readwrite").objectStore("following"); + obj.get(floID).onsuccess = function (event) { + var followBtn = document.getElementById("follow-button"); + if(event.target.result === undefined){ + followBtn.innerHTML = "+ Follow"; + followBtn.value = "follow"; + }else{ + followBtn.innerHTML = "- Unfollow"; + followBtn.value = "unfollow"; + } + followBtn.disabled = false; + } var obs = db.transaction("tweets", "readwrite").objectStore("tweets"); obs.openCursor().onsuccess = function(event) { var cursor = event.target.result; @@ -144,17 +141,10 @@ function connectToX(floID){ } function storeTweet(data,id){ - var idb = indexedDB.open("FLO_Tweet",2); + var idb = indexedDB.open("FLO_Tweet"); idb.onerror = function(event) { console.log("Error in opening IndexedDB!"); }; - idb.onupgradeneeded = function(event) { - var objectStore = event.target.result.createObjectStore("tweets",{ keyPath: 'id' }); - objectStore.createIndex('floID', 'floID', { unique: false }); - objectStore.createIndex('time', 'time', { unique: false }); - objectStore.createIndex('data', 'data', { unique: false }); - var objectStore2 = event.target.result.createObjectStore("lastTweet"); - }; idb.onsuccess = function(event) { var db = event.target.result; var obs = db.transaction("tweets", "readwrite").objectStore("tweets"); @@ -169,17 +159,10 @@ function storeTweet(data,id){ function getTweetsFromX(floID){ return new Promise( function (resolve,reject){ - var idb = indexedDB.open("FLO_Tweet",2); + var idb = indexedDB.open("FLO_Tweet"); idb.onerror = function(event) { reject("Error in opening IndexedDB!"); }; - idb.onupgradeneeded = function(event) { - var objectStore = event.target.result.createObjectStore("tweets",{ keyPath: 'id' }); - objectStore.createIndex('floID', 'floID', { unique: false }); - objectStore.createIndex('time', 'time', { unique: false }); - objectStore.createIndex('data', 'data', { unique: false }); - var objectStore2 = event.target.result.createObjectStore("lastTweet"); - }; idb.onsuccess = function(event) { var db = event.target.result; //window["wait"] = addrList.length; @@ -208,3 +191,82 @@ function getTweetsFromX(floID){ } ); } + +function initselfWebSocket(){ + selfWebsocket = new WebSocket("ws://"+location.host+"/ws"); + selfWebsocket.onopen = function(evt){ + console.log("Connecting"); + var pass = sessionStorage.serverPass; + selfWebsocket.send("$"+pass); + }; + selfWebsocket.onclose = function(evt){ + console.log("DISCONNECTED"); + }; + selfWebsocket.onmessage = function(evt){ + console.log(evt.data); + if(evt.data[0] == '$') + return; + try{ + data = JSON.parse(evt.data); + if(data.follow && encrypt.verify(selfID, data.sign, profiles[data.floID].pubKey)){ + var idb = indexedDB.open("FLO_Tweet"); + idb.onsuccess = function(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 = function(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}`); + } + }catch(error){ + console.log(error.message) + } + }; + selfWebsocket.onerror = function(evt){ + console.log(evt); + }; +} + +function follow(){ + var followBtn = document.getElementById("follow-button"); + if(followBtn.value == 'follow'){ + var sign = encrypt.sign(floID,privKey); + var data = JSON.stringify({follow:true, floID:selfID, sign:sign}); + profileWebsocket.send(data); + selfWebsocket.send(`f${floID}-${sign}`) + var idb = indexedDB.open("FLO_Tweet"); + idb.onsuccess = function(event) { + var db = event.target.result; + var obs = db.transaction("following", "readwrite").objectStore("following"); + obs.add(sign,floID); + db.close(); + }; + followBtn.value = 'unfollow'; + followBtn.innerHTML = "- Unfollow"; + } + else if(followBtn.value == 'unfollow'){ + var sign = encrypt.sign(floID,privKey); + var data = JSON.stringify({unfollow:true, floID:selfID, sign:sign}); + profileWebsocket.send(data); + selfWebsocket.send(`u${floID}`) + var idb = indexedDB.open("FLO_Tweet"); + idb.onsuccess = function(event) { + var db = event.target.result; + var obs = db.transaction("following", "readwrite").objectStore("following"); + obs.delete(floID); + db.close(); + }; + followBtn.value = 'follow'; + followBtn.innerHTML = "+ Follow"; + } +} + diff --git a/reader b/reader index f563955..f0dcabe 100755 Binary files a/reader and b/reader differ diff --git a/tweeter b/tweeter index d1a6135..d2e8515 100755 Binary files a/tweeter and b/tweeter differ diff --git a/websocket_storage/readBinFile.c b/websocket_storage/readBinFile.c index 3fa0d96..47612de 100644 --- a/websocket_storage/readBinFile.c +++ b/websocket_storage/readBinFile.c @@ -8,17 +8,62 @@ struct tweetData char data[5000]; }; +struct followData{ + char floID[35]; + char sign[150]; +}; + int main() { + //Declaration struct tweetData tweet; + struct followData data; + char buf[5000]; FILE *fptr; + + //Display Tweets + printf("\n--Tweets--\n"); fptr = fopen("tweet.bin","rb"); - if(fptr == NULL){ - printf("Error in opening tweet file\n"); - return 1; + if(fptr == NULL) + printf("Error in opening tweet.bin\n"); + else{ + while(fread(&tweet,sizeof(tweet),1,fptr)) + printf("%d\t:%s\n", tweet.id,tweet.data); + fclose(fptr); } - while(fread(&tweet,sizeof(tweet),1,fptr)) - printf("%d\t:%s\n", tweet.id,tweet.data); - fclose(fptr); + + //Display Following list + printf("\n--Following--\n"); + fptr = fopen("following.bin","rb"); + if(fptr == NULL) + printf("Error in opening following.bin\n"); + else{ + while(fread(&data,sizeof(data),1,fptr)) + printf("%s\t:%s\n", data.floID,data.sign); + fclose(fptr); + } + + //Display Followers list + printf("\n--Followers--\n"); + fptr = fopen("followers.bin","rb"); + if(fptr == NULL) + printf("Error in opening followers.bin\n"); + else{ + while(fread(&data,sizeof(data),1,fptr)) + printf("%s\t:%s\n", data.floID,data.sign); + fclose(fptr); + } + + //Display Incoming data + printf("\n--Incoming Data--\n"); + fptr = fopen("incoming.bin","rb"); + if(fptr == NULL) + printf("Error in opening incoming.bin\n"); + else{ + while(fread(&buf,sizeof(buf),1,fptr)) + printf("%s\n", buf); + fclose(fptr); + } + return 0; } \ No newline at end of file diff --git a/websocket_storage/reader b/websocket_storage/reader deleted file mode 100755 index f563955..0000000 Binary files a/websocket_storage/reader and /dev/null differ diff --git a/websocket_storage/test.html b/websocket_storage/test.html deleted file mode 100644 index 716b4ff..0000000 --- a/websocket_storage/test.html +++ /dev/null @@ -1,240 +0,0 @@ - - -Tweet Tester - - - - - - - \ No newline at end of file diff --git a/websocket_storage/tester b/websocket_storage/tester deleted file mode 100755 index a62ecdb..0000000 Binary files a/websocket_storage/tester and /dev/null differ diff --git a/websocket_storage/tmp/index.html b/websocket_storage/tmp/index.html deleted file mode 100644 index b5047f1..0000000 --- a/websocket_storage/tmp/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - WebSocket Test - - - - - - -
-

Websocket PubSub Demonstration

- -

- This page demonstrates how Mongoose could be used to implement - - publish–subscribe pattern. Open this page in several browser - windows. Each window initiates persistent - WebSocket - connection with the server, making each browser window a websocket client. - Send messages, and see messages sent by other clients. -

- -
-
- -

- - -

-
- - diff --git a/websocket_storage/tweeter b/websocket_storage/tweeter deleted file mode 100755 index d1a6135..0000000 Binary files a/websocket_storage/tweeter and /dev/null differ diff --git a/websocket_storage/websocket_chat.c b/websocket_storage/websocket_chat.c index 5d58a10..e184c8b 100644 --- a/websocket_storage/websocket_chat.c +++ b/websocket_storage/websocket_chat.c @@ -11,12 +11,16 @@ static struct mg_serve_http_opts s_http_server_opts; static char serverpass[100]; static struct mg_connection *selfClient = NULL; -struct tweetData -{ +struct tweetData{ int id; char data[5000]; }; +struct followData{ + char floID[35]; + char sign[150]; +}; + static void signal_handler(int sig_num) { signal(sig_num, signal_handler); // Reinstantiate signal handler s_signal_received = sig_num; @@ -56,7 +60,7 @@ static void storeTweet(struct mg_connection *nc,const struct mg_str msg){ FILE *fptr; fptr = fopen("tweet.bin","ab"); if(fptr == NULL){ - printf("Error in opening tweet file"); + printf("Error in opening tweet.bin\n"); return; } fseek(fptr,0,SEEK_END); @@ -85,7 +89,7 @@ static void sendTweets(struct mg_connection *nc, const struct mg_str d){ FILE *fptr; fptr = fopen("tweet.bin","rb"); if(fptr == NULL){ - printf("Error in opening tweet file\n"); + printf("Error in opening tweet.bin\n"); return; } fseek(fptr, n*sizeof(tweet), SEEK_SET); @@ -97,6 +101,122 @@ static void sendTweets(struct mg_connection *nc, const struct mg_str d){ fclose(fptr); } +static void Follower(const struct mg_str d){ + struct followData data; + snprintf(data.floID, sizeof(data.floID), "%.*s", (int) (34), &d.p[1]); + snprintf(data.sign, sizeof(data.sign), "%.*s", (int) (d.len-36), &d.p[36]); + printf("Follower : %s\n",data.floID); + FILE *fptr; + fptr = fopen("followers.bin","ab"); + if(fptr == NULL){ + printf("Error in opening followers.bin\n"); + return; + } + fseek(fptr,0,SEEK_END); + fwrite(&data,sizeof(data),1,fptr); + fclose(fptr); +} + +static void Unfollower(const struct mg_str d){ + char floID[35]; + struct followData data; + snprintf(floID, sizeof(floID), "%.*s", (int) (34), &d.p[1]); + printf("Unfollower : %s\n",floID); + FILE *fp; + FILE *fp_tmp; + fp = fopen("followers.bin", "rb"); + if (!fp) { + printf("Error in opening followers.bin\n"); + return; + } + fp_tmp = fopen("tmp.bin", "wb"); + if (!fp) { + printf("Error in opening tmp.bin\n"); + return; + } + while(fread(&data,sizeof(data),1,fp)){ + if(strcmp(data.floID,floID)) //floID != follower.floID + fwrite(&data,sizeof(data),1,fp_tmp); + } + fclose(fp); + fclose(fp_tmp); + remove("followers.bin"); + rename("tmp.bin", "followers.bin"); + return; +} + +static void follow(const struct mg_str d){ + struct followData data; + snprintf(data.floID, sizeof(data.floID), "%.*s", (int) (34), &d.p[1]); + snprintf(data.sign, sizeof(data.sign), "%.*s", (int) (d.len-36), &d.p[36]); + printf("follow : %s\n",data.floID); + FILE *fptr; + fptr = fopen("following.bin","ab"); + if(fptr == NULL){ + printf("Error in opening following.bin\n"); + return; + } + fseek(fptr,0,SEEK_END); + fwrite(&data,sizeof(data),1,fptr); + fclose(fptr); +} + +static void unfollow(const struct mg_str d){ + char floID[35]; + struct followData data; + snprintf(floID, sizeof(floID), "%.*s", (int) (34), &d.p[1]); + printf("unfollow : %s\n",floID); + FILE *fp; + FILE *fp_tmp; + fp = fopen("following.bin", "rb"); + if (!fp) { + printf("Error in opening following.bin\n"); + return; + } + fp_tmp = fopen("tmp.bin", "wb"); + if (!fp) { + printf("Error in opening tmp.bin\n"); + return; + } + while(fread(&data,sizeof(data),1,fp)){ + if(strcmp(data.floID,floID)) //floID != follower.floID + fwrite(&data,sizeof(data),1,fp_tmp); + } + fclose(fp); + fclose(fp_tmp); + remove("following.bin"); + rename("tmp.bin", "following.bin"); + return; +} + +static void storeIncoming(const struct mg_str msg){ + char buf[5000]; + snprintf(buf, sizeof(buf), "%.*s", (int) msg.len, msg.p); + FILE *fptr; + fptr = fopen("incoming.bin","ab"); + if(fptr == NULL){ + printf("Error in opening incoming.bin\n"); + return; + } + fseek(fptr,0,SEEK_END); + fwrite(&buf,sizeof(buf),1,fptr); + fclose(fptr); +} + +static void forwardIncomings(){ + char buf[5000]; + FILE *fptr; + fptr = fopen("incoming.bin","rb"); + if(fptr == NULL){ + printf("No new Incomings\n"); + return; + } + while(fread(&buf,sizeof(buf),1,fptr)){ + mg_send_websocket_frame(selfClient, WEBSOCKET_OP_TEXT, buf, strlen(buf)); + } + fclose(fptr); + remove("incoming.bin"); +} static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { switch (ev) { case MG_EV_WEBSOCKET_HANDSHAKE_DONE: { @@ -108,30 +228,47 @@ static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { struct websocket_message *wm = (struct websocket_message *) ev_data; /* New websocket message. Tell everybody. */ struct mg_str d = {(char *) wm->data, wm->size}; - if (d.p[0] == '$'){ - char pass[100]; - snprintf(pass, sizeof(pass), "%.*s",(int)d.len-1, &d.p[1]); - if(!strcmp(pass,serverpass)){ - if(selfClient!=NULL) - unicast(selfClient,mg_mk_str("$Another login is encountered! Please close/refresh this window")); - selfClient = nc; - unicast(selfClient,mg_mk_str("$Access Granted!")); - broadcast(nc, mg_mk_str("#+")); - }else - unicast(nc,mg_mk_str("$Access Denied!")); - } - else if(d.p[0] == '#'){ - if(selfClient == NULL) - unicast(nc,mg_mk_str("#-")); + if(selfClient == nc){ + if(d.p[0] == 'F') + Follower(d); + else if(d.p[0] == 'U') + Unfollower(d); + else if(d.p[0] == 'f') + follow(d); + else if(d.p[0] == 'u') + unfollow(d); else - unicast(nc,mg_mk_str("#+")); - } - else if(d.p[0] == '>'){ - sendTweets(nc, d); - } - else if(selfClient == nc){ - storeTweet(nc, d); + storeTweet(nc, d); + }else{ + if (d.p[0] == '$'){ + char pass[100]; + snprintf(pass, sizeof(pass), "%.*s",(int)d.len-1, &d.p[1]); + if(!strcmp(pass,serverpass)){ + if(selfClient!=NULL) + unicast(selfClient,mg_mk_str("$Another login is encountered! Please close/refresh this window")); + selfClient = nc; + unicast(selfClient,mg_mk_str("$Access Granted!")); + forwardIncomings(); + }else + unicast(nc,mg_mk_str("$Access Denied!")); + } + else if(d.p[0] == '#'){ + if(selfClient == NULL) + unicast(nc,mg_mk_str("#-")); + else + unicast(nc,mg_mk_str("#+")); + } + else if(d.p[0] == '>'){ + sendTweets(nc, d); + } + else { + if(selfClient==NULL) + storeIncoming(d); + else + unicast(selfClient,d); + } } + break; } case MG_EV_HTTP_REQUEST: {