UNPKG

isock

Version:

Web -> Non-Web connectionusing Socket.io

146 lines (145 loc) 4.7 kB
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;