Added follow features and changed profile listing UI
This commit is contained in:
parent
fabd75ffbc
commit
71f108ffa3
16
app.js
16
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 = `<a href="profile.html?floID=${p}"><div class="media-body">
|
||||
<h5 class="media-heading">${profiles[p].name}</h5>
|
||||
<small>@${p}</small>
|
||||
</div></a>`
|
||||
profileList.appendChild(element);
|
||||
}
|
||||
//document.getElementById("profileInfo").style.display = "none";
|
||||
}
|
||||
89
home.html
89
home.html
@ -54,19 +54,19 @@
|
||||
<div class="col-xs-3">
|
||||
<h5>
|
||||
<small>TWEETS</small>
|
||||
<a href="#">1,545</a>
|
||||
<a href="#">-</a>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-xs-4">
|
||||
<h5>
|
||||
<small>FOLLOWING</small>
|
||||
<a href="#">251</a>
|
||||
<a href="#">-</a>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-xs-5">
|
||||
<h5>
|
||||
<small>FOLLOWERS</small>
|
||||
<a href="#">153</a>
|
||||
<a href="#">-</a>
|
||||
</h5>
|
||||
</div>
|
||||
</div>
|
||||
@ -78,6 +78,7 @@
|
||||
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading">
|
||||
<div class="media">
|
||||
@ -92,88 +93,24 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="panel-body" id="tweetsContainer">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3">
|
||||
<div class="panel panel-default panel-custom">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
Who to follow
|
||||
<small><a href="#">Refresh</a> ● <a href="#">View all</a></small>
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="media">
|
||||
<div class="media-left">
|
||||
<img src="http://placehold.it/32x32" alt="" class="media-object img-rounded">
|
||||
</div>
|
||||
<div class="media-body">
|
||||
<h4 class="media-heading">Nome e cognome</h4>
|
||||
<a href="#" class="btn btn-default btn-xs">
|
||||
+
|
||||
<span class="glyphicon glyphicon-user"></span>
|
||||
Follow
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="panel panel-default panel-custom">
|
||||
<div class="panel-footer">
|
||||
<h3 class="panel-title">
|
||||
Profiles
|
||||
</h3>
|
||||
</div>
|
||||
<div class="media">
|
||||
<div class="media-left">
|
||||
<img src="http://placehold.it/32x32" alt="" class="media-object img-rounded">
|
||||
</div>
|
||||
<div class="media-body">
|
||||
<h4 class="media-heading">Nome e cognome</h4>
|
||||
<a href="#" class="btn btn-default btn-xs">
|
||||
+
|
||||
<span class="glyphicon glyphicon-user"></span>
|
||||
Follow
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="media">
|
||||
<div class="media-left">
|
||||
<img src="http://placehold.it/32x32" alt="" class="media-object img-rounded">
|
||||
</div>
|
||||
<div class="media-body">
|
||||
<h4 class="media-heading">Nome e cognome</h4>
|
||||
<a href="#" class="btn btn-default btn-xs">
|
||||
+
|
||||
<span class="glyphicon glyphicon-user"></span>
|
||||
Follow
|
||||
</a>
|
||||
</div>
|
||||
<div class="panel-body" id="profileList">
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-footer">
|
||||
<a href="www.google.it">
|
||||
<span class="glyphicon glyphicon-user"></span>
|
||||
Find people you know
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="well well-sm">
|
||||
<ul class="list-inline">
|
||||
<li>© 2015 Twitter</li>
|
||||
<li><a href="#">About</a></li>
|
||||
<li><a href="#">Help</a></li>
|
||||
<li><a href="#">Terms</a></li>
|
||||
<li><a href="#">Privacy</a></li>
|
||||
<li><a href="#">Cookies</a></li>
|
||||
<li><a href="#">Ads info</a></li>
|
||||
<li><a href="#">Brand</a></li>
|
||||
<li><a href="#">Blog</a></li>
|
||||
<li><a href="#">Status</a></li>
|
||||
<li><a href="#">Apps</a></li>
|
||||
<li><a href="#">Jobs</a></li>
|
||||
<li><a href="#">Advertise</a></li>
|
||||
<li><a href="#">Businesses</a></li>
|
||||
<li><a href="#">Media</a></li>
|
||||
<li><a href="#">Developers</a></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
64
home.js
64
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
5
index.html
Normal file
5
index.html
Normal file
@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<script type="text/javascript">
|
||||
window.location.href = "home.html";
|
||||
</script>
|
||||
</html>
|
||||
87
profile.html
87
profile.html
@ -51,26 +51,31 @@
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body" id="profileInfo">
|
||||
<a href="#"><img class="img-responsive" alt="" src="http://placehold.it/800x500"></a>
|
||||
<h5>
|
||||
<div id="profileName"></div>
|
||||
<small id="profileFloID"></small>
|
||||
</h5>
|
||||
<div class="row">
|
||||
<div class="col-xs-3">
|
||||
<h5>
|
||||
<small>TWEETS</small>
|
||||
<a href="#">1,545</a>
|
||||
<a href="#" id="tweetCount">-</a>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-xs-4">
|
||||
<h5>
|
||||
<small>FOLLOWING</small>
|
||||
<a href="#">251</a>
|
||||
<a href="#" id="followingCount">-</a>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-xs-5">
|
||||
<div class="col-xs-4">
|
||||
<h5>
|
||||
<small>FOLLOWERS</small>
|
||||
<a href="#">153</a>
|
||||
<a href="#" id="followersCount">-</a>
|
||||
</h5>
|
||||
</div>
|
||||
</div>
|
||||
<button onclick="follow()" id="follow-button" class="btn btn-info btn-xs" disabled></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -87,81 +92,17 @@
|
||||
</div>
|
||||
|
||||
<div class="col-sm-3">
|
||||
|
||||
<div class="panel panel-default panel-custom">
|
||||
<div class="panel-heading">
|
||||
<div class="panel-footer">
|
||||
<h3 class="panel-title">
|
||||
Who to follow
|
||||
<small><a href="#">Refresh</a> ● <a href="#">View all</a></small>
|
||||
Profiles
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="media">
|
||||
<div class="media-left">
|
||||
<img src="http://placehold.it/32x32" alt="" class="media-object img-rounded">
|
||||
</div>
|
||||
<div class="media-body">
|
||||
<h4 class="media-heading">Nome e cognome</h4>
|
||||
<a href="#" class="btn btn-default btn-xs">
|
||||
+
|
||||
<span class="glyphicon glyphicon-user"></span>
|
||||
Follow
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="media">
|
||||
<div class="media-left">
|
||||
<img src="http://placehold.it/32x32" alt="" class="media-object img-rounded">
|
||||
</div>
|
||||
<div class="media-body">
|
||||
<h4 class="media-heading">Nome e cognome</h4>
|
||||
<a href="#" class="btn btn-default btn-xs">
|
||||
+
|
||||
<span class="glyphicon glyphicon-user"></span>
|
||||
Follow
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="media">
|
||||
<div class="media-left">
|
||||
<img src="http://placehold.it/32x32" alt="" class="media-object img-rounded">
|
||||
</div>
|
||||
<div class="media-body">
|
||||
<h4 class="media-heading">Nome e cognome</h4>
|
||||
<a href="#" class="btn btn-default btn-xs">
|
||||
+
|
||||
<span class="glyphicon glyphicon-user"></span>
|
||||
Follow
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-footer">
|
||||
<a href="www.google.it">
|
||||
<span class="glyphicon glyphicon-user"></span>
|
||||
Find people you know
|
||||
</a>
|
||||
<div class="panel-body" id="profileList">
|
||||
</div>
|
||||
</div>
|
||||
<div class="well well-sm">
|
||||
<ul class="list-inline">
|
||||
<li>© 2015 Twitter</li>
|
||||
<li><a href="#">About</a></li>
|
||||
<li><a href="#">Help</a></li>
|
||||
<li><a href="#">Terms</a></li>
|
||||
<li><a href="#">Privacy</a></li>
|
||||
<li><a href="#">Cookies</a></li>
|
||||
<li><a href="#">Ads info</a></li>
|
||||
<li><a href="#">Brand</a></li>
|
||||
<li><a href="#">Blog</a></li>
|
||||
<li><a href="#">Status</a></li>
|
||||
<li><a href="#">Apps</a></li>
|
||||
<li><a href="#">Jobs</a></li>
|
||||
<li><a href="#">Advertise</a></li>
|
||||
<li><a href="#">Businesses</a></li>
|
||||
<li><a href="#">Media</a></li>
|
||||
<li><a href="#">Developers</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
180
profile.js
180
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 = `<a href="profile.html?floID=${p}"><div class="media-body">
|
||||
<h4 class="media-heading">${profiles[p].name}</h4>
|
||||
@${p}
|
||||
</div></a>
|
||||
<hr/>`
|
||||
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";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
Binary file not shown.
@ -1,240 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Tweet Tester</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
<script>
|
||||
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
|
||||
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
|
||||
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;
|
||||
|
||||
if (!window.indexedDB) {
|
||||
window.alert("Your browser doesn't support a stable version of IndexedDB.")
|
||||
}
|
||||
|
||||
var contacts = [];
|
||||
var tweeterID = prompt("Enter FloID : ");
|
||||
var selfwebsocket,followWebSocket;
|
||||
//var privKey = prompt("Enter Private Key");
|
||||
/*
|
||||
var encrypt = {
|
||||
|
||||
p: BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16),
|
||||
|
||||
exponent1: function () {
|
||||
return encrypt.p.add(BigInteger.ONE).divide(BigInteger("4"))
|
||||
},
|
||||
|
||||
calculateY: function (x) {
|
||||
let p = this.p;
|
||||
let exp = this.exponent1();
|
||||
// x is x value of public key in BigInteger format without 02 or 03 or 04 prefix
|
||||
return x.modPow(BigInteger("3"), p).add(BigInteger("7")).mod(p).modPow(exp, p)
|
||||
},
|
||||
|
||||
// Insert a compressed public key
|
||||
getUncompressedPublicKey: function (compressedPublicKey) {
|
||||
|
||||
const p = this.p;
|
||||
|
||||
// Fetch x from compressedPublicKey
|
||||
let pubKeyBytes = Crypto.util.hexToBytes(compressedPublicKey);
|
||||
const prefix = pubKeyBytes.shift() // remove prefix
|
||||
let prefix_modulus = prefix % 2;
|
||||
pubKeyBytes.unshift(0) // add prefix 0
|
||||
let x = new BigInteger(pubKeyBytes)
|
||||
let xDecimalValue = x.toString()
|
||||
|
||||
// Fetch y
|
||||
let y = this.calculateY(x);
|
||||
let yDecimalValue = y.toString();
|
||||
|
||||
// verify y value
|
||||
let resultBigInt = y.mod(BigInteger("2"));
|
||||
|
||||
let check = resultBigInt.toString() % 2;
|
||||
|
||||
if (prefix_modulus !== check) {
|
||||
yDecimalValue = y.negate().mod(p).toString();
|
||||
}
|
||||
|
||||
return {
|
||||
x: xDecimalValue,
|
||||
y: yDecimalValue
|
||||
};
|
||||
},
|
||||
|
||||
getSenderPublicKeyString: function () {
|
||||
privateKey = ellipticCurveEncryption.senderRandom();
|
||||
senderPublicKeyString = ellipticCurveEncryption.senderPublicString(privateKey);
|
||||
return {
|
||||
privateKey: privateKey,
|
||||
senderPublicKeyString: senderPublicKeyString
|
||||
}
|
||||
},
|
||||
|
||||
deriveSharedKeySender: function (receiverCompressedPublicKey, senderPrivateKey) {
|
||||
try {
|
||||
let receiverPublicKeyString = this.getUncompressedPublicKey(
|
||||
receiverCompressedPublicKey);
|
||||
var senderDerivedKey = {
|
||||
XValue: "",
|
||||
YValue: ""
|
||||
};
|
||||
senderDerivedKey = ellipticCurveEncryption.senderSharedKeyDerivation(
|
||||
receiverPublicKeyString.x,
|
||||
receiverPublicKeyString.y, senderPrivateKey);
|
||||
return senderDerivedKey;
|
||||
} catch (error) {
|
||||
return new Error(error);
|
||||
}
|
||||
},
|
||||
|
||||
deriveReceiverSharedKey: function (senderPublicKeyString, receiverPrivateKey) {
|
||||
return ellipticCurveEncryption.receiverSharedKeyDerivation(
|
||||
senderPublicKeyString.XValuePublicString, senderPublicKeyString.YValuePublicString,
|
||||
receiverPrivateKey);
|
||||
},
|
||||
|
||||
getReceiverPublicKeyString: function (privateKey) {
|
||||
return ellipticCurveEncryption.receiverPublicString(privateKey);
|
||||
},
|
||||
|
||||
deriveSharedKeyReceiver: function (senderPublicKeyString, receiverPrivateKey) {
|
||||
try {
|
||||
return ellipticCurveEncryption.receiverSharedKeyDerivation(senderPublicKeyString.XValuePublicString,
|
||||
senderPublicKeyString.YValuePublicString, receiverPrivateKey);
|
||||
|
||||
} catch (error) {
|
||||
return new Error(error);
|
||||
}
|
||||
},
|
||||
|
||||
encryptMessage: function (data, receiverCompressedPublicKey) {
|
||||
var senderECKeyData = this.getSenderPublicKeyString();
|
||||
var senderDerivedKey = {
|
||||
XValue: "",
|
||||
YValue: ""
|
||||
};
|
||||
var senderPublicKeyString = {};
|
||||
senderDerivedKey = this.deriveSharedKeySender(
|
||||
receiverCompressedPublicKey, senderECKeyData.privateKey);
|
||||
console.log("senderDerivedKey", senderDerivedKey);
|
||||
let senderKey = senderDerivedKey.XValue + senderDerivedKey.YValue;
|
||||
let secret = Crypto.AES.encrypt(data, senderKey);
|
||||
return {
|
||||
secret: secret,
|
||||
senderPublicKeyString: senderECKeyData.senderPublicKeyString
|
||||
};
|
||||
},
|
||||
|
||||
decryptMessage: function (secret, senderPublicKeyString) {
|
||||
var receiverDerivedKey = {
|
||||
XValue: "",
|
||||
YValue: ""
|
||||
};
|
||||
var receiverECKeyData = {};
|
||||
var myPrivateKey = privKey;
|
||||
if (typeof myPrivateKey !== "string") throw new Error("No private key found.");
|
||||
|
||||
let privateKey = this.wifToDecimal(myPrivateKey, true);
|
||||
if (typeof privateKey.privateKeyDecimal !== "string") throw new Error(
|
||||
"Failed to detremine your private key.");
|
||||
receiverECKeyData.privateKey = privateKey.privateKeyDecimal;
|
||||
|
||||
receiverDerivedKey = this.deriveReceiverSharedKey(senderPublicKeyString,
|
||||
receiverECKeyData.privateKey);
|
||||
console.log("receiverDerivedKey", receiverDerivedKey);
|
||||
|
||||
let receiverKey = receiverDerivedKey.XValue + receiverDerivedKey.YValue;
|
||||
let decryptMsg = Crypto.AES.decrypt(secret, receiverKey);
|
||||
return decryptMsg;
|
||||
},
|
||||
|
||||
ecparams: EllipticCurve.getSECCurveByName("secp256k1"),
|
||||
getPubKeyHex: function(privateKeyHex){
|
||||
var key = new Bitcoin.ECKey(privateKeyHex);
|
||||
if(key.priv == null){
|
||||
alert("Invalid Private key");
|
||||
return;
|
||||
}
|
||||
key.setCompressed(true);
|
||||
var pubkeyHex = key.getPubKeyHex();
|
||||
return pubkeyHex;
|
||||
},
|
||||
getFLOIDfromPubkeyHex: function(pubkeyHex){
|
||||
var key = new Bitcoin.ECKey().setPub(pubkeyHex);
|
||||
var floID = key.getBitcoinAddress();
|
||||
return floID;
|
||||
},
|
||||
sign: function (msg, privateKeyHex) {
|
||||
var key = new Bitcoin.ECKey(privateKeyHex);
|
||||
key.setCompressed(true);
|
||||
|
||||
var privateKeyArr = key.getBitcoinPrivateKeyByteArray();
|
||||
privateKey = BigInteger.fromByteArrayUnsigned(privateKeyArr);
|
||||
var messageHash = Crypto.SHA256(msg);
|
||||
|
||||
var messageHashBigInteger = new BigInteger(messageHash);
|
||||
var messageSign = Bitcoin.ECDSA.sign(messageHashBigInteger, key.priv);
|
||||
|
||||
var sighex = Crypto.util.bytesToHex(messageSign);
|
||||
return sighex;
|
||||
},
|
||||
verify: function (msg, signatureHex, publicKeyHex) {
|
||||
var msgHash = Crypto.SHA256(msg);
|
||||
var messageHashBigInteger = new BigInteger(msgHash);
|
||||
|
||||
var sigBytes = Crypto.util.hexToBytes(signatureHex);
|
||||
var signature = Bitcoin.ECDSA.parseSig(sigBytes);
|
||||
|
||||
var publicKeyPoint = this.ecparams.getCurve().decodePointHex(publicKeyHex);
|
||||
|
||||
var verify = Bitcoin.ECDSA.verifyRaw(messageHashBigInteger, signature.r, signature.s,
|
||||
publicKeyPoint);
|
||||
return verify;
|
||||
},
|
||||
wifToDecimal: function(pk_wif, isPubKeyCompressed = false) {
|
||||
let pk = Bitcoin.Base58.decode(pk_wif)
|
||||
pk.shift()
|
||||
pk.splice(-4, 4)
|
||||
//If the private key corresponded to a compressed public key, also drop the last byte (it should be 0x01).
|
||||
if (isPubKeyCompressed == true) pk.pop()
|
||||
pk.unshift(0)
|
||||
privateKeyDecimal = BigInteger(pk).toString()
|
||||
privateKeyHex = Crypto.util.bytesToHex(pk)
|
||||
return {
|
||||
privateKeyDecimal: privateKeyDecimal,
|
||||
privateKeyHex: privateKeyHex
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
function initselfWebSocket(){
|
||||
selfwebsocket = new WebSocket("ws://"+location.host+"/ws");
|
||||
selfwebsocket.onopen = function(evt){
|
||||
console.log("CONNECTED");
|
||||
var pass = prompt("Enter server password :")
|
||||
selfwebsocket.send("$"+pass);
|
||||
};
|
||||
selfwebsocket.onclose = function(evt){
|
||||
console.log("DISCONNECTED");
|
||||
};
|
||||
selfwebsocket.onmessage = function(evt){
|
||||
console.log(evt.data);
|
||||
};
|
||||
selfwebsocket.onerror = function(evt){
|
||||
console.log(evt);
|
||||
};
|
||||
}
|
||||
|
||||
function tweet(data){
|
||||
selfwebsocket.send(data);
|
||||
}
|
||||
initselfWebSocket();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
@ -1,85 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>WebSocket Test</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<style type="text/css">
|
||||
body {
|
||||
background-color: #789; margin: 0;
|
||||
padding: 0; font: 14px Helvetica, Arial, sans-serif;
|
||||
}
|
||||
div.content {
|
||||
width: 800px; margin: 2em auto; padding: 20px 50px;
|
||||
background-color: #fff; border-radius: 1em;
|
||||
}
|
||||
#messages {
|
||||
border: 2px solid #fec; border-radius: 1em;
|
||||
height: 10em; overflow: scroll; padding: 0.5em 1em;
|
||||
}
|
||||
a:link, a:visited { color: #69c; text-decoration: none; }
|
||||
@media (max-width: 700px) {
|
||||
body { background-color: #fff; }
|
||||
div.content {
|
||||
width: auto; margin: 0 auto; border-radius: 0;
|
||||
padding: 1em;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script language="javascript" type="text/javascript">
|
||||
|
||||
var rooms = [];
|
||||
var ws = new WebSocket('ws://' + location.host + '/ws');
|
||||
|
||||
if (!window.console) { window.console = { log: function() {} } };
|
||||
|
||||
ws.onopen = function(ev) { console.log(ev); };
|
||||
ws.onerror = function(ev) { console.log(ev); };
|
||||
ws.onclose = function(ev) { console.log(ev); };
|
||||
ws.onmessage = function(ev) {
|
||||
console.log(ev);
|
||||
var div = document.createElement('div');
|
||||
div.innerHTML = ev.data;
|
||||
document.getElementById('messages').appendChild(div);
|
||||
|
||||
};
|
||||
|
||||
window.onload = function() {
|
||||
document.getElementById('send_button').onclick = function(ev) {
|
||||
var msg = document.getElementById('send_input').value;
|
||||
document.getElementById('send_input').value = '';
|
||||
ws.send(msg);
|
||||
};
|
||||
document.getElementById('send_input').onkeypress = function(ev) {
|
||||
if (ev.keyCode == 13 || ev.which == 13) {
|
||||
document.getElementById('send_button').click();
|
||||
}
|
||||
};
|
||||
};
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="content">
|
||||
<h1>Websocket PubSub Demonstration</h1>
|
||||
|
||||
<p>
|
||||
This page demonstrates how Mongoose could be used to implement
|
||||
<a href="http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern">
|
||||
publish–subscribe pattern</a>. Open this page in several browser
|
||||
windows. Each window initiates persistent
|
||||
<a href="http://en.wikipedia.org/wiki/WebSocket">WebSocket</a>
|
||||
connection with the server, making each browser window a websocket client.
|
||||
Send messages, and see messages sent by other clients.
|
||||
</p>
|
||||
|
||||
<div id="messages">
|
||||
</div>
|
||||
|
||||
<p>
|
||||
<input type="text" id="send_input" />
|
||||
<button id="send_button">Send Message</button>
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
@ -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: {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user