diff --git a/www/common/pinpad.js b/www/common/pinpad.js index dce9f328c..65d40407d 100644 --- a/www/common/pinpad.js +++ b/www/common/pinpad.js @@ -4,25 +4,80 @@ define([ '/bower_components/tweetnacl/nacl-fast.min.js' ], function (Cryptpad, Rpc) { - var Nacl = window.nacl; - var create = function (network, ed) { - var exp = {}; - var rpc = Rpc.create(network, ed); + var localChannelsHash = function (fileList) { + fileList = fileList || Cryptpad.getUserChannelList(); + + var channelIdList = []; + fileList.forEach(function (href) { + var parsedHref = Cryptpad.parsePadUrl(href); + if (!parsedHref || !parsedHref.hash) { return; } + var parsedHash = Cryptpad.parseHash(parsedHref.hash); + if (!parsedHash || !parsedHash.channel) { return; } + channelIdList.push(Cryptpad.base64ToHex(parsedHash.channel)); + }); + var uniqueList = Cryptpad.deduplicateString(channelIdList).sort(); + + var hash = Nacl.util.encodeBase64(Nacl + .hash(Nacl.util.decodeUTF8( JSON.stringify(uniqueList) ))); + + return hash; + }; + + // TODO move this into pinpad + false && (function () { + // compute what you think the hash should be - var checkHash = exp.checkHash = function (fileList) { - fileList = fileList || Cryptpad.getUserChannelList(); + // then ask the server if what it has matches your records + rpc.send('GET_HASH', edPublic, function (e, hash) { + if (e) { return void console.error(e); } + + console.log("user pins hash is [%s]", hash); + // if it does, awesome! + // you should be able to pin and unpin things easily + + // if it doesn't, send a reset, and start re-pinning + }); + }()); + + getServerHash = function (rpc, edPublic, cb) { + rpc.send('GET_HASH', edPublic, cb); + }; + + var getFileSize = function (rpc, file, cb) { + rpc.send('GET_FILE_SIZE', file, cb); + }; - var channelIdList = []; - fileList.forEach(function (href) { - var parsedHref = Cryptpad.parsePadUrl(href); - if (!parsedHref || !parsedHref.hash) { return; } - var parsedHash = Cryptpad.parseHash(parsedHref.hash); - if (!parsedHash || !parsedHash.channel) { return; } - channelIdList.push(Cryptpad.base64ToHex(parsedHash.channel)); + var getFileListSize = function (rpc, list, cb) { + var bytes = 0; + + var left = list.length; + + list.forEach(function (chan) { + getFileSize(rpc, chan, function (e, msg) { + if (e) { + if (e === 'ENOENT') { + + // these channels no longer exists on the server + console.log(e, chan); + } else { + console.error(e); + } + } else if (msg && msg[0] && typeof(msg[0]) === 'number') { + bytes += msg[0]; + //console.log(bytes); + } else { + console.log("returned message was not a number: ", msg); + } + + --left; + if (left === 0) { + cb(void 0, bytes); + } }); - var uniqueList = Cryptpad.deduplicateString(channelIdList).sort(); + }); + }; /* 1. every time you want to pin or unpid a pad you send a message to the server @@ -34,12 +89,41 @@ define([ UNPIN all, send all */ - var hash = Nacl.util.encodeBase64(Nacl.hash(Nacl.util.decodeUTF8( JSON.stringify(uniqueList) ))); - return hash; - }; + // Don't use create until Cryptpad is ready + // (use Cryptpad.ready) + var create = function (cb) { + // you will need to communicate with the server + // use an already established + var network = Cryptpad.getNetwork(); + + // your user proxy contains credentials you will need to make RPC calls + var proxy = Cryptpad.getStore().getProxy().proxy; + + var edPrivate = proxy.edPrivate; + var edPublic = proxy.edPublic; + + if (!(edPrivate && edPublic)) { return void cb('INVALID_KEYS'); } + + Rpc.create(network, edPrivate, edPublic, function (e, rpc) { + if (e) { return void cb(e); } + + var exp = {}; + exp.publicKey = edPublic; + exp.send = rpc.send; + + exp.getFileSize = function (file, cb) { + getFileSize(rpc, file, cb); + }; + exp.getFileListSize = function (list, cb) { + getFileListSize(rpc, list, cb); + }; + exp.getServerHash = function (cb) { + getServerHash(rpc, edPublic, cb); + }; - return exp; + cb(e, exp); + }); }; return { create: create };