From f826e6aa3b46ebe5189fa96a25a219476951ffb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Mon, 25 Nov 2019 15:42:26 +0000 Subject: [PATCH 01/65] align filter input and buttons --- customize.dist/src/less2/include/usergrid.less | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/customize.dist/src/less2/include/usergrid.less b/customize.dist/src/less2/include/usergrid.less index 38202de86..9201f7415 100644 --- a/customize.dist/src/less2/include/usergrid.less +++ b/customize.dist/src/less2/include/usergrid.less @@ -23,6 +23,8 @@ flex: 1; min-width: 0; margin-bottom: 0 !important; + height: 38px; + margin: 6px 8px 6px 0px; &::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */ color: @cryptpad_color_grey; opacity: 1; /* Firefox */ @@ -33,6 +35,10 @@ margin: 0; display: none; } + button:last-child { + margin-right: 0px !important; + } + } .cp-usergrid-user { width: 70px; From 8fc08538a1cefd22fcd920b026a0809bc438f2fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 26 Nov 2019 11:21:58 +0000 Subject: [PATCH 02/65] open share modal on ready --- www/common/toolbar3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/toolbar3.js b/www/common/toolbar3.js index 224f7eeb6..2e503164c 100644 --- a/www/common/toolbar3.js +++ b/www/common/toolbar3.js @@ -533,7 +533,7 @@ MessengerUI, Messages) { Common.getSframeChannel().event('EV_SHARE_OPEN', { hidden: true }); - $shareBlock.click(function () { + $shareBlock.ready(function () { // XXX temporary open share modal on load var title = (config.title && config.title.getTitle && config.title.getTitle()) || (config.title && config.title.defaultName) || ""; From 66073804eed656ae65d69a59dc42ac66d73b8eed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 26 Nov 2019 11:50:34 +0000 Subject: [PATCH 03/65] remove rounded corners on avatars --- customize.dist/src/less2/include/avatar.less | 1 - 1 file changed, 1 deletion(-) diff --git a/customize.dist/src/less2/include/avatar.less b/customize.dist/src/less2/include/avatar.less index 87b4a3a32..9ef46482a 100644 --- a/customize.dist/src/less2/include/avatar.less +++ b/customize.dist/src/less2/include/avatar.less @@ -30,7 +30,6 @@ justify-content: center; align-items: center; - border-radius: 4px; overflow: hidden; box-sizing: content-box; } From 1523a3107e8b62cbe0f3636ca6320d271be2b1b2 Mon Sep 17 00:00:00 2001 From: ansuz Date: Tue, 26 Nov 2019 17:35:26 -0500 Subject: [PATCH 04/65] update changelog to include 3.6.0 (GoldenFrog) --- CHANGELOG.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12df2ec6d..a4f63651f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,39 @@ +# GoldenFrog release (3.6.0) + +## Goals + +We're following up our last few releases of major core developments with an effort to improve reliability in some unstable areas and make some superficial tweaks to improve usability of some critical interfaces. + +## Update notes + +Update to 3.6.0 from 3.5.0 using the normal update procedure: + +1. stop your server +2. pull the latest code via git +3. run `bower update` +4. restart your server + +## Features + +* We've introduced a word-count feature in our rich text editor. +* The "share modal" which is accessible from both the "right-click menu" in the drive and the sharing button in the toolbar has been redesigned: + * different means of sharing access to documents have been split into different tabs to present users with less information to process + * each sharing method has an associated icon to make their actions easier to recognize at a glance + * various UI elements have been restyled to make their purpose and importance more obvious + * cancel buttons have a grey border to draw less attention + * OK buttons have a blue or grey background depending on whether they are active + * secondary buttons like "preview" have only a thin blue border so that they don't draw attention away from the primary button + * read-only text fields have a subtler appearance since they are shown primarily for the purpose of previewing your action + * text input fields (such as search) have a light background to suggest that you can use them +* We've made a minor adjustment to some of our styles for small screen to detect when a screen is very short in addition to when it is very narrow. As a result it should be somewhat easier to use on-screen keyboards. + +## Bug fixes + +* We found and fixed a subtle race condition which caused teams' quotas to be calculated incorrectly in certain circumstances. +* A minor bug in our login process caused users with premium accounts to incorrectly see an entry in their user menu as linking to our 'pricing' page instead of their 'subscription' management tools. This has since been fixed. +* We noticed that some of the rendered messages in the history mode of the notifications panel could fail to display text for some message types. These incorrect messages will be hidden from view wherever it is impossible to decide what should be displayed. We plan to address the issue in a deeper way in the near future. +* We've become aware of some odd behaviour in long-lived sessions where tabs seem to lose their connection to the sharedWorker which is common to all tabs open in a particular browser session. As far as we can tell the bug only affects Firefox browser. Unfortunately, debugging sharedWorkers in Firefox has been broken for a number of major versions, so we haven't been able to determine the cause of the issue. Until we're able to determine the underlying cause we've added extra checks to detect when particular features become isolated from the worker, where previously we assumed that if the worker was connected to the server then everything was behaving correctly. We recommend that you reload the tab if you notice that aspects of your shared folders or drives (for users or teams) display a read-only warning while your other tabs are behaving normally. + # FalklandWolf release (3.5.0) ## Goals From 50886b81da85d4a787f7921cb329bc492014c576 Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 27 Nov 2019 11:31:43 +0100 Subject: [PATCH 05/65] Update orgmode regex in codemirror #466 --- www/code/orgmode.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/www/code/orgmode.js b/www/code/orgmode.js index 3377ebb15..f36ffe9d6 100644 --- a/www/code/orgmode.js +++ b/www/code/orgmode.js @@ -6,22 +6,24 @@ define([ CodeMirror.defineSimpleMode("orgmode", { start: [ - {regex: /^(^\*{1,6}\s)(TODO|DOING|WAITING|NEXT){0,1}(CANCELLED|CANCEL|DEFERRED|DONE|REJECTED|STOP|STOPPED){0,1}(.*)$/, token: ["header org-level-star", "header org-todo", "header org-done", "header"]}, + {regex: /(\*\s)(TODO|DOING|WAITING|NEXT|PENDING|)(CANCELLED|CANCELED|CANCEL|DONE|REJECTED|STOP|STOPPED|)(\s+\[\#[A-C]\]\s+|)(.*?)(?:(\s{10,}|))(\:[\S]+\:|)$/, sol: true, token: ["header level1 org-level-star","header level1 org-todo","header level1 org-done", "header level1 org-priority", "header level1", "header level1 void", "header level1 comment"]}, + {regex: /(\*{1,}\s)(TODO|DOING|WAITING|NEXT|PENDING|)(CANCELLED|CANCELED|CANCEL|DEFERRED|DONE|REJECTED|STOP|STOPPED|)(\s+\[\#[A-C]\]\s+|)(.*?)(?:(\s{10,}|))(\:[\S]+\:|)$/, sol: true, token: ["header org-level-star","header org-todo","header org-done", "header org-priority", "header", "header void", "header comment"]}, {regex: /(\+[^\+]+\+)/, token: ["strikethrough"]}, {regex: /(\*[^\*]+\*)/, token: ["strong"]}, {regex: /(\/[^\/]+\/)/, token: ["em"]}, {regex: /(\_[^\_]+\_)/, token: ["link"]}, {regex: /(\~[^\~]+\~)/, token: ["comment"]}, {regex: /(\=[^\=]+\=)/, token: ["comment"]}, - {regex: /\[\[[^\[\]]*\]\[[^\[\]]*\]\]/, token: "url"}, // links - {regex: /\[[xX\s]?\]/, token: 'qualifier'}, // checkbox - {regex: /\#\+BEGIN_[A-Z]*/, token: "comment", next: "env"}, // comments - {regex: /:?[A-Z_]+\:.*/, token: "comment"}, // property drawers - {regex: /(\#\+[A-Z_]*)(\:.*)/, token: ["keyword", 'qualifier']}, // environments - {regex: /(CLOCK\:|SHEDULED\:)(\s.+)/, token: ["comment", "keyword"]} + {regex: /\[\[[^\[\]]+\]\[[^\[\]]+\]\]/, token: "org-url"}, // links + {regex: /\[\[[^\[\]]+\]\]/, token: "org-image"}, // image + {regex: /\[[xX\s\-\_]\]/, token: 'qualifier org-toggle'}, // checkbox + {regex: /\#\+(?:(BEGIN|begin))_[a-zA-Z]*/, token: "comment", next: "env", sol: true}, // comments + {regex: /:?[A-Z_]+\:.*/, token: "comment", sol: true}, // property drawers + {regex: /(\#\+[a-zA-Z_]*)(\:.*)/, token: ["keyword", 'qualifier'], sol: true}, // environments + {regex: /(CLOCK\:|SHEDULED\:|DEADLINE\:)(\s.+)/, token: ["comment", "keyword"]} ], env: [ - {regex: /.*?\#\+END_[A-Z]*/, token: "comment", next: "start"}, + {regex: /\#\+(?:(END|end))_[a-zA-Z]*/, token: "comment", next: "start", sol: true}, {regex: /.*/, token: "comment"} ] }); From 3b6155ffce80a7c1901852ffda0d2c2d8ba2fc19 Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 27 Nov 2019 13:14:33 +0100 Subject: [PATCH 06/65] Change properties icon in the drive --- www/common/drive-ui.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/drive-ui.js b/www/common/drive-ui.js index 4c73a95a8..2f7da5886 100644 --- a/www/common/drive-ui.js +++ b/www/common/drive-ui.js @@ -79,7 +79,7 @@ define([ var faColor = 'cptools-palette'; var faTrash = 'fa-trash'; var faDelete = 'fa-eraser'; - var faProperties = 'fa-database'; + var faProperties = 'fa-info-circle'; var faTags = 'fa-hashtag'; var faUploadFiles = 'cptools-file-upload'; var faUploadFolder = 'cptools-folder-upload'; From 8a0e0621fb9d78a5b5d31375013e1e94f7f0a494 Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 27 Nov 2019 17:26:21 +0100 Subject: [PATCH 07/65] Fast auth --- www/auth/main.js | 85 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 67 insertions(+), 18 deletions(-) diff --git a/www/auth/main.js b/www/auth/main.js index 7930e96e0..afe029bc3 100644 --- a/www/auth/main.js +++ b/www/auth/main.js @@ -1,12 +1,16 @@ define([ 'jquery', - '/common/cryptpad-common.js', + '/common/cryptget.js', + '/common/pinpad.js', '/common/common-constants.js', '/common/outer/local-store.js', + '/common/outer/login-block.js', + '/common/outer/network-config.js', '/common/test.js', '/bower_components/nthen/index.js', + '/bower_components/netflux-websocket/netflux-client.js', '/bower_components/tweetnacl/nacl-fast.min.js' -], function ($, Cryptpad, Constants, LocalStore, Test, nThen) { +], function ($, Crypt, Pinpad, Constants, LocalStore, Block, NetConfig, Test, nThen, Netflux) { var Nacl = window.nacl; var signMsg = function (msg, privKey) { @@ -27,9 +31,55 @@ define([ sessionStorage[Constants.userHashKey]; var proxy; + var rpc; + var network; + var rpcError; + + var loadProxy = function (hash) { + nThen(function (waitFor) { + Crypt.get(hash, waitFor(function (err, val) { + if (err) { + waitFor.abort(); + console.error(err); + } + try { + var parsed = JSON.parse(val); + proxy = parsed; + } catch (e) { + console.log("Can't parse user drive", e); + } + }); + }).nThen(function (waitFor) { + var wsUrl = NetConfig.getWebsocketURL(); + var w = waitFor(); + Netflux.connect(wsUrl).then(function (network) { + network = _network; + w(); + }, function (err) { + rpcError = err; + console.error(err); + waitFor.abort(); + }); + }).nThen(function (waitFor) { + Pinpad.create(network, proxy, waitFor(function (e, call) { + if (e) { + rpcError = e; + return void waitFor.abort(); + } + rpc = call; + })); + }).nThen(function () { + console.log('IFRAME READY'); + Test(function () { + // This is only here to maybe trigger an error. + window.drive = proxy['drive']; + Test.passed(); + }); + }); + }; var whenReady = function (cb) { - if (proxy) { return void cb(); } + if (proxy && (rpc || rpcError)) { return void cb(); } console.log('CryptPad not ready...'); setTimeout(function () { whenReady(cb); @@ -50,6 +100,8 @@ define([ ret.error = "UNAUTH_DOMAIN"; } else if (!LocalStore.isLoggedIn()) { ret.error = "NOT_LOGGED_IN"; + } else if ('LOGIN') { + // XXX Display login modal.... } else { return void whenReady(function () { var sig = signMsg(data.data, proxy.edPrivate); @@ -63,7 +115,14 @@ define([ } } else if (data.cmd === 'UPDATE_LIMIT') { return void whenReady(function () { - Cryptpad.updatePinLimit(function (e, limit, plan, note) { + if (rpcError) { + // XXX + // Tell the user on accounts that there was an issue and they need to wait maximum 24h or contact an admin + } + rpc.updatePinLimits(function (e, limit, plan, note) { + if (e) { + // XXX same as above + } ret.res = [limit, plan, note]; srcWindow.postMessage(JSON.stringify(ret), domain); }); @@ -74,18 +133,8 @@ define([ srcWindow.postMessage(JSON.stringify(ret), domain); }); - nThen(function (waitFor) { - Cryptpad.ready(waitFor()); - }).nThen(function (waitFor) { - Cryptpad.getUserObject(null, waitFor(function (obj) { - proxy = obj; - })); - }).nThen(function () { - console.log('IFRAME READY'); - Test(function () { - // This is only here to maybe trigger an error. - window.drive = proxy['drive']; - Test.passed(); - }); - }); + var userHash = LocalStore.getUserHash(); + if (userHash) { + loadProxy(userHash); + } }); From d7bcb63f7036fdce6896fd37f0e6364ad3661dbe Mon Sep 17 00:00:00 2001 From: ansuz Date: Wed, 27 Nov 2019 11:45:02 -0500 Subject: [PATCH 08/65] add our opencollective url to package.json for the new 'funding' api --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index 4b62e5a37..a84f9ef6c 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,10 @@ "type": "git", "url": "git://github.com/xwiki-labs/cryptpad.git" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cryptpad" + }, "dependencies": { "chainpad-crypto": "^0.2.2", "chainpad-server": "^3.0.5", From d6d92531ea122665c8251a3e66fae5f6217d50d5 Mon Sep 17 00:00:00 2001 From: yflory Date: Thu, 28 Nov 2019 12:46:12 +0100 Subject: [PATCH 09/65] Add finnish translation files --- customize.dist/translations/messages.fi.js | 14 ++++++++++++++ www/common/translations/messages.fi.json | 2 ++ 2 files changed, 16 insertions(+) create mode 100644 customize.dist/translations/messages.fi.js create mode 100644 www/common/translations/messages.fi.json diff --git a/customize.dist/translations/messages.fi.js b/customize.dist/translations/messages.fi.js new file mode 100644 index 000000000..f01fa5160 --- /dev/null +++ b/customize.dist/translations/messages.fi.js @@ -0,0 +1,14 @@ +/* + * You can override the translation text using this file. + * The recommended method is to make a copy of this file (/customize.dist/translations/messages.{LANG}.js) + in a 'customize' directory (/customize/translations/messages.{LANG}.js). + * If you want to check all the existing translation keys, you can open the internal language file + but you should not change it directly (/common/translations/messages.{LANG}.js) +*/ +define(['/common/translations/messages.fi.js'], function (Messages) { + // Replace the existing keys in your copied file here: + // Messages.button_newpad = "New Rich Text Document"; + + return Messages; +}); + diff --git a/www/common/translations/messages.fi.json b/www/common/translations/messages.fi.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/www/common/translations/messages.fi.json @@ -0,0 +1,2 @@ +{ +} From 03701f02e05445c431d604cc39591bcb5f4dbfb7 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 29 Nov 2019 10:46:34 +0100 Subject: [PATCH 10/65] Remove debug logs --- www/auth/main.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/www/auth/main.js b/www/auth/main.js index afe029bc3..d019c1a8c 100644 --- a/www/auth/main.js +++ b/www/auth/main.js @@ -41,6 +41,7 @@ define([ if (err) { waitFor.abort(); console.error(err); + return; } try { var parsed = JSON.parse(val); @@ -48,11 +49,11 @@ define([ } catch (e) { console.log("Can't parse user drive", e); } - }); + })); }).nThen(function (waitFor) { var wsUrl = NetConfig.getWebsocketURL(); var w = waitFor(); - Netflux.connect(wsUrl).then(function (network) { + Netflux.connect(wsUrl).then(function (_network) { network = _network; w(); }, function (err) { @@ -69,7 +70,6 @@ define([ rpc = call; })); }).nThen(function () { - console.log('IFRAME READY'); Test(function () { // This is only here to maybe trigger an error. window.drive = proxy['drive']; @@ -95,13 +95,15 @@ define([ console.log('CP receiving', data); if (data.cmd === 'PING') { ret.res = 'PONG'; + } else if (data.cmd === 'LOGIN') { + UI.alert('okok'); + return; + // XXX Display login modal.... } else if (data.cmd === 'SIGN') { if (!AUTHORIZED_DOMAINS.filter(function (x) { return x.test(domain); }).length) { ret.error = "UNAUTH_DOMAIN"; } else if (!LocalStore.isLoggedIn()) { ret.error = "NOT_LOGGED_IN"; - } else if ('LOGIN') { - // XXX Display login modal.... } else { return void whenReady(function () { var sig = signMsg(data.data, proxy.edPrivate); From cc4e6d9a1e56bd1e05f3daf02d6e4f3558b449ef Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 29 Nov 2019 14:30:12 +0100 Subject: [PATCH 11/65] Fix integrity checks --- www/common/outer/userObject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/outer/userObject.js b/www/common/outer/userObject.js index 384ab99c2..ef81fd14c 100644 --- a/www/common/outer/userObject.js +++ b/www/common/outer/userObject.js @@ -818,7 +818,7 @@ define([ } // Fix href - if (href && href.slice(0,1) !== '/') { el.href = exp.cryptor.encrypt(Hash.getRelativeHref(el.href)); } + if (href && href.slice(0,1) !== '/') { el.href = exp.cryptor.encrypt(Hash.getRelativeHref(href)); } // Fix creation time if (!el.ctime) { el.ctime = el.atime; } // Fix title From 71d2f8388d90cd7e218513f35c3b9750cd96022d Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 29 Nov 2019 14:32:40 +0100 Subject: [PATCH 12/65] Rename a variable --- www/common/outer/userObject.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/www/common/outer/userObject.js b/www/common/outer/userObject.js index ef81fd14c..5a2693fd9 100644 --- a/www/common/outer/userObject.js +++ b/www/common/outer/userObject.js @@ -769,18 +769,18 @@ define([ continue; } - var href; + var decryptedHref; try { - href = el.href && ((el.href.indexOf('#') !== -1) ? el.href : exp.cryptor.decrypt(el.href)); + decryptedHref = el.href && ((el.href.indexOf('#') !== -1) ? el.href : exp.cryptor.decrypt(el.href)); } catch (e) {} - if (href && href.indexOf('#') === -1) { + if (decryptedHref && decryptedHref.indexOf('#') === -1) { // If we can't decrypt the href, it means we don't have the correct secondaryKey and we're in readOnly mode: // abort now, we won't be able to fix anything anyway continue; } - var parsed = Hash.parsePadUrl(href || el.roHref); + var parsed = Hash.parsePadUrl(decryptedHref || el.roHref); var secret; // Clean invalid hash @@ -797,9 +797,9 @@ define([ } // If we have an edit link, check the view link - if (href && parsed.hashData.type === "pad" && parsed.hashData.version) { + if (decryptedHref && parsed.hashData.type === "pad" && parsed.hashData.version) { if (parsed.hashData.mode === "view") { - el.roHref = href; + el.roHref = decryptedHref; delete el.href; } else if (!el.roHref) { secret = Hash.getSecrets(parsed.type, parsed.hash, el.password); @@ -818,7 +818,9 @@ define([ } // Fix href - if (href && href.slice(0,1) !== '/') { el.href = exp.cryptor.encrypt(Hash.getRelativeHref(href)); } + if (decryptedHref && decryptedHref.slice(0,1) !== '/') { + el.href = exp.cryptor.encrypt(Hash.getRelativeHref(decryptedHref)); + } // Fix creation time if (!el.ctime) { el.ctime = el.atime; } // Fix title From e4231956a391f1ea8c89cb2e246b090a2d762d08 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 29 Nov 2019 14:30:12 +0100 Subject: [PATCH 13/65] Fix integrity checks --- www/common/outer/userObject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/outer/userObject.js b/www/common/outer/userObject.js index 384ab99c2..ef81fd14c 100644 --- a/www/common/outer/userObject.js +++ b/www/common/outer/userObject.js @@ -818,7 +818,7 @@ define([ } // Fix href - if (href && href.slice(0,1) !== '/') { el.href = exp.cryptor.encrypt(Hash.getRelativeHref(el.href)); } + if (href && href.slice(0,1) !== '/') { el.href = exp.cryptor.encrypt(Hash.getRelativeHref(href)); } // Fix creation time if (!el.ctime) { el.ctime = el.atime; } // Fix title From e35b1712c3a80d343f5707138cedc89a5538969b Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 29 Nov 2019 16:47:18 +0100 Subject: [PATCH 14/65] Change initial tab in the share modal --- www/common/common-interface.js | 8 +++++--- www/common/common-ui-elements.js | 12 +++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/www/common/common-interface.js b/www/common/common-interface.js index 72438fec2..8efc7397a 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -187,7 +187,8 @@ define([ dialog.tabs = function (tabs) { var contents = []; var titles = []; - tabs.forEach(function (tab) { + var active = 0; + tabs.forEach(function (tab, i) { if (!tab.content || !tab.title) { return; } var content = h('div.alertify-tabs-content', tab.content); var title = h('span.alertify-tabs-title', tab.title); @@ -203,10 +204,11 @@ define([ }); titles.push(title); contents.push(content); + if (tab.active) { active = i; } }); if (contents.length) { - $(contents[0]).addClass('alertify-tabs-content-active'); - $(titles[0]).addClass('alertify-tabs-active'); + $(contents[active]).addClass('alertify-tabs-content-active'); + $(titles[active]).addClass('alertify-tabs-active'); } return h('div.alertify-tabs', [ h('div.alertify-tabs-titles', titles), diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index f7c84298a..b8ae705a2 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1185,13 +1185,15 @@ define([ // Create modal var tabs = [{ - title: Messages.share_linkCategory, - icon: "fa fa-link", - content: frameLink - }, { title: Messages.share_contactCategory, icon: "fa fa-address-book", - content: frameContacts + content: frameContacts, + active: hasFriends + }, { + title: Messages.share_linkCategory, + icon: "fa fa-link", + content: frameLink, + active: !hasFriends }, { title: Messages.share_embedCategory, icon: "fa fa-code", From d52acfa5d270fadc430e7ef5ec025a43e229196c Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 29 Nov 2019 17:02:02 +0100 Subject: [PATCH 15/65] Change initial tab in the file share modal --- www/common/common-ui-elements.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index b8ae705a2..eb8bb21a2 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1349,13 +1349,15 @@ define([ // Create modal var tabs = [{ - title: Messages.share_linkCategory, - icon: "fa fa-link", - content: frameLink - }, { title: Messages.share_contactCategory, icon: "fa fa-address-book", - content: frameContacts + content: frameContacts, + active: hasFriends, + }, { + title: Messages.share_linkCategory, + icon: "fa fa-link", + content: frameLink, + active: !hasFriends }, { title: Messages.share_embedCategory, icon: "fa fa-code", From 1da5e8ac3c2ea7e1b6ac972f8aba2d4a6d7ed7d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Mon, 2 Dec 2019 11:34:34 +0000 Subject: [PATCH 16/65] usergrid avatar display and scrolling --- customize.dist/src/less2/include/avatar.less | 6 ++- .../src/less2/include/usergrid.less | 51 +++++++++++++------ www/common/common-ui-elements.js | 18 +++++-- 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/customize.dist/src/less2/include/avatar.less b/customize.dist/src/less2/include/avatar.less index 9ef46482a..4ba4e8c44 100644 --- a/customize.dist/src/less2/include/avatar.less +++ b/customize.dist/src/less2/include/avatar.less @@ -1,4 +1,5 @@ @import (reference) "./tools.less"; +@import (reference) "./colortheme-all.less"; .avatar_vars( @width: 30px ) { @@ -35,10 +36,11 @@ } .cp-avatar-default { .tools_unselectable(); - background: white; - color: black; + background: rgb(160, 160, 160); // XXX testing + color: @cryptpad_text_col; // XXX testing font-size: @avatar-font-size; font-size: var(--avatar-font-size); + text-transform: capitalize; } media-tag { min-height: @avatar-width; diff --git a/customize.dist/src/less2/include/usergrid.less b/customize.dist/src/less2/include/usergrid.less index ae56716a1..e3f1dad97 100644 --- a/customize.dist/src/less2/include/usergrid.less +++ b/customize.dist/src/less2/include/usergrid.less @@ -10,12 +10,12 @@ .cp-usergrid-grid { display: flex; flex-wrap: wrap; + margin: -3px; margin-bottom: 6px; - } - &:not(.large) { - .cp-usergrid-grid { - margin: -3px; - margin-bottom: 6px; + max-height: 130px; + overflow: auto; + @media screen and (max-height: 515px) { + max-height: unset; // remove double scrollbar } } &.cp-usergrid-empty { @@ -30,13 +30,13 @@ min-width: 0; margin-bottom: 0 !important; height: 38px; - margin: 6px 8px 6px 0px; + margin: 6px 0px; &::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */ color: @cryptpad_color_grey; opacity: 1; /* Firefox */ } } - margin-bottom: 15px; + margin-bottom: 10px; &:empty { margin: 0; display: none; @@ -54,7 +54,6 @@ justify-content: center; align-items: center; padding: 5px; - margin: 3px; cursor: default; transition: order 0.5s, background-color 0.5s; margin-top: 1px; @@ -64,10 +63,21 @@ background-color: @colortheme_alertify-primary; color: @colortheme_alertify-primary-text; order: -1 !important; + .cp-usergrid-avatar { + media-tag, .cp-avatar-default { + opacity: 0.7; + } + } } .cp-usergrid-user-avatar { min-height: 40px; } + &:not(.large) { + .cp-usergrid-user-name { + display: none; + } + } + .cp-usergrid-user-name { overflow: hidden; white-space: nowrap; @@ -75,24 +85,33 @@ width: 100%; text-align: center; line-height: 18px; + flex: 1; } - border: 1px solid @colortheme_alertify-primary; &:not(.large) { - .avatar_main(40px); + .avatar_main(60px); } &.large { .avatar_main(25px); - width: 140px; + width: 145px; height: 35px; flex-flow: row; - margin: 0; - margin-right: 15px; - margin-bottom: 1px; - &:nth-child(3n) { - margin-right: 0; + margin: 3px; + flex-basis: calc(33.3333333% - 6px); + flex-shrink: 1; + min-width: 0; + .cp-usergrid-user-name { + margin-left: 5px; + text-align: left; + color: @cryptpad_text_col; } } + &.cp-selected { + .cp-usergrid-user-name { + color: @colortheme_alertify-primary-text; + } + + } } } } diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 280849e7f..652b2ab56 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -791,9 +791,7 @@ define([ var div = h('div.cp-usergrid-container' + noOthers + (config.large?'.large':''), [ label ? h('label', label) : undefined, h('div.cp-usergrid-filter', (config.noFilter || config.noSelect) ? undefined : [ - inputFilter, - buttonSelect, - buttonDeselect + inputFilter ]), ]); var $div = $(div); @@ -880,10 +878,21 @@ define([ delete friends[curve]; }); + var x = new Array(50).fill('test'); // XXX fake friend generator + x.forEach(function (el, i) { + friends[i] = { + edPublic: i, + curvePublic: i, + displayName: i + " pizza" // Hash.createChannelId() + }; + }); // XXX + + var friendsList = UIElements.getUserGrid(null, { common: common, data: friends, - noFilter: false + noFilter: false, + large: true }, refreshButtons); var friendDiv = friendsList.div; $div.append(friendDiv); @@ -909,6 +918,7 @@ define([ var teamsList = UIElements.getUserGrid(Messages.share_linkTeam, { common: common, noFilter: true, + large: true, data: teams }, refreshButtons); $div.append(teamsList.div); From 308d255a252fc779cd84d316e5f7b47c1f1008ec Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 2 Dec 2019 11:11:31 -0500 Subject: [PATCH 17/65] update jquery to 2.2.4, closes #471 --- bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bower.json b/bower.json index 86eb284b3..6dbc2bbd1 100644 --- a/bower.json +++ b/bower.json @@ -18,7 +18,7 @@ "tests" ], "dependencies": { - "jquery": "~2.1.3", + "jquery": "2.2.4", "tweetnacl": "0.12.2", "components-font-awesome": "^4.6.3", "ckeditor": "4.7.3", From e39257672c9dabd7a881d2dd949db4a71ce81820 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 2 Dec 2019 11:27:13 -0500 Subject: [PATCH 18/65] enable gantt chart rendering in rendered markdown --- www/common/diffMarked.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/diffMarked.js b/www/common/diffMarked.js index 07044f5e2..2b2cf4a1c 100644 --- a/www/common/diffMarked.js +++ b/www/common/diffMarked.js @@ -84,7 +84,7 @@ define([ var defaultCode = renderer.code; renderer.code = function (code, language) { - if (language === 'mermaid' && (code.match(/^sequenceDiagram/) || code.match(/^graph/))) { + if (language === 'mermaid' && (code.match(/^sequenceDiagram/) || code.match(/^(graph|gantt)/))) { return '
'+code+'
'; } else { return defaultCode.apply(renderer, arguments); From aa6beebe6a88d2e76a60fea31242414a04ed1553 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 2 Dec 2019 11:56:29 -0500 Subject: [PATCH 19/65] address jquery version conflict --- bower.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bower.json b/bower.json index 6dbc2bbd1..b67900338 100644 --- a/bower.json +++ b/bower.json @@ -51,6 +51,7 @@ "requirejs-plugins": "^1.0.3" }, "resolutions": { - "bootstrap": "^v4.0.0" + "bootstrap": "^v4.0.0", + "jquery": "2.2.4" } } From e7447008cef7310a928c98596d4c96253ef18a13 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 2 Dec 2019 13:08:33 -0500 Subject: [PATCH 20/65] enable more mermaid modes --- www/common/diffMarked.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/diffMarked.js b/www/common/diffMarked.js index 2b2cf4a1c..35bd82c55 100644 --- a/www/common/diffMarked.js +++ b/www/common/diffMarked.js @@ -84,7 +84,7 @@ define([ var defaultCode = renderer.code; renderer.code = function (code, language) { - if (language === 'mermaid' && (code.match(/^sequenceDiagram/) || code.match(/^(graph|gantt)/))) { + if (language === 'mermaid' && code.match(/^(graph|pie|gantt|sequenceDiagram|classDiagram|gitGraph)/))) { return '
'+code+'
'; } else { return defaultCode.apply(renderer, arguments); From ff67f8381bba5bc0241e621b729692e5567ee626 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 2 Dec 2019 13:10:38 -0500 Subject: [PATCH 21/65] oops, I really should have linted before pushing... --- www/common/diffMarked.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/diffMarked.js b/www/common/diffMarked.js index 35bd82c55..5817e5ac9 100644 --- a/www/common/diffMarked.js +++ b/www/common/diffMarked.js @@ -84,7 +84,7 @@ define([ var defaultCode = renderer.code; renderer.code = function (code, language) { - if (language === 'mermaid' && code.match(/^(graph|pie|gantt|sequenceDiagram|classDiagram|gitGraph)/))) { + if (language === 'mermaid' && code.match(/^(graph|pie|gantt|sequenceDiagram|classDiagram|gitGraph)/)) { return '
'+code+'
'; } else { return defaultCode.apply(renderer, arguments); From 198786ed908c6a0ce11f992cb565add767cc93e4 Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 3 Dec 2019 10:37:47 +0100 Subject: [PATCH 22/65] Login from accounts --- www/auth/main.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/www/auth/main.js b/www/auth/main.js index d019c1a8c..878393012 100644 --- a/www/auth/main.js +++ b/www/auth/main.js @@ -6,11 +6,12 @@ define([ '/common/outer/local-store.js', '/common/outer/login-block.js', '/common/outer/network-config.js', + '/customize/login.js', '/common/test.js', '/bower_components/nthen/index.js', '/bower_components/netflux-websocket/netflux-client.js', '/bower_components/tweetnacl/nacl-fast.min.js' -], function ($, Crypt, Pinpad, Constants, LocalStore, Block, NetConfig, Test, nThen, Netflux) { +], function ($, Crypt, Pinpad, Constants, LocalStore, Block, NetConfig, Login, Test, nThen, Netflux) { var Nacl = window.nacl; var signMsg = function (msg, privKey) { @@ -96,9 +97,16 @@ define([ if (data.cmd === 'PING') { ret.res = 'PONG'; } else if (data.cmd === 'LOGIN') { - UI.alert('okok'); + Login.loginOrRegister(data.data.name, data.data.password, false, false, function (err, res) { + if (err) { + ret.error = 'LOGIN_ERROR' + srcWindow.postMessage(JSON.stringify(ret), domain); + return; + } + loadProxy(LocalStore.getUserHash()); + srcWindow.postMessage(JSON.stringify(ret), domain); + }); return; - // XXX Display login modal.... } else if (data.cmd === 'SIGN') { if (!AUTHORIZED_DOMAINS.filter(function (x) { return x.test(domain); }).length) { ret.error = "UNAUTH_DOMAIN"; From ee1371c8ba85ab9a7ad2157a5a6e2f9bd618c9c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 3 Dec 2019 09:38:39 +0000 Subject: [PATCH 23/65] try to get rid of vertical scroll --- customize.dist/src/less2/include/usergrid.less | 2 +- www/common/drive-ui.js | 11 ++++++++++- www/common/toolbar3.js | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/customize.dist/src/less2/include/usergrid.less b/customize.dist/src/less2/include/usergrid.less index e3f1dad97..28b90359a 100644 --- a/customize.dist/src/less2/include/usergrid.less +++ b/customize.dist/src/less2/include/usergrid.less @@ -13,7 +13,7 @@ margin: -3px; margin-bottom: 6px; max-height: 130px; - overflow: auto; + overflow-y: auto; @media screen and (max-height: 515px) { max-height: unset; // remove double scrollbar } diff --git a/www/common/drive-ui.js b/www/common/drive-ui.js index 4c73a95a8..102ba876b 100644 --- a/www/common/drive-ui.js +++ b/www/common/drive-ui.js @@ -4187,7 +4187,16 @@ define([ } getProperties(el, function (e, $prop) { if (e) { return void logError(e); } - UI.alert($prop[0], undefined, true); + var modal = UI.dialog.customModal($prop[0], { + buttons: [{ + className: 'secondary', + name: Messages.okButton, + onClick: function () {}, + keys: [13] + }], + onClose: config.onClose, + }); + UI.openCustomModal(modal); }); } else if ($this.hasClass("cp-app-drive-context-hashtag")) { diff --git a/www/common/toolbar3.js b/www/common/toolbar3.js index 2e503164c..b6cb3c125 100644 --- a/www/common/toolbar3.js +++ b/www/common/toolbar3.js @@ -533,7 +533,7 @@ MessengerUI, Messages) { Common.getSframeChannel().event('EV_SHARE_OPEN', { hidden: true }); - $shareBlock.ready(function () { // XXX temporary open share modal on load + $shareBlock.click(function () { var title = (config.title && config.title.getTitle && config.title.getTitle()) || (config.title && config.title.defaultName) || ""; From 26c681c3cbf62b0380a2fce4cd9968b1626617ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 3 Dec 2019 10:11:52 +0000 Subject: [PATCH 24/65] remove padding in prop modal - caused a vertical scrollbar - now constructed like the share modal (customModals inside tabs) --- www/common/common-ui-elements.js | 16 +++++++++++++--- www/common/drive-ui.js | 11 +---------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 652b2ab56..4fd9860ff 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -737,12 +737,22 @@ define([ UIElements.getProperties = function (common, data, cb) { var c1; var c2; + var button = [{ + className: 'primary', + name: Messages.okButton, + onClick: function () {}, + keys: [13] + }]; NThen(function (waitFor) { getPadProperties(common, data, waitFor(function (e, c) { - c1 = c[0]; + c1 = UI.dialog.customModal(c[0], { + buttons: button + }); })); getRightsProperties(common, data, waitFor(function (e, c) { - c2 = c[0]; + c2 = UI.dialog.customModal(c[0], { + buttons: button + }); })); }).nThen(function () { var tabs = UI.dialog.tabs([{ @@ -1767,7 +1777,7 @@ define([ if (e) { return void console.error(e); } UIElements.getProperties(common, data, function (e, $prop) { if (e) { return void console.error(e); } - UI.alert($prop[0], undefined, true); + UI.openCustomModal($prop[0]); }); }); }); diff --git a/www/common/drive-ui.js b/www/common/drive-ui.js index 102ba876b..bdb6144cb 100644 --- a/www/common/drive-ui.js +++ b/www/common/drive-ui.js @@ -4187,16 +4187,7 @@ define([ } getProperties(el, function (e, $prop) { if (e) { return void logError(e); } - var modal = UI.dialog.customModal($prop[0], { - buttons: [{ - className: 'secondary', - name: Messages.okButton, - onClick: function () {}, - keys: [13] - }], - onClose: config.onClose, - }); - UI.openCustomModal(modal); + UI.openCustomModal($prop[0]); }); } else if ($this.hasClass("cp-app-drive-context-hashtag")) { From 5657793e9ccb3f0d4503627838b9023dbfe44a78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 3 Dec 2019 10:25:56 +0000 Subject: [PATCH 25/65] use .large avatars in manage owners --- customize.dist/src/less2/include/usergrid.less | 2 +- www/common/common-ui-elements.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/customize.dist/src/less2/include/usergrid.less b/customize.dist/src/less2/include/usergrid.less index 28b90359a..59fed1d56 100644 --- a/customize.dist/src/less2/include/usergrid.less +++ b/customize.dist/src/less2/include/usergrid.less @@ -84,7 +84,7 @@ text-overflow: ellipsis; width: 100%; text-align: center; - line-height: 18px; + line-height: 20px; flex: 1; } diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 4fd9860ff..8fa79b0a6 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -147,6 +147,7 @@ define([ : Messages.owner_removeText; var removeCol = UIElements.getUserGrid(msg, { common: common, + large: true, data: _owners, noFilter: true }, function () { @@ -238,6 +239,7 @@ define([ }); var addCol = UIElements.getUserGrid(Messages.owner_addText, { common: common, + large: true, data: _friends }, function () { //console.log(arguments); @@ -254,6 +256,7 @@ define([ }); var teamsList = UIElements.getUserGrid(Messages.owner_addTeamText, { common: common, + large: true, noFilter: true, data: teamsData }, function () {}); From d7b3a5ce678c84e954b4559b4f8804042fde898d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 3 Dec 2019 10:43:27 +0000 Subject: [PATCH 26/65] adjust default avatar colors --- customize.dist/src/less2/include/avatar.less | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/customize.dist/src/less2/include/avatar.less b/customize.dist/src/less2/include/avatar.less index 4ba4e8c44..59a5189b8 100644 --- a/customize.dist/src/less2/include/avatar.less +++ b/customize.dist/src/less2/include/avatar.less @@ -5,6 +5,8 @@ ) { @avatar-width: @width; @avatar-font-size: @width / 1.2; + @avatar-default-bg: #D9D8D8; + @avatar-default-fg: darken(@avatar-default-bg, 40%); } .avatar_main(@width: 30px) { --LessLoader_require: LessLoader_currentFile(); @@ -36,8 +38,8 @@ } .cp-avatar-default { .tools_unselectable(); - background: rgb(160, 160, 160); // XXX testing - color: @cryptpad_text_col; // XXX testing + background:@avatar-default-bg; // XXX testing + color: @avatar-default-fg; // XXX testing font-size: @avatar-font-size; font-size: var(--avatar-font-size); text-transform: capitalize; From 2f087a392a0ca6e952e76cb25208e255d95dafa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 3 Dec 2019 11:03:57 +0000 Subject: [PATCH 27/65] clean up XXXes --- customize.dist/src/less2/include/avatar.less | 4 ++-- www/common/common-ui-elements.js | 10 ---------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/customize.dist/src/less2/include/avatar.less b/customize.dist/src/less2/include/avatar.less index 59a5189b8..9cd14ebbc 100644 --- a/customize.dist/src/less2/include/avatar.less +++ b/customize.dist/src/less2/include/avatar.less @@ -38,8 +38,8 @@ } .cp-avatar-default { .tools_unselectable(); - background:@avatar-default-bg; // XXX testing - color: @avatar-default-fg; // XXX testing + background:@avatar-default-bg; + color: @avatar-default-fg; font-size: @avatar-font-size; font-size: var(--avatar-font-size); text-transform: capitalize; diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 8fa79b0a6..785ad3e1e 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -891,16 +891,6 @@ define([ delete friends[curve]; }); - var x = new Array(50).fill('test'); // XXX fake friend generator - x.forEach(function (el, i) { - friends[i] = { - edPublic: i, - curvePublic: i, - displayName: i + " pizza" // Hash.createChannelId() - }; - }); // XXX - - var friendsList = UIElements.getUserGrid(null, { common: common, data: friends, From 63c5fddf3891a3c9b5f189b4d25d4cb522ccbafc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 3 Dec 2019 11:07:18 +0000 Subject: [PATCH 28/65] lint --- customize.dist/src/less2/include/avatar.less | 2 +- customize.dist/src/less2/include/usergrid.less | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/customize.dist/src/less2/include/avatar.less b/customize.dist/src/less2/include/avatar.less index 9cd14ebbc..c85c34877 100644 --- a/customize.dist/src/less2/include/avatar.less +++ b/customize.dist/src/less2/include/avatar.less @@ -38,7 +38,7 @@ } .cp-avatar-default { .tools_unselectable(); - background:@avatar-default-bg; + background: @avatar-default-bg; color: @avatar-default-fg; font-size: @avatar-font-size; font-size: var(--avatar-font-size); diff --git a/customize.dist/src/less2/include/usergrid.less b/customize.dist/src/less2/include/usergrid.less index 59fed1d56..973b1a516 100644 --- a/customize.dist/src/less2/include/usergrid.less +++ b/customize.dist/src/less2/include/usergrid.less @@ -44,7 +44,6 @@ button:last-child { margin-right: 0px !important; } - } .cp-usergrid-user { width: 70px; @@ -110,7 +109,6 @@ .cp-usergrid-user-name { color: @colortheme_alertify-primary-text; } - } } } From 3b7732ceb298cbe405b63f0112ff4fb751aa7222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 3 Dec 2019 12:01:31 +0000 Subject: [PATCH 29/65] display alert in link tab --- customize.dist/src/less2/include/alertify.less | 8 +++++++- www/common/common-ui-elements.js | 10 ++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index 9cd904c45..26cffc827 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -229,7 +229,7 @@ &[readonly] { background-color: @alertify-light-bg; color: @cryptpad_text_col; - border-color: @alertify-input-fg; + border-color: @alertify-light-bg; } } @@ -509,5 +509,11 @@ overflow-x: auto; } } + .alert { + margin:5px 0px; + font-size:12px; + padding:5px; + border-radius:0px; + } } diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index b8ae705a2..e448688f5 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1068,6 +1068,16 @@ define([ UI.createCheckbox('cp-share-embed', Messages.share_linkEmbed, false, { mark: {tabindex:1} }), h('br'), ]; + // check if the pad is password protection + var hash = hashes.editHash || hashes.viewHash; + var href = origin + pathname + '#' + hash; + var parsedHref = Hash.parsePadUrl(href); + var hasPassword = parsedHref.hashData.password; + if (hasPassword) { + linkContent.push(h('div.alert.alert-danger', [h('i.fa.fa-lock'), + ' ', 'has password'])) + }; + linkContent.push(UI.dialog.selectable('', { id: 'cp-share-link-preview', tabindex: 1 })); var link = h('div.cp-share-modal', linkContent); From a38fa71d571ab1b52ec1ec0ae32830ed722bb04e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Tue, 3 Dec 2019 14:52:46 +0000 Subject: [PATCH 30/65] use translation key for alert message --- www/common/common-ui-elements.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index e448688f5..e1f7dc445 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1075,7 +1075,7 @@ define([ var hasPassword = parsedHref.hashData.password; if (hasPassword) { linkContent.push(h('div.alert.alert-danger', [h('i.fa.fa-lock'), - ' ', 'has password'])) + ' ', Messages.share_linkPasswordAlert])) }; linkContent.push(UI.dialog.selectable('', { id: 'cp-share-link-preview', tabindex: 1 })); From ba74fc8d4fb8b5016e69b58db843c38512d25d1c Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 4 Dec 2019 10:49:51 +0100 Subject: [PATCH 31/65] Send warning to accounts when we can't update pin limit --- www/auth/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/auth/main.js b/www/auth/main.js index 878393012..68eded8fe 100644 --- a/www/auth/main.js +++ b/www/auth/main.js @@ -126,12 +126,12 @@ define([ } else if (data.cmd === 'UPDATE_LIMIT') { return void whenReady(function () { if (rpcError) { - // XXX // Tell the user on accounts that there was an issue and they need to wait maximum 24h or contact an admin + ret.warning = true; } rpc.updatePinLimits(function (e, limit, plan, note) { if (e) { - // XXX same as above + ret.warning = true; } ret.res = [limit, plan, note]; srcWindow.postMessage(JSON.stringify(ret), domain); From 187eb4afde388ea473d5115f27bc83157edb5dc4 Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 4 Dec 2019 11:13:05 +0100 Subject: [PATCH 32/65] Load only one network to get history keeper ID from cryptget --- www/auth/main.js | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/www/auth/main.js b/www/auth/main.js index 68eded8fe..1b3667377 100644 --- a/www/auth/main.js +++ b/www/auth/main.js @@ -38,6 +38,16 @@ define([ var loadProxy = function (hash) { nThen(function (waitFor) { + var wsUrl = NetConfig.getWebsocketURL(); + var w = waitFor(); + Netflux.connect(wsUrl).then(function (_network) { + network = _network; + w(); + }, function (err) { + rpcError = err; + console.error(err); + }); + }).nThen(function (waitFor) { Crypt.get(hash, waitFor(function (err, val) { if (err) { waitFor.abort(); @@ -50,19 +60,11 @@ define([ } catch (e) { console.log("Can't parse user drive", e); } - })); - }).nThen(function (waitFor) { - var wsUrl = NetConfig.getWebsocketURL(); - var w = waitFor(); - Netflux.connect(wsUrl).then(function (_network) { - network = _network; - w(); - }, function (err) { - rpcError = err; - console.error(err); - waitFor.abort(); + }), { + network: network }); }).nThen(function (waitFor) { + if (!network) { return void waitFor.abort(); } Pinpad.create(network, proxy, waitFor(function (e, call) { if (e) { rpcError = e; @@ -97,9 +99,9 @@ define([ if (data.cmd === 'PING') { ret.res = 'PONG'; } else if (data.cmd === 'LOGIN') { - Login.loginOrRegister(data.data.name, data.data.password, false, false, function (err, res) { + Login.loginOrRegister(data.data.name, data.data.password, false, false, function (err) { if (err) { - ret.error = 'LOGIN_ERROR' + ret.error = 'LOGIN_ERROR'; srcWindow.postMessage(JSON.stringify(ret), domain); return; } @@ -128,6 +130,8 @@ define([ if (rpcError) { // Tell the user on accounts that there was an issue and they need to wait maximum 24h or contact an admin ret.warning = true; + srcWindow.postMessage(JSON.stringify(ret), domain); + return; } rpc.updatePinLimits(function (e, limit, plan, note) { if (e) { From 0b0ce98fc7bcbb30acaaa8f7bd0971f9ddcb692a Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 4 Dec 2019 11:18:25 +0100 Subject: [PATCH 33/65] Kanban UI --- www/kanban/app-kanban.less | 3 ++- www/kanban/jkanban.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/www/kanban/app-kanban.less b/www/kanban/app-kanban.less index 0827e4530..76efd749c 100644 --- a/www/kanban/app-kanban.less +++ b/www/kanban/app-kanban.less @@ -54,6 +54,7 @@ .kanban-item-text { cursor: text; overflow-wrap: anywhere; + flex: 1; } } @@ -67,7 +68,7 @@ margin-right: 10px; min-width: 0; overflow: hidden; - white-space: nowrap; + //white-space: nowrap; text-overflow: ellipsis; } #kanban-edit { diff --git a/www/kanban/jkanban.js b/www/kanban/jkanban.js index 422884bc7..5ef939f1b 100644 --- a/www/kanban/jkanban.js +++ b/www/kanban/jkanban.js @@ -349,7 +349,7 @@ titleBoard = document.createElement('div'); titleBoard.classList.add('kanban-title-board'); titleBoard.innerHTML = board.title; - titleBoard.setAttribute('title', board.title); + //titleBoard.setAttribute('title', board.title); titleBoard.clickfn = board.boardTitleClick; __onboardTitleClickHandler(titleBoard); headerBoard.appendChild(titleBoard); From 1ba03dee452a5853e2f1c5c9101d32596fe1fc41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Wed, 4 Dec 2019 11:41:08 +0000 Subject: [PATCH 34/65] position and style alert --- .../src/less2/include/alertify.less | 5 ++++ www/common/common-ui-elements.js | 30 +++++++++++++------ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index 26cffc827..585627a28 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -514,6 +514,11 @@ font-size:12px; padding:5px; border-radius:0px; + &.alert-primary { + background-color: @alertify-base; + color: @alertify-fg; + border-color: @alertify-fg; + } } } diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 26791a204..76d296606 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1027,6 +1027,12 @@ define([ if (!hashes || (!hashes.editHash && !hashes.viewHash)) { return; } + // check if the pad is password protected + var hash = hashes.editHash || hashes.viewHash; + var href = origin + pathname + '#' + hash; + var parsedHref = Hash.parsePadUrl(href); + var hasPassword = parsedHref.hashData.password; + var parsed = Hash.parsePadUrl(pathname); var canPresent = ['code', 'slide'].indexOf(parsed.type) !== -1; @@ -1081,18 +1087,15 @@ define([ UI.createCheckbox('cp-share-embed', Messages.share_linkEmbed, false, { mark: {tabindex:1} }), h('br'), ]; - // check if the pad is password protection - var hash = hashes.editHash || hashes.viewHash; - var href = origin + pathname + '#' + hash; - var parsedHref = Hash.parsePadUrl(href); - var hasPassword = parsedHref.hashData.password; + + linkContent.push(UI.dialog.selectable('', { id: 'cp-share-link-preview', tabindex: 1 })); + + // Show alert if the pad is password protected if (hasPassword) { - linkContent.push(h('div.alert.alert-danger', [h('i.fa.fa-lock'), + linkContent.push(h('div.alert.alert-primary', [h('i.fa.fa-lock'), ' ', Messages.share_linkPasswordAlert])) }; - linkContent.push(UI.dialog.selectable('', { id: 'cp-share-link-preview', tabindex: 1 })); - var link = h('div.cp-share-modal', linkContent); var $link = $(link); @@ -1158,7 +1161,16 @@ define([ // XXX Don't display access rights if no contacts var contactsContent = h('div.cp-share-modal'); - $(contactsContent).append(friendsList); + var $contactsContent = $(contactsContent); + + $contactsContent.append(friendsList); + + // Show alert if the pad is password protected + if (hasPassword) { + $contactsContent.append(h('div.alert.alert-primary', [h('i.fa.fa-unlock'), + ' ', Messages.share_contactPasswordAlert])) + }; + var contactButtons = [makeCancelButton(), friendsObject.button]; From ab3945db1fc51efb9580bd6bf8d4e2c8e69b49f3 Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 4 Dec 2019 13:37:46 +0100 Subject: [PATCH 35/65] temp --- rpc.js | 56 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/rpc.js b/rpc.js index c3d44e86c..e2d092f7a 100644 --- a/rpc.js +++ b/rpc.js @@ -416,20 +416,40 @@ var getDeletedPads = function (Env, channels, cb) { const batchTotalSize = BatchRead("GET_TOTAL_SIZE"); var getTotalSize = function (Env, publicKey, cb) { - batchTotalSize(publicKey, cb, function (done) { - var bytes = 0; - return void getChannelList(Env, publicKey, function (channels) { - if (!channels) { return done('INVALID_PIN_LIST'); } // unexpected + var unescapedKey = unescapeKeyCharacters(publicKey); + var limit = Env.limits[unescapedKey]; - nThen(function (w) { - channels.forEach(function (channel) { // TODO semaphore? - getFileSize(Env, channel, w(function (e, size) { - if (!e) { bytes += size; } + batchTotalSize(publicKey, cb, function (done) { + var channels = []; + var bytes = 0; + nThen(function (waitFor) { + // Get the channels list for our users + getChannelList(Env, publicKey, waitFor(function (_channels) { + if (!_channels) { return done('INVALID_PIN_LIST'); } + Array.prototype.push.apply(channels, _channels); + })); + // Get the channels list for users sharing our quota + if (limit && Array.isArray(limit.users) && limit.users.length > 1) { + limit.users.forEach(function (key) { + if (key === unescapedKey) { return; } // Don't count ourselves twice + getChannelList(Env, key, waitFor(function (_channels) { + if (!_channels) { return; } // Broken user, don't count their quota + Array.prototype.push.apply(channels, _channels); })); }); - }).nThen(function () { - done(void 0, bytes); + } + }).nThen(function (waitFor) { + // Get size of the channels (without duplicate) + var list = []; + channels.forEach(function (channel) { // TODO semaphore? + if (list.indexOf(channel) !== -1) { return; } + list.push(channel); + getFileSize(Env, channel, waitFor(function (e, size) { + if (!e) { bytes += size; } + })); }); + }).nThen(function () { + done(void 0, bytes); }); }); }; @@ -552,7 +572,21 @@ var updateLimits = function (Env, config, publicKey, cb /*:(?string, ?any[])=>vo cb(e); }); - req.end(body); + var str = '{"URKfpoOMxeSD2v144vfFIrhwR4cfhqn5l+hPPIqtY8U=":{"limit":16106127360,"note":"","plan":"global","users":["URKfpoOMxeSD2v144vfFIrhwR4cfhqn5l+hPPIqtY8U=","45b3UTJpt9CVcOjix7ra8BDEnhLn3YHg+4PadLBHweo="]},"45b3UTJpt9CVcOjix7ra8BDEnhLn3YHg+4PadLBHweo=":{"limit":16106127360,"note":"","plan":"global","users":["URKfpoOMxeSD2v144vfFIrhwR4cfhqn5l+hPPIqtY8U=","45b3UTJpt9CVcOjix7ra8BDEnhLn3YHg+4PadLBHweo="]}}'; + var json = JSON.parse(str); + Env.limits = json; + applyCustomLimits(Env, config); + var l; + if (userId) { + var limit = Env.limits[userId]; + l = limit && typeof limit.limit === "number" ? + [limit.limit, limit.plan, limit.note] : [defaultLimit, '', '']; + } + setTimeout(function () { + cb(void 0, l); + }); + + //req.end(body); }; var getLimit = function (Env, publicKey, cb) { From ee35c1d1515a6c2355d5594b542370e63a8d007e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Wed, 4 Dec 2019 12:46:56 +0000 Subject: [PATCH 36/65] display share link in textarea --- customize.dist/src/less2/include/alertify.less | 7 +++++++ www/common/common-interface.js | 12 ++++++++++++ www/common/common-ui-elements.js | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index 585627a28..354b29174 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -233,6 +233,13 @@ } } + textarea { + overflow: hidden; + &[readonly] { + resize: none; + } + } + span.cp-password-container { display: flex; align-items: center; diff --git a/www/common/common-interface.js b/www/common/common-interface.js index 8efc7397a..8dc14cc8c 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -127,6 +127,18 @@ define([ return input; }; + dialog.selectableArea = function (value, opt) { + var attrs = merge({ + readonly: 'readonly', + }, opt); + + var input = h('textarea', attrs); + $(input).val(value).click(function () { + input.select(); + }); + return input; + }; + dialog.okButton = function (content, classString) { var sel = typeof(classString) === 'string'? 'button.ok.' + classString:'button.ok.primary'; return h(sel, { tabindex: '2', }, content || Messages.okButton); diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 76d296606..fd64571ab 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1088,7 +1088,7 @@ define([ h('br'), ]; - linkContent.push(UI.dialog.selectable('', { id: 'cp-share-link-preview', tabindex: 1 })); + linkContent.push(UI.dialog.selectableArea('', { id: 'cp-share-link-preview', tabindex: 1, rows:3})); // Show alert if the pad is password protected if (hasPassword) { From cf298ccd89cf7818fdbd39d033d6b0b474442b87 Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 4 Dec 2019 17:05:10 +0100 Subject: [PATCH 37/65] Remove dev code and improve performances --- rpc.js | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/rpc.js b/rpc.js index e2d092f7a..e09ef7b17 100644 --- a/rpc.js +++ b/rpc.js @@ -419,13 +419,19 @@ var getTotalSize = function (Env, publicKey, cb) { var unescapedKey = unescapeKeyCharacters(publicKey); var limit = Env.limits[unescapedKey]; - batchTotalSize(publicKey, cb, function (done) { + // Get a common key if multiple users share the same quota, otherwise take the public key + var batchKey = (limit && Array.isArray(limit.users)) ? limit.users.join('') : publicKey; + + batchTotalSize(batchKey, cb, function (done) { var channels = []; var bytes = 0; nThen(function (waitFor) { - // Get the channels list for our users + // Get the channels list for our user account getChannelList(Env, publicKey, waitFor(function (_channels) { - if (!_channels) { return done('INVALID_PIN_LIST'); } + if (!_channels) { + waitFor.abort(); + return done('INVALID_PIN_LIST'); + } Array.prototype.push.apply(channels, _channels); })); // Get the channels list for users sharing our quota @@ -439,8 +445,8 @@ var getTotalSize = function (Env, publicKey, cb) { }); } }).nThen(function (waitFor) { - // Get size of the channels (without duplicate) - var list = []; + // Get size of the channels + var list = []; // Contains the channels already counted in the quota to avoid duplicates channels.forEach(function (channel) { // TODO semaphore? if (list.indexOf(channel) !== -1) { return; } list.push(channel); @@ -572,21 +578,7 @@ var updateLimits = function (Env, config, publicKey, cb /*:(?string, ?any[])=>vo cb(e); }); - var str = '{"URKfpoOMxeSD2v144vfFIrhwR4cfhqn5l+hPPIqtY8U=":{"limit":16106127360,"note":"","plan":"global","users":["URKfpoOMxeSD2v144vfFIrhwR4cfhqn5l+hPPIqtY8U=","45b3UTJpt9CVcOjix7ra8BDEnhLn3YHg+4PadLBHweo="]},"45b3UTJpt9CVcOjix7ra8BDEnhLn3YHg+4PadLBHweo=":{"limit":16106127360,"note":"","plan":"global","users":["URKfpoOMxeSD2v144vfFIrhwR4cfhqn5l+hPPIqtY8U=","45b3UTJpt9CVcOjix7ra8BDEnhLn3YHg+4PadLBHweo="]}}'; - var json = JSON.parse(str); - Env.limits = json; - applyCustomLimits(Env, config); - var l; - if (userId) { - var limit = Env.limits[userId]; - l = limit && typeof limit.limit === "number" ? - [limit.limit, limit.plan, limit.note] : [defaultLimit, '', '']; - } - setTimeout(function () { - cb(void 0, l); - }); - - //req.end(body); + req.end(body); }; var getLimit = function (Env, publicKey, cb) { From 195de903e32001be02c04864059ac16de0230f22 Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 4 Dec 2019 17:15:45 +0100 Subject: [PATCH 38/65] mkAsync getFileSize and getChannelList --- rpc.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rpc.js b/rpc.js index e09ef7b17..8c7fe6c70 100644 --- a/rpc.js +++ b/rpc.js @@ -228,13 +228,15 @@ var truthyKeys = function (O) { }); }; -var getChannelList = function (Env, publicKey, cb) { +var getChannelList = function (Env, publicKey, _cb) { + var cb = Util.once(Util.mkAsync(_cb)); loadUserPins(Env, publicKey, function (pins) { cb(truthyKeys(pins)); }); }; -var getFileSize = function (Env, channel, cb) { +var getFileSize = function (Env, channel, _cb) { + var cb = Util.once(Util.mkAsync(_cb)); if (!isValidId(channel)) { return void cb('INVALID_CHAN'); } if (channel.length === 32) { if (typeof(Env.msgStore.getChannelSize) !== 'function') { From f3d7a97c23094bc9b24a5d205cdd981666a655bf Mon Sep 17 00:00:00 2001 From: yflory Date: Wed, 4 Dec 2019 17:34:28 +0100 Subject: [PATCH 39/65] Fix contacts app --- www/common/messenger-ui.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/messenger-ui.js b/www/common/messenger-ui.js index 4cbeaf56e..1979bae66 100644 --- a/www/common/messenger-ui.js +++ b/www/common/messenger-ui.js @@ -43,7 +43,7 @@ define([ MessengerUI.create = function ($container, common, toolbar) { var metadataMgr = common.getMetadataMgr(); var origin = metadataMgr.getPrivateData().origin; - var readOnly = metadataMgr.getPrivateData().readOnly || toolbar.readOnly; + var readOnly = metadataMgr.getPrivateData().readOnly || (toolbar && toolbar.readOnly); var isApp = typeof(toolbar) !== "undefined"; From 1d2f40e6cc1daa0f12a6febf712cd1830c643a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 10:10:48 +0000 Subject: [PATCH 40/65] try to add link to password FAQ --- www/common/common-ui-elements.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index fd64571ab..7b3603ccc 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1033,6 +1033,12 @@ define([ var parsedHref = Hash.parsePadUrl(href); var hasPassword = parsedHref.hashData.password; + var faqLink = h('a', {href: '#'}, Messages.passwordFaqLink); + $(faqLink).click(function () { + console.log(config.origin + "/faq.html#security-pad_password"); + common.openURL(config.origin + "/faq.html#security-pad_password"); + }); + var parsed = Hash.parsePadUrl(pathname); var canPresent = ['code', 'slide'].indexOf(parsed.type) !== -1; @@ -1192,6 +1198,17 @@ define([ h('br'), UI.dialog.selectable(getEmbedValue(), { id: 'cp-embed-link-preview', tabindex: 1 }) ]; + + // Show alert if the pad is password protected + // + if (hasPassword) { + embedContent.push(h('div.alert.alert-primary', [ + h('i.fa.fa-lock'), ' ', + Messages.share_embedPasswordAlert, ' ', + faqLink + ])) + }; + var embedButtons = [ makeCancelButton(), { className: 'primary', From f3b1761d0d116f13687222223bd0f9e6eadfa607 Mon Sep 17 00:00:00 2001 From: yflory Date: Thu, 5 Dec 2019 11:33:43 +0100 Subject: [PATCH 41/65] Enable openURL and gotoURL in the share iframe --- www/common/sframe-common-outer.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index e439d04c1..e0571bb16 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -488,6 +488,20 @@ define([ Cryptpad.storeInTeam(data, cb); }); + sframeChan.on('EV_GOTO_URL', function (url) { + if (url) { + window.location.href = url; + } else { + window.location.reload(); + } + }); + + sframeChan.on('EV_OPEN_URL', function (url) { + if (url) { + window.open(url); + } + }); + }; addCommonRpc(sframeChan); @@ -956,20 +970,6 @@ define([ }); }); - sframeChan.on('EV_GOTO_URL', function (url) { - if (url) { - window.location.href = url; - } else { - window.location.reload(); - } - }); - - sframeChan.on('EV_OPEN_URL', function (url) { - if (url) { - window.open(url); - } - }); - sframeChan.on('Q_PIN_GET_USAGE', function (teamId, cb) { Cryptpad.isOverPinLimit(teamId, function (err, overLimit, data) { cb({ From 951a59f3ea2a5848e1840214df6596bb4c3b1827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 10:55:52 +0000 Subject: [PATCH 42/65] add password FAQ links to share modal tabs --- www/common/common-ui-elements.js | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 7b3603ccc..70aceaf89 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1033,11 +1033,14 @@ define([ var parsedHref = Hash.parsePadUrl(href); var hasPassword = parsedHref.hashData.password; - var faqLink = h('a', {href: '#'}, Messages.passwordFaqLink); - $(faqLink).click(function () { - console.log(config.origin + "/faq.html#security-pad_password"); - common.openURL(config.origin + "/faq.html#security-pad_password"); - }); + var makeFaqLink = function () { + var link = h('a', {href: '#'}, Messages.passwordFaqLink); + $(link).click(function () { + common.openURL(config.origin + "/faq.html#security-pad_password"); + }); + return link; + }; + var parsed = Hash.parsePadUrl(pathname); var canPresent = ['code', 'slide'].indexOf(parsed.type) !== -1; @@ -1098,8 +1101,11 @@ define([ // Show alert if the pad is password protected if (hasPassword) { - linkContent.push(h('div.alert.alert-primary', [h('i.fa.fa-lock'), - ' ', Messages.share_linkPasswordAlert])) + linkContent.push(h('div.alert.alert-primary', [ + h('i.fa.fa-lock'), ' ', + Messages.share_linkPasswordAlert, ' ', + makeFaqLink() + ])) }; var link = h('div.cp-share-modal', linkContent); @@ -1173,8 +1179,11 @@ define([ // Show alert if the pad is password protected if (hasPassword) { - $contactsContent.append(h('div.alert.alert-primary', [h('i.fa.fa-unlock'), - ' ', Messages.share_contactPasswordAlert])) + $contactsContent.append(h('div.alert.alert-primary', [ + h('i.fa.fa-lock'), ' ', + Messages.share_contactPasswordAlert, ' ', + makeFaqLink() + ])) }; @@ -1200,12 +1209,11 @@ define([ ]; // Show alert if the pad is password protected - // if (hasPassword) { embedContent.push(h('div.alert.alert-primary', [ h('i.fa.fa-lock'), ' ', Messages.share_embedPasswordAlert, ' ', - faqLink + makeFaqLink() ])) }; From e138dc8c6a40028423ab6a127306e157c6534f9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 10:58:54 +0000 Subject: [PATCH 43/65] display embed code in textarea --- customize.dist/src/less2/include/alertify.less | 1 + www/common/common-ui-elements.js | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index 354b29174..b3c32aec7 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -235,6 +235,7 @@ textarea { overflow: hidden; + padding: 8px; &[readonly] { resize: none; } diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 70aceaf89..64104ab6d 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1204,8 +1204,7 @@ define([ }; var embedContent = [ h('p', Messages.viewEmbedTag), - h('br'), - UI.dialog.selectable(getEmbedValue(), { id: 'cp-embed-link-preview', tabindex: 1 }) + UI.dialog.selectableArea(getEmbedValue(), { id: 'cp-embed-link-preview', tabindex: 1, rows: 3}) ]; // Show alert if the pad is password protected From 5d599887cff7833946a71debaaff11c0c565ab3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 11:01:29 +0000 Subject: [PATCH 44/65] style links in bootsstrap alerts --- customize.dist/src/less2/include/alertify.less | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index b3c32aec7..138b9930b 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -526,7 +526,12 @@ background-color: @alertify-base; color: @alertify-fg; border-color: @alertify-fg; + a { + color: @alertify-fg; + text-decoration: underline; + } } + } } From 22873fe1f7f3a774d6f4bc488e37bd2e228b6dfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 11:16:12 +0000 Subject: [PATCH 45/65] adjustments to FAQ password links --- www/common/common-ui-elements.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 64104ab6d..1ac27403f 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1034,7 +1034,7 @@ define([ var hasPassword = parsedHref.hashData.password; var makeFaqLink = function () { - var link = h('a', {href: '#'}, Messages.passwordFaqLink); + var link = h('a', {href: '#'}, [h('i.fa.fa-question-circle'), ' ', Messages.passwordFaqLink]); $(link).click(function () { common.openURL(config.origin + "/faq.html#security-pad_password"); }); @@ -1103,7 +1103,7 @@ define([ if (hasPassword) { linkContent.push(h('div.alert.alert-primary', [ h('i.fa.fa-lock'), ' ', - Messages.share_linkPasswordAlert, ' ', + Messages.share_linkPasswordAlert, h('br'), makeFaqLink() ])) }; @@ -1180,8 +1180,8 @@ define([ // Show alert if the pad is password protected if (hasPassword) { $contactsContent.append(h('div.alert.alert-primary', [ - h('i.fa.fa-lock'), ' ', - Messages.share_contactPasswordAlert, ' ', + h('i.fa.fa-unlock'), ' ', + Messages.share_contactPasswordAlert, h('br'), makeFaqLink() ])) }; @@ -1211,7 +1211,7 @@ define([ if (hasPassword) { embedContent.push(h('div.alert.alert-primary', [ h('i.fa.fa-lock'), ' ', - Messages.share_embedPasswordAlert, ' ', + Messages.share_embedPasswordAlert, h('br'), makeFaqLink() ])) }; From 708ad7a10d1b92d9dfd43ef2b8249c53022f4d1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 11:19:46 +0000 Subject: [PATCH 46/65] linting --- customize.dist/src/less2/include/alertify.less | 9 ++++----- www/common/common-ui-elements.js | 12 ++++++------ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index 138b9930b..de15c05bd 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -518,10 +518,10 @@ } } .alert { - margin:5px 0px; - font-size:12px; - padding:5px; - border-radius:0px; + margin: 5px 0px; + font-size: 12px; + padding: 5px; + border-radius: 0px; &.alert-primary { background-color: @alertify-base; color: @alertify-fg; @@ -531,7 +531,6 @@ text-decoration: underline; } } - } } diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 1ac27403f..922ec61fd 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1105,8 +1105,8 @@ define([ h('i.fa.fa-lock'), ' ', Messages.share_linkPasswordAlert, h('br'), makeFaqLink() - ])) - }; + ])); + } var link = h('div.cp-share-modal', linkContent); var $link = $(link); @@ -1183,8 +1183,8 @@ define([ h('i.fa.fa-unlock'), ' ', Messages.share_contactPasswordAlert, h('br'), makeFaqLink() - ])) - }; + ])); + } var contactButtons = [makeCancelButton(), @@ -1213,8 +1213,8 @@ define([ h('i.fa.fa-lock'), ' ', Messages.share_embedPasswordAlert, h('br'), makeFaqLink() - ])) - }; + ])); + } var embedButtons = [ makeCancelButton(), { From 0be5b90495ba23dcf276995185f1ea9027ecf5ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 11:28:46 +0000 Subject: [PATCH 47/65] avoid underlined space at start of FAQ link --- www/common/common-ui-elements.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 922ec61fd..d5ac033a9 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1034,7 +1034,10 @@ define([ var hasPassword = parsedHref.hashData.password; var makeFaqLink = function () { - var link = h('a', {href: '#'}, [h('i.fa.fa-question-circle'), ' ', Messages.passwordFaqLink]); + var link = h('span', [ + h('i.fa.fa-question-circle'), ' ', + h('a', {href: '#'}, Messages.passwordFaqLink) + ]); $(link).click(function () { common.openURL(config.origin + "/faq.html#security-pad_password"); }); From 9ec2dd8e70e58f1f0868ba6f9a7bce72c868390d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 11:46:34 +0000 Subject: [PATCH 48/65] remove grey bg on password reveal eye btn --- customize.dist/src/less2/include/password-input.less | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/customize.dist/src/less2/include/password-input.less b/customize.dist/src/less2/include/password-input.less index 79824bac7..0f476390a 100644 --- a/customize.dist/src/less2/include/password-input.less +++ b/customize.dist/src/less2/include/password-input.less @@ -1,3 +1,4 @@ +@import (reference) "./colortheme-all.less"; .password_main() { --LessLoader_require: LessLoader_currentFile(); } @@ -17,7 +18,7 @@ justify-content: center; cursor: pointer; &:hover { - background-color: rgba(0,0,0,0.1); + color: darken(@colortheme_alertify-primary, 10%); } } } From 78488d00bf3ba3b702f3c9e322ccfe7b2684196f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 14:52:04 +0000 Subject: [PATCH 49/65] adjust spacing --- customize.dist/src/less2/include/alertify.less | 14 ++++++++++++-- .../src/less2/include/modals-ui-elements.less | 3 ++- customize.dist/src/less2/include/usergrid.less | 1 + www/common/common-ui-elements.js | 1 - 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index de15c05bd..07b8cb491 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -222,7 +222,7 @@ background-color: @alertify-input-fg; color: @cryptpad_text_col; border: 1px solid @alertify-input-bg; - margin-bottom: 15px; + margin: @alertify_padding-base 0px; width: 100%; font-size: 100%; padding: @alertify_padding-base; @@ -365,6 +365,7 @@ nav { padding: @alertify_padding-base; + padding-top: 0px; text-align: right; button { margin: 0px !important; @@ -518,7 +519,7 @@ } } .alert { - margin: 5px 0px; + margin: 0px 0px @alertify_padding-base 0px; font-size: 12px; padding: 5px; border-radius: 0px; @@ -531,6 +532,15 @@ text-decoration: underline; } } + &.dismissable { + display: flex; + align-items: center; + span.fa-times { + font-size: @colortheme_app-font-size; + margin-left: 20px; + cursor: pointer; + } + } } } diff --git a/customize.dist/src/less2/include/modals-ui-elements.less b/customize.dist/src/less2/include/modals-ui-elements.less index 6e3921781..28bd63278 100644 --- a/customize.dist/src/less2/include/modals-ui-elements.less +++ b/customize.dist/src/less2/include/modals-ui-elements.less @@ -1,5 +1,5 @@ @import (reference) "./colortheme-all.less"; - +@import (reference) "./variables.less"; .modals-ui-elements_main() { --LessLoader_require: LessLoader_currentFile(); } @@ -7,6 +7,7 @@ // Share modal .msg.cp-inline-radio-group { overflow: unset !important; + padding: 0px @variables_padding; .radio-group { display: flex; flex-direction: row; diff --git a/customize.dist/src/less2/include/usergrid.less b/customize.dist/src/less2/include/usergrid.less index 973b1a516..f4e72591e 100644 --- a/customize.dist/src/less2/include/usergrid.less +++ b/customize.dist/src/less2/include/usergrid.less @@ -28,6 +28,7 @@ input { flex: 1; min-width: 0; + margin-top: 0 !important; margin-bottom: 0 !important; height: 38px; margin: 6px 0px; diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index d5ac033a9..2b6ad9717 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1097,7 +1097,6 @@ define([ h('br'), ] : [ UI.createCheckbox('cp-share-embed', Messages.share_linkEmbed, false, { mark: {tabindex:1} }), - h('br'), ]; linkContent.push(UI.dialog.selectableArea('', { id: 'cp-share-link-preview', tabindex: 1, rows:3})); From bee6aa42bf74f544a2a37fc047961413be761718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 14:57:18 +0000 Subject: [PATCH 50/65] add inline alert in link tab --- www/common/common-ui-elements.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 2b6ad9717..71bca3a0c 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1110,6 +1110,12 @@ define([ ])); } + // Show alert if user has not dismissed it in the past + linkContent.push(h('div.alert.alert-danger.dismissable', [ + h('span.cp-inline-alert-text', Messages.share_linkWarning), + h('span.fa.fa-times') + ])); + var link = h('div.cp-share-modal', linkContent); var $link = $(link); From 0e4b7623ff4bee99c0b941f29307ee6634d838be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Thu, 5 Dec 2019 15:52:16 +0000 Subject: [PATCH 51/65] adjust spacing - fixed spacing to work also in properties modal --- customize.dist/src/less2/include/alertify.less | 5 ++++- customize.dist/src/less2/include/modals-ui-elements.less | 3 +++ www/common/common-ui-elements.js | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index 07b8cb491..6692955e7 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -159,6 +159,9 @@ margin-bottom: @alertify_padding-base; margin: 0; overflow: auto; + label{ + margin-bottom: 0px; + } } .alertify-tabs { max-height: 100%; @@ -222,7 +225,7 @@ background-color: @alertify-input-fg; color: @cryptpad_text_col; border: 1px solid @alertify-input-bg; - margin: @alertify_padding-base 0px; + margin-bottom: @alertify_padding-base; width: 100%; font-size: 100%; padding: @alertify_padding-base; diff --git a/customize.dist/src/less2/include/modals-ui-elements.less b/customize.dist/src/less2/include/modals-ui-elements.less index 28bd63278..1d91767ba 100644 --- a/customize.dist/src/less2/include/modals-ui-elements.less +++ b/customize.dist/src/less2/include/modals-ui-elements.less @@ -4,6 +4,9 @@ --LessLoader_require: LessLoader_currentFile(); } & { + .cp-spacer{ + height: @variables_padding; + } // Share modal .msg.cp-inline-radio-group { overflow: unset !important; diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 71bca3a0c..fa7ae38ea 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1098,7 +1098,7 @@ define([ ] : [ UI.createCheckbox('cp-share-embed', Messages.share_linkEmbed, false, { mark: {tabindex:1} }), ]; - + linkContent.push(h('div.cp-spacer')) linkContent.push(UI.dialog.selectableArea('', { id: 'cp-share-link-preview', tabindex: 1, rows:3})); // Show alert if the pad is password protected From 1da662687f6deaa8f39c53a3107b610dc9271279 Mon Sep 17 00:00:00 2001 From: ansuz Date: Thu, 5 Dec 2019 13:35:26 -0500 Subject: [PATCH 52/65] guarantee asynchronous execution for batch reads and write queues --- lib/batch-read.js | 11 +++++++---- lib/write-queue.js | 10 ++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/batch-read.js b/lib/batch-read.js index 3e729e66d..2852a0579 100644 --- a/lib/batch-read.js +++ b/lib/batch-read.js @@ -8,6 +8,8 @@ If the result of IO or computation is requested while an identical request is already in progress, wait until the first one completes and provide its result to every routine that requested it. +Asynchrony is guaranteed. + ## Usage Provide: @@ -51,11 +53,12 @@ module.exports = function (/* task */) { var args = Array.prototype.slice.call(arguments); //if (map[id] && map[id].length > 1) { console.log("BATCH-READ DID ITS JOB for [%s][%s]", task, id); } - - map[id].forEach(function (h) { - h.apply(null, args); + setTimeout(function () { + map[id].forEach(function (h) { + h.apply(null, args); + }); + delete map[id]; }); - delete map[id]; }); }; }; diff --git a/lib/write-queue.js b/lib/write-queue.js index c1b64ebaf..c82b12b3b 100644 --- a/lib/write-queue.js +++ b/lib/write-queue.js @@ -4,7 +4,7 @@ q(id, function (next) { // whatever you need to do.... // when you're done - next(); + next(); // guaranteed to be asynchronous :D }); */ @@ -16,9 +16,11 @@ module.exports = function () { var map = {}; var next = function (id) { - if (map[id] && map[id].length === 0) { return void delete map[id]; } - var task = map[id].shift(); - task(fix1(next, id)); + setTimeout(function () { + if (map[id] && map[id].length === 0) { return void delete map[id]; } + var task = map[id].shift(); + task(fix1(next, id)); + }); }; return function (id, task) { From 62c50d9e236dd9f61c97e02774fc7e1bad4c30f0 Mon Sep 17 00:00:00 2001 From: ansuz Date: Thu, 5 Dec 2019 17:41:54 -0500 Subject: [PATCH 53/65] avoid redrawing mermaid graphs which have not changed --- www/common/diffMarked.js | 60 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/www/common/diffMarked.js b/www/common/diffMarked.js index 5817e5ac9..0f92897bc 100644 --- a/www/common/diffMarked.js +++ b/www/common/diffMarked.js @@ -197,7 +197,6 @@ define([ 'APPLET', 'VIDEO', // privacy implications of videos are the same as images 'AUDIO', // same with audio - 'SVG' ]; var unsafeTag = function (info) { /*if (info.node && $(info.node).parents('media-tag').length) { @@ -307,8 +306,39 @@ define([ var Dom = domFromHTML($('
').append($div).html()); $content[0].normalize(); - $content.find('pre.mermaid[data-processed="true"]').remove(); + + var mermaid_source = []; + var mermaid_cache = {}; + + // iterate over the unrendered mermaid inputs, caching their source as you go + $(newDomFixed).find('pre.mermaid').each(function (index, el) { + if (el.childNodes.length === 1 && el.childNodes[0].nodeType === 3) { + var src = el.childNodes[0].wholeText; + el.setAttribute('mermaid-source', src); + mermaid_source[index] = src; + } + }); + + // iterate over rendered mermaid charts + $content.find('pre.mermaid:not([processed="true"])').each(function (index, el) { + // retrieve the attached source code which it was drawn + var src = el.getAttribute('mermaid-source'); + + // check if that source exists in the set of charts which are about to be rendered + if (mermaid_source.indexOf(src) === -1) { + // if it's not, then you can remove it + if (el.parentNode && el.parentNode.children.length) { + el.parentNode.removeChild(el); + } + } else if (el.childNodes.length === 1 && el.childNodes[0].nodeType !== 3) { + // otherwise, confirm that the content of the rendered chart is not a text node + // and keep a copy of it + mermaid_cache[src] = el.childNodes[0]; + } + }); + var oldDom = domFromHTML($content[0].outerHTML); + var patch = makeDiff(oldDom, Dom, id); if (typeof(patch) === 'string') { throw new Error(patch); @@ -348,8 +378,32 @@ define([ var target = document.getElementById($a.attr('data-href')); if (target) { target.scrollIntoView(); } }); + + // loop over mermaid elements in the rendered content + $content.find('pre.mermaid').each(function (index, el) { + // since you've simply drawn the content that was supplied via markdown + // you can assume that the index of your rendered charts matches that + // of those in the markdown source. + var src = mermaid_source[index]; + el.setAttribute('mermaid-source', src); + var cached = mermaid_cache[src]; + + // check if you had cached a pre-rendered instance of the supplied source + if (typeof(cached) !== 'object') { return; } + + // if there's a cached rendering, empty out the contained source code + // which would otherwise be drawn again. + // apparently this is the fastest way to empty out an element + while (el.firstChild) { el.removeChild(el.firstChild); } //el.innerHTML = ''; + // insert the cached graph + el.appendChild(cached); + // and set a flag indicating that this graph need not be reprocessed + el.setAttribute('data-processed', true); + }); + try { - Mermaid.init(); + // finally, draw any graphs which have changed and were thus not cached + Mermaid.init(undefined, $content.find('pre.mermaid:not([data-processed="true"])')); } catch (e) { console.error(e); } } }; From daf6482ace1ed6dcac791d42ae802f612afc1804 Mon Sep 17 00:00:00 2001 From: ansuz Date: Thu, 5 Dec 2019 17:42:13 -0500 Subject: [PATCH 54/65] throttle markdown rendering in the code app --- www/code/inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/code/inner.js b/www/code/inner.js index 7c5e64c4f..e2ed086de 100644 --- a/www/code/inner.js +++ b/www/code/inner.js @@ -131,7 +131,7 @@ define([ if (['markdown', 'gfm'].indexOf(CodeMirror.highlightMode) === -1) { return; } if (!$previewButton.is('.cp-toolbar-button-active')) { return; } forceDrawPreview(); - }, 150); + }, 400); var previewTo; $previewButton.click(function () { From edd2274262490c3da253c4b0226c2541c1774873 Mon Sep 17 00:00:00 2001 From: ansuz Date: Thu, 5 Dec 2019 17:42:37 -0500 Subject: [PATCH 55/65] add a few default styles for gantt charts --- www/code/mermaid.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/www/code/mermaid.css b/www/code/mermaid.css index 769933f0a..0802db0e0 100644 --- a/www/code/mermaid.css +++ b/www/code/mermaid.css @@ -121,6 +121,11 @@ text.actor { font-size: 11px; text-height: 14px; } +.sectionTitle, .titleText { + font-weight: bold; + text-decoration: underline; +} + /* Grid and axis */ .grid .tick { stroke: lightgrey; From 3f77a800cfb1c8e4bfb3d25757ac150c9c024ae7 Mon Sep 17 00:00:00 2001 From: ansuz Date: Fri, 6 Dec 2019 09:14:33 -0500 Subject: [PATCH 56/65] revert addition of underlines to some mermaid titles --- www/code/mermaid.css | 1 - 1 file changed, 1 deletion(-) diff --git a/www/code/mermaid.css b/www/code/mermaid.css index 0802db0e0..60c366bb6 100644 --- a/www/code/mermaid.css +++ b/www/code/mermaid.css @@ -123,7 +123,6 @@ text.actor { } .sectionTitle, .titleText { font-weight: bold; - text-decoration: underline; } /* Grid and axis */ From 72a855aa6abe3ba003ca76eac7572253a7a8bc44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Fri, 6 Dec 2019 15:35:10 +0000 Subject: [PATCH 57/65] change link alert to warning --- www/common/common-ui-elements.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index fa7ae38ea..6fe865647 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1110,10 +1110,9 @@ define([ ])); } - // Show alert if user has not dismissed it in the past - linkContent.push(h('div.alert.alert-danger.dismissable', [ + linkContent.push(h('div.alert.alert-warning.dismissable', [ h('span.cp-inline-alert-text', Messages.share_linkWarning), - h('span.fa.fa-times') + h('span.fa.fa-times') // XXX dismiss message and remember ])); var link = h('div.cp-share-modal', linkContent); From 713d67439f00211bad67f37643b91c12079b263a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Fri, 6 Dec 2019 16:52:53 +0000 Subject: [PATCH 58/65] review --- .../src/less2/include/alertify.less | 6 ++-- .../src/less2/include/usergrid.less | 13 ++++----- www/common/common-ui-elements.js | 28 ++++--------------- 3 files changed, 13 insertions(+), 34 deletions(-) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index 6692955e7..b1143ff38 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -159,8 +159,8 @@ margin-bottom: @alertify_padding-base; margin: 0; overflow: auto; - label{ - margin-bottom: 0px; + :last-child{ + margin-bottom: 0; } } .alertify-tabs { @@ -368,7 +368,6 @@ nav { padding: @alertify_padding-base; - padding-top: 0px; text-align: right; button { margin: 0px !important; @@ -521,6 +520,7 @@ overflow-x: auto; } } + // Bootstrap Alerts .alert { margin: 0px 0px @alertify_padding-base 0px; font-size: 12px; diff --git a/customize.dist/src/less2/include/usergrid.less b/customize.dist/src/less2/include/usergrid.less index f4e72591e..37c406d52 100644 --- a/customize.dist/src/less2/include/usergrid.less +++ b/customize.dist/src/less2/include/usergrid.less @@ -6,7 +6,9 @@ --LessLoader_require: LessLoader_currentFile(); }; & { + .cp-usergrid-container { + margin-bottom: 12px; // XXX add margin at bottom of user grids .cp-usergrid-grid { display: flex; flex-wrap: wrap; @@ -28,10 +30,9 @@ input { flex: 1; min-width: 0; - margin-top: 0 !important; + margin: 0; margin-bottom: 0 !important; height: 38px; - margin: 6px 0px; &::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */ color: @cryptpad_color_grey; opacity: 1; /* Firefox */ @@ -54,6 +55,7 @@ justify-content: center; align-items: center; padding: 5px; + margin: 3px; cursor: default; transition: order 0.5s, background-color 0.5s; margin-top: 1px; @@ -72,11 +74,6 @@ .cp-usergrid-user-avatar { min-height: 40px; } - &:not(.large) { - .cp-usergrid-user-name { - display: none; - } - } .cp-usergrid-user-name { overflow: hidden; @@ -89,7 +86,7 @@ } &:not(.large) { - .avatar_main(60px); + .avatar_main(40px); } &.large { .avatar_main(25px); diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 6fe865647..ccc837766 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -795,8 +795,6 @@ define([ var noOthers = icons.length === 0 ? '.cp-usergrid-empty' : ''; - var buttonSelect = h('button', Messages.share_selectAll); - var buttonDeselect = h('button', Messages.share_deselectAll); var inputFilter = h('input', { placeholder: Messages.share_filterFriend }); @@ -817,23 +815,8 @@ define([ $div.find('.cp-usergrid-user:not(.cp-selected):not([data-name*="'+name+'"])').hide(); } }; - $(inputFilter).on('keydown keyup change', redraw); - $(buttonSelect).click(function () { - $div.find('.cp-usergrid-user:not(.cp-selected):visible').addClass('cp-selected'); - onSelect(); - }); - $(buttonDeselect).click(function () { - $div.find('.cp-usergrid-user.cp-selected').removeClass('cp-selected').each(function (i, el) { - var order = $(el).attr('data-order'); - if (!order) { return; } - $(el).attr('style', 'order:'+order); - }); - redraw(); - onSelect(); - }); - $(div).append(h('div.cp-usergrid-grid', icons)); if (!config.noSelect) { $div.on('click', '.cp-usergrid-user', function () { @@ -1035,7 +1018,7 @@ define([ var makeFaqLink = function () { var link = h('span', [ - h('i.fa.fa-question-circle'), ' ', + h('i.fa.fa-question-circle'), ' ', // XXX remove and make it a margin h('a', {href: '#'}, Messages.passwordFaqLink) ]); $(link).click(function () { @@ -1098,13 +1081,13 @@ define([ ] : [ UI.createCheckbox('cp-share-embed', Messages.share_linkEmbed, false, { mark: {tabindex:1} }), ]; - linkContent.push(h('div.cp-spacer')) + linkContent.push(h('div.cp-spacer')); linkContent.push(UI.dialog.selectableArea('', { id: 'cp-share-link-preview', tabindex: 1, rows:3})); // Show alert if the pad is password protected if (hasPassword) { linkContent.push(h('div.alert.alert-primary', [ - h('i.fa.fa-lock'), ' ', + h('i.fa.fa-lock'), ' ', // XXX remove and make it a margin Messages.share_linkPasswordAlert, h('br'), makeFaqLink() ])); @@ -1187,7 +1170,7 @@ define([ // Show alert if the pad is password protected if (hasPassword) { $contactsContent.append(h('div.alert.alert-primary', [ - h('i.fa.fa-unlock'), ' ', + h('i.fa.fa-unlock'), ' ', // XXX remove and make it a margin Messages.share_contactPasswordAlert, h('br'), makeFaqLink() ])); @@ -1317,6 +1300,7 @@ define([ return modal; }; + // XXX add password messages to file share UIElements.createFileShareModal = function (config) { var origin = config.origin; var pathname = config.pathname; @@ -1387,10 +1371,8 @@ define([ // Embed tab var embed = h('div.cp-share-modal', [ h('p', Messages.fileEmbedScript), - h('br'), UI.dialog.selectable(common.getMediatagScript()), h('p', Messages.fileEmbedTag), - h('br'), UI.dialog.selectable(common.getMediatagFromHref(fileData)), ]); var embedButtons = [{ From 9b5c3878b16963e82f03344bcad2932d763a42d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Mon, 9 Dec 2019 09:57:41 +0000 Subject: [PATCH 59/65] add password messages to file share modal --- www/common/common-ui-elements.js | 53 ++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index ccc837766..e9dc55471 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1311,6 +1311,21 @@ define([ if (!hashes.fileHash) { throw new Error("You must provide a file hash"); } var url = origin + pathname + '#' + hashes.fileHash; + // check if the file is password protected + var parsedHref = Hash.parsePadUrl(url); + var hasPassword = parsedHref.hashData.password; + + var makeFaqLink = function () { + var link = h('span', [ + h('i.fa.fa-question-circle'), ' ', // XXX remove and make it a margin + h('a', {href: '#'}, Messages.passwordFaqLink) + ]); + $(link).click(function () { + common.openURL(config.origin + "/faq.html#security-pad_password"); + }); + return link; + }; + var getLinkValue = function () { return url; }; var makeCancelButton = function() { @@ -1322,9 +1337,23 @@ define([ // Share link tab var linkContent = [ - UI.dialog.selectable(getLinkValue(), { id: 'cp-share-link-preview', tabindex: 1 }) + UI.dialog.selectableArea(getLinkValue(), { id: 'cp-share-link-preview', tabindex: 1, rows:2 }) ]; + // Show alert if the pad is password protected + if (hasPassword) { + linkContent.push(h('div.alert.alert-primary', [ + h('i.fa.fa-lock'), ' ', // XXX remove and make it a margin + Messages.share_linkPasswordAlert, h('br'), + makeFaqLink() + ])); + } + + linkContent.push(h('div.alert.alert-warning.dismissable', [ + h('span.cp-inline-alert-text', Messages.share_linkWarning), + h('span.fa.fa-times') // XXX dismiss message and remember + ])); + var link = h('div.cp-share-modal', linkContent); var linkButtons = [ @@ -1357,7 +1386,17 @@ define([ var friendsList = friendsObject.content; var contactsContent = h('div.cp-share-modal'); - $(contactsContent).append(friendsList); + var $contactsContent = $(contactsContent); + $contactsContent.append(friendsList); + + // Show alert if the pad is password protected + if (hasPassword) { + $contactsContent.append(h('div.alert.alert-primary', [ + h('i.fa.fa-unlock'), ' ', // XXX remove and make it a margin + Messages.share_contactPasswordAlert, h('br'), + makeFaqLink() + ])); + } var contactButtons = [makeCancelButton(), friendsObject.button]; @@ -1375,6 +1414,16 @@ define([ h('p', Messages.fileEmbedTag), UI.dialog.selectable(common.getMediatagFromHref(fileData)), ]); + + // Show alert if the pad is password protected + if (hasPassword) { + embed.append(h('div.alert.alert-primary', [ + h('i.fa.fa-lock'), ' ', + Messages.share_embedPasswordAlert, h('br'), + makeFaqLink() + ])); + } + var embedButtons = [{ className: 'cancel', name: Messages.cancel, From be40254f1aa79036b0631da082af3da43563efcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Mon, 9 Dec 2019 10:02:44 +0000 Subject: [PATCH 60/65] remove spaces in password messages - space between icon and text is now a margin --- www/common/common-ui-elements.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index e9dc55471..9338471a7 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1018,7 +1018,7 @@ define([ var makeFaqLink = function () { var link = h('span', [ - h('i.fa.fa-question-circle'), ' ', // XXX remove and make it a margin + h('i.fa.fa-question-circle'), h('a', {href: '#'}, Messages.passwordFaqLink) ]); $(link).click(function () { @@ -1033,7 +1033,6 @@ define([ var rights = h('div.msg.cp-inline-radio-group', [ h('label', Messages.share_linkAccess), - h('br'), h('div.radio-group',[ UI.createRadio('accessRights', 'cp-share-editable-false', Messages.share_linkView, true, { mark: {tabindex:1} }), @@ -1087,7 +1086,7 @@ define([ // Show alert if the pad is password protected if (hasPassword) { linkContent.push(h('div.alert.alert-primary', [ - h('i.fa.fa-lock'), ' ', // XXX remove and make it a margin + h('i.fa.fa-lock'), Messages.share_linkPasswordAlert, h('br'), makeFaqLink() ])); @@ -1170,7 +1169,7 @@ define([ // Show alert if the pad is password protected if (hasPassword) { $contactsContent.append(h('div.alert.alert-primary', [ - h('i.fa.fa-unlock'), ' ', // XXX remove and make it a margin + h('i.fa.fa-unlock'), Messages.share_contactPasswordAlert, h('br'), makeFaqLink() ])); @@ -1300,7 +1299,6 @@ define([ return modal; }; - // XXX add password messages to file share UIElements.createFileShareModal = function (config) { var origin = config.origin; var pathname = config.pathname; @@ -1317,7 +1315,7 @@ define([ var makeFaqLink = function () { var link = h('span', [ - h('i.fa.fa-question-circle'), ' ', // XXX remove and make it a margin + h('i.fa.fa-question-circle'), h('a', {href: '#'}, Messages.passwordFaqLink) ]); $(link).click(function () { @@ -1343,7 +1341,7 @@ define([ // Show alert if the pad is password protected if (hasPassword) { linkContent.push(h('div.alert.alert-primary', [ - h('i.fa.fa-lock'), ' ', // XXX remove and make it a margin + h('i.fa.fa-lock'), Messages.share_linkPasswordAlert, h('br'), makeFaqLink() ])); @@ -1392,7 +1390,7 @@ define([ // Show alert if the pad is password protected if (hasPassword) { $contactsContent.append(h('div.alert.alert-primary', [ - h('i.fa.fa-unlock'), ' ', // XXX remove and make it a margin + h('i.fa.fa-unlock'), Messages.share_contactPasswordAlert, h('br'), makeFaqLink() ])); From b558d6e35462a1fbf7a542b3cf7d4a599761eb7f Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 9 Dec 2019 11:03:11 +0100 Subject: [PATCH 61/65] Fix null item in kanban --- www/kanban/inner.js | 2 +- www/kanban/jkanban.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/www/kanban/inner.js b/www/kanban/inner.js index c2d845557..035794b2a 100644 --- a/www/kanban/inner.js +++ b/www/kanban/inner.js @@ -286,7 +286,7 @@ define([ kanban.inEditMode = true; // create a form to enter element var boardId = $(el.parentNode.parentNode).attr("data-id"); - var $item = $('
', {'class': 'kanban-item'}); + var $item = $('
', {'class': 'kanban-item new-item'}); var $input = getInput().val(name).appendTo($item); kanban.addForm(boardId, $item[0]); $input.focus(); diff --git a/www/kanban/jkanban.js b/www/kanban/jkanban.js index 5ef939f1b..f1f70955a 100644 --- a/www/kanban/jkanban.js +++ b/www/kanban/jkanban.js @@ -147,9 +147,13 @@ self.drake = self.dragula(self.boardContainer, { moves: function (el, source, handle, sibling) { if (self.options.readOnly) { return false; } + if (el.classList.contains('new-item')) { return false; } return handle.classList.contains('kanban-item'); }, accepts: function (el, target, source, sibling) { + if (sibling === null) { + return false; + } if (self.options.readOnly) { return false; } return true; }, From df9f2c9c293af7343b7f547132d4f82b5771b5f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Mon, 9 Dec 2019 11:14:05 +0000 Subject: [PATCH 62/65] dismiss warning about sharing links - remember if warning has been dismissed - include this in tips that can be reset - move the option to reset tips to the account settings --- www/common/common-ui-elements.js | 52 +++++++++++++++++++++++++++----- www/settings/inner.js | 4 +-- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 9338471a7..46befaac2 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1092,10 +1092,29 @@ define([ ])); } - linkContent.push(h('div.alert.alert-warning.dismissable', [ - h('span.cp-inline-alert-text', Messages.share_linkWarning), - h('span.fa.fa-times') // XXX dismiss message and remember - ])); + // warning about sharing links + var localStore = window.cryptpadStore; + var dismissButton = h('span.fa.fa-times'); + var shareLinkWarning = h('div.alert.alert-warning.dismissable', + { style: 'display: none;' }, + [ + h('span.cp-inline-alert-text', Messages.share_linkWarning), + dismissButton + ]); + linkContent.push(shareLinkWarning); + + localStore.get('hide-alert-shareLinkWarning', function (val) { + if (val === '1') { return; } + $(shareLinkWarning).show(); + + $(dismissButton).on('click', function () { + localStore.put('hide-alert-shareLinkWarning', '1'); + $(shareLinkWarning).remove(); + }); + + }); + + var link = h('div.cp-share-modal', linkContent); var $link = $(link); @@ -1347,10 +1366,27 @@ define([ ])); } - linkContent.push(h('div.alert.alert-warning.dismissable', [ - h('span.cp-inline-alert-text', Messages.share_linkWarning), - h('span.fa.fa-times') // XXX dismiss message and remember - ])); + // warning about sharing links + var localStore = window.cryptpadStore; + var dismissButton = h('span.fa.fa-times'); + var shareLinkWarning = h('div.alert.alert-warning.dismissable', + { style: 'display: none;' }, + [ + h('span.cp-inline-alert-text', Messages.share_linkWarning), + dismissButton + ]); + linkContent.push(shareLinkWarning); + + localStore.get('hide-alert-shareLinkWarning', function (val) { + if (val === '1') { return; } + $(shareLinkWarning).show(); + + $(dismissButton).on('click', function () { + localStore.put('hide-alert-shareLinkWarning', '1'); + $(shareLinkWarning).remove(); + }); + + }); var link = h('div.cp-share-modal', linkContent); diff --git a/www/settings/inner.js b/www/settings/inner.js index d67f62818..7c9dd0630 100644 --- a/www/settings/inner.js +++ b/www/settings/inner.js @@ -51,6 +51,7 @@ define([ 'cp-settings-info-block', 'cp-settings-displayname', 'cp-settings-language-selector', + 'cp-settings-resettips', 'cp-settings-logout-everywhere', 'cp-settings-autostore', 'cp-settings-userfeedback', @@ -67,7 +68,6 @@ define([ ], 'drive': [ 'cp-settings-drive-duplicate', - 'cp-settings-resettips', 'cp-settings-thumbnails', 'cp-settings-drive-backup', 'cp-settings-drive-import-local', @@ -835,7 +835,7 @@ define([ var localStore = window.cryptpadStore; $button.click(function () { Object.keys(localStore.store).forEach(function (k) { - if(k.slice(0, 9) === "hide-info") { + if(/^(hide-(info|alert))/.test(k)) { localStore.put(k, null); } }); From e9c0e1a71057974ff2239dd7c546800b07369e65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Mon, 9 Dec 2019 11:15:52 +0000 Subject: [PATCH 63/65] icon spacing --- customize.dist/src/less2/include/alertify.less | 3 +++ 1 file changed, 3 insertions(+) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index b1143ff38..96a8ae506 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -526,6 +526,9 @@ font-size: 12px; padding: 5px; border-radius: 0px; + i { + margin-right: 10px; + } &.alert-primary { background-color: @alertify-base; color: @alertify-fg; From f04d4e1010e1ba9f4275d6b3be9e6a5f2e3e1955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Mon, 9 Dec 2019 11:34:00 +0000 Subject: [PATCH 64/65] adjust spacing of usergrid --- customize.dist/src/less2/include/usergrid.less | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/customize.dist/src/less2/include/usergrid.less b/customize.dist/src/less2/include/usergrid.less index 37c406d52..a171b0950 100644 --- a/customize.dist/src/less2/include/usergrid.less +++ b/customize.dist/src/less2/include/usergrid.less @@ -8,7 +8,7 @@ & { .cp-usergrid-container { - margin-bottom: 12px; // XXX add margin at bottom of user grids + margin-bottom: 12px !important; // even when last child of .msg .cp-usergrid-grid { display: flex; flex-wrap: wrap; @@ -100,6 +100,7 @@ .cp-usergrid-user-name { margin-left: 5px; text-align: left; + line-height: 150%; color: @cryptpad_text_col; } } From bc593132381f3fe0d51bf19ed9a0870929f83bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Benqu=C3=A9?= Date: Mon, 9 Dec 2019 11:37:20 +0000 Subject: [PATCH 65/65] lint --- customize.dist/src/less2/include/alertify.less | 4 ++-- customize.dist/src/less2/include/modals-ui-elements.less | 2 +- customize.dist/src/less2/include/usergrid.less | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index 96a8ae506..4bd5e298b 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -159,7 +159,7 @@ margin-bottom: @alertify_padding-base; margin: 0; overflow: auto; - :last-child{ + :last-child { margin-bottom: 0; } } @@ -520,7 +520,7 @@ overflow-x: auto; } } - // Bootstrap Alerts + // Bootstrap Alerts .alert { margin: 0px 0px @alertify_padding-base 0px; font-size: 12px; diff --git a/customize.dist/src/less2/include/modals-ui-elements.less b/customize.dist/src/less2/include/modals-ui-elements.less index 1d91767ba..21707eab8 100644 --- a/customize.dist/src/less2/include/modals-ui-elements.less +++ b/customize.dist/src/less2/include/modals-ui-elements.less @@ -4,7 +4,7 @@ --LessLoader_require: LessLoader_currentFile(); } & { - .cp-spacer{ + .cp-spacer { height: @variables_padding; } // Share modal diff --git a/customize.dist/src/less2/include/usergrid.less b/customize.dist/src/less2/include/usergrid.less index a171b0950..6ba8c2d07 100644 --- a/customize.dist/src/less2/include/usergrid.less +++ b/customize.dist/src/less2/include/usergrid.less @@ -6,7 +6,7 @@ --LessLoader_require: LessLoader_currentFile(); }; & { - + .cp-usergrid-container { margin-bottom: 12px !important; // even when last child of .msg .cp-usergrid-grid {