Merge branch 'staging' of github.com:xwiki-labs/cryptpad into staging
commit
4de6bd6195
|
@ -1,11 +1,12 @@
|
|||
define([
|
||||
'jquery',
|
||||
'/api/config',
|
||||
'/common/hyperscript.js',
|
||||
'/common/outer/local-store.js',
|
||||
'/customize/messages.js',
|
||||
|
||||
'less!/customize/src/less2/pages/page-404.less',
|
||||
], function (Config, h, LocalStore, Messages) {
|
||||
], function ($, Config, h, LocalStore, Messages) {
|
||||
var urlArgs = Config.requireConf.urlArgs;
|
||||
var img = h('img#cp-logo', {
|
||||
src: '/customize/cryptpad-new-logo-colors-logoonly.png?' + urlArgs
|
||||
|
@ -20,6 +21,14 @@ define([
|
|||
href: loggedIn? '/drive/': '/',
|
||||
}, loggedIn? Messages.header_logoTitle: Messages.header_homeTitle);
|
||||
|
||||
if (Config.httpUnsafeOrigin && Config.httpUnsafeOrigin !== window.location.origin
|
||||
&& window.parent) {
|
||||
$(link).click(function (e) {
|
||||
e.preventDefault();
|
||||
window.parent.location = Config.httpUnsafeOrigin + $(link).attr('href').slice(1);
|
||||
});
|
||||
}
|
||||
|
||||
var content = h('div#cp-main', [
|
||||
img,
|
||||
brand,
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
<head>
|
||||
<title data-localization="main_title">CryptPad: Zero Knowledge, Collaborative Real Time Editing</title>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="description" content="CryptPad is an open-source browser-based suite of collaborative editors. It uses client-side encryption so that the server cannot read users' documents"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/main-favicon.png" id="favicon"/>
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||
|
|
27
rpc.js
27
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;
|
||||
|
|
|
@ -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;
|
||||
});
|
||||
|
|
|
@ -1274,7 +1274,7 @@ define([
|
|||
$userAdminContent.append($userAccount).append(Util.fixHTML(accountName));
|
||||
$userAdminContent.append($('<br>'));
|
||||
}
|
||||
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'},
|
||||
|
|
|
@ -238,55 +238,57 @@ define([
|
|||
var $nameValue = $('<span>', {
|
||||
'class': 'cp-toolbar-userlist-name-value'
|
||||
}).text(name).appendTo($nameSpan);
|
||||
var $button = $('<button>', {
|
||||
'class': 'fa fa-pencil cp-toolbar-userlist-name-edit',
|
||||
title: Messages.user_rename
|
||||
}).appendTo($nameSpan);
|
||||
$button.hover(function (e) { e.preventDefault(); e.stopPropagation(); });
|
||||
$button.mouseenter(function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
window.setTimeout(function () {
|
||||
$button.parents().mouseleave();
|
||||
if (!Config.disableProfile) {
|
||||
var $button = $('<button>', {
|
||||
'class': 'fa fa-pencil cp-toolbar-userlist-name-edit',
|
||||
title: Messages.user_rename
|
||||
}).appendTo($nameSpan);
|
||||
$button.hover(function (e) { e.preventDefault(); e.stopPropagation(); });
|
||||
$button.mouseenter(function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
window.setTimeout(function () {
|
||||
$button.parents().mouseleave();
|
||||
});
|
||||
});
|
||||
});
|
||||
var $nameInput = $('<input>', {
|
||||
'class': 'cp-toolbar-userlist-name-input'
|
||||
}).val(name).appendTo($rightCol);
|
||||
$button.click(function (e) {
|
||||
e.stopPropagation();
|
||||
$nameSpan.hide();
|
||||
$nameInput.show().focus().select();
|
||||
editingUserName.state = true;
|
||||
editingUserName.oldName = $nameInput.val();
|
||||
});
|
||||
$nameInput.click(function (e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
$nameInput.on('keydown', function (e) {
|
||||
if (e.which === 13 || e.which === 27) {
|
||||
$nameInput.hide();
|
||||
$nameSpan.show();
|
||||
$button.show();
|
||||
editingUserName.state = false;
|
||||
var $nameInput = $('<input>', {
|
||||
'class': 'cp-toolbar-userlist-name-input'
|
||||
}).val(name).appendTo($rightCol);
|
||||
$button.click(function (e) {
|
||||
e.stopPropagation();
|
||||
$nameSpan.hide();
|
||||
$nameInput.show().focus().select();
|
||||
editingUserName.state = true;
|
||||
editingUserName.oldName = $nameInput.val();
|
||||
});
|
||||
$nameInput.click(function (e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
$nameInput.on('keydown', function (e) {
|
||||
if (e.which === 13 || e.which === 27) {
|
||||
$nameInput.hide();
|
||||
$nameSpan.show();
|
||||
$button.show();
|
||||
editingUserName.state = false;
|
||||
}
|
||||
if (e.which === 13) {
|
||||
var newName = $nameInput.val(); // TODO clean
|
||||
$nameValue.text(newName);
|
||||
setDisplayName(newName);
|
||||
return;
|
||||
}
|
||||
if (e.which === 27) {
|
||||
$nameValue.text(editingUserName.oldName);
|
||||
return;
|
||||
}
|
||||
});
|
||||
if (editingUserName.state) {
|
||||
$button.click();
|
||||
$nameInput.val(editingUserName.value);
|
||||
$nameInput[0].setSelectionRange(editingUserName.select[0],
|
||||
editingUserName.select[1]);
|
||||
setTimeout(function () { $nameInput.focus(); });
|
||||
}
|
||||
if (e.which === 13) {
|
||||
var newName = $nameInput.val(); // TODO clean
|
||||
$nameValue.text(newName);
|
||||
setDisplayName(newName);
|
||||
return;
|
||||
}
|
||||
if (e.which === 27) {
|
||||
$nameValue.text(editingUserName.oldName);
|
||||
return;
|
||||
}
|
||||
});
|
||||
if (editingUserName.state) {
|
||||
$button.click();
|
||||
$nameInput.val(editingUserName.value);
|
||||
$nameInput[0].setSelectionRange(editingUserName.select[0],
|
||||
editingUserName.select[1]);
|
||||
setTimeout(function () { $nameInput.focus(); });
|
||||
}
|
||||
} else if (Common.isLoggedIn() && data.curvePublic && !friends[data.curvePublic]
|
||||
&& !priv.readOnly) {
|
||||
|
|
|
@ -9,6 +9,7 @@ define([
|
|||
'/common/common-interface.js',
|
||||
'/common/common-realtime.js',
|
||||
'/customize/messages.js',
|
||||
'/customize/application_config.js',
|
||||
'/bower_components/marked/marked.min.js',
|
||||
'cm/lib/codemirror',
|
||||
|
||||
|
@ -33,6 +34,7 @@ define([
|
|||
UI,
|
||||
Realtime,
|
||||
Messages,
|
||||
AppConfig,
|
||||
Marked,
|
||||
CodeMirror
|
||||
)
|
||||
|
@ -478,6 +480,10 @@ define([
|
|||
$(waitFor(UI.addLoadingScreen));
|
||||
SFCommon.create(waitFor(function (c) { APP.common = common = c; }));
|
||||
}).nThen(function (waitFor) {
|
||||
if (AppConfig.disableProfile) {
|
||||
common.gotoURL('/drive/');
|
||||
return;
|
||||
}
|
||||
APP.$container = $('#cp-sidebarlayout-container');
|
||||
APP.$toolbar = $('#cp-toolbar');
|
||||
APP.$leftside = $('<div>', {id: 'cp-sidebarlayout-leftside'}).appendTo(APP.$container);
|
||||
|
|
|
@ -74,6 +74,10 @@ define([
|
|||
var feedbackIdx = categories.account.indexOf('cp-settings-userfeedback');
|
||||
categories.account.splice(feedbackIdx, 1);
|
||||
}
|
||||
if (AppConfig.disableProfile) {
|
||||
var displaynameIdx = categories.account.indexOf('cp-settings-displayname');
|
||||
categories.account.splice(displaynameIdx, 1);
|
||||
}
|
||||
|
||||
var create = {};
|
||||
|
||||
|
@ -159,8 +163,7 @@ define([
|
|||
create['logout-everywhere'] = function () {
|
||||
if (!common.isLoggedIn()) { return; }
|
||||
var $div = $('<div>', { 'class': 'cp-settings-logout-everywhere cp-sidebarlayout-element'});
|
||||
$('<label>', { 'for': 'cp-settings-logout-everywhere'})
|
||||
.text(Messages.settings_logoutEverywhereTitle).appendTo($div);
|
||||
$('<label>').text(Messages.settings_logoutEverywhereTitle).appendTo($div);
|
||||
$('<span>', {'class': 'cp-sidebarlayout-description'})
|
||||
.text(Messages.settings_logoutEverywhere).appendTo($div);
|
||||
var $button = $('<button>', {
|
||||
|
|
Loading…
Reference in New Issue