From 612a00b484435cb80225348c8ddae1278e24d661 Mon Sep 17 00:00:00 2001 From: ansuz Date: Fri, 10 Mar 2017 18:03:15 +0100 Subject: [PATCH] implement serverside RPC infrastructure --- NetfluxWebsocketSrv.js | 20 ++++++++++++++++++-- config.js.dist | 7 +++++++ rpc.js | 37 +++++++++++++++++++++++++++++++++++++ server.js | 37 ++++++++++++++++++++++++++++--------- 4 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 rpc.js diff --git a/NetfluxWebsocketSrv.js b/NetfluxWebsocketSrv.js index b15cdd33b..bd6b6da87 100644 --- a/NetfluxWebsocketSrv.js +++ b/NetfluxWebsocketSrv.js @@ -209,6 +209,21 @@ const handleMessage = function (ctx, user, msg) { let parsedMsg = {state: 1, channel: parsed[1]}; sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'MSG', user.id, JSON.stringify(parsedMsg)]); }); + } else if (ctx.rpc) { + /* RPC Calls... */ + var rpc_call = parsed.slice(1); + + // slice off the sequence number and pass in the rest of the message + ctx.rpc(rpc_call, function (err, output) { + if (err) { + console.error('[' + err + ']', output); + sendMsg(ctx, user, [seq, 'ACK']); + sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'MSG', user.id, JSON.stringify([parsed[0], 'ERROR', err])]); + return + } + sendMsg(ctx, user, [seq, 'ACK']); + sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'MSG', user.id, JSON.stringify([parsed[0]].concat(output))]); + }); } return; } @@ -251,7 +266,7 @@ const handleMessage = function (ctx, user, msg) { } }; -let run = module.exports.run = function (storage, socketServer, config) { +let run = module.exports.run = function (storage, socketServer, config, rpc) { /* Channel removal timeout defaults to 60000ms (one minute) */ config.channelRemovalTimeout = typeof(config.channelRemovalTimeout) === 'number'? @@ -263,7 +278,8 @@ let run = module.exports.run = function (storage, socketServer, config) { channels: {}, timeouts: {}, store: storage, - config: config + config: config, + rpc: rpc, }; setInterval(function () { Object.keys(ctx.users).forEach(function (userId) { diff --git a/config.js.dist b/config.js.dist index da80bb374..3818ae002 100644 --- a/config.js.dist +++ b/config.js.dist @@ -130,6 +130,13 @@ module.exports = { */ openFileLimit: 2048, + /* Cryptpad's socket server can be extended to respond to RPC calls + * you can configure it to respond to custom RPC calls if you like. + * provide the path to your RPC module here, or `false` if you would + * like to disable the RPC interface completely + */ + rpc: './rpc.js', + /* it is recommended that you serve cryptpad over https * the filepaths below are used to configure your certificates */ diff --git a/rpc.js b/rpc.js new file mode 100644 index 000000000..66973039b --- /dev/null +++ b/rpc.js @@ -0,0 +1,37 @@ +/* Use Nacl for checking signatures of messages + +*/ +var Nacl = require("tweetnacl"); + +var RPC = module.exports; + +var pin = function (ctx, cb) { }; +var unpin = function (ctx, cb) { }; +var getHash = function (ctx, cb) { }; +var getTotalSize = function (ctx, cb) { }; +var getFileSize = function (ctx, cb) { }; + +RPC.create = function (config, cb) { + // load pin-store... + + console.log('loading rpc module...'); + rpc = function (msg, respond) { + switch (msg[0]) { + case 'ECHO': + respond(void 0, msg); + break; + case 'PIN': + case 'UNPIN': + case 'GET_HASH': + case 'GET_TOTAL_SIZE': + case 'GET_FILE_SIZE': + + default: + respond('UNSUPPORTED_RPC_CALL', msg); + break; + } + }; + + cb(void 0, rpc); +}; + diff --git a/server.js b/server.js index 34f8cfedf..ea26778f9 100644 --- a/server.js +++ b/server.js @@ -117,13 +117,32 @@ httpServer.listen(config.httpPort,config.httpAddress,function(){ var wsConfig = { server: httpServer }; -if(!config.useExternalWebsocket) { - if (websocketPort !== config.httpPort) { - console.log("setting up a new websocket server"); - wsConfig = { port: websocketPort}; +var createSocketServer = function (err, rpc) { + if(!config.useExternalWebsocket) { + if (websocketPort !== config.httpPort) { + console.log("setting up a new websocket server"); + wsConfig = { port: websocketPort}; + } + var wsSrv = new WebSocketServer(wsConfig); + Storage.create(config, function (store) { + NetfluxSrv.run(store, wsSrv, config, rpc); + }); } - var wsSrv = new WebSocketServer(wsConfig); - Storage.create(config, function (store) { - NetfluxSrv.run(store, wsSrv, config); - }); -} +}; + +var loadRPC = function (cb) { + config.rpc = typeof(config.rpc) === 'undefined'? './rpc.js' : config.rpc; + + if (typeof(config.rpc) === 'string') { + // load pin store... + var Rpc = require(config.rpc); + Rpc.create(config, function (e, rpc) { + if (e) { throw e; } + cb(void 0, rpc); + }); + } else { + cb(); + } +}; + +loadRPC(createSocketServer);