From 8e4b6a6383cf3882eebc48dd4e40258a3d300392 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 15:52:04 +0200 Subject: [PATCH 01/22] change the log type on noisy messages for easier filtering --- www/common/LessLoader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/LessLoader.js b/www/common/LessLoader.js index d9e7d3078..4817d5a25 100644 --- a/www/common/LessLoader.js +++ b/www/common/LessLoader.js @@ -165,7 +165,7 @@ define([ stack.push(url); cacheGet(url, function (css) { if (css) { return void loadSubmodulesAndInject(css, url, done, stack); } - console.log('CACHE MISS ' + url); + console.debug('CACHE MISS ' + url); ((/\.less([\?\#].*)?$/.test(url)) ? loadLess : loadCSS)(url, function (err, css) { if (!css) { return void console.error(err); } var output = fixAllURLs(css, url); From c7cea7fae3682f55b8c71f9afd3bfcb81455d12f Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 15:56:01 +0200 Subject: [PATCH 02/22] identify cause of 'channel ready without callback' and handle reconnection more gracefully --- www/common/common-messenger.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/www/common/common-messenger.js b/www/common/common-messenger.js index 1210e652f..be4fa9aa2 100644 --- a/www/common/common-messenger.js +++ b/www/common/common-messenger.js @@ -728,6 +728,15 @@ define([ network.on('reconnect', function () { if (channel && channel.stopped) { return; } if (!channels[data.channel]) { return; } + + if (!joining[data.channel]) { + joining[data.channel] = function () { + console.log("reconnected to %s", data.channel); + }; + } else { + console.error("Reconnected to a chat channel (%s) which was not fully connected", data.channel); + } + network.join(data.channel).then(onOpen, function (err) { console.error(err); }); From c9be2fae363c9adce794243098b39bc5e99431e1 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 15:59:56 +0200 Subject: [PATCH 03/22] avoid triggering a warning when using the Notifications API in an insecure context --- www/common/notify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/notify.js b/www/common/notify.js index 5109e8748..dc5c19ad5 100644 --- a/www/common/notify.js +++ b/www/common/notify.js @@ -6,7 +6,7 @@ define(['/api/config'], function (ApiConfig) { var isSupported = Module.isSupported = function () { - return typeof(window.Notification) === 'function'; + return typeof(window.Notification) === 'function' && window.location.protocol === 'https:'; }; var hasPermission = Module.hasPermission = function () { From d83c43b0ebe2cc850ebcb3f62f18f20a69c7da6a Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 16:00:59 +0200 Subject: [PATCH 04/22] increment version to 3.1.0 --- customize.dist/pages.js | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/customize.dist/pages.js b/customize.dist/pages.js index 9791e83f0..bd373b04c 100644 --- a/customize.dist/pages.js +++ b/customize.dist/pages.js @@ -103,7 +103,7 @@ define([ ])*/ ]) ]), - h('div.cp-version-footer', "CryptPad v3.0.1 (Aurochs' revenge)") + h('div.cp-version-footer', "CryptPad v3.1.0 (Baiji)") ]); }; diff --git a/package.json b/package.json index f14fda1aa..fdbbc008a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cryptpad", "description": "realtime collaborative visual editor with zero knowlege server", - "version": "3.0.1", + "version": "3.1.0", "license": "AGPL-3.0+", "repository": { "type": "git", From 1d5534b593b9dd4ab8fb63026071e062e4024820 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 16:03:14 +0200 Subject: [PATCH 05/22] provide more debugging info on metadata parse errors --- storage/file.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/file.js b/storage/file.js index 904e07e38..52b1d38e9 100644 --- a/storage/file.js +++ b/storage/file.js @@ -76,7 +76,7 @@ var getMetadataAtPath = function (Env, path, cb) { catch (e) { console.log("getMetadataAtPath"); console.error(e); - complete('INVALID_METADATA'); + complete('INVALID_METADATA', metadata); } }); stream.on('end', function () { From 56ec91ff275e9ecbc27371cf638531b742bcca6b Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 16:30:58 +0200 Subject: [PATCH 06/22] update util.once to add a handler for multiple callbacks --- www/common/common-util.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/www/common/common-util.js b/www/common/common-util.js index 580b9f539..ba70b0ceb 100644 --- a/www/common/common-util.js +++ b/www/common/common-util.js @@ -222,13 +222,14 @@ return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); }; + Util.noop = function () {}; + /* for wrapping async functions such that they can only be called once */ - Util.once = function (f) { - var called; + Util.once = function (f, g) { return function () { - if (called) { return; } - called = true; + if (!f) { return; } f.apply(this, Array.prototype.slice.call(arguments)); + f = g; }; }; From 40f302d0028d34f0e01e70013307b9fefbbf5af3 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 16:34:30 +0200 Subject: [PATCH 07/22] revert usage of batch reads for file size --- rpc.js | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/rpc.js b/rpc.js index 71e267dfd..c382a275a 100644 --- a/rpc.js +++ b/rpc.js @@ -294,37 +294,33 @@ var getUploadSize = function (Env, channel, cb) { // FIXME FILES }); }; -const batchFileSize = BatchRead("GET_FILE_SIZE"); var getFileSize = function (Env, channel, cb) { if (!isValidId(channel)) { return void cb('INVALID_CHAN'); } - batchFileSize(channel, cb, function (done) { - if (channel.length === 32) { - if (typeof(Env.msgStore.getChannelSize) !== 'function') { - return done('GET_CHANNEL_SIZE_UNSUPPORTED'); - } - - return void Env.msgStore.getChannelSize(channel, function (e, size /*:number*/) { - if (e) { - if (e.code === 'ENOENT') { return void done(void 0, 0); } - return void done(e.code); - } - done(void 0, size); - }); + if (channel.length === 32) { + if (typeof(Env.msgStore.getChannelSize) !== 'function') { + return cb('GET_CHANNEL_SIZE_UNSUPPORTED'); } - // 'channel' refers to a file, so you need another API - getUploadSize(Env, channel, function (e, size) { - if (typeof(size) === 'undefined') { return void done(e); } - done(void 0, size); + return void Env.msgStore.getChannelSize(channel, function (e, size /*:number*/) { + if (e) { + if (e.code === 'ENOENT') { return void cb(void 0, 0); } + return void cb(e.code); + } + cb(void 0, size); }); + } + + // 'channel' refers to a file, so you need another API + getUploadSize(Env, channel, function (e, size) { + if (typeof(size) === 'undefined') { return void cb(e); } + cb(void 0, size); }); }; const batchMetadata = BatchRead("GET_METADATA"); var getMetadata = function (Env, channel, cb) { if (!isValidId(channel)) { return void cb('INVALID_CHAN'); } - - if (channel.length !== 32) { return cb("INVALID_CHAN"); } + if (channel.length !== 32) { return cb("INVALID_CHAN_LENGTH"); } batchMetadata(channel, cb, function (done) { var ref = {}; From a3eff2728e80d260c692aa4ec6b9db8b6683622a Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 16:39:54 +0200 Subject: [PATCH 08/22] update lib/once.js to match clientside definition --- lib/once.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/once.js b/lib/once.js index 369ee162e..a851af259 100644 --- a/lib/once.js +++ b/lib/once.js @@ -1,8 +1,7 @@ -module.exports = function (f) { - var called; +module.exports = function (f, g) { return function () { - if (called) { return; } - called = true; + if (!f) { return; } f.apply(this, Array.prototype.slice.call(arguments)); + f = g; }; }; From 26faf72df8fbb857bd0bcaa9ca21eeb0934133df Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 17:23:35 +0200 Subject: [PATCH 09/22] make it easier to filter clientside logs --- www/common/LessLoader.js | 2 +- www/common/cryptpad-common.js | 2 +- www/common/notify.js | 2 +- www/common/sframe-common-mailbox.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/www/common/LessLoader.js b/www/common/LessLoader.js index 4817d5a25..c04006e12 100644 --- a/www/common/LessLoader.js +++ b/www/common/LessLoader.js @@ -158,7 +158,7 @@ define([ var done = function () { clearTimeout(timeout); if (btime) { - console.log("Compiling [" + url + "] took " + (+new Date() - btime) + "ms"); + console.info("Compiling [" + url + "] took " + (+new Date() - btime) + "ms"); } cb(); }; diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index 1cdfda3e9..e51a0b8be 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -1346,7 +1346,7 @@ define([ console.log(parsed); return; } else { - console.log(parsed); + //console.log(parsed); } Util.fetch(parsed.href, waitFor(function (err, arraybuffer) { if (err) { return void console.log(err); } diff --git a/www/common/notify.js b/www/common/notify.js index dc5c19ad5..5b49de991 100644 --- a/www/common/notify.js +++ b/www/common/notify.js @@ -52,7 +52,7 @@ define(['/api/config'], function (ApiConfig) { }; var createFavicon = function () { - console.log("creating favicon"); + console.debug("creating favicon"); var fav = document.createElement('link'); var attrs = { id: 'favicon', diff --git a/www/common/sframe-common-mailbox.js b/www/common/sframe-common-mailbox.js index e468b29f1..a988ef003 100644 --- a/www/common/sframe-common-mailbox.js +++ b/www/common/sframe-common-mailbox.js @@ -126,7 +126,7 @@ define([ var onMessage = function (data) { // data = { type: 'type', content: {msg: 'msg', hash: 'hash'} } - console.log(data.type, data.content); + console.debug(data.type, data.content); pushMessage(data); if (!history[data.type]) { history[data.type] = []; } history[data.type].push(data.content); From b84c4be69c8269cce169bcba0cc374ac902a2b15 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 9 Sep 2019 17:37:11 +0200 Subject: [PATCH 10/22] Display OS notifications when receiving a notification on CryptPad --- www/common/outer/async-store.js | 4 ++-- www/common/outer/mailbox.js | 14 ++++++++++---- www/common/sframe-common-mailbox.js | 12 +++++++++--- www/common/sframe-common-outer.js | 8 ++++++-- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index 1dfe35716..2b301b20b 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -1752,12 +1752,12 @@ define([ broadcast([], "UPDATE_METADATA"); }, pinPads: function (data, cb) { Store.pinPads(null, data, cb); }, - }, waitFor, function (ev, data, clients) { + }, waitFor, function (ev, data, clients, cb) { clients.forEach(function (cId) { postMessage(cId, 'MAILBOX_EVENT', { ev: ev, data: data - }); + }, cb); }); }); }; diff --git a/www/common/outer/mailbox.js b/www/common/outer/mailbox.js index ac88b616e..34b3b13f0 100644 --- a/www/common/outer/mailbox.js +++ b/www/common/outer/mailbox.js @@ -2,10 +2,11 @@ define([ '/common/common-util.js', '/common/common-hash.js', '/common/common-realtime.js', + '/common/notify.js', '/common/outer/mailbox-handlers.js', '/bower_components/chainpad-netflux/chainpad-netflux.js', '/bower_components/chainpad-crypto/crypto.js', -], function (Util, Hash, Realtime, Handlers, CpNetflux, Crypto) { +], function (Util, Hash, Realtime, Notify, Handlers, CpNetflux, Crypto) { var Mailbox = {}; var TYPES = [ @@ -54,11 +55,11 @@ proxy.mailboxes = { return (m.viewed || []).indexOf(hash) === -1 && hash !== m.lastKnownHash; }; - var showMessage = function (ctx, type, msg, cId) { + var showMessage = function (ctx, type, msg, cId, cb) { ctx.emit('MESSAGE', { type: type, content: msg - }, cId ? [cId] : ctx.clients); + }, cId ? [cId] : ctx.clients, cb); }; var hideMessage = function (ctx, type, hash, clients) { ctx.emit('VIEWED', { @@ -272,7 +273,11 @@ proxy.mailboxes = { }); } box.content[hash] = msg; - showMessage(ctx, type, message); + showMessage(ctx, type, message, null, function (obj) { + if (!box.ready) { return; } + if (!obj || !obj.msg) { return; } + Notify.system(undefined, obj.msg); + }); }); } else { // Message has already been viewed by the user @@ -320,6 +325,7 @@ proxy.mailboxes = { view(n); } }); + box.ready = true; // Continue onReady(); }; diff --git a/www/common/sframe-common-mailbox.js b/www/common/sframe-common-mailbox.js index e468b29f1..eb50a8398 100644 --- a/www/common/sframe-common-mailbox.js +++ b/www/common/sframe-common-mailbox.js @@ -124,10 +124,16 @@ define([ removeFromHistory(data.type, data.hash); }; - var onMessage = function (data) { + var onMessage = function (data, cb) { // data = { type: 'type', content: {msg: 'msg', hash: 'hash'} } console.log(data.type, data.content); pushMessage(data); + if (data.content && typeof (data.content.getFormatText) == "function") { + var text = $('
').html(data.content.getFormatText()).text(); + cb({ + msg: text + }); + } if (!history[data.type]) { history[data.type] = []; } history[data.type].push(data.content); }; @@ -224,7 +230,7 @@ define([ // CHANNEL WITH WORKER - sframeChan.on('EV_MAILBOX_EVENT', function (obj) { + sframeChan.on('EV_MAILBOX_EVENT', function (obj, cb) { // obj = { ev: 'type', data: obj } var ev = obj.ev; var data = obj.data; @@ -232,7 +238,7 @@ define([ return void onHistory(data); } if (ev === 'MESSAGE') { - return void onMessage(data); + return void onMessage(data, cb); } if (ev === 'VIEWED') { return void onViewed(data); diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index e39e6880f..ade5dcb72 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -414,8 +414,12 @@ define([ }); }); - Cryptpad.mailbox.onEvent.reg(function (data) { - sframeChan.event('EV_MAILBOX_EVENT', data); + Cryptpad.mailbox.onEvent.reg(function (data, cb) { + sframeChan.query('EV_MAILBOX_EVENT', data, function (err, obj) { + if (!cb) { return; } + if (err) { return void cb({error: err}); } + cb(obj); + }); }); sframeChan.on('Q_MAILBOX_COMMAND', function (data, cb) { Cryptpad.mailbox.execCommand(data, cb); From e7f56ca23643873d37a50cdaed64a4ae44855f98 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 9 Sep 2019 18:10:20 +0200 Subject: [PATCH 11/22] lint compliance... --- www/common/sframe-common-mailbox.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/sframe-common-mailbox.js b/www/common/sframe-common-mailbox.js index f44618b32..35bf5df70 100644 --- a/www/common/sframe-common-mailbox.js +++ b/www/common/sframe-common-mailbox.js @@ -128,7 +128,7 @@ define([ // data = { type: 'type', content: {msg: 'msg', hash: 'hash'} } console.debug(data.type, data.content); pushMessage(data); - if (data.content && typeof (data.content.getFormatText) == "function") { + if (data.content && typeof (data.content.getFormatText) === "function") { var text = $('
').html(data.content.getFormatText()).text(); cb({ msg: text From 8c8f7e460581b36b512f58dffdd0acbf4345617e Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 9 Sep 2019 18:11:27 +0200 Subject: [PATCH 12/22] Fix 'document' not defined in the worker context --- www/common/notify.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/www/common/notify.js b/www/common/notify.js index 5b49de991..101bae6ee 100644 --- a/www/common/notify.js +++ b/www/common/notify.js @@ -4,6 +4,7 @@ define(['/api/config'], function (ApiConfig) { var DEFAULT_MAIN = '/customize/main-favicon.png?' + ApiConfig.requireConf.urlArgs; var DEFAULT_ALT = '/customize/alt-favicon.png?' + ApiConfig.requireConf.urlArgs; + var document = window.document; var isSupported = Module.isSupported = function () { return typeof(window.Notification) === 'function' && window.location.protocol === 'https:'; @@ -22,7 +23,7 @@ define(['/api/config'], function (ApiConfig) { }; var create = Module.create = function (msg, title, icon) { - if (!icon) { + if (document && !icon) { var favicon = document.getElementById('favicon'); icon = favicon.getAttribute('data-main-favicon') || DEFAULT_MAIN; } @@ -52,6 +53,9 @@ define(['/api/config'], function (ApiConfig) { }; var createFavicon = function () { + if (!document) { + return void console.error('document is not available in this context'); + } console.debug("creating favicon"); var fav = document.createElement('link'); var attrs = { @@ -68,9 +72,12 @@ define(['/api/config'], function (ApiConfig) { document.head.appendChild(fav); }; - if (!document.getElementById('favicon')) { createFavicon(); } + if (document && !document.getElementById('favicon')) { createFavicon(); } Module.tab = function (frequency, count) { + if (!document) { + return void console.error('document is not available in this context'); + } var key = '_pendingTabNotification'; var favicon = document.getElementById('favicon'); From 6f9d438d4dd286a256ef14fc5e7ecdb491ab3cf2 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 17:53:57 +0200 Subject: [PATCH 13/22] fix hacky detection of secure context --- www/common/notify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/notify.js b/www/common/notify.js index 101bae6ee..e54531f0d 100644 --- a/www/common/notify.js +++ b/www/common/notify.js @@ -7,7 +7,7 @@ define(['/api/config'], function (ApiConfig) { var document = window.document; var isSupported = Module.isSupported = function () { - return typeof(window.Notification) === 'function' && window.location.protocol === 'https:'; + return typeof(window.Notification) === 'function' && window.isSecureContext; }; var hasPermission = Module.hasPermission = function () { From 9f9bce7ac519919cc8c453f619b80d40c81671fb Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 9 Sep 2019 18:02:08 +0200 Subject: [PATCH 14/22] create the 'what is cryptpad' pad as owned when you register --- www/common/outer/async-store.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index 2b301b20b..beae6a523 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -642,8 +642,13 @@ define([ href: href, channel: channel, title: data.driveReadmeTitle, + owners: [ store.proxy.edPublic ], }; Store.addPad(clientId, fileData, cb); + }, { + metadata: { + owners: [ store.proxy.edPublic ], + }, }); }); }; From c19ff5958c02376a6d95cd453cca36f050ddf174 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 9 Sep 2019 18:47:34 +0200 Subject: [PATCH 15/22] Fix duplicate join in cursor.js --- www/common/outer/cursor.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/www/common/outer/cursor.js b/www/common/outer/cursor.js index 709b53a91..f8473fd18 100644 --- a/www/common/outer/cursor.js +++ b/www/common/outer/cursor.js @@ -148,12 +148,14 @@ define([ return void cb({error: err}); }); - network.on('reconnect', function () { + var onReconnect = function () { if (!ctx.channels[channel]) { console.log("cant reconnect", channel); return; } network.join(channel).then(onOpen, function (err) { console.error(err); }); - }); + }; + chan.onReconnect = onReconnect; + network.on('reconnect', onReconnect); }; var updateCursor = function (ctx, data, client, cb) { @@ -173,6 +175,10 @@ define([ var channel = ctx.channels[cursorChan]; if (channel.padChan !== padChan) { return; } if (channel.wc) { channel.wc.leave(); } + if (channel.onReconnect) { + var network = ctx.store.network; + network.off('reconnect', channel.onReconnect); + } delete ctx.channels[cursorChan]; return true; }); @@ -190,6 +196,10 @@ define([ chan.clients = chan.clients.filter(filter); if (chan.clients.length === 0) { if (chan.wc) { chan.wc.leave(); } + if (chan.onReconnect) { + var network = ctx.store.network; + network.off('reconnect', chan.onReconnect); + } delete ctx.channels[k]; } } From 2bd8c2d363365f5910d80bae9d6b97e14dfb8945 Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 9 Sep 2019 18:56:49 +0200 Subject: [PATCH 16/22] Fix onreconnect in cursor --- www/common/outer/cursor.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/www/common/outer/cursor.js b/www/common/outer/cursor.js index f8473fd18..e2ca194c7 100644 --- a/www/common/outer/cursor.js +++ b/www/common/outer/cursor.js @@ -154,7 +154,8 @@ define([ console.error(err); }); }; - chan.onReconnect = onReconnect; + ctx.channels[channel] = ctx.channels[channel] || {}; + ctx.channels[channel].onReconnect = onReconnect; network.on('reconnect', onReconnect); }; From 532ba9b9fdd2e460e5ef12cc1e009d2e46ca4ac0 Mon Sep 17 00:00:00 2001 From: ansuz Date: Tue, 10 Sep 2019 10:29:08 +0200 Subject: [PATCH 17/22] update XXX comments which are no longer valid or can wait --- scripts/tests/test-rpc.js | 3 +-- www/common/outer/async-store.js | 11 ----------- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/scripts/tests/test-rpc.js b/scripts/tests/test-rpc.js index 8c9f3348c..8b8c806e6 100644 --- a/scripts/tests/test-rpc.js +++ b/scripts/tests/test-rpc.js @@ -251,8 +251,7 @@ nThen(function (w) { return void console.error(err); } - // XXX validate that the write was actually successful by checking its size - + // TODO validate that the write was actually successful by checking its size response = response; // shutdown doesn't work, so we need to do this instead })); diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index beae6a523..86c5e1f9a 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -1790,17 +1790,6 @@ define([ // If we don't check now, Listmap will create an empty proxy if it no longer exists on // the server. nThen(function (waitFor) { - //var edPublic = store.proxy.edPublic; - /*var checkExpired = Object.keys(shared).filter(function (fId) { - var d = shared[fId]; - return (Array.isArray(d.owners) && d.owners.length && - (!edPublic || d.owners.indexOf(edPublic) === -1)) - || (d.expire && d.expire < (+new Date())); - }).map(function (fId) { - return shared[fId].channel; - });*/ - // XXX test: we probably shouldn't filter shared folder anymore here because - // the owner or the expiration time can change, so they can all be deleted var checkExpired = Object.keys(shared).map(function (fId) { return shared[fId].channel; }); From 285eb055f957d073e8871120b91bf163c54c07c2 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 10 Sep 2019 08:29:50 +0000 Subject: [PATCH 18/22] Translated using Weblate (German) Currently translated at 100.0% (1066 of 1066 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/de/ --- www/common/translations/messages.de.json | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/www/common/translations/messages.de.json b/www/common/translations/messages.de.json index 20f50c4cf..3fb83e79a 100644 --- a/www/common/translations/messages.de.json +++ b/www/common/translations/messages.de.json @@ -351,13 +351,13 @@ "fm_info_sharedFolder": "Dieser Ordner ist geteilt. Da du aber nicht eingeloggt bist, hast du nur einen schreibgeschützen Zugriff.
Registriere oder logge ich ein, damit du diesen Ordner in dein CryptDrive importieren und bearbeiten kannst.", "fm_info_owned": "Diese Pads sind deine eigenen. Das heißt, dass du sie jederzeit vom Server entfernen kannst. Wenn du das machst, dann sind sie auch für andere Nutzer nicht mehr zugänglich.", "fm_alert_backupUrl": "Backup-Link für dieses CryptDrive.
Es wird dringend empfohlen, diesen Link geheim zu halten.
Du kannst ihn benutzen, um deine gesamten Dateien abzurufen, wenn dein Browserspeicher gelöscht wurde.
Jede Person, die diesen Link hat, kann die Dateien in deinem CryptDrive bearbeiten oder löschen.
", - "fm_alert_anonymous": "Hallo, du benutzt CryptPad anonym. Das ist in Ordnung, aber Dokumente können nach einer längerer Inaktivität gelöscht werden. Wir haben fortgeschrittene Funktionen in anonymen CryptDrives deaktiviert, weil wir deutlich machen wollen, dass es kein sicherer Platz zur Ablage von Daten ist. Du kannst nachlesen, weshalb wir das machen und weshalb du dich wirklich registrieren oder einloggen solltest.", + "fm_alert_anonymous": "Hallo, du benutzt CryptPad anonym. Das ist in Ordnung, aber Dokumente können nach längerer Inaktivität gelöscht werden. Wir haben fortgeschrittene Funktionen in anonymen CryptDrives deaktiviert, weil wir deutlich machen wollen, dass es kein sicherer Platz zur Ablage von Daten ist. Du kannst nachlesen, weshalb wir das machen und weshalb du dich wirklich registrieren oder einloggen solltest.", "fm_backup_title": "Backup-Link", "fm_nameFile": "Wie soll diese Datei heißen?", "fm_error_cantPin": "Interner Serverfehler. Bitte lade die Seite neu und versuche es erneut.", "fm_viewListButton": "Listenansicht", "fm_viewGridButton": "Kachelansicht", - "fm_renamedPad": "Du hast einen benutzerdefinierten Namen für dieses Pad gesetzt. Sein geteilter Titel ist:
{0}", + "fm_renamedPad": "Du hast einen benutzerdefinierten Namen für dieses Pad gesetzt. Der geteilte Titel ist:
{0}", "fm_canBeShared": "Dieser Ordner kann geteilt werden", "fm_prop_tagsList": "Tags", "fm_burnThisDriveButton": "Alle Informationen löschen, die CryptPad in deinem Browser speichert", @@ -1131,7 +1131,7 @@ "uploadFolder_modal_filesPassword": "Passwort für Dateien", "uploadFolder_modal_owner": "Eigene Dateien", "uploadFolder_modal_forceSave": "Dateien im CryptDrive speichern", - "convertFolderToSF_SFParent": "Dieser Ordner kann an seinem aktuellen Ort nicht einen geteilten Ordner umgewandelt werden. Verschiebe ihn zunächst aus dem übergeordneten geteilten Ordner heraus.", + "convertFolderToSF_SFParent": "Dieser Ordner kann an seinem aktuellen Ort nicht in einen geteilten Ordner umgewandelt werden. Verschiebe ihn zunächst aus dem übergeordneten geteilten Ordner heraus.", "convertFolderToSF_SFChildren": "Dieser Ordner kann nicht in einen geteilten Ordner umgewandelt werden, weil er bereits geteilte Ordner enthält. Verschiebe diese geteilten Ordner zunächst an einen anderen Ort.", "convertFolderToSF_confirm": "Dieser Ordner muss in einen geteilten Ordner umgewandelt werden, damit ihn andere sehen können. Fortfahren?", "pricing": "Preise und Konditionen", @@ -1149,5 +1149,16 @@ "owner_removeConfirm": "Bist du sicher, dass die Eigentümerschaft der ausgewählten Benutzer entfernen möchtest? Sie werden über diese Aktion informiert.", "owner_removeMeConfirm": "Du bist dabei, deine Rechte als Eigentümer aufzugeben. Diese Aktion kannst du nicht rückgängig machen. Bist du sicher?", "owner_openModalButton": "Eigentümer verwalten", - "owner_add": "{0} möchte ein Eigentümer des Pads {1} sein. Bist du damit einverstanden?" + "owner_add": "{0} möchte ein Eigentümer des Pads {1} sein. Bist du damit einverstanden?", + "owner_removeText": "Einen Eigentümer entfernen", + "owner_removePendingText": "Eine ausstehende Einladung zurückziehen", + "owner_addText": "Einen Freund zur Mit-Eigentümerschaft einladen", + "owner_removePendingButton": "Ausgewählte Einladungen zurückziehen", + "owner_addButton": "Zur Eigentümerschaft einladen", + "owner_addConfirm": "Mit-Eigentümer können den Inhalt bearbeiten und dich als Eigentümer entfernen. Bist du sicher?", + "owner_request": "{0} möchte dich zum Eigentümer von {1} machen", + "owner_request_accepted": "{0} hat deine Einladung angenommen, ein Eigentümer von {1} zu sein", + "owner_request_declined": "{0} hat deine Einladung abgelehnt, ein Eigentümer von {1} zu sein", + "owner_removed": "{0} hat dich als Eigentümer von {1} entfernt", + "owner_removedPending": "{0} hat die Einladung zur Eigentümerschaft von {1} zurückgezogen" } From fc3c4874211ca37755f08a40e201efcfff845d5f Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 10 Sep 2019 11:23:00 +0200 Subject: [PATCH 19/22] Disable transfer ownership for shared folders and files --- www/common/common-ui-elements.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index fccef7ce2..3a9b0068f 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -406,7 +406,11 @@ define([ $d.append(UI.dialog.selectable(owners, { id: 'cp-app-prop-owners', })); - if (owned) { + var parsed; + if (data.href || data.roHref) { + parsed = Hash.parsePadUrl(data.href || data.roHref); + } + if (owned && data.roHref && parsed.type !== 'drive' && parsed.hashData.type === 'pad') { var manageOwners = h('button.no-margin', Messages.owner_openModalButton); $(manageOwners).click(function () { var modal = createOwnerModal(common, data); @@ -445,7 +449,6 @@ define([ $d.append(password); } - var parsed = Hash.parsePadUrl(data.href || data.roHref); if (!data.noEditPassword && owned && parsed.hashData.type === 'pad' && parsed.type !== "sheet") { // FIXME SHEET fix password change for sheets var sframeChan = common.getSframeChannel(); var changePwTitle = Messages.properties_changePassword; @@ -590,7 +593,7 @@ define([ id: 'cp-app-prop-size', })); - if (data.sharedFolder) { + if (data.sharedFolder && false) { $('