From 6f1e281cf877523d31e81defd7082747b0256209 Mon Sep 17 00:00:00 2001 From: yflory Date: Thu, 11 Jul 2019 14:16:04 +0200 Subject: [PATCH 1/3] request capabilities temp --- www/common/cryptpad-common.js | 4 ++ www/common/notifications.js | 27 ++++++++++++- www/common/outer/async-store.js | 60 ++++++++++++++++++++++++++++ www/common/outer/mailbox-handlers.js | 28 +++++++++++++ www/common/outer/mailbox.js | 2 +- www/common/outer/store-rpc.js | 1 + www/common/sframe-app-framework.js | 1 + www/common/sframe-common-outer.js | 7 ++++ www/common/toolbar3.js | 38 ++++++++++++++++++ 9 files changed, 166 insertions(+), 2 deletions(-) diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index fef46951c..bd467b764 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -693,6 +693,10 @@ define([ pad.onConnectEvent = Util.mkEvent(); pad.onErrorEvent = Util.mkEvent(); + pad.requestAccess = function (data, cb) { + postMessage("REQUEST_PAD_ACCESS", data, cb); + }; + common.changePadPassword = function (Crypt, href, newPassword, edPublic, cb) { if (!href) { return void cb({ error: 'EINVAL_HREF' }); } var parsed = Hash.parsePadUrl(href); diff --git a/www/common/notifications.js b/www/common/notifications.js index 2e4bfce62..8aa46fde1 100644 --- a/www/common/notifications.js +++ b/www/common/notifications.js @@ -2,9 +2,10 @@ define([ 'jquery', '/common/hyperscript.js', '/common/common-hash.js', + '/common/common-interface.js', '/common/common-ui-elements.js', '/customize/messages.js', -], function ($, h, Hash, UIElements, Messages) { +], function ($, h, Hash, UI, UIElements, Messages) { var handlers = {}; @@ -84,12 +85,36 @@ define([ key: 'newPadPassword', value: msg.content.password }, todo); + common.mailbox.dismiss(data, function (err) { + if (err) { return void console.error(err); } + }); }; if (!content.archived) { content.dismissHandler = defaultDismiss(common, data); } }; + handlers['REQUEST_PAD_ACCESS'] = function (common, data) { + var content = data.content; + var msg = content.msg; + + // Check authenticity + if (msg.author !== msg.content.user.curvePublic) { return; } + + // Display the notification + content.getFormatText = function () { + return 'Edit access request: ' + msg.content.channel + ' - ' + msg.content.user.displayName; + }; + + // if not archived, add handlers + content.handler = function () { + UI.confirm("Give edit rights?", function (yes) { + if (!yes) { return; } + // XXX Command to worker to get the edit href and send it to msg.content.user + }); + }; + }; + return { add: function (common, data) { var type = data.content.msg.type; diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index fb1bcd202..a4aaf2b5c 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -1090,6 +1090,7 @@ define([ var channels = Store.channels = store.channels = {}; Store.joinPad = function (clientId, data) { + console.log('joining', data.channel); var isNew = typeof channels[data.channel] === "undefined"; var channel = channels[data.channel] = channels[data.channel] || { queue: [], @@ -1243,6 +1244,65 @@ define([ channel.sendMessage(msg, clientId, cb); }; + Store.requestPadAccess = function (clientId, data, cb) { + // Get owners from pad metadata + // Try to find an owner in our friend list + // Mailbox... + var channel = channels[data.channel]; + if (!data.send && channel && (!channel.data || !channel.data.channel)) { + var i = 0; + var it = setInterval(function () { + if (channel.data && channel.data.channel) { + clearInterval(it); + Store.requestPadAccess(clientId, data, cb); + return; + } + if (i >= 300) { // One minute timeout + clearInterval(it); + } + i++ + }, 200); + return; + }; + var fData = channel.data || {}; + if (fData.owners) { + var friends = store.proxy.friends || {}; + if (Object.keys(friends).length > 1) { + var owner; + fData.owners.some(function (edPublic) { + return Object.keys(friends).some(function (curve) { + if (curve === "me") { return; } + if (edPublic === friends[curve].edPublic && + friends[curve].notifications) { + owner = friends[curve]; + return true; + } + }); + }); + if (owner) { + console.log(owner); + if (data.send) { + // XXX send the pad title here...? or get it from the recipient's drive + var myData = Messaging.createData(store.proxy); + delete myData.channel; + store.mailbox.sendTo('REQUEST_PAD_ACCESS', { + channel: data.channel, + user: myData + }, { + channel: owner.notifications, + curvePublic: owner.curvePublic + }, function () { + cb({state: true}); + }); + return; + } + return void cb({state: true}); + } + } + } + cb({sent: false}); + }; + // GET_FULL_HISTORY from sframe-common-outer Store.getFullHistory = function (clientId, data, cb) { var network = store.network; diff --git a/www/common/outer/mailbox-handlers.js b/www/common/outer/mailbox-handlers.js index 10e61fb60..e460233c2 100644 --- a/www/common/outer/mailbox-handlers.js +++ b/www/common/outer/mailbox-handlers.js @@ -201,6 +201,34 @@ define([ } }; + // Incoming edit rights request: add data before sending it to inner + handlers['REQUEST_PAD_ACCESS'] = function (ctx, box, data, hash) { + var msg = data.msg; + var hash = data.hash; + var content = msg.content; + + if (msg.author !== content.user.curvePublic) { return void cb(true); } + + var channel = content.channel; + var res = ctx.store.manager.findChannel(channel); + + if (!res.length) { return void cb(true); } + + var edPublic = store.proxy.edPublic; + var title; + if (!res.some(functon (obj) { + if (obj.data && + Array.isArray(obj.data.owners) && obj.data.owners.indexOf(edPublic) !== -1 && + obj.data.href) { + title = obj.data.filename || obj.data.title; + return true; + } + })) { return void cb(true); } + + content.title = title; + + }); + return { add: function (ctx, box, data, cb) { /** diff --git a/www/common/outer/mailbox.js b/www/common/outer/mailbox.js index 08e7b9351..24d14345f 100644 --- a/www/common/outer/mailbox.js +++ b/www/common/outer/mailbox.js @@ -339,10 +339,10 @@ proxy.mailboxes = { var txid = parsed[1]; var req = ctx.req[txid]; + if (!req) { return; } var type = parsed[0]; var _msg = parsed[2]; var box = req.box; - if (!req) { return; } if (type === 'HISTORY_RANGE') { if (!Array.isArray(_msg)) { return; } diff --git a/www/common/outer/store-rpc.js b/www/common/outer/store-rpc.js index 6b774339c..adfe4115c 100644 --- a/www/common/outer/store-rpc.js +++ b/www/common/outer/store-rpc.js @@ -78,6 +78,7 @@ define([ GET_FULL_HISTORY: Store.getFullHistory, GET_HISTORY_RANGE: Store.getHistoryRange, IS_NEW_CHANNEL: Store.isNewChannel, + REQUEST_PAD_ACCESS: Store.requestPadAccess, // Drive DRIVE_USEROBJECT: Store.userObjectCommand, // Settings, diff --git a/www/common/sframe-app-framework.js b/www/common/sframe-app-framework.js index f1068a6de..af856d1d7 100644 --- a/www/common/sframe-app-framework.js +++ b/www/common/sframe-app-framework.js @@ -603,6 +603,7 @@ define([ 'newpad', 'share', 'limit', + 'request', 'unpinnedWarning', 'notifications' ], diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index fba08279a..8c6f79eb2 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -941,6 +941,13 @@ define([ sframeChan.event('EV_WORKER_TIMEOUT'); }); + sframeChan.on('Q_REQUEST_ACCESS', function (data, cb) { + Cryptpad.padRpc.requestAccess({ + send: data, + channel: secret.channel + }, cb); + }); + if (cfg.messaging) { Notifier.getPermission(); diff --git a/www/common/toolbar3.js b/www/common/toolbar3.js index d6b116df3..98c2801e7 100644 --- a/www/common/toolbar3.js +++ b/www/common/toolbar3.js @@ -574,6 +574,43 @@ MessengerUI, Messages) { return $shareBlock; }; + var createRequest = function (toolbar, config) { + console.error('test'); + if (!config.metadataMgr) { + throw new Error("You must provide a `metadataMgr` to display the request access button"); + } + + // We can only requets more access if we're in read-only mode + if (config.readOnly !== 1) { return; } + + var $requestBlock = $('