diff --git a/customize.dist/pages.js b/customize.dist/pages.js index 5fac0939b..4a3f37b8c 100644 --- a/customize.dist/pages.js +++ b/customize.dist/pages.js @@ -76,7 +76,7 @@ define([ ]) ]) ]), - h('div.cp-version-footer', "CryptPad v1.16.0 (Qalupalik)") + h('div.cp-version-footer', "CryptPad v1.17.0 (Ratatoskr)") ]); }; @@ -524,8 +524,8 @@ define([ h('div.row.cp-register-test',[ h('hr'), h('div.col-12', [ - setHTML(h('p.test-details'), Msg.register_testimonial), - h('a.cp-test-source.pull-right', { href : 'http://boingboing.net/2016/09/26/cryptpad-a-freeopen-end-to.html'}, Msg.register_testimonial_name) + setHTML(h('p.test-details'), " \"Tools like Etherpad and Google Docs [...] all share a weakness, which is that whomever owns the document server can see everything you're typing. Cryptpad is a free/open project that uses some of the ideas behind blockchain to implement a \"zero-knowledge\" version of a collaborative document editor, ensuring that only the people working on a document can see it.\" "), + h('a.cp-test-source.pull-right', { href : 'http://boingboing.net/2016/09/26/cryptpad-a-freeopen-end-to.html'}, "Cory Doctorow") ]) ]) ]), @@ -558,8 +558,7 @@ define([ placeholder: Msg.login_password, }), h('div.extra', [ - h('button.login.first.btn', Msg.login_login), - h('button#register.btn.register.cp-login-register', Msg.login_register) + h('button.login.first.btn', Msg.login_login) ]) ]) ]), @@ -657,7 +656,7 @@ define([ h('br') ]), h('div#cp-app-poll-table-container', [ - h('div#cp-app-poll-table-scroll'), + h('div#cp-app-poll-table-scroll', [h('table')]), h('button#cp-app-poll-create-user.btn.btn-secondary', { title: Msg.poll_create_user }, h('span.fa.fa-plus')), @@ -669,9 +668,12 @@ define([ h('h2#cp-app-poll-comments-add-title', Msg.poll_comment_add), h('div#cp-app-poll-comments-add', [ h('input.cp-app-poll-comments-add-name', { - type: 'text' + type: 'text', + placeholder: Msg.anonymous + }), + h('textarea.cp-app-poll-comments-add-msg', { + placeholder: Msg.poll_comment_placeholder }), - h('textarea.cp-app-poll-comments-add-msg'), h('button.cp-app-poll-comments-add-submit.btn.btn-secondary', Msg.poll_comment_submit), h('button.cp-app-poll-comments-add-cancel.btn.btn-secondary', @@ -679,7 +681,8 @@ define([ ]), h('h2#cp-app-poll-comments-list-title', Msg.poll_comment_list), h('div#cp-app-poll-comments-list') - ]) + ]), + h('div#cp-app-poll-nocomments', Msg.poll_comment_disabled) ]) ]) ]) diff --git a/customize.dist/src/less2/pages/page-login.less b/customize.dist/src/less2/pages/page-login.less index 3e5e4e77f..2b8064486 100644 --- a/customize.dist/src/less2/pages/page-login.less +++ b/customize.dist/src/less2/pages/page-login.less @@ -54,19 +54,11 @@ } .extra { margin-top: 1em; - .cp-login-register { - color: @cryptpad_color_blue; - background: #fff; - border: 2px solid @cryptpad_color_blue; - border-radius: 0; - &:hover { - transform: scale(1.05); - } - } .login { - background: transparent; - color: @cryptpad_color_blue; - padding: 0; + background: @cryptpad_color_blue; + color: #fff; + padding: 10px; + border-radius: 0; &:hover { transform: scale(1.05); } diff --git a/customize.dist/translations/messages.fr.js b/customize.dist/translations/messages.fr.js index 49cf9fdb1..c99a10c06 100644 --- a/customize.dist/translations/messages.fr.js +++ b/customize.dist/translations/messages.fr.js @@ -156,8 +156,10 @@ define(function () { out.filePicker_filter = "Filtrez les fichiers par leur nom"; out.or = 'ou'; - out.tags_title = "Mots-clés du pad"; + out.tags_title = "Mots-clés du pad (pour vous uniquement)"; out.tags_add = "Modifier les mots-clés du pad"; + out.tags_searchHint = "Commencez une recherche par # dans votre CryptDrive pour retrouver vos pads par mot-clé."; + out.tags_notShared = "Vos mots-clés ne sont pas partagés avec les autres utilisateurs."; out.tags_duplicate = "Mot-clé déjà présent : {0}"; out.slideOptionsText = "Options"; @@ -265,6 +267,9 @@ define(function () { out.poll_comment_add = "Ajouter un commentaire"; out.poll_comment_submit = "Envoyer"; out.poll_comment_remove = "Supprimer ce commentaire"; + out.poll_comment_placeholder = "Votre commentaire"; + + out.poll_comment_disabled = "Publiez ce sondage en utilisant le bouton ✓ afin d'activer les commentaires."; // Canvas out.canvas_clear = "Nettoyer"; @@ -392,6 +397,7 @@ define(function () { out.fc_remove = "Supprimer définitivement"; out.fc_empty = "Vider la corbeille"; out.fc_prop = "Propriétés"; + out.fc_hashtag = "Mots-clés"; out.fc_sizeInKilobytes = "Taille en kilo-octets"; // fileObject.js (logs) out.fo_moveUnsortedError = "La liste des éléments non triés ne peut pas contenir de dossiers."; @@ -539,6 +545,12 @@ define(function () { out.main_howitworks_p1 = 'CryptPad utilise une variante de l\'algorithme d\'Operational transformation qui est capable de trouver un consensus distribué en utilisant une chaîne de bloc Nakamoto, un outil popularisé par le Bitcoin. De cette manière, l\'algorithme évite la nécessité d\'utiliser un serveur central pour résoudre les conflits d\'édition de l\'Operational Transformation, et sans ce besoin de résolution des conflits le serveur peut rester ignorant du contenu qui est édité dans le pad.'; //contact.html out.main_about_p2 = 'Si vous avez des questions ou commentaires, vous pouvez nous tweeter, ouvrir une issue sur GitHub, venir dire bonjour sur notre salle Matrix ou IRC (#cryptpad sur irc.freenode.net), ou bien encore nous envoyer un email.'; + out.main_about_p22 = 'Tweetez nous'; + out.main_about_p23 = 'Ouvrez un ticket (GitHub)'; + out.main_about_p24 = 'Dites Bonjour (Matrix)'; + out.main_about_p25 = 'Envoyez-nous un email'; + out.main_about_p26 = 'Si vous avez une question ou des remarques, n\'hésitez pas à nous contacter !'; + out.main_info = "

Collaborez avec confiance


Développez vos idées en groupe avec des documents partagés; la technologie Zero Knowledge sécurise vos données."; out.main_catch_phrase = "Le Cloud Zero Knowledge"; @@ -584,6 +596,25 @@ define(function () { out.topbar_whatIsCryptpad = "Qu'est-ce que CryptPad"; + // what-is-cryptpad.html + + out.whatis_title = "Qu'est-ce que CryptPad"; + out.whatis_collaboration = 'Collaboration rapide, facile'; + out.whatis_collaboration_p1 = "Avec CryptPad, vous pouvez créer rapidement des documents collaboratifs pour prendre des notes à plusieurs. Quand vous vous enregistrez et vous vous connectez, vous obtenez la possibilité d'importer des fichiers dans un CryptDrive où vous pouvez organiser tous vos pads (documents). En tant qu'utilisateur enregistré, vous possédez 50 Mo de stockage gratuit."; + out.whatis_collaboration_p2 = "Vous pouvez partager l'accès à un document simplement en partageant le lien. Vous pouvez aussi partager un lien spécial fournissant un accès en lecture seule au pad, permettant du publier des travaux collaboratifs tout en restant maître de l'édition."; + out.whatis_collaboration_p3 = "Vous pouvez créer des documents de texte avec CKEditor tout comme des documents Markdown qui sont rendus en temps-réel pendant que vous tapez. Vous pouvez aussi utiliser l'application de sondage pour planifier des évènements avec plusieurs participants."; + out.whatis_zeroknowledge = 'Zero Knowledge'; + out.whatis_zeroknowledge_p1 = "Nous ne souhaitons pas connaître ce que vous tapez et grâce à la cryptographie moderne, vous pouvez être assuré que nous ne le pouvons pas. CryptPad utilise un chiffrement à 100% côté client pour protéger le contenu que vous tapez de nous, les personnes contrôlant le serveur."; + out.whatis_zeroknowledge_p2 = "Quand vous vous enregistrez et vous vous connectez, votre nom d'utilisateur et votre mot de passe sont transformés en une clé secrète grâce à la fonction de dérivation de clé Scrypt. Ni cette clé, ni le nom d'utilisateur ou le mot de passe, ne sont envoyés au serveur. À la place, elle est utilisée côté client pour chiffrer et déchiffrer le contenu de votre CryptDrive, qui contient toutes les clés permettant d'accéder à vos pads."; + out.whatis_zeroknowledge_p3 = "Quand vous partagez le lien vers un document, vous partagez la clé cryptographique permettant de déchiffrer le document, mais puisque cette clé se trouve dans l'identificateur de fragment, elle n'est jamais envoyée au serveur. Venez lire notre article de blog sur la vie privée pour en apprendre davantage sur le type de métadonnées auxquelles nous avons ou n'avons pas accès."; + out.whatis_drive = "Organisation avec CryptDrive"; + out.whatis_drive_p1 = "Dés que vous accédez à un pad dans CryptPad, celui-ci est automatiquement ajouté à votre CryptDrive, dans le dossier principal. Vous pouvez alors ranger ce pad dans un dossier ou le déplacer vers la corbeille. CryptDrive vous permet de rechercher parmi vos pads et de les organiser quand vous le souaitez, comme vous le souhaitez."; + out.whatis_drive_p2 = "Avec le glisser-déposer intuitif, vous pouvez déplacer vos pads dans votre drive tout en conservant les liens vers ces pads pour que vos collaborateurs n'en perdent pas l'accès"; + out.whatis_drive_p3 = "Vous pouvez également importer des fichier dans votre CryptDrive et les partager avec des collègues. Les fichiers importés peuvent être rangés de la même manière que vos pads collaboratifs."; + out.whatis_business = 'CryptPad for Business'; + out.whatis_business_p1 = "Le chiffrement Zero Knowledge de CryptPad excelle pour multiplier l'efficacité des protocoles de sécurité existants en recréant les contrôles d'accès organisationnels de manière cryptographique. Puisque les données sensibles ne peuvent être déchiffrées qu'en utilisant les identifiants d'un employé, CryptPad empêche d'éventuels hackers ayant réussi à s'introduire dans le serveur d'avoir accès en clair à ces données. Découvrez-en plus sur la manière dont CryptPad peut aider votre entreprise en lisant le CryptPad Whitepaper."; + out.whatis_business_p2 = "CryptPad est déployable sur site et les développeurs CryptPad chez XWiki SAS peuvent effectuer du développement, des personnalisations et du support commercial. Contactez-nous à sales@cryptpad.fr pour plus d'informations."; + // privacy.html out.policy_title = 'Politique de confidentialité de CryptPad'; @@ -697,6 +728,7 @@ define(function () { out.tips.drive = "Les utilisateurs enregistrés peuvent organiser leurs fichiers dans leur CryptDrive, accessible depuis l'icône CryptPad dans le coin supérieur gauche des pads."; out.tips.profile = "Les utilisateurs enregistrés peuvent créer un profil depuis le menu utilisateur, dans le coin supérieur droit."; out.tips.avatars = "Vous pouvez uploader un avatar dans votre profil. Les autres personnes le verront dans la liste d'utilisateurs des pads."; + out.tips.tags = "Ajoutez des mots-clés aux pads et effectuer une recherche commençant par # dans votre CryptDrive pour les retrouver."; out.feedback_about = "Si vous lisez ceci, vous vous demandez probablement pourquoi CryptPad envoie des requêtes vers des pages web quand vous realisez certaines actions."; out.feedback_privacy = "Nous prenons au sérieux le respect de votre vie privée, et en même temps nous souhaitons rendre CryptPad très simple à utiliser. Nous utilisons cette page pour comprendre quelles fonctionnalités dans l'interface comptent le plus pour les utilisateurs, en l'appelant avec un paramètre spécifiant quelle action a été réalisée."; diff --git a/customize.dist/translations/messages.js b/customize.dist/translations/messages.js index a5afb6ec7..df86d5be3 100644 --- a/customize.dist/translations/messages.js +++ b/customize.dist/translations/messages.js @@ -158,9 +158,11 @@ define(function () { out.filePicker_filter = "Filter files by name"; out.or = 'or'; - out.tags_title = "Tags"; + out.tags_title = "Tags (for you only)"; out.tags_add = "Update this page's tags"; out.tags_searchHint = "Find files by their tags by searching in your CryptDrive"; + out.tags_searchHint = "Start a search with # in your CryptDrive to find your tagged pads."; + out.tags_notShared = "Your tags are not shared with other users"; out.tags_duplicate = "Duplicate tag: {0}"; @@ -270,6 +272,9 @@ define(function () { out.poll_comment_add = "Add a comment"; out.poll_comment_submit = "Send"; out.poll_comment_remove = "Delete this comment"; + out.poll_comment_placeholder = "Your comment"; + + out.poll_comment_disabled = "Publish this poll using the ✓ button to enable the comments."; // Canvas out.canvas_clear = "Clear"; @@ -449,8 +454,6 @@ define(function () { "
  • If you are using a shared computer, you need to log out when you are done, closing the tab is not enough.
  • ", "" ].join(''); - out.register_testimonial =" \"Tools like Etherpad and Google Docs [...] all share a weakness, which is that whomever owns the document server can see everything you're typing. Cryptpad is a free/open project that uses some of the ideas behind blockchain to implement a \"zero-knowledge\" version of a collaborative document editor, ensuring that only the people working on a document can see it.\" "; - out.register_testimonial_name = "Cory Doctorow"; out.register_writtenPassword = "I have written down my username and password, proceed"; out.register_cancel = "Go back"; @@ -737,7 +740,7 @@ define(function () { out.tips.drive = "Logged in users can organize their files in their CryptDrive, accessible from the CryptPad icon at the top left of all pads."; out.tips.profile = "Registered users can create a profile from the user menu in the top right."; out.tips.avatars = "You can upload an avatar in your profile. People will see it when you collaborate in a pad."; - out.tips.tags = "You can hashtag pads, and then search by tag in your CryptDrive."; + out.tips.tags = "Tag your pads and start a search with # in your CryptDrive to find them"; out.feedback_about = "If you're reading this, you were probably curious why CryptPad is requesting web pages when you perform certain actions"; out.feedback_privacy = "We care about your privacy, and at the same time we want CryptPad to be very easy to use. We use this file to figure out which UI features matter to our users, by requesting it along with a parameter specifying which action was taken."; diff --git a/package.json b/package.json index 3dc9fca3b..df7b3bd79 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cryptpad", "description": "realtime collaborative visual editor with zero knowlege server", - "version": "1.16.0", + "version": "1.17.0", "dependencies": { "chainpad-server": "^1.0.1", "express": "~4.10.1", diff --git a/readme.md b/readme.md index 956077d15..9d32288ce 100644 --- a/readme.md +++ b/readme.md @@ -16,13 +16,17 @@ Installing CryptPad is pretty straightforward. You can read all about it in the It also contains information on keeping your instance of CryptPad up to date. +## Current version + +The most recent version and all past release notes can be found [here](https://github.com/xwiki-labs/cryptpad/releases/). + ## Setup using Docker -See [Cryptpad-Docker](docs/cryptpad-docker.md) +See [Cryptpad-Docker](docs/cryptpad-docker.md). ## Setup using Ansible -See [Ansible Role for Cryptpad](https://github.com/systemli/ansible-role-cryptpad) +See [Ansible Role for Cryptpad](https://github.com/systemli/ansible-role-cryptpad). # Security @@ -75,7 +79,7 @@ If you have any questions or comments, or if you're interested in contributing t This software is and will always be available under the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. If you wish to use this technology in a proprietary product, please contact -sales@xwiki.com +sales@xwiki.com. [ChainPad]: https://github.com/xwiki-contrib/chainpad [active attack]: https://en.wikipedia.org/wiki/Attack_(computing)#Types_of_attacks diff --git a/www/common/common-file.js b/www/common/common-file.js index 0c3eadd36..6b1f33505 100644 --- a/www/common/common-file.js +++ b/www/common/common-file.js @@ -76,6 +76,7 @@ define([ common.renamePad(title || "", href, function (err) { if (err) { return void console.error(err); } onComplete(href); + common.setPadAttribute('fileType', metadata.type, null, href); }); }); }; diff --git a/www/common/common-interface.js b/www/common/common-interface.js index badfa4e57..644efded2 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -179,9 +179,11 @@ define([ var tagger = dialog.frame([ dialog.message([ Messages.tags_add, - h('p', Messages.tags_searchHint) + h('br'), + Messages.tags_searchHint, ]), input, + h('center', h('small', Messages.tags_notShared)), dialog.nav(), ]); diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index 863d97d07..4962bd072 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -489,8 +489,8 @@ define([ }; // STORAGE - common.setPadAttribute = function (attr, value, cb) { - var href = getRelativeHref(window.location.href); + common.setPadAttribute = function (attr, value, cb, href) { + href = getRelativeHref(href || window.location.href); getStore().setPadAttribute(href, attr, value, cb); }; common.setDisplayName = function (value, cb) { @@ -1204,8 +1204,8 @@ define([ }; // Forget button - var moveToTrash = common.moveToTrash = function (cb) { - var href = window.location.href; + var moveToTrash = common.moveToTrash = function (cb, href) { + href = href || window.location.href; common.forgetPad(href, function (err) { if (err) { console.log("unable to forget pad"); diff --git a/www/common/sframe-common-codemirror.js b/www/common/sframe-common-codemirror.js index f90b47985..30f164296 100644 --- a/www/common/sframe-common-codemirror.js +++ b/www/common/sframe-common-codemirror.js @@ -62,6 +62,46 @@ define([ editor.scrollTo(scroll.left, scroll.top); }; + module.getHeadingText = function (editor) { + var lines = editor.getValue().split(/\n/); + + var text = ''; + lines.some(function (line) { + // lines including a c-style comment are also valuable + var clike = /^\s*(\/\*|\/\/)(.*)?(\*\/)*$/; + if (clike.test(line)) { + line.replace(clike, function (a, one, two) { + if (!(two && two.replace)) { return; } + text = two.replace(/\*\/\s*$/, '').trim(); + }); + return true; + } + + // lisps? + var lispy = /^\s*(;|#\|)+(.*?)$/; + if (lispy.test(line)) { + line.replace(lispy, function (a, one, two) { + text = two; + }); + return true; + } + + // lines beginning with a hash are potentially valuable + // works for markdown, python, bash, etc. + var hash = /^#+(.*?)$/; + if (hash.test(line)) { + line.replace(hash, function (a, one) { + text = one; + }); + return true; + } + + // TODO make one more pass for multiline comments + }); + + return text.trim(); + }; + module.create = function (Common, defaultMode, CMeditor) { var exp = {}; var Messages = Cryptpad.Messages; @@ -152,43 +192,7 @@ define([ }()); exp.getHeadingText = function () { - var lines = editor.getValue().split(/\n/); - - var text = ''; - lines.some(function (line) { - // lines including a c-style comment are also valuable - var clike = /^\s*(\/\*|\/\/)(.*)?(\*\/)*$/; - if (clike.test(line)) { - line.replace(clike, function (a, one, two) { - if (!(two && two.replace)) { return; } - text = two.replace(/\*\/\s*$/, '').trim(); - }); - return true; - } - - // lisps? - var lispy = /^\s*(;|#\|)+(.*?)$/; - if (lispy.test(line)) { - line.replace(lispy, function (a, one, two) { - text = two; - }); - return true; - } - - // lines beginning with a hash are potentially valuable - // works for markdown, python, bash, etc. - var hash = /^#+(.*?)$/; - if (hash.test(line)) { - line.replace(hash, function (a, one) { - text = one; - }); - return true; - } - - // TODO make one more pass for multiline comments - }); - - return text.trim(); + return module.getHeadingText(editor); }; exp.configureLanguage = function (cb, onModeChanged) { diff --git a/www/common/sframe-common-file.js b/www/common/sframe-common-file.js index 10bb8fbac..a2abd006a 100644 --- a/www/common/sframe-common-file.js +++ b/www/common/sframe-common-file.js @@ -1,8 +1,9 @@ define([ 'jquery', '/file/file-crypto.js', + '/common/common-thumbnail.js', '/bower_components/tweetnacl/nacl-fast.min.js', -], function ($, FileCrypto) { +], function ($, FileCrypto, Thumb) { var Nacl = window.nacl; var module = {}; @@ -220,30 +221,46 @@ define([ var handleFile = File.handleFile = function (file, e, thumbnail) { var thumb; - var finish = function (arrayBuffer) { + var file_arraybuffer; + var finish = function () { var metadata = { name: file.name, type: file.type, }; if (thumb) { metadata.thumbnail = thumb; } queue.push({ - blob: arrayBuffer, + blob: file_arraybuffer, metadata: metadata, dropEvent: e }); }; - var processFile = function () { - blobToArrayBuffer(file, function (e, buffer) { - finish(buffer); - }); - }; - - if (!thumbnail) { return void processFile(); } - blobToArrayBuffer(thumbnail, function (e, buffer) { + blobToArrayBuffer(file, function (e, buffer) { if (e) { console.error(e); } - thumb = arrayBufferToString(buffer); - processFile(); + file_arraybuffer = buffer; + if (thumbnail) { // there is already a thumbnail + return blobToArrayBuffer(thumbnail, function (e, buffer) { + if (e) { console.error(e); } + thumb = arrayBufferToString(buffer); + finish(); + }); + } + + if (!Thumb.isSupportedType(file.type)) { return finish(); } + // make a resized thumbnail from the image.. + Thumb.fromImageBlob(file, function (e, thumb_blob) { + if (e) { console.error(e); } + if (!thumb_blob) { return finish(); } + + blobToArrayBuffer(thumb_blob, function (e, buffer) { + if (e) { + console.error(e); + return finish(); + } + thumb = arrayBufferToString(buffer); + finish(); + }); + }); }); }; diff --git a/www/common/sframe-common-interface.js b/www/common/sframe-common-interface.js index 0a128b31d..52d95b040 100644 --- a/www/common/sframe-common-interface.js +++ b/www/common/sframe-common-interface.js @@ -150,9 +150,6 @@ define([ 'class': "fa fa-trash cryptpad-forget", style: 'font:'+size+' FontAwesome' }); - if (!common.isStrongestStored()) { - button.addClass('cp-toolbar-hidden'); - } if (callback) { button .click(common.prepareFeedback(type)) @@ -216,7 +213,7 @@ define([ title: Messages.tags_title, }) .click(common.prepareFeedback(type)) - .click(function () { UI.updateTags(null); }); + .click(function () { UI.updateTags(common, null); }); break; default: button = $('