CryptPad: Zero Knowledge, Collaborative Real Time Editing
+
diff --git a/rpc.js b/rpc.js
index c27c15f92..ebc6ae96d 100644
--- a/rpc.js
+++ b/rpc.js
@@ -95,8 +95,7 @@ var unescapeKeyCharacters = function (key) {
return key.replace(/\-/g, '/');
};
-// TODO Rename to getSession ?
-var beginSession = function (Sessions, key) {
+var getSession = function (Sessions, key) {
var safeKey = escapeKeyCharacters(key);
if (Sessions[safeKey]) {
Sessions[safeKey].atime = +new Date();
@@ -136,7 +135,7 @@ var expireSessions = function (Sessions) {
var addTokenForKey = function (Sessions, publicKey, token) {
if (!Sessions[publicKey]) { throw new Error('undefined user'); }
- var user = beginSession(Sessions, publicKey);
+ var user = getSession(Sessions, publicKey);
user.tokens.push(token);
user.atime = +new Date();
if (user.tokens.length > 2) { user.tokens.shift(); }
@@ -158,7 +157,7 @@ var isValidCookie = function (Sessions, publicKey, cookie) {
return false;
}
- var user = beginSession(Sessions, publicKey);
+ var user = getSession(Sessions, publicKey);
if (!user) { return false; }
var idx = user.tokens.indexOf(parsed.seq);
@@ -213,7 +212,7 @@ var checkSignature = function (signedMsg, signature, publicKey) {
};
var loadUserPins = function (Env, publicKey, cb) {
- var session = beginSession(Env.Sessions, publicKey);
+ var session = getSession(Env.Sessions, publicKey);
if (session.channels) {
return cb(session.channels);
@@ -579,7 +578,7 @@ var pinChannel = function (Env, publicKey, channels, cb) {
// get channel list ensures your session has a cached channel list
getChannelList(Env, publicKey, function (pinned) {
- var session = beginSession(Env.Sessions, publicKey);
+ var session = getSession(Env.Sessions, publicKey);
// only pin channels which are not already pinned
var toStore = channels.filter(function (channel) {
@@ -622,7 +621,7 @@ var unpinChannel = function (Env, publicKey, channels, cb) {
}
getChannelList(Env, publicKey, function (pinned) {
- var session = beginSession(Env.Sessions, publicKey);
+ var session = getSession(Env.Sessions, publicKey);
// only unpin channels which are pinned
var toStore = channels.filter(function (channel) {
@@ -647,7 +646,7 @@ var unpinChannel = function (Env, publicKey, channels, cb) {
var resetUserPins = function (Env, publicKey, channelList, cb) {
if (!Array.isArray(channelList)) { return void cb('INVALID_PIN_LIST'); }
- var session = beginSession(Env.Sessions, publicKey);
+ var session = getSession(Env.Sessions, publicKey);
if (!channelList.length) {
return void getHash(Env, publicKey, function (e, hash) {
@@ -812,7 +811,7 @@ var upload = function (Env, publicKey, content, cb) {
catch (e) { return void cb('DECODE_BUFFER'); }
var len = dec.length;
- var session = beginSession(Env.Sessions, publicKey);
+ var session = getSession(Env.Sessions, publicKey);
if (typeof(session.currentUploadSize) !== 'number' ||
typeof(session.currentUploadSize) !== 'number') {
@@ -844,7 +843,7 @@ var upload = function (Env, publicKey, content, cb) {
var upload_cancel = function (Env, publicKey, cb) {
var paths = Env.paths;
- var session = beginSession(Env.Sessions, publicKey);
+ var session = getSession(Env.Sessions, publicKey);
delete session.currentUploadSize;
delete session.pendingUploadSize;
if (session.blobstage) { session.blobstage.close(); }
@@ -874,7 +873,7 @@ var isFile = function (filePath, cb) {
var upload_complete = function (Env, publicKey, cb) {
var paths = Env.paths;
- var session = beginSession(Env.Sessions, publicKey);
+ var session = getSession(Env.Sessions, publicKey);
if (session.blobstage && session.blobstage.close) {
session.blobstage.close();
@@ -1171,7 +1170,7 @@ RPC.create = function (config /*:Config_t*/, cb /*:(?Error, ?Function)=>void*/)
// make sure a user object is initialized in the cookie jar
if (publicKey) {
- beginSession(Sessions, publicKey);
+ getSession(Sessions, publicKey);
} else {
console.log("No public key");
}
@@ -1317,7 +1316,7 @@ RPC.create = function (config /*:Config_t*/, cb /*:(?Error, ?Function)=>void*/)
return void upload_status(Env, safeKey, msg[1], function (e, yes) {
if (!e && !yes) {
// no pending uploads, set the new size
- var user = beginSession(Sessions, safeKey);
+ var user = getSession(Sessions, safeKey);
user.pendingUploadSize = filesize;
user.currentUploadSize = 0;
}
@@ -1351,7 +1350,7 @@ RPC.create = function (config /*:Config_t*/, cb /*:(?Error, ?Function)=>void*/)
}
// if session has not been authenticated, do so
- var session = beginSession(Sessions, safeKey);
+ var session = getSession(Sessions, safeKey);
if (typeof(session.privilege) !== 'boolean') {
return void isPrivilegedUser(publicKey, function (yes) {
session.privilege = yes;
diff --git a/www/common/application_config_internal.js b/www/common/application_config_internal.js
index bea0bc343..24c46b790 100644
--- a/www/common/application_config_internal.js
+++ b/www/common/application_config_internal.js
@@ -88,14 +88,14 @@ define(function() {
//config.hideUsageBar = true;
// Disable feedback for all the users and hide the settings part about feedback
- config.disableFeedback = true;
+ //config.disableFeedback = true;
// Add new options in the share modal (extend an existing tab or add a new tab).
// More info about how to use it on the wiki:
// https://github.com/xwiki-labs/cryptpad/wiki/Application-config#configcustomizeshareoptions
//config.customizeShareOptions = function (hashes, tabs, config) {};
- // Add code to be executed on every page before loading the user object. `isLoggedIn` is a boolean
+ // Add code to be executed on every page before loading the user object. `isLoggedIn` (bool) is
// indicating if the user is registered or anonymous. Here you can change the way anonymous users
// work in CryptPad, use an external SSO or even force registration
// *NOTE*: You have to call the `callback` function to continue the loading process
@@ -106,5 +106,10 @@ define(function() {
// *NOTE*: You have to call the `callback` function to continue the loading process
//config.afterLogin = function(api, callback) {};
+ // Disabling the profile app allows you to import the profile informations (display name, avatar)
+ // from an external source and make sure the users can't change them from CryptPad.
+ // You can use config.afterLogin to import these values in the users' drive.
+ //config.disableProfile = true;
+
return config;
});
diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js
index dbbf86b71..0100be3f8 100644
--- a/www/common/common-ui-elements.js
+++ b/www/common/common-ui-elements.js
@@ -1274,7 +1274,7 @@ define([
$userAdminContent.append($userAccount).append(Util.fixHTML(accountName));
$userAdminContent.append($(' '));
}
- if (config.displayName) {
+ if (config.displayName && !AppConfig.disableProfile) {
// Hide "Display name:" in read only mode
$userName.append(Messages.user_displayName + ': ');
$userName.append($displayedName);
@@ -1297,14 +1297,14 @@ define([
});
}
// Add the change display name button if not in read only mode
- if (config.changeNameButtonCls && config.displayChangeName) {
+ if (config.changeNameButtonCls && config.displayChangeName && !AppConfig.disableProfile) {
options.push({
tag: 'a',
attributes: {'class': config.changeNameButtonCls},
content: Messages.user_rename
});
}
- if (accountName) {
+ if (accountName && !AppConfig.disableProfile) {
options.push({
tag: 'a',
attributes: {'class': 'cp-toolbar-menu-profile'},
diff --git a/www/common/toolbar3.js b/www/common/toolbar3.js
index 03cb9d7c1..c7afbaca8 100644
--- a/www/common/toolbar3.js
+++ b/www/common/toolbar3.js
@@ -238,55 +238,57 @@ define([
var $nameValue = $('', {
'class': 'cp-toolbar-userlist-name-value'
}).text(name).appendTo($nameSpan);
- var $button = $('