From 9df98f0ca5f290d97b3c9e7029c1acb217edf60f Mon Sep 17 00:00:00 2001 From: ansuz Date: Fri, 19 Mar 2021 15:48:34 +0530 Subject: [PATCH 01/18] latest changes in changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e8379bd0..0dd0f5091 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,11 +32,15 @@ * pinning? * oo rebuild * OnlyOffice v6.2 + * some buttons that we were hiding have new ids and needed to be hidden again * translations * updated catch-phrase (Collaboration suite\nend-to-end-encrypted and open-source * CKEditor * cursor jump when clicking on a comment bubble * keybindings for common styles + * test if this affects scroll position (it shouldn't) + * check that CTRL-space doesn't mess with anything and that it is what Google uses + * test on Mac * nodrive * load anonymous accounts without creating a drive * faster load time, less junk on the server From ccbd89d45ea71f4984cfe93c5f3fb411a601a33d Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 19 Mar 2021 11:52:33 +0100 Subject: [PATCH 02/18] Translated using Weblate (French) Currently translated at 100.0% (1188 of 1188 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/fr/ --- www/common/translations/messages.fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/common/translations/messages.fr.json b/www/common/translations/messages.fr.json index 3b4a81f6a..08561d8b8 100644 --- a/www/common/translations/messages.fr.json +++ b/www/common/translations/messages.fr.json @@ -254,7 +254,7 @@ "fm_sharedFolderName": "Dossier partagé", "fm_searchPlaceholder": "Rechercher...", "fm_newButton": "Nouveau", - "fm_newButtonTitle": "Créer un nouveau pad ou un dossier, importer un fichier dans le dossier courant", + "fm_newButtonTitle": "Créer un nouveau document ou un dossier, importer un fichier dans le dossier actuel.", "fm_newFolder": "Nouveau dossier", "fm_newFile": "Nouveau pad", "fm_folder": "Dossier", @@ -603,7 +603,7 @@ "creation_noOwner": "Pas de propriétaire", "creation_expiration": "Date d'expiration", "creation_passwordValue": "Mot de passe", - "creation_newPadModalDescription": "Cliquez sur un type de pad pour le créer. Vous pouvez aussi appuyer sur Tab pour sélectionner un type et appuyer sur Entrée pour valider.", + "creation_newPadModalDescription": "Cliquer sur le type de document à créer. Vous pouvez aussi utiliser les touches Tab pour sélectionner un type et Entrée pour valider.", "password_info": "Le pad auquel vous essayez d'accéder n'existe plus ou est protégé par un mot de passe. Entrez le bon mot de passe pour accéder à son contenu.", "password_error": "Pad introuvable !
Cette erreur peut provenir de deux facteurs. Soit le mot de passe est faux, soit le pad a été supprimé du serveur.", "password_placeholder": "Tapez le mot de passe ici...", From 0c67bce3ab87f456e28e405333a409fef98c8e36 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 19 Mar 2021 11:52:34 +0100 Subject: [PATCH 03/18] Translated using Weblate (English) Currently translated at 100.0% (1189 of 1189 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/en/ Translated using Weblate (English) Currently translated at 100.0% (1188 of 1188 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/en/ --- www/common/translations/messages.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/www/common/translations/messages.json b/www/common/translations/messages.json index 6112b780d..d0e4d20cb 100644 --- a/www/common/translations/messages.json +++ b/www/common/translations/messages.json @@ -257,7 +257,7 @@ "fm_sharedFolderName": "Shared folder", "fm_searchPlaceholder": "Search...", "fm_newButton": "New", - "fm_newButtonTitle": "Create a new pad or folder, import a file in the current folder", + "fm_newButtonTitle": "Create a new document or folder, import a file in the current folder.", "fm_newFolder": "New folder", "fm_newFile": "New pad", "fm_morePads": "More", @@ -618,7 +618,7 @@ "creation_noOwner": "No owner", "creation_expiration": "Expiration date", "creation_passwordValue": "Password", - "creation_newPadModalDescription": "Click on a pad type to create it. You can also press Tab to select the type and press Enter to confirm.", + "creation_newPadModalDescription": "Click on a document type to create it. You can also press Tab to select the type and press Enter to confirm.", "password_info": "The pad you're trying to open no longer exist or is protected with a password. Enter the correct password to access its content.", "password_error": "Pad not found!
This error can be caused by two factors: either the password in invalid, or the pad has been deleted from the server.", "password_placeholder": "Type the password here...", @@ -1188,5 +1188,6 @@ "addOptionalPassword": "Add a password (optional)", "importError": "Failed to import (wrong format)", "fm_cantUploadHere": "Can't upload a file here", - "oo_lostEdits": "Unfortunately your recent unsaved edits could not be recovered after synchronising new content." + "oo_lostEdits": "Unfortunately your recent unsaved edits could not be recovered after synchronising new content.", + "toolbar_degraded": "Over {0} editors are currently present in this document. The user list and chat are disabled to improve performance." } From 5351e625745a5610bf56a3b36cead2619f906c2b Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 19 Mar 2021 11:52:34 +0100 Subject: [PATCH 04/18] Translated using Weblate (German) Currently translated at 100.0% (1188 of 1188 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/de/ --- www/common/translations/messages.de.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/common/translations/messages.de.json b/www/common/translations/messages.de.json index cb5682dc7..26a950a53 100644 --- a/www/common/translations/messages.de.json +++ b/www/common/translations/messages.de.json @@ -250,7 +250,7 @@ "fm_sharedFolderName": "Geteilter Ordner", "fm_searchPlaceholder": "Suchen...", "fm_newButton": "Neu", - "fm_newButtonTitle": "Ein neues Pad oder Ordner erstellen, oder eine Datei in den aktuellen Ordner importieren", + "fm_newButtonTitle": "Erstelle ein neues Dokument oder einen neuen Ordner, importiere eine Datei in den aktuellen Ordner.", "fm_newFolder": "Neuer Ordner", "fm_newFile": "Neues Pad", "fm_folder": "Ordner", @@ -596,7 +596,7 @@ "creation_noOwner": "Kein Eigentümer", "creation_expiration": "Ablaufdatum", "creation_passwordValue": "Passwort", - "creation_newPadModalDescription": "Klicke auf einen Pad-Typ, um das entsprechende Pad zu erstellen. Du kannst auch die Tab-Taste für die Auswahl und die Enter-Taste zum Bestätigen benutzen.", + "creation_newPadModalDescription": "Klicke auf einen Dokument-Typ, um das entsprechende Dokument zu erstellen. Du kannst auch die Tab-Taste für die Auswahl und die Enter-Taste zum Bestätigen benutzen.", "password_info": "Das Pad, das du öffnen möchtest, existiert nicht mehr oder ist mit einem Passwort geschützt. Gib das richtige Passwort ein, um den Inhalt anzuzeigen.", "password_error": "Pad nicht gefunden!
Dieser Fehler kann zwei Ursachen haben: Entweder ist das Passwort ungültig oder das Pad wurde vom Server gelöscht.", "password_placeholder": "Gib das Passwort hier ein...", From e20bfd3632b35ca175737193d9407831003bca31 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 19 Mar 2021 11:52:34 +0100 Subject: [PATCH 05/18] Translated using Weblate (Spanish) Currently translated at 47.0% (559 of 1188 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/es/ --- www/common/translations/messages.es.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/www/common/translations/messages.es.json b/www/common/translations/messages.es.json index e394fc8a0..84cf547f1 100644 --- a/www/common/translations/messages.es.json +++ b/www/common/translations/messages.es.json @@ -223,7 +223,7 @@ "canvas_opacity": "Opacidad", "settings_publicSigningKey": "Clave de Firma Pública", "historyButton": "Mostrar el historial del documento", - "history_next": "Ir a la versión anterior", + "history_next": "Siguiente versión", "history_prev": "Ir a la versión posterior", "history_closeTitle": "Cerrar el historial", "history_restoreTitle": "Restaurar la versión seleccionada del documento", @@ -269,7 +269,7 @@ "fm_info_trash": "Vacía tu papelera para liberar espacio en tu CryptDrive.", "upload_mustLogin": "Tienes que estar conectado para subir archivos", "uploadButton": "Subir", - "uploadButtonTitle": "Subir un archivo a la carpeta", + "uploadButtonTitle": "Subir un archivo a tu CryptDrive", "filePickerButton": "Incrustar un archivo", "filePicker_close": "Cerrar", "filePicker_description": "Elige un archivo de tu CryptDrive para incrustarlo o sube uno nuevo", @@ -350,7 +350,7 @@ "errorCopy": " Aún puedes acceder al contenido presionando Esc.
Una vez que cierres esta ventana no te será posible acceder a ella nuevamente.", "errorRedirectToHome": "PresionaEscpara ser redirigido a tu Cryptdrive.", "newVersionError": "Una nueva versión de CryptPad está disponible.
Recargar para usar la nueva versión, o presiona escape para acceder a tu contenido en modo offline.", - "deletedFromServer": "Nota borrada desde el servidor", + "deletedFromServer": "Nota borrada", "mustLogin": "Debes haber ingresado a tu cuenta para acceder a esta página", "disabledApp": "Esta nota ha sido eliminada por inactividad. Presione Esc para crear una nueva nota.", "initializing": "Iniciando...", @@ -451,7 +451,7 @@ "settings_cat_cursor": "Cursor", "settings_cat_pad": "Texto enriquecido", "settings_cat_subscription": "Suscripción", - "settings_backupHint": "Respalde o recupere todo sus contenido ne CryptDrive. No tendrán el contenido de sus archivos, solo las llaves para acceder a ellos.", + "settings_backupHint": "Respalde o recupere todo sus contenido en CryptDrive. No tendrán el contenido de sus archivos, solo las llaves para acceder a ellos.", "settings_backupHint2": "Descargue el contenido actual de sus notas. Las notas serán descargadas en un formato de leíble si el formato esta disponible.", "settings_backup2": "Descargar mi CryptDrive", "settings_backup2Confirm": "Esto descargara todas las notas y archivos desde su CryptDrive. Si desea continuar, elija un nombre y presione OK", @@ -603,5 +603,6 @@ "settings_cursorColorTitle": "Color de puntero", "mdToolbar_button": "Mostrar u ocultar la barra de herramientas de Markdown", "creation_404": "Esta almohadilla ya no existe. Utilice el siguiente formulario para crear un nuevo pad.", - "creation_owned1": "Un pad propio puede ser eliminado del servidor cuando el propietario lo desee. Al eliminar un pad propio se elimina de los CryptDrives de otros usuarios." + "creation_owned1": "Un pad propio puede ser eliminado del servidor cuando el propietario lo desee. Al eliminar un pad propio se elimina de los CryptDrives de otros usuarios.", + "settings_padNotifTitle": "Notificaciones de comentarios" } From 0aa6a3529300c4ab22303e8dcc796eeed3644903 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 19 Mar 2021 11:59:41 +0100 Subject: [PATCH 06/18] Translated using Weblate (French) Currently translated at 100.0% (1189 of 1189 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/fr/ --- www/common/translations/messages.fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/www/common/translations/messages.fr.json b/www/common/translations/messages.fr.json index 08561d8b8..322c7cf7b 100644 --- a/www/common/translations/messages.fr.json +++ b/www/common/translations/messages.fr.json @@ -1188,5 +1188,6 @@ "addOptionalPassword": "Ajouter un mot de passe (optionnel)", "fm_cantUploadHere": "Impossible d'importer un fichier ici", "importError": "Impossible d'importer (mauvais format)", - "oo_lostEdits": "Vos récentes modifications non sauvegardées n'ont pas pu être récupérées après la synchronisation du nouveau contenu." + "oo_lostEdits": "Vos récentes modifications non sauvegardées n'ont pas pu être récupérées après la synchronisation du nouveau contenu.", + "toolbar_degraded": "Au moins {0} éditeurs sont actuellement connectés à ce document. La liste des utilisateurs et le chat sont désactivés pour améliorer les performances." } From 5600720a9859e0fa306ad5faacedbe9d68663767 Mon Sep 17 00:00:00 2001 From: ansuz Date: Fri, 19 Mar 2021 16:31:26 +0530 Subject: [PATCH 07/18] remove an XXX --- www/common/outer/messenger.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/www/common/outer/messenger.js b/www/common/outer/messenger.js index 1ac7a6e17..981d9f8de 100644 --- a/www/common/outer/messenger.js +++ b/www/common/outer/messenger.js @@ -537,10 +537,9 @@ define([ if (peer === hk) { return; } if (channel.readOnly) { return; } - // XXX review // Sending myData is used to build a "mapId" object which links // netflux IDs to a curvePublic/uid. We use this map in friend chat - // to detect is the other user is online and we also use it in team chat + // to detect if the other user is online and we also use it in team chat // to show if other team members are online (in the roster section). // It is not needed in the pad chat for now and only causes useless // network usage. From 31414ca7b0690fc9c410ba9bb43bb4786f4851f9 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 19 Mar 2021 15:09:05 +0100 Subject: [PATCH 08/18] Fix degraded mode not set when multiple tabs on the same pad --- www/common/outer/cursor.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/www/common/outer/cursor.js b/www/common/outer/cursor.js index b6662b75f..8338fef16 100644 --- a/www/common/outer/cursor.js +++ b/www/common/outer/cursor.js @@ -50,6 +50,12 @@ define([ }); }; + var updateDegraded = function (ctx, wc, chan) { + var m = wc.members; + chan.degraded = (m.length-1) >= DEGRADED; + ctx.emit('DEGRADED', { degraded: chan.degraded }, chan.clients); + }; + var initCursor = function (ctx, obj, client, cb) { var channel = obj.channel; var secret = obj.secret; @@ -92,14 +98,10 @@ define([ // ==> And push the new tab to the list chan.clients.push(client); + updateDegraded(ctx, chan.wc, chan); return void cb(); } - var updateDegraded = function (ctx, wc, chan) { - var m = wc.members; - chan.degraded = (m.length-1) >= DEGRADED; - ctx.emit('DEGRADED', { degraded: chan.degraded }, chan.clients); - }; var onOpen = function (wc) { ctx.channels[channel] = ctx.channels[channel] || {}; From 3e969dd9a5e52c38aa997f25a8de13e3f16ade2a Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 19 Mar 2021 15:09:28 +0100 Subject: [PATCH 09/18] Fix noDrive uid always modified --- www/common/outer/async-store.js | 11 +++++++++-- www/debug/main.js | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index 60dc9ca73..d4f49014f 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -586,11 +586,14 @@ define([ var proxy = store.proxy || {}; var disableThumbnails = Util.find(proxy, ['settings', 'general', 'disableThumbnails']); var teams = (store.modules['team'] && store.modules['team'].getTeamsData(app)) || {}; + if (!proxy.uid) { + store.noDriveUid = store.noDriveUid || Hash.createChannelId(); + } var metadata = { // "user" is shared with everybody via the userlist user: { name: proxy[Constants.displayNameKey] || store.noDriveName || "", - uid: proxy.uid || Hash.createChannelId(), // Random uid in nodrive mode + uid: proxy.uid || store.noDriveUid, // Random uid in nodrive mode avatar: Util.find(proxy, ['profile', 'avatar']), profile: Util.find(proxy, ['profile', 'view']), color: getUserColor(), @@ -858,6 +861,7 @@ define([ Store.setDisplayName = function (clientId, value, cb) { if (!store.proxy) { store.noDriveName = value; + broadcast([clientId], "UPDATE_METADATA"); return void cb(); } if (store.modules['profile']) { @@ -2836,7 +2840,10 @@ define([ store.driveMetadata = info.metadata; if (!rt.proxy.drive || typeof(rt.proxy.drive) !== 'object') { rt.proxy.drive = {}; } if (!rt.proxy[Constants.displayNameKey] && store.noDriveName) { - store.proxy[Constants.displayNameKey] = store.noDriveName; + rt.proxy[Constants.displayNameKey] = store.noDriveName; + } + if (!rt.proxy.uid && store.noDriveUid) { + rt.proxy.uid = store.noDriveUid; } /* // deprecating localStorage migration as of 4.2.0 diff --git a/www/debug/main.js b/www/debug/main.js index 9053dfbf6..6f855e1db 100644 --- a/www/debug/main.js +++ b/www/debug/main.js @@ -44,6 +44,7 @@ define([ meta.debugDrive = drive; }; SFCommonO.start({ + noDrive: true, addData:addData }); }); From 9980346ef7947acaa19483e6bd39cb1c28045106 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 19 Mar 2021 15:19:57 +0100 Subject: [PATCH 10/18] Set degraded mode limit in AppConfig --- www/common/application_config_internal.js | 11 +++++++++++ www/common/outer/cursor.js | 6 ++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/www/common/application_config_internal.js b/www/common/application_config_internal.js index 496e65f1f..f91c73f56 100644 --- a/www/common/application_config_internal.js +++ b/www/common/application_config_internal.js @@ -179,5 +179,16 @@ define(function() { // You can change the value here. // config.maxOwnedTeams = 5; + // The userlist displayed in collaborative documents is stored alongside the document data. + // Everytime someone with edit rights joins a document or modify their user data (display + // name, avatar, color, etc.), they update the "userlist" part of the document. When too many + // editors are in the same document, all these changes increase the risks of conflicts which + // require CPU time to solve. A "degraded" mode can now be set when a certain number of editors + // are in a document at the same time. This mode disables the userlist, the chat and the + // position of other users' cursor. You can configure the number of user from which the session + // will enter into degraded mode. A big number may result in collaborative edition being broken, + // but this number depends on the network and CPU performances of each user's device. + config.degradedLimit = 8; + return config; }); diff --git a/www/common/outer/cursor.js b/www/common/outer/cursor.js index 8338fef16..371a4565e 100644 --- a/www/common/outer/cursor.js +++ b/www/common/outer/cursor.js @@ -2,11 +2,13 @@ define([ '/common/common-util.js', '/common/common-constants.js', '/customize/messages.js', + '/customize/application_config.js', '/bower_components/chainpad-crypto/crypto.js', -], function (Util, Constants, Messages, Crypto) { +], function (Util, Constants, Messages, AppConfig, Crypto) { var Cursor = {}; - var DEGRADED = 3; // XXX Number of users before switching to degraded mode + var DEGRADED = AppConfig.degradedLimit || 8; +console.log(DEGRADED); var convertToUint8 = function (obj) { var l = Object.keys(obj).length; From 86e50e04775aad51c89a92440426233c82b909fd Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 19 Mar 2021 17:05:28 +0100 Subject: [PATCH 11/18] Add a configuration key to disable driveless mode --- www/common/application_config_internal.js | 8 ++++++++ www/common/sframe-common-outer.js | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/www/common/application_config_internal.js b/www/common/application_config_internal.js index f91c73f56..e119b3e5e 100644 --- a/www/common/application_config_internal.js +++ b/www/common/application_config_internal.js @@ -190,5 +190,13 @@ define(function() { // but this number depends on the network and CPU performances of each user's device. config.degradedLimit = 8; + // In "legacy" mode, one-time users were always creating an "anonymous" drive when visiting CryptPad + // in which they could store their pads. The new "driveless" mode allow users to open an existing + // pad without creating a drive in the background. The drive will only be created if they visit + // a different page (Drive, Settings, etc.) or try to create a new pad themselves. You can disable + // the driveless mode by changing the following value to "false" + config.allowDrivelessMode = true; + config.allowDrivelessMode = true; + return config; }); diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index df49ee6a3..77aa9ba43 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -222,7 +222,7 @@ define([ } catch (e) { console.error(e); } Cryptpad.ready(waitFor(), { - noDrive: cfg.noDrive, + noDrive: cfg.noDrive && AppConfig.allowDrivelessMode, driveEvents: cfg.driveEvents, cache: Boolean(cfg.cache), currentPad: currentPad From 18e995f63a8a75a145b389099d02160db8567ddd Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 19 Mar 2021 17:08:11 +0100 Subject: [PATCH 12/18] Add the degraded threshold value to the translation key in toolbar --- www/common/outer/cursor.js | 1 - www/common/toolbar.js | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/www/common/outer/cursor.js b/www/common/outer/cursor.js index 371a4565e..95b2b34c6 100644 --- a/www/common/outer/cursor.js +++ b/www/common/outer/cursor.js @@ -8,7 +8,6 @@ define([ var Cursor = {}; var DEGRADED = AppConfig.degradedLimit || 8; -console.log(DEGRADED); var convertToUint8 = function (obj) { var l = Object.keys(obj).length; diff --git a/www/common/toolbar.js b/www/common/toolbar.js index c42aa36cb..aafc356a5 100644 --- a/www/common/toolbar.js +++ b/www/common/toolbar.js @@ -212,6 +212,7 @@ MessengerUI, Messages) { var $editUsersList = $('
', {'class': 'cp-toolbar-userlist-others'}) .appendTo($editUsers); + var degradedLimit = Config.degradedLimit || 8; if (!online) { $('').text(Messages.userlist_offline).appendTo($editUsersList); numberOfEditUsers = '?'; @@ -219,8 +220,7 @@ MessengerUI, Messages) { } else if (metadataMgr.isDegraded() === true) { numberOfEditUsers = Math.max(metadataMgr.getChannelMembers().length - 1, 0); numberOfViewUsers = ''; - Messages.toolbar_degraded = "Too many editors are present in the pad. The userlist has been disabled to improve performances"; // XXX - $('').text(Messages.toolbar_degraded).appendTo($editUsersList); + $('').text(Messages._getKey('toolbar_degraded', [degradedLimit])).appendTo($editUsersList); } // Update the buttons From c168393c21559d785fbd8e8938eb457a8bf553e9 Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 19 Mar 2021 17:14:40 +0100 Subject: [PATCH 13/18] Only allow driveless mode for existing pads --- www/common/sframe-common-outer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index 77aa9ba43..e74fb882c 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -221,8 +221,11 @@ define([ } } catch (e) { console.error(e); } + // NOTE: Driveless mode should only work for existing pads, but we can't check that + // before creating the worker because we need the anon RPC to do so. + // We're only going to check if a hash exists in the URL or not. Cryptpad.ready(waitFor(), { - noDrive: cfg.noDrive && AppConfig.allowDrivelessMode, + noDrive: cfg.noDrive && AppConfig.allowDrivelessMode && currentPad.hash, driveEvents: cfg.driveEvents, cache: Boolean(cfg.cache), currentPad: currentPad From c6b8b11dc3c18c7b55ef3646970665b969b3067a Mon Sep 17 00:00:00 2001 From: yflory Date: Fri, 19 Mar 2021 18:10:27 +0100 Subject: [PATCH 14/18] Fix Destroy and change password when pad not stored --- www/common/cryptpad-common.js | 16 ++++++++++++---- www/common/inner/access.js | 11 +++++++++-- www/common/outer/async-store.js | 2 ++ www/common/proxy-manager.js | 15 ++++++++++++--- www/common/sframe-common-outer.js | 1 + www/secureiframe/main.js | 1 + 6 files changed, 37 insertions(+), 9 deletions(-) diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index 31c65bb86..f4419d2cb 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -1095,6 +1095,7 @@ define([ common.changePadPassword = function (Crypt, Crypto, data, cb) { var href = data.href; + var oldPassword = data.oldPassword; var newPassword = data.password; var teamId = data.teamId; if (!href) { return void cb({ error: 'EINVAL_HREF' }); } @@ -1123,7 +1124,9 @@ define([ var isSharedFolder = parsed.type === 'drive'; - var optsGet = {}; + var optsGet = { + password: oldPassword + }; var optsPut = { password: newPassword, metadata: {}, @@ -1133,7 +1136,7 @@ define([ var cryptgetVal; Nthen(function (waitFor) { - if (parsed.hashData && parsed.hashData.password) { + if (parsed.hashData && parsed.hashData.password && !oldPassword) { common.getPadAttribute('password', waitFor(function (err, password) { optsGet.password = password; }), href); @@ -1418,6 +1421,7 @@ define([ common.changeOOPassword = function (data, _cb) { var cb = Util.once(Util.mkAsync(_cb)); var href = data.href; + var oldPassword = data.oldPassword; var newPassword = data.password; var teamId = data.teamId; if (!href) { return void cb({ error: 'EINVAL_HREF' }); } @@ -1452,12 +1456,16 @@ define([ validateKey: newSecret.keys.validateKey }, }; - var optsGet = {}; + var optsGet = { + password: oldPassword + }; Nthen(function (waitFor) { common.getPadAttribute('', waitFor(function (err, _data) { padData = _data; - optsGet.password = padData.password; + if (!oldPassword) { + optsGet.password = padData.password; + } }), href); common.getAccessKeys(waitFor(function (keys) { optsGet.accessKeys = keys; diff --git a/www/common/inner/access.js b/www/common/inner/access.js index 3bbef91e9..a09f98bfb 100644 --- a/www/common/inner/access.js +++ b/www/common/inner/access.js @@ -888,9 +888,16 @@ define([ }); } + var href = data.href; + var hashes = priv.hashes || {}; + var bestHash = hashes.editHash || hashes.viewHash || hashes.fileHash; + if (data.fakeHref) { + href = Hash.hashToHref(bestHash, priv.app); + } sframeChan.query(q, { teamId: typeof(owned) !== "boolean" ? owned : undefined, - href: data.href, + href: href, + oldPassword: priv.password, password: newPass }, function (err, data) { $(passwordOk).text(Messages.properties_changePasswordButton); @@ -956,7 +963,7 @@ define([ spinner.spin(); sframeChan.query('Q_DELETE_OWNED', { teamId: typeof(owned) !== "boolean" ? owned : undefined, - channel: data.channel + channel: data.channel || priv.channel }, function (err, obj) { spinner.done(); UI.findCancelButton().click(); diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index d4f49014f..8ac1a77c3 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -331,6 +331,8 @@ define([ teamId = data.teamId; } + // XXX CLEAR CACHE + if (channel === store.driveChannel && !force) { return void cb({error: 'User drive removal blocked!'}); } diff --git a/www/common/proxy-manager.js b/www/common/proxy-manager.js index 7093f0ec5..011ec4f36 100644 --- a/www/common/proxy-manager.js +++ b/www/common/proxy-manager.js @@ -868,7 +868,6 @@ define([ if (fId && Env.folders[fId] && Env.folders[fId].deleting) { delete Env.folders[fId].deleting; } - console.error(obj.error, chan); Feedback.send('ERROR_DELETING_OWNED_PAD=' + chan + '|' + obj.error, true); return void cb(); } @@ -881,6 +880,11 @@ define([ ids.push(fId); } + if (!ids.length) { + toDelete = undefined; + return void cb(); + } + ids.forEach(function (id) { var paths = findFile(Env, id); var _resolved = _resolvePaths(Env, paths); @@ -912,8 +916,13 @@ define([ }); }); }).nThen(function () { - // Remove deleted pads from the drive - _delete(Env, { resolved: toDelete }, cb); + if (!toDelete) { + // Nothing to delete + cb(); + } else { + // Remove deleted pads from the drive + _delete(Env, { resolved: toDelete }, cb); + } // If we were using the access modal, send a refresh command if (data.channel) { Env.Store.refreshDriveUI(); diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index e74fb882c..687d3a54b 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -1407,6 +1407,7 @@ define([ }; config.data = { app: parsed.type, + channel: secret.channel, hashes: hashes, password: password, isTemplate: isTemplate, diff --git a/www/secureiframe/main.js b/www/secureiframe/main.js index bb7f05cca..be026194e 100644 --- a/www/secureiframe/main.js +++ b/www/secureiframe/main.js @@ -101,6 +101,7 @@ define([ origin: window.location.origin, pathname: window.location.pathname, feedbackAllowed: Utils.Feedback.state, + channel: config.data.channel, hashes: config.data.hashes, password: config.data.password, propChannels: config.data.getPropChannels(), From ed7f9e343e6f569ac6816545293c3794a236e774 Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 22 Mar 2021 00:09:35 +0100 Subject: [PATCH 15/18] Translated using Weblate (German) Currently translated at 100.0% (1189 of 1189 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/de/ --- www/common/translations/messages.de.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/www/common/translations/messages.de.json b/www/common/translations/messages.de.json index 26a950a53..c282362b6 100644 --- a/www/common/translations/messages.de.json +++ b/www/common/translations/messages.de.json @@ -1188,5 +1188,6 @@ "addOptionalPassword": "Passwort hinzufügen (optional)", "oo_lostEdits": "Leider konnten deine letzten ungespeicherten Bearbeitungen nach dem Synchronisieren neuer Inhalte nicht wiederhergestellt werden.", "fm_cantUploadHere": "Hochladen hier nicht möglich", - "importError": "Import fehlgeschlagen (falsches Format)" + "importError": "Import fehlgeschlagen (falsches Format)", + "toolbar_degraded": "Derzeit bearbeiten über {0} Benutzer dieses Dokument. Die Benutzerliste und der Chat wurden deaktiviert, um die Performance zu verbessern." } From 25dc22f9d413cd6098d71e53a94612c55832e739 Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 22 Mar 2021 00:09:35 +0100 Subject: [PATCH 16/18] Translated using Weblate (Spanish) Currently translated at 53.9% (642 of 1189 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/es/ Translated using Weblate (Spanish) Currently translated at 52.9% (630 of 1189 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/es/ Translated using Weblate (Spanish) Currently translated at 47.4% (564 of 1189 strings) Translation: CryptPad/App Translate-URL: http://weblate.cryptpad.fr/projects/cryptpad/app/es/ --- www/common/translations/messages.es.json | 138 +++++++++++++++-------- 1 file changed, 88 insertions(+), 50 deletions(-) diff --git a/www/common/translations/messages.es.json b/www/common/translations/messages.es.json index 84cf547f1..3334fb2a6 100644 --- a/www/common/translations/messages.es.json +++ b/www/common/translations/messages.es.json @@ -106,8 +106,8 @@ "fm_originalPath": "Enlace original", "fm_noname": "Documento sin título", "fm_emptyTrashDialog": "¿Seguro que quieres vaciar la papelera?", - "fm_removeSeveralPermanentlyDialog": "¿Seguro que quieres eliminar estos {0} elementos de la papelera para siempre?", - "fm_removePermanentlyDialog": "¿Seguro que quieres eliminar este elemento para siempre?", + "fm_removeSeveralPermanentlyDialog": "¿Estás seguro de que quieres eliminar estos {0} elementos de tu unidad? Permanecerán en las unidades de otros usuarios que los hayan almacenado.", + "fm_removePermanentlyDialog": "¿Estás seguro de que quieres eliminar este elemento de tu unidad? Permanecerá en las unidades de otros usuarios que lo hayan almacenado.", "fm_restoreDialog": "¿Seguro que quieres recuperar {0}?", "fm_unknownFolderError": "La carpeta seleccionada ya no existe. Abriendo la carpeta anterior...", "fm_contextMenuError": "No se pudo abrir el menú para este elemento. Si persiste el problema, recarga la página.", @@ -120,7 +120,7 @@ "fc_open_ro": "Abrir (sólo lectura)", "fc_delete": "Eliminar", "fc_restore": "Recuperar", - "fc_remove": "Eliminar para siempre", + "fc_remove": "Eliminar", "fc_empty": "Vaciar la papelera", "fc_prop": "Propiedades", "fo_moveUnsortedError": "No puedes mover una carpeta en la lista de documentos no organizados", @@ -139,11 +139,11 @@ "login_invalUser": "Nombre de usuario requerido", "login_invalPass": "Contraseña requerida", "login_unhandledError": "Ha ocurrido un error inesperado :(", - "register_importRecent": "Importe el historial de tu sesión anónima", + "register_importRecent": "Importar documentos de su sesión no registrada", "register_acceptTerms": "Acepto los términos de servicio", "register_passwordsDontMatch": "Las contraseñas no corresponden", "register_mustAcceptTerms": "Tienes que aceptar los términos de servicio", - "register_header": "Bienvenido a CryptPad", + "register_header": "Registrar", "settings_title": "Preferencias", "settings_save": "Guardar", "settings_backup": "Copia de seguridad", @@ -156,7 +156,7 @@ "settings_resetTipsDone": "Todos los consejos ahora están visibles", "footer_aboutUs": "Acerca de nosotros", "about": "Acerca de nosotros", - "privacy": "Privacidad", + "privacy": "Política de privacidad", "contact": "Contacto", "terms": "Términos de Servicio", "movedToTrash": "Este pad fue movido a la papelera.
Acceder a mi Drive", @@ -170,7 +170,7 @@ "blog": "Blog", "driveReadmeTitle": "¿Qué es CryptPad?", "readme_welcome": "¡Bienvenido a CryptPad!", - "readme_p1": "Bienvenido a CryptPad, aquí podrás anotar cosas solo o con otra gente.", + "readme_p1": "Bienvenido a CryptPad, aquí es donde puedes tomar nota de las cosas solo y con tus contactos.", "readme_p2": "Este pad es una guía rápida para aprender a usar a CryptPad para tomar notas, organizarlas y trabajar con más personas.", "readme_cat1": "Conoce tu CryptDrive", "readme_cat1_l1": "Crea un pad: En CryptDrive, haz clic en {0} y luego en {1} para crear un pad.", @@ -205,11 +205,11 @@ "feedback_optout": "Si quieres darte de baja, visita tus preferencias, donde podrás activar o desactivar el feedback", "fm_searchName": "Buscar", "fm_searchPlaceholder": "Buscar...", - "fm_newButtonTitle": "Crear un nuevo pad o carpeta", + "fm_newButtonTitle": "Crear un nuevo documento o carpeta.", "fm_openParent": "Mostrar en carpeta", "register_writtenPassword": "He escrito mi usuario y contraseña, continuar", - "register_cancel": "Volver", - "register_warning": "Zero Knowledge significa que no podemos recuperar tus datos si pierdes tu contraseña.", + "register_cancel": "Cancelar", + "register_warning": " Advertencia", "register_alreadyRegistered": "Este usuario ya existe, ¿iniciar sesión?", "button_newwhiteboard": "Nueva Pizarra", "saveTemplateButton": "Guardar como plantilla", @@ -224,7 +224,7 @@ "settings_publicSigningKey": "Clave de Firma Pública", "historyButton": "Mostrar el historial del documento", "history_next": "Siguiente versión", - "history_prev": "Ir a la versión posterior", + "history_prev": "Versión anterior", "history_closeTitle": "Cerrar el historial", "history_restoreTitle": "Restaurar la versión seleccionada del documento", "history_restorePrompt": "¿Estás seguro de que quieres cambiar la versión actual del documento por ésta?", @@ -251,7 +251,7 @@ "newVersion": "CryptPad ha sido actualizado!
Puedes ver lo que ha cambiado aquí (en inglés):
Notas de versión para CryptPad {0}", "pinLimitReachedAlertNoAccounts": "Has llegado a tu límite de espacio", "previewButtonTitle": "Mostrar/esconder la vista previa Markdown", - "fm_info_anonymous": "No estás conectado, así que estos pads pueden ser borrados (¿por qué?). Regístrate o Inicia sesión para asegurarlos.", + "fm_info_anonymous": "No has iniciado sesión, por lo que tus documentos expirarán después de {0} días. Borrar el historial de tu navegador puede hacer que desaparezcan.
Inscríbete (no se requieren datos personales) o Ingresa para almacenarlos en tu disco de forma indefinida. Más información sobre las cuentas registradas.", "fm_alert_anonymous": "Hola, estás usando CryptPad anónimamente. Está bien, pero tus pads pueden ser borrados después de un périodo de inactividad. Hemos desactivado funciones avanzadas de CryptDrive para usuarios anónimos porque queremos dejar claro que no es un lugar seguro para almacenar cosas. Puedes leer este articulo (en inglés) acerca de por qué hacemos esto y por qué deberías Registrarte e Iniciar sesión.", "fm_error_cantPin": "Error del servidor. Por favor, recarga la página e inténtalo de nuevo.", "upload_notEnoughSpace": "No tienes suficiente espacio para este archivo en tu CryptDrive", @@ -290,7 +290,7 @@ "openLinkInNewTab": "Abrir enlace en pestaña nueva", "profileButton": "Perfil", "profile_avatar": "Imagen", - "profile_upload": "Subir una imagen de perfil", + "profile_upload": " Subir una imagen de perfil", "profile_error": "Error al crear tu perfil: {0}", "profile_register": "Tienes que ingresar para crear un perfil!", "download_mt_button": "Descargar", @@ -337,7 +337,7 @@ "settings_cat_code": "Código", "settings_codeIndentation": "Indentación del editor de código (espacios)", "settings_codeUseTabs": "Utilizar tabulaciones en vez de espacios", - "main_catch_phrase": "El Cloud Zero Knowledge", + "main_catch_phrase": "Paquete de colaboración
de extremo a extremo encriptado y de código abierto", "button_newkanban": "Nuevo Kanban", "button_newsheet": "Nueva Hoja", "padNotPinned": "Esta nota expirará luego de 3 meses de inactividad, {0}ingresar{1} o {2}registrarse{3}para conservar.", @@ -349,7 +349,7 @@ "invalidHashError": "El documento que has solicitado tiene una URL invalida.", "errorCopy": " Aún puedes acceder al contenido presionando Esc.
Una vez que cierres esta ventana no te será posible acceder a ella nuevamente.", "errorRedirectToHome": "PresionaEscpara ser redirigido a tu Cryptdrive.", - "newVersionError": "Una nueva versión de CryptPad está disponible.
Recargar para usar la nueva versión, o presiona escape para acceder a tu contenido en modo offline.", + "newVersionError": "Una nueva versión de CryptPad está disponible.
Recargar para usar la nueva versión, o presiona escape para acceder a tu contenido en modo offline.", "deletedFromServer": "Nota borrada", "mustLogin": "Debes haber ingresado a tu cuenta para acceder a esta página", "disabledApp": "Esta nota ha sido eliminada por inactividad. Presione Esc para crear una nueva nota.", @@ -397,8 +397,8 @@ "fileEmbedScript": "Para insertar este archivo, incluya este código una vez en su página para cargar el Etiqueta de Media:", "fileEmbedTag": "Luego ponga esta Etiqueta de Media donde quiera que sea incorporada en su página:", "pad_mediatagTitle": "Opciones de Etiquetas de Media", - "poll_bookmark_col": "Agregue esta columna a sus marcadores así estará siempre desbloqueada y se le mostrará al comienzo", - "poll_bookmarked_col": "Esta es su columna de bookmarks. Siempre será desbloqueada y mostrada al comienzo para usted.", + "poll_bookmark_col": "Agregue esta columna a sus marcadores así estará siempre desbloqueada y se le mostrará al comienzo", + "poll_bookmarked_col": "Esta es su columna de bookmarks. Siempre será desbloqueada y mostrada al comienzo para usted.", "poll_total": "TOTAL", "poll_comment_list": "Comentarios", "poll_comment_add": "Agregue un comentario", @@ -426,7 +426,7 @@ "fm_deleteOwnedPad": "Está seguro que quiere remover esta nota del servidor de manera permanente?", "fm_deleteOwnedPads": "Está seguro que quiere remover estas notas del servidor de manera permanente?", "fm_info_recent": "Estas notas han sido abiertas o modificadas recientemente por ti o por tus colaboradores.", - "fm_info_sharedFolder": "Esta es una carpeta compartida. Usted no ha ingresado a su cuenta por lo que solo tiene acceso en modo solo lectura.
ingresar o ingresar para poder importarla a su Cryptdrive y modificarla.", + "fm_info_sharedFolder": "Esta es una carpeta compartida. Usted no ha ingresado a su cuenta por lo que solo tiene acceso en modo solo lectura.
ingresar o ingresar para poder importarla a su Cryptdrive y modificarla.", "fm_info_owned": "Usted es el dueño de las notas que se presentan. Esto significa que puede removerlas de manera permanente del servidor cuando lo desee. Si lo hace, los otros usuarios no podrán acceder a ellas nunca más.", "fm_renamedPad": "Ha definido un nombre personalizado para esta nota. El título que se comparte es: br>{0}", "fm_canBeShared": "Esta carpeta puede ser compartida", @@ -442,7 +442,7 @@ "fm_moveNestedSF": "No puedes poner una carpeta compartida dentro de otra. La carpeta {0} no se movió.", "fm_passwordProtected": "Protegido por una contraseña", "fc_newsharedfolder": "Nueva carpeta compartida", - "fc_delete_owned": "Eliminar desde el servidor", + "fc_delete_owned": "Destruir", "fc_remove_sharedfolder": "Eliminar", "fc_hashtag": "Etiquetas", "register_passwordTooShort": "La contraseña debe tener por los menos {0} caracteres de largo.", @@ -452,7 +452,7 @@ "settings_cat_pad": "Texto enriquecido", "settings_cat_subscription": "Suscripción", "settings_backupHint": "Respalde o recupere todo sus contenido en CryptDrive. No tendrán el contenido de sus archivos, solo las llaves para acceder a ellos.", - "settings_backupHint2": "Descargue el contenido actual de sus notas. Las notas serán descargadas en un formato de leíble si el formato esta disponible.", + "settings_backupHint2": "Descargue todos los documentos de su unidad. Los documentos se descargarán en formatos legibles por otras aplicaciones cuando dicho formato esté disponible. Cuando dicho formato no esté disponible, los documentos se descargarán en un formato legible por CryptPad.", "settings_backup2": "Descargar mi CryptDrive", "settings_backup2Confirm": "Esto descargara todas las notas y archivos desde su CryptDrive. Si desea continuar, elija un nombre y presione OK", "settings_exportTitle": "Exportar su CryptDrive", @@ -506,7 +506,7 @@ "settings_autostoreHint": " Automático Todos los pads que visita se almacenan en su CryptDrive.
Manual (siempre pregunte) Si aún no ha guardado un pad, se le preguntará si desea para almacenarlos en su CryptDrive.
Manual (nunca preguntar) Los Pads no se almacenan automáticamente en su Cryptpad. La opción para almacenarlos estará oculta.", "settings_driveDuplicateTitle": "Pads de propiedad duplicadas", "settings_driveDuplicateHint": "Cuando mueve sus propias Pads a una carpeta compartida, se guarda una copia en su CryptDrive para asegurarse de que conserva su control sobre ella. Puedes ocultar archivos duplicados. Solo la versión compartida será visible, a menos que se elimine, en cuyo caso el original se mostrará en su ubicación anterior.", - "settings_padWidthHint": "Los Pads de texto enriquecido usan de manera predeterminada el ancho máximo disponible en su pantalla y puede ser difícil de leer. Puede reducir el ancho del editor aquí.", + "settings_padWidthHint": "Cambia entre el modo de página (por defecto) que limita el ancho del editor de texto, y el uso del ancho total de la pantalla.", "settings_padSpellcheckHint": "Esta opción le permite habilitar la corrección ortográfica en los Pads de texto enriquecido. Los errores ortográficos estarán subrayados en rojo y tendrá que mantener presionada la tecla Ctrl o Meta mientras hace clic derecho para ver las opciones correctas.", "settings_padSpellcheckLabel": "Habilite el corrector ortográfico en el Pad de texto enriquecido", "settings_ownDriveConfirm": "La actualización de su cuenta puede llevar algún tiempo. Deberá volver a iniciar sesión en todos sus dispositivos. ¿Estás seguro?", @@ -536,7 +536,7 @@ "uploadFolder_modal_owner": "Archivos de propiedad", "uploadFolder_modal_forceSave": "Almacene sus archivos en su CryptDrive", "upload_notEnoughSpaceBrief": "Sin espacio suficiente", - "upload_tooLargeBrief": "Archivo muy grande", + "upload_tooLargeBrief": "El archivo supera el límite de {0}MB", "upload_up": "Subir", "download_dl": "Descargar", "download_step1": "Descargando", @@ -556,53 +556,91 @@ "mdToolbar_check": "Lista de tarea", "mdToolbar_code": "Código", "mdToolbar_toc": "Tablas de contenidos", - "home_host": "Esta es una instancia de comunidad independiente de CryptPad. Su código fuente está disponible en GitHub .", - "whatis_title": "¿Que es CryptPad?", - "whatis_collaboration": "Colaboración fácil y rápida", + "home_host": "Esta es una instancia comunitaria independiente de CryptPad.", + "whatis_title": "¿Qué es CryptPad?", + "whatis_collaboration": "Colaboración privada", "whatis_drive": "Organización con CryptDrive", "features": "Caracteristicas", - "features_title": "Comparación de características", - "features_anon": "Usuario anonimo", - "features_registered": "Usuario registrado", - "features_premium": "Usuarios Premium", - "features_f_apps": "Acceso a las principales aplicaciones", - "features_f_core": "Características comunes para las aplicaciones", + "features_title": "Características", + "features_anon": "No registrado", + "features_registered": "Registrado", + "features_premium": "Premium", + "features_f_apps": "Acceso a todas las aplicaciones", + "features_f_core": "Características comunes", "features_f_core_note": "Editar, Importar y Exportar, Historial, Lista de usuarios, Chat", - "features_f_file0": "Abrir archivos", - "features_f_file0_note": "Ver y descargar archivos compartidos por otros usuarios", + "features_f_file0": "Abrir documentos", + "features_f_file0_note": "Ver y descargar documentos compartidos por otros usuarios", "features_f_cryptdrive0": "Acceso limitado a CryptDrive", "features_f_cryptdrive0_note": "Posibilidad de almacenar los pads visitados en su navegador para poder abrirlos más tarde", "features_f_storage0": "Tiempo de almacenamiento limitado", - "features_f_storage0_note": "Las Pads creadas corren el riesgo de eliminación después de 3 meses de inactividad", + "features_f_storage0_note": "Los documentos se eliminan después de {0} días de inactividad", "features_f_anon": "Todas las funciones de usuario anónimo", - "features_f_anon_note": "Con mejor usabilidad y más poder sobre tus pads", + "features_f_anon_note": "Con funcionalidad adicional", "features_f_cryptdrive1": "Funcionalidad completa de CryptDrive", "features_f_cryptdrive1_note": "Carpetas, compartir carpetas, plantillas, tareas", "features_f_devices": "Tus pads en todos tus dispositivos", "features_f_devices_note": "Acceda a su CryptDrive en todas partes con su cuenta de usuario", - "features_f_social": "Aplicaciones sociales", - "features_f_social_note": "Crear un perfil, usar un avatar, hablar con contactos", + "features_f_social": "Características sociales", + "features_f_social_note": "Añadir contactos para una colaboración segura, crear un perfil, controles de acceso detallados", "features_f_file1": "Subir y compartir archivos", - "features_f_file1_note": "Compartir archivos con tus contactos o incrustarlo en tus notas", - "features_f_storage1": "Almacenamiento permanente (50 MB)", - "features_f_storage1_note": "Los Pads almacenados en su CryptDrive nunca se eliminan por inactividad", + "features_f_file1_note": "Almacena archivos en tu CryptDrive: imágenes, PDFs, vídeos y mucho más. Compártelos con tus contactos o incrústalos en tus documentos. (hasta {0}MB)", + "features_f_storage1": "Almacenamiento Personal ({0})", + "features_f_storage1_note": "Los documentos almacenados en su CryptDrive no se borran por inactividad", "features_f_register": "Registrate gratis", "features_f_reg": "Todas las funciones de usuario registrado", - "features_f_reg_note": "Y ayudar al desarrollo de CryptPad", + "features_f_reg_note": "Con beneficios adicionales", "features_f_storage2": "Espacio de almacenamiento adicional", - "features_f_storage2_note": "De 5GB a 50GB dependiendo del plan seleccionado", + "features_f_storage2_note": "De 5GB a 50GB según el plan, límite aumentado de {0}MB para la subida de archivos", "features_f_support": "Soporte más rápido", - "features_f_support_note": "Soporte profesional por correo electrónico con el plan Team", - "features_f_supporter": "Conviértete en un defensor de la privacidad", - "features_f_supporter_note": "Ayúdenos a mostrar que el software para mejorar la privacidad debería ser la norma", - "features_f_subscribe": "Suscríbase a premium", - "features_f_subscribe_note": "Primero debe iniciar sesión en CryptPad", + "features_f_support_note": "Respuesta prioritaria del equipo de administración a través del correo electrónico y del sistema de tickets incorporado", + "features_f_supporter": "Apoyar la privacidad", + "features_f_supporter_note": "Ayudar a CryptPad a ser financieramente sostenible y demostrar que el software de mejora de la privacidad financiado voluntariamente por los usuarios debería ser la norma", + "features_f_subscribe": "Suscribirse", + "features_f_subscribe_note": "Se necesita una cuenta registrada para suscribirse", "four04_pageNotFound": "No pudimos encontrar la página que estabas buscando.", "help_genericMore": "Obtenga más información sobre cómo CryptPad puede funcionar para usted leyendo nuestras Preguntas frecuentes ", "storageStatus": "Almacenamiento:
{0} usado de {1}", "settings_cursorColorTitle": "Color de puntero", "mdToolbar_button": "Mostrar u ocultar la barra de herramientas de Markdown", - "creation_404": "Esta almohadilla ya no existe. Utilice el siguiente formulario para crear un nuevo pad.", - "creation_owned1": "Un pad propio puede ser eliminado del servidor cuando el propietario lo desee. Al eliminar un pad propio se elimina de los CryptDrives de otros usuarios.", - "settings_padNotifTitle": "Notificaciones de comentarios" + "creation_404": "Este pad ya no existe. Utilice el siguiente formulario para crear un nuevo pad.", + "creation_owned1": "Un objeto propiedad puede ser destruido cuando el propietario lo desee. La destrucción de un objeto propio hace que no esté disponible en los CryptDrives de otros usuarios.", + "settings_padNotifTitle": "Notificaciones de comentarios", + "password_info": "El bloc que intentas abrir no existe o está protegido con una contraseña. Ingrese la contraseña correcta para acceder a su contenido.", + "creation_newPadModalDescription": "Haz click en un tipo de documento para crearlo. Tú también puedes presionar Tab para seleccionar el tipo y presiona Enter para confirmar.", + "toolbar_degraded": "Actualmente hay más de {0} editores en este documento. La lista de usuarios y el chat están desactivados para mejorar el rendimiento.", + "oo_lostEdits": "Lamentablemente, las ediciones recientes no guardadas no se pueden recuperar después de sincronizar el nuevo contenido.", + "properties_passwordError": "Se ha producido un error al intentar cambiar la contraseña. Por favor, inténtelo de nuevo.", + "properties_passwordSame": "Las nuevas contraseñas deben diferir de la actual.", + "properties_confirmChange": "¿Está seguro? Al cambiar la contraseña se eliminará su historial. Los usuarios que no tengan la nueva contraseña perderán el acceso a este pad", + "properties_confirmNew": "¿Está seguro? Añadir una contraseña cambiará la URL de este pad y eliminará su historial. Los usuarios sin la contraseña perderán el acceso a este pad", + "properties_changePassword": "Cambiar la contraseña", + "properties_addPassword": "Añadir una contraseña", + "password_submit": "Enviar", + "password_placeholder": "Escriba la contraseña aquí...", + "password_error": "¡No se ha encontrado el pad!
Este error puede ser causado por dos factores: o la contraseña no es válida, o el pad ha sido borrado del servidor.", + "creation_passwordValue": "Contraseña", + "creation_expiration": "Fecha de vencimiento", + "creation_noOwner": "Sin propietario", + "creation_owners": "Propietarios", + "creation_create": "Crear", + "creation_newTemplate": "Nueva plantilla", + "creation_noTemplate": "Sin plantilla", + "creation_password": "Contraseña\n", + "creation_expireMonths": "Mes(es)", + "creation_expireDays": "Día(s)", + "creation_expireHours": "Hora(s)", + "creation_expireFalse": "Ilimitado", + "creation_expire": "Pad expirando", + "creation_owned": "Pad propio", + "share_linkCategory": "Enlace", + "sharedFolders_forget": "Este bloc sólo se almacena en una carpeta compartida, no puedes moverlo a la papelera. Puedes usar tu CryptDrive si quieres borrarlo.", + "share_mediatagCopy": "Copiar mediatag al portapapeles", + "share_contactCategory": "Contactos", + "share_linkCopy": "Copiar", + "share_linkOpen": "Previsualizar", + "share_linkView": "Ver", + "share_linkEdit": "Editar", + "share_linkAccess": "Permisos de acceso", + "properties_passwordWarning": "La contraseña ha sido cambiada con éxito pero fue incapaz de actualizar tu CryptDrive con los nuevos datos. Es posible que tenga que eliminar la versión antigua del pad manualmente.
Pulse OK para recargar y actualizar sus derechos de acceso.", + "properties_passwordSuccess": "La contraseña ha sido cambiada con éxito.
Pulsa OK para recargar y actualizar tus derechos de acceso." } From 3141d7add18b4782891a615665062a19e15c78f1 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 22 Mar 2021 14:12:14 +0530 Subject: [PATCH 17/18] remove trailing slashes from configured origins in both the server and the example config file --- config/config.example.js | 2 +- server.js | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/config/config.example.js b/config/config.example.js index 855a848e3..37fd5ada9 100644 --- a/config/config.example.js +++ b/config/config.example.js @@ -54,7 +54,7 @@ module.exports = { * and it may have unintended consequences in practice. * */ - httpUnsafeOrigin: 'http://localhost:3000/', + httpUnsafeOrigin: 'http://localhost:3000', /* httpSafeOrigin is the URL that is used for the 'sandbox' described above. * If you're testing or developing with CryptPad on your local machine then diff --git a/server.js b/server.js index f3ee71d0b..d2df3bba6 100644 --- a/server.js +++ b/server.js @@ -16,15 +16,19 @@ var Env = require("./lib/env").create(config); var app = Express(); +var canonicalizeOrigin = function (s) { + return (s || '').trim().replace(/\/+$/, ''); +}; + (function () { // you absolutely must provide an 'httpUnsafeOrigin' if (typeof(config.httpUnsafeOrigin) !== 'string') { throw new Error("No 'httpUnsafeOrigin' provided"); } - config.httpUnsafeOrigin = config.httpUnsafeOrigin.trim(); + config.httpUnsafeOrigin = canonicalizeOrigin(config.httpUnsafeOrigin); if (typeof(config.httpSafeOrigin) === 'string') { - config.httpSafeOrigin = config.httpSafeOrigin.trim().replace(/\/$/, ''); + config.httpSafeOrigin = canonicalizeOrigin(config.httpSafeOrigin); } // fall back to listening on a local address From 91266a701811ba3dd54cafb02cfe0e061d6adff3 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 22 Mar 2021 14:22:24 +0530 Subject: [PATCH 18/18] open new links from the 'about CryptPad' menu in a new tab --- www/common/common-ui-elements.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 562c3757c..08c84d1e6 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -1552,6 +1552,8 @@ define([ faqLine, ]); + $(content).find('a').attr('target', '_blank'); + var buttons = [ { className: 'primary',