diff --git a/rpc.js b/rpc.js index 9cdb440f3..6599d66bb 100644 --- a/rpc.js +++ b/rpc.js @@ -326,6 +326,24 @@ var getFileSize = function (Env, channel, cb) { }); }; +var getMetadata = function (Env, channel, cb) { + if (!isValidId(channel)) { return void cb('INVALID_CHAN'); } + + if (channel.length === 32) { + if (typeof(Env.msgStore.getChannelMetadata) !== 'function') { + return cb('GET_CHANNEL_METADATA_UNSUPPORTED'); + } + + return void Env.msgStore.getChannelMetadata(channel, function (e, data /*:object*/) { + if (e) { + if (e.code === 'INVALID_METADATA') { return void cb(void 0, {}); } + return void cb(e.code); + } + cb(void 0, data); + }); + } +}; + var getMultipleFileSize = function (Env, channels, cb) { if (!Array.isArray(channels)) { return cb('INVALID_PIN_LIST'); } if (typeof(Env.msgStore.getChannelSize) !== 'function') { @@ -1128,6 +1146,7 @@ var isNewChannel = function (Env, channel, cb) { var isUnauthenticatedCall = function (call) { return [ 'GET_FILE_SIZE', + 'GET_METADATA', 'GET_MULTIPLE_FILE_SIZE', 'IS_CHANNEL_PINNED', 'IS_NEW_CHANNEL', @@ -1248,12 +1267,14 @@ RPC.create = function ( } case 'GET_FILE_SIZE': return void getFileSize(Env, msg[1], function (e, size) { - if (e) { - console.error(e); - } WARN(e, msg[1]); respond(e, [null, size, null]); }); + case 'GET_METADATA': + return void getMetadata(Env, msg[1], function (e, data) { + WARN(e, msg[1]); + respond(e, [null, data, null]); + }); case 'GET_MULTIPLE_FILE_SIZE': return void getMultipleFileSize(Env, msg[1], function (e, dict) { if (e) { diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index 6790f2ed1..b7f47a1d1 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -429,12 +429,26 @@ define([ toSign.drive = secret.channel; toSign.edPublic = store.proxy.edPublic; var signKey = Crypto.Nacl.util.decodeBase64(secret.keys.signKey); - console.log(Sortify(toSign)); - var proof = Crypto.Nacl.sign.detached(Crypto.Nacl.util.decodeUTF8(Sortify(toSign)), signKey); - var proofTxt = Crypto.Nacl.util.encodeBase64(proof); - cb({ - proof: proofTxt, - toSign: JSON.parse(Sortify(toSign)) + Store.anonRpcMsg({ + msg: 'GET_METADATA', + data: secret.channel + }, function (data) { + console.log(data[0]); + var metadata = data[0]; + // Owned drive + if (metadata && metadata.owners && metadata.owners.length === 1 && + metadata.owners.indexOf(edPublic) !== -1) { + + return; + } + + // Not owned drive + var proof = Crypto.Nacl.sign.detached(Crypto.Nacl.util.decodeUTF8(Sortify(toSign)), signKey); + var proofTxt = Crypto.Nacl.util.encodeBase64(proof); + cb({ + proof: proofTxt, + toSign: JSON.parse(Sortify(toSign)) + }); }); };