isock
Version:
Web -> Non-Web connectionusing Socket.io
146 lines (145 loc) • 4.7 kB
JavaScript
isocks=(function(srv=null){
console.info("what is: ",srv);
console.trace();
if(srv==="client"){return require("./isocks.client.js");}
var fun=(function(){return (function(){});});
var srv=srv===null?require("./isock.js")():srv();
var simplersa=require("simplersa");
var keys={};
var sockets={};
var on_data=fun();
var on_secure=fun();
var on_connect=fun();
var on_disconnect=fun();
var list_sockets=(function(){
return Object.keys(sockets);
});
var get_socket=(function(id){
if(sockets[id]!==undefined){
return socket[id];
}
return false;
});
var add_socket=(function(id,socket){
socket.id=id;
sockets[id]=socket;
});
var del_socket=(function(id){
if(sockets[id]!==undefined){
try{sockets[id].close();}catch(err){}
try{delete keys[id];}catch(err){}
delete sockets[id];
}
});
srv.on_connect(function(socket){
var id=Math.round(Math.random()*1000000000);
add_socket(id,socket);
on_connect(socket);
console.log("New client",socket.id);
//console.log("oh hi");
setTimeout(function(){
//console.log("telling them to get secure");
socket.emit("get-secure",true);
},100);
});
srv.on_receive(function(socket,data){
//console.log(socket.id,"sent",data);
if(data.secure){
data.data=keys[socket.id].rsa.dec(data.data);
//console.log(data);
}
try{
data.data=JSON.parse(data.data,true);
}catch(e){}
var rep;
rep=socket.send;
if(data.nonce!==undefined){
rep=(function(rep_data){
socket.emit(data.nonce,rep_data);
});
}
on_data(socket,data.data,rep);
});
srv.on_disconnect(function(socket){
console.log("Client left",socket.id);
del_socket(socket);
on_diconnect(socket);
});
srv.on("secure-1",function(socket,data){
if(data===true){
//console.log(data,"for secure",socket.id)
var rsa1=simplersa();
rsa1.gen.pri();
keys[socket.id]={};
keys[socket.id].rsa=rsa1;
socket.emit("secure-1",{key:rsa1.get.pub()});
}
});
srv.on("secure-2",function(socket,data){
//console.log("detecting secure-2",socket.id);
if(keys[socket.id]!==undefined){
//console.log("doing secure-2",socket.id);
var key=data.key;
var dkey=keys[socket.id].rsa.dec(key);
var rsa1=simplersa();
rsa1.gen.pri();
keys[socket.id].rsa=rsa1;
var rsa2=simplersa();
rsa2.set.pub(dkey);
var key=rsa2.enc(rsa1.get.pub());
socket.emit("secure-2",{key:key});
}
});
srv.on("secure-3",function(socket,data){
if(keys[socket.id]!==undefined){
var key=data.key;
var dkey=keys[socket.id].rsa.dec(key);
var rsa1=simplersa();
rsa1.gen.pri();
keys[socket.id].rsa=rsa1;
var rsa2=simplersa();
rsa2.set.pub(dkey);
var key=rsa2.enc(rsa1.get.pub());
socket.emit("secure-3",{key:key});
}
});
srv.on("secure-done",function(socket,data){
var key=data.key;
var dkey=keys[socket.id].rsa.dec(key);
var rsa1=simplersa();
rsa1.set.pri(dkey);
keys[socket.id].rsa=rsa1;
socket.emit("secure-done",true);
console.log("Client",socket.id,"secured");
socket._send=socket.send;
socket.send=(function(data){
socket._send({
secure:true,
data:keys[socket.id].rsa.enc(JSON.stringify([data]))
});
});
socket._emit=socket.emit;
socket.emit=(function(name,data){
socket._emit(name,keys[socket.id].rsa.enc(JSON.stringify([data])));
});
on_connect(socket);
});
return {
get_socket:get_socket,
list_sockets:list_sockets,
on_connect:(function(IN){
on_connect=IN;
}),
on_data:(function(IN){
on_data=IN;
}),
on_disconnect:(function(IN){
on_disconnect=IN;
}),
start:(function(port=24681){
srv.start(port);
console.log("iSocks Activated!");
})
};
});
module.exports=isocks;