mirror of
https://github.com/cryptpad/cryptpad.git
synced 2026-09-14 11:05:41 +05:00
Stop using sessionStorage when creating/opening pads
This commit is contained in:
parent
d844538758
commit
4df7fb93f8
@ -169,6 +169,17 @@ Version 1
|
||||
/code/#/1/edit/3Ujt4F2Sjnjbis6CoYWpoQ/usn4+9CqVja8Q7RZOGTfRgqI
|
||||
*/
|
||||
|
||||
var getNewPadOpts = function (hashArr) {
|
||||
var k;
|
||||
// Check if we have a ownerKey for this pad
|
||||
hashArr.some(function (data) {
|
||||
if (/^newpad=/.test(data)) {
|
||||
k = data.slice(7);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
return k || '';
|
||||
};
|
||||
var getVersionHash = function (hashArr) {
|
||||
var k;
|
||||
// Check if we have a ownerKey for this pad
|
||||
@ -202,6 +213,7 @@ Version 1
|
||||
parsed.present = options.indexOf('present') !== -1;
|
||||
parsed.embed = options.indexOf('embed') !== -1;
|
||||
parsed.versionHash = getVersionHash(options);
|
||||
parsed.newPadOpts = getNewPadOpts(options);
|
||||
parsed.ownerKey = getOwnerKey(options);
|
||||
};
|
||||
|
||||
@ -217,6 +229,13 @@ Version 1
|
||||
password: parsed.password
|
||||
};
|
||||
};
|
||||
|
||||
if (/^\/newpad=/.test(hash)) {
|
||||
return {
|
||||
newPadOpts: hash.slice(8, -1)
|
||||
};
|
||||
}
|
||||
|
||||
if (hash.slice(0,1) !== '/' && hash.length >= 56) { // Version 0
|
||||
// Old hash
|
||||
parsed.channel = hash.slice(0, 32);
|
||||
@ -237,6 +256,9 @@ Version 1
|
||||
if (versionHash) {
|
||||
hash += 'hash=' + Crypto.b64RemoveSlashes(versionHash) + '/';
|
||||
}
|
||||
if (opts.newPadOpts) {
|
||||
hash += 'newpad=' + opts.newPadOpts + '/';
|
||||
}
|
||||
return hash;
|
||||
};
|
||||
|
||||
@ -372,6 +394,10 @@ Version 1
|
||||
var url = '/';
|
||||
if (!ret.type) { return url; }
|
||||
url += ret.type + '/';
|
||||
// New pad with options: append the options to the hash
|
||||
if (!ret.hashData && options.newPadOpts) {
|
||||
return url + '#/newpad=' + options.newPadOpts + '/';
|
||||
}
|
||||
if (!ret.hashData) { return url; }
|
||||
if (ret.hashData.type !== 'pad') { return url + '#' + ret.hash; }
|
||||
if (ret.hashData.version === 0) { return url + '#' + ret.hash; }
|
||||
@ -575,6 +601,9 @@ Version 1
|
||||
// Valid hash?
|
||||
if (parsed.hash) {
|
||||
if (!parsed.hashData) { return; }
|
||||
// New pad: only newPadOpts allowed
|
||||
if (Object.keys(parsed.hashData).length === 1 &&
|
||||
parsed.hashData.newPadOpts) { return true; }
|
||||
// Version should be a number
|
||||
if (typeof(parsed.hashData.version) === "undefined") { return; }
|
||||
// pads and files should have a base64 (or hex) key
|
||||
|
||||
@ -148,6 +148,21 @@ define([
|
||||
send();
|
||||
};
|
||||
|
||||
common.setTabHref = function (href) {
|
||||
var ohc = window.onhashchange;
|
||||
window.onhashchange = function () {};
|
||||
window.location.href = href;
|
||||
window.onhashchange = ohc;
|
||||
ohc({reset: true});
|
||||
};
|
||||
common.setTabHash = function (hash) {
|
||||
var ohc = window.onhashchange;
|
||||
window.onhashchange = function () {};
|
||||
window.location.hash = hash;
|
||||
window.onhashchange = ohc;
|
||||
ohc({reset: true});
|
||||
};
|
||||
|
||||
// RESTRICTED
|
||||
// Settings only
|
||||
common.resetDrive = function (cb) {
|
||||
@ -2089,26 +2104,6 @@ define([
|
||||
language: common.getLanguage(),
|
||||
driveEvents: true //rdyCfg.driveEvents // Boolean
|
||||
};
|
||||
// if a pad is created from a file
|
||||
if (sessionStorage[Constants.newPadFileData]) {
|
||||
common.fromFileData = JSON.parse(sessionStorage[Constants.newPadFileData]);
|
||||
var _parsed1 = Hash.parsePadUrl(common.fromFileData.href);
|
||||
var _parsed2 = Hash.parsePadUrl(window.location.href);
|
||||
if (_parsed1.hashData.type === 'pad') {
|
||||
if (_parsed1.type !== _parsed2.type) { delete common.fromFileData; }
|
||||
}
|
||||
delete sessionStorage[Constants.newPadFileData];
|
||||
}
|
||||
|
||||
if (sessionStorage[Constants.newPadPathKey]) {
|
||||
common.initialPath = sessionStorage[Constants.newPadPathKey];
|
||||
delete sessionStorage[Constants.newPadPathKey];
|
||||
}
|
||||
|
||||
if (sessionStorage[Constants.newPadTeamKey]) {
|
||||
common.initialTeam = sessionStorage[Constants.newPadTeamKey];
|
||||
delete sessionStorage[Constants.newPadTeamKey];
|
||||
}
|
||||
|
||||
var channelIsReady = waitFor();
|
||||
|
||||
|
||||
@ -1125,6 +1125,18 @@ define([
|
||||
var hiddenHref = Hash.hashToHref(hash, parsed.type);
|
||||
window.open(APP.origin + hiddenHref);
|
||||
};
|
||||
var openIn = function (type, path, team, fData) {
|
||||
var obj = JSON.stringify({
|
||||
p: path,
|
||||
t: team,
|
||||
d: fData
|
||||
});
|
||||
var str = encodeURIComponent(obj);
|
||||
var parsed = Hash.parsePadUrl(Hash.hashToHref('', type));
|
||||
var opts = parsed.getOptions();
|
||||
opts.newPadOpts = str;
|
||||
common.openURL(parsed.getUrl(opts));
|
||||
};
|
||||
|
||||
var refresh = APP.refresh = function () {
|
||||
APP.displayDirectory(currentPath);
|
||||
@ -2667,12 +2679,7 @@ define([
|
||||
.click(function () {
|
||||
var type = $(this).attr('data-type') || 'pad';
|
||||
var path = manager.isPathIn(currentPath, [TRASH]) ? '' : currentPath;
|
||||
nThen(function (waitFor) {
|
||||
common.sessionStorage.put(Constants.newPadPathKey, path, waitFor());
|
||||
common.sessionStorage.put(Constants.newPadTeamKey, APP.team, waitFor());
|
||||
}).nThen(function () {
|
||||
common.openURL('/' + type + '/');
|
||||
});
|
||||
openIn(type, path, APP.team);
|
||||
});
|
||||
};
|
||||
var createNewButton = function (isInRoot, $container) {
|
||||
@ -4227,31 +4234,19 @@ define([
|
||||
else if ($this.hasClass('cp-app-drive-context-makeacopy')) {
|
||||
if (paths.length !== 1) { return; }
|
||||
el = manager.find(paths[0].path);
|
||||
var _metadata = manager.getFileData(el);
|
||||
var _simpleData = {
|
||||
title: _metadata.filename || _metadata.title,
|
||||
href: _metadata.href || _metadata.roHref,
|
||||
password: _metadata.password,
|
||||
channel: _metadata.channel,
|
||||
};
|
||||
nThen(function (waitFor) {
|
||||
(function () {
|
||||
var path = currentPath;
|
||||
if (path[0] !== ROOT) { path = [ROOT]; }
|
||||
common.sessionStorage.put(Constants.newPadFileData, JSON.stringify(_simpleData), waitFor());
|
||||
common.sessionStorage.put(Constants.newPadPathKey, path, waitFor());
|
||||
common.sessionStorage.put(Constants.newPadTeamKey, APP.team, waitFor());
|
||||
}).nThen(function () {
|
||||
var _metadata = manager.getFileData(el);
|
||||
var _simpleData = {
|
||||
title: _metadata.filename || _metadata.title,
|
||||
href: _metadata.href || _metadata.roHref,
|
||||
password: _metadata.password,
|
||||
channel: _metadata.channel,
|
||||
};
|
||||
var parsed = Hash.parsePadUrl(_metadata.href || _metadata.roHref);
|
||||
common.openURL(Hash.hashToHref('', parsed.type));
|
||||
// We need to restore sessionStorage for the next time we want to create a pad from this tab
|
||||
// NOTE: the 100ms timeout is to fix a race condition in firefox where sessionStorage
|
||||
// would be deleted before the new tab was created
|
||||
setTimeout(function () {
|
||||
common.sessionStorage.put(Constants.newPadFileData, '', function () {});
|
||||
common.sessionStorage.put(Constants.newPadPathKey, '', function () {});
|
||||
common.sessionStorage.put(Constants.newPadTeamKey, '', function () {});
|
||||
}, 100);
|
||||
});
|
||||
openIn(parsed.type, path, APP.team, _simpleData);
|
||||
})();
|
||||
}
|
||||
else if ($this.hasClass('cp-app-drive-context-openincode')) {
|
||||
if (paths.length !== 1) { return; }
|
||||
@ -4264,23 +4259,20 @@ define([
|
||||
password: metadata.password,
|
||||
channel: metadata.channel,
|
||||
};
|
||||
nThen(function (waitFor) {
|
||||
common.sessionStorage.put(Constants.newPadFileData, JSON.stringify(simpleData), waitFor());
|
||||
common.sessionStorage.put(Constants.newPadPathKey, currentPath, waitFor());
|
||||
common.sessionStorage.put(Constants.newPadTeamKey, APP.team, waitFor());
|
||||
}).nThen(function () {
|
||||
common.openURL('/code/');
|
||||
// We need to restore sessionStorage for the next time we want to create a pad from this tab
|
||||
// NOTE: the 100ms timeout is to fix a race condition in firefox where sessionStorage
|
||||
// would be deleted before the new tab was created
|
||||
setTimeout(function () {
|
||||
common.sessionStorage.put(Constants.newPadFileData, '', function () {});
|
||||
common.sessionStorage.put(Constants.newPadPathKey, '', function () {});
|
||||
common.sessionStorage.put(Constants.newPadTeamKey, '', function () {});
|
||||
}, 100);
|
||||
});
|
||||
(function () {
|
||||
var path = currentPath;
|
||||
if (path[0] !== ROOT) { path = [ROOT]; }
|
||||
var _metadata = manager.getFileData(el);
|
||||
var _simpleData = {
|
||||
title: _metadata.filename || _metadata.title,
|
||||
href: _metadata.href || _metadata.roHref,
|
||||
password: _metadata.password,
|
||||
channel: _metadata.channel,
|
||||
};
|
||||
var parsed = Hash.parsePadUrl(_metadata.href || _metadata.roHref);
|
||||
openIn('code', path, APP.team, _simpleData);
|
||||
})();
|
||||
}
|
||||
|
||||
else if ($this.hasClass('cp-app-drive-context-expandall') ||
|
||||
$this.hasClass('cp-app-drive-context-collapseall')) {
|
||||
if (paths.length !== 1) { return; }
|
||||
@ -4482,12 +4474,7 @@ define([
|
||||
else if ($this.hasClass("cp-app-drive-context-newdoc")) {
|
||||
var ntype = $this.data('type') || 'pad';
|
||||
var path2 = manager.isPathIn(currentPath, [TRASH]) ? '' : currentPath;
|
||||
nThen(function (waitFor) {
|
||||
common.sessionStorage.put(Constants.newPadPathKey, path2, waitFor());
|
||||
common.sessionStorage.put(Constants.newPadTeamKey, APP.team, waitFor());
|
||||
}).nThen(function () {
|
||||
common.openURL('/' + ntype + '/');
|
||||
});
|
||||
openIn(ntype, path2, APP.team);
|
||||
}
|
||||
else if ($this.hasClass("cp-app-drive-context-properties")) {
|
||||
if (type === 'trash') {
|
||||
|
||||
@ -108,21 +108,17 @@ define([
|
||||
return Messages._getKey(key, [name, title, teamName]);
|
||||
};
|
||||
content.handler = function() {
|
||||
var todo = function() {
|
||||
common.openURL(msg.content.href);
|
||||
defaultDismiss(common, data)();
|
||||
};
|
||||
nThen(function(waitFor) {
|
||||
if (msg.content.isTemplate) {
|
||||
common.sessionStorage.put(Constants.newPadPathKey, ['template'], waitFor());
|
||||
}
|
||||
if (teamNotification) {
|
||||
common.sessionStorage.put(Constants.newPadTeamKey, teamNotification, waitFor());
|
||||
}
|
||||
common.sessionStorage.put('newPadPassword', msg.content.password || '', waitFor());
|
||||
}).nThen(function() {
|
||||
todo();
|
||||
var obj = JSON.stringify({
|
||||
p: msg.content.isTemplate ? ['template'] : undefined,
|
||||
t: teamNotification || undefined,
|
||||
pw: msg.content.password || ''
|
||||
});
|
||||
var str = encodeURIComponent(obj);
|
||||
var parsed = Hash.parsePadUrl(msg.content.href);
|
||||
var opts = parsed.getOptions();
|
||||
opts.newPadOpts = str;
|
||||
common.openURL(parsed.getUrl(opts));
|
||||
defaultDismiss(common, data)();
|
||||
};
|
||||
if (!content.archived) {
|
||||
content.dismissHandler = defaultDismiss(common, data);
|
||||
|
||||
@ -26,7 +26,7 @@ define([
|
||||
};
|
||||
var AppConfig;
|
||||
var Test;
|
||||
var password;
|
||||
var password, newPadPassword;
|
||||
var initialPathInDrive;
|
||||
var burnAfterReading;
|
||||
|
||||
@ -202,15 +202,47 @@ define([
|
||||
}
|
||||
// Rendered (maybe hidden) hash
|
||||
var renderedParsed = Utils.Hash.parsePadUrl(window.location.href);
|
||||
var ohc = window.onhashchange;
|
||||
window.onhashchange = function () {};
|
||||
window.location.href = renderedParsed.getUrl(opts);
|
||||
window.onhashchange = ohc;
|
||||
ohc({reset: true});
|
||||
Cryptpad.setTabHref(renderedParsed.getUrl(opts));
|
||||
}
|
||||
}));
|
||||
};
|
||||
|
||||
// New pad options
|
||||
if (parsed.hashData && parsed.hashData.newPadOpts) {
|
||||
try {
|
||||
var newPad = JSON.parse(decodeURIComponent(parsed.hashData.newPadOpts));
|
||||
Cryptpad.initialTeam = newPad.t;
|
||||
Cryptpad.initialPath = newPad.p;
|
||||
newPadPassword = newPad.pw;
|
||||
if (newPad.d) {
|
||||
Cryptpad.fromFileData = newPad.d;
|
||||
var _parsed1 = Utils.Hash.parsePadUrl(Cryptpad.fromFileData.href);
|
||||
if (_parsed1.hashData.type === 'pad' && _parsed1.type !== parsed.type) {
|
||||
delete Cryptpad.fromFileData;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e, parsed.hashData.newPadOpts);
|
||||
}
|
||||
delete parsed.hashData.newPadOpts;
|
||||
|
||||
// If it's a new pad, don't check password
|
||||
if (!Object.keys(parsed.hashData).length) {
|
||||
delete parsed.hashData;
|
||||
parsed.hash = '';
|
||||
currentPad.hash = '';
|
||||
Cryptpad.setTabHash('');
|
||||
return void todo();
|
||||
}
|
||||
// Otherwise, existing pad (new for us)
|
||||
var opts = parsed.getOptions();
|
||||
delete opts.newPadOpts;
|
||||
parsed = Utils.Hash.parsePadUrl(parsed.getUrl(opts));
|
||||
currentPad.hash = parsed.hash;
|
||||
Cryptpad.setTabHash(parsed.hash);
|
||||
}
|
||||
|
||||
|
||||
if (!parsed.hashData) { // No hash, no need to check for a password
|
||||
return void todo();
|
||||
}
|
||||
@ -340,9 +372,8 @@ define([
|
||||
password = val;
|
||||
}), parsed.getUrl());
|
||||
}).nThen(function (w) {
|
||||
if (!password && !stored && sessionStorage.newPadPassword) {
|
||||
passwordCfg.value = sessionStorage.newPadPassword;
|
||||
delete sessionStorage.newPadPassword;
|
||||
if (!password && !stored && newPadPassword) {
|
||||
passwordCfg.value = newPadPassword;
|
||||
}
|
||||
|
||||
if (parsed.type === "file") {
|
||||
@ -362,7 +393,7 @@ define([
|
||||
waitFor.abort();
|
||||
return;
|
||||
}
|
||||
if (!isNew) { return void todo(); }
|
||||
if (!e && !isNew) { return void todo(); }
|
||||
if (parsed.hashData.mode === 'view' && (password || !parsed.hashData.password)) {
|
||||
// Error, wrong password stored, the view seed has changed with the password
|
||||
// password will never work
|
||||
@ -513,18 +544,10 @@ define([
|
||||
sframeChan.onReg('EV_METADATA_UPDATE', updateMeta);
|
||||
|
||||
Utils.LocalStore.onLogin(function () {
|
||||
var ohc = window.onhashchange;
|
||||
window.onhashchange = function () {};
|
||||
window.location.hash = currentPad.hash;
|
||||
window.onhashchange = ohc;
|
||||
ohc({reset: true});
|
||||
Cryptpad.setTabHash(currentPad.hash);
|
||||
});
|
||||
Utils.LocalStore.onLogout(function () {
|
||||
var ohc = window.onhashchange;
|
||||
window.onhashchange = function () {};
|
||||
window.location.hash = currentPad.hash;
|
||||
window.onhashchange = ohc;
|
||||
ohc({reset: true});
|
||||
Cryptpad.setTabHash(currentPad.hash);
|
||||
sframeChan.event('EV_LOGOUT');
|
||||
});
|
||||
|
||||
@ -1168,11 +1191,7 @@ define([
|
||||
var hiddenParsed = Utils.Hash.parsePadUrl(window.location.href);
|
||||
|
||||
// Update the hash in the address bar
|
||||
var ohc = window.onhashchange;
|
||||
window.onhashchange = function () {};
|
||||
window.location.href = hiddenParsed.getUrl(opts);
|
||||
window.onhashchange = ohc;
|
||||
ohc({reset: true});
|
||||
Cryptpad.setTabHref(hiddenParsed.getUrl(opts));
|
||||
});
|
||||
|
||||
|
||||
@ -1519,11 +1538,7 @@ define([
|
||||
// in the address bar
|
||||
Cryptpad.padRpc.onChannelDeleted.reg(function (channel) {
|
||||
if (channel !== secret.channel) { return; }
|
||||
var ohc = window.onhashchange;
|
||||
window.onhashchange = function () {};
|
||||
window.location.href = currentPad.href;
|
||||
window.onhashchange = ohc;
|
||||
ohc({reset: true});
|
||||
Cryptpad.setTabHref(currentPad.href);
|
||||
});
|
||||
|
||||
// Join the netflux channel
|
||||
@ -1607,13 +1622,9 @@ define([
|
||||
Utils.crypto = Utils.Crypto.createEncryptor(Utils.secret.keys);
|
||||
|
||||
// Update the hash in the address bar
|
||||
var ohc = window.onhashchange;
|
||||
window.onhashchange = function () {};
|
||||
window.location.hash = newHash;
|
||||
currentPad.hash = newHash;
|
||||
currentPad.href = '/' + parsed.type + '/#' + newHash;
|
||||
window.onhashchange = ohc;
|
||||
ohc({reset: true});
|
||||
Cryptpad.setTabHash(newHash);
|
||||
|
||||
// Update metadata values and send new metadata inside
|
||||
parsed = Utils.Hash.parsePadUrl(currentPad.href);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user