diff --git a/www/assert/main.js b/www/assert/main.js
index e0b437f58..17769868d 100644
--- a/www/assert/main.js
+++ b/www/assert/main.js
@@ -309,6 +309,43 @@ define([
parsed.keys.symmetric.length === keys.symmetric.length);
}, 'parse a block hash');
+ assert(function (cb) {
+ var v1 = Hash.isValidHref('https://cryptpad.fr/pad');
+ var v2 = Hash.isValidHref('https://cryptpad.fr/pad/');
+ var v3 = Hash.isValidHref('/pad');
+ var v4 = Hash.isValidHref('/pad/');
+
+ var res = v1 && v2 && v3 && v4;
+ cb(res);
+ if (!res) {
+ console.log(v1, v2, v3, v4);
+ }
+ }, 'test isValidHref no hash');
+ assert(function (cb) {
+ var v1 = !Hash.isValidHref('https://cryptpad.fr/pad#'); // Invalid
+ var v2 = Hash.isValidHref('https://cryptpad.fr/pad/#');
+ var v3 = Hash.isValidHref('/pad#'); // Invalid
+ var v4 = Hash.isValidHref('/pad/#');
+
+ var res = v1 && v2 && v3 && v4;
+ cb(res);
+ if (!res) {
+ console.log(v1, v2, v3, v4);
+ }
+ }, 'test isValidHref empty hash');
+ assert(function (cb) {
+ var v1 = Hash.isValidHref('https://cryptpad.fr/pad/#/2/pad/edit/HGu0tK2od-2BBnwAz2ZNS-t4/p/embed');
+ var v2 = Hash.isValidHref('https://cryptpad.fr/pad/#/1/edit/CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G/present/embed');
+ var v3 = Hash.isValidHref('https://cryptpad.fr/pad/#67b8385b07352be53e40746d2be6ccd7XAYSuJYYqa9NfmInyHci7LNy');
+ var v4 = Hash.isValidHref('/pad/#/2/pad/edit/HGu0tK2od-2BBnwAz2ZNS-t4/p/embed');
+
+ var res = v1 && v2 && v3 && v4;
+ cb(res);
+ if (!res) {
+ console.log(v1, v2, v3, v4);
+ }
+ }, 'test isValidHref hash');
+
assert(function (cb) {
try {
MediaTag(void 0).on('progress').on('decryption');
diff --git a/www/common/common-hash.js b/www/common/common-hash.js
index 1bdd3b702..71ad0977b 100644
--- a/www/common/common-hash.js
+++ b/www/common/common-hash.js
@@ -225,7 +225,7 @@ Version 1
var ret = {};
if (!href) { return ret; }
- if (href.slice(-1) !== '/') { href += '/'; }
+ if (href.slice(-1) !== '/' && href.slice(-1) !== '#') { href += '/'; }
href = href.replace(/\/\?[^#]+#/, '/#');
var idx;
@@ -246,6 +246,7 @@ Version 1
if (!/^https*:\/\//.test(href)) {
idx = href.indexOf('/#');
ret.type = href.slice(1, idx);
+ if (idx === -1) { return ret; }
ret.hash = href.slice(idx + 2);
ret.hashData = parseTypeHash(ret.type, ret.hash);
return ret;
diff --git a/www/common/sframe-common.js b/www/common/sframe-common.js
index b89cad5bb..5f4c1bdea 100644
--- a/www/common/sframe-common.js
+++ b/www/common/sframe-common.js
@@ -563,7 +563,7 @@ define([
msg = Messages.deletedError + '
' + Messages.errorRedirectToHome;
}
if (err === "INVALID_HASH") {
- msg = Messages.invalidHashError; // XXX
+ msg = Messages.invalidHashError;
}
UI.errorLoadingScreen(msg, false, function () {
funcs.gotoURL('/drive/');
diff --git a/www/common/translations/messages.fr.json b/www/common/translations/messages.fr.json
index 462a6afd4..6d73a29db 100644
--- a/www/common/translations/messages.fr.json
+++ b/www/common/translations/messages.fr.json
@@ -31,6 +31,7 @@
"deletedError": "Ce pad a été supprimé par son propriétaire et n'est donc plus disponible.",
"inactiveError": "Ce pad a été supprimé en raison de son inactivité. Appuyez sur Échap pour créer un nouveau pad.",
"chainpadError": "Une erreur critique est survenue lors de la mise à jour du contenu. Le pad est désormais en mode lecture seule afin de s'assurer que vous ne perdiez pas davantage de données.
Appuyez sur Échap pour voir le pad ou rechargez la page pour pouvoir le modifier à nouveau.",
+ "invalidHashError": "L'URL du document demandé n'est pas valide.",
"errorCopy": " Vous pouvez toujours copier son contenu ailleurs en appuyant sur Échap.
Dés que vous aurez quitté la page, il sera impossible de le récupérer.",
"errorRedirectToHome": "Appuyez sur Échap pour retourner vers votre CryptDrive.",
"newVersionError": "Une nouvelle version de CryptPad est disponible.
Rechargez la page pour utiliser la nouvelle version, ou appuyez sur Échap pour accéder au contenu actuel en mode hors-ligne.",
@@ -250,6 +251,8 @@
"poll_comment_placeholder": "Votre commentaire",
"poll_comment_disabled": "Publiez ce sondage en utilisant le bouton ✓ afin d'activer les commentaires.",
"oo_reconnect": "La connexion au serveur est rétablie. Cliquez sur OK pour recharger la page et continuer l'édition.",
+ "oo_cantUpload": "Impossible d'importer un document si d'autres utilisateurs sont présents.",
+ "oo_uploaded": "L'importation est terminée. Cliquez sur OK pour recharger la page ou sur Annuler pour continuer en lecture-seule",
"canvas_clear": "Nettoyer",
"canvas_delete": "Supprimer la sélection",
"canvas_disable": "Désactiver le dessin",
@@ -374,6 +377,7 @@
"fm_tags_used": "Nombre d'utilisations",
"fm_restoreDrive": "Restauration de votre CryptDrive à une version antérieure. Pour de meilleurs résultats, veuillez éviter de modifier votre CryptDrive avant que cette restauration ne soit terminée.",
"fm_moveNestedSF": "Vous ne pouvez pas placer un dossier partagé dans un autre. Le dossier {0} n'a pas été déplacé.",
+ "fm_passwordProtected": "Ce document est protégé avec un mot de passe",
"fc_newfolder": "Nouveau dossier",
"fc_newsharedfolder": "Nouveau dossier partagé",
"fc_rename": "Renommer",