Merge branch 'staging' of github.com:xwiki-labs/cryptpad into staging

This commit is contained in:
ansuz 2017-02-09 17:16:03 +01:00
commit f92ba193c3
15 changed files with 238 additions and 305 deletions

View File

@ -12,8 +12,5 @@ define(function() {
*/ */
config.notificationTimeout = 5000; config.notificationTimeout = 5000;
config.USE_FS_STORE = true;
config.USE_HOMEPAGE_TABLE = false;
return config; return config;
}); });

View File

@ -16,133 +16,116 @@ define([
*/ */
var Store = {}; var Store = {};
var storeObj; var store;
var ready = false;
var filesOp;
var exp = {};
var safeSet = function (key, val) { var initStore = function (filesOp, storeObj, exp) {
storeObj[key] = val; var ret = {};
};
// Store uses nodebacks... var safeSet = function (key, val) {
Store.set = function (key, val, cb) { storeObj[key] = val;
safeSet(key, val); };
cb();
};
// implement in alternative store // Store uses nodebacks...
Store.setBatch = function (map, cb) { ret.set = function (key, val, cb) {
Object.keys(map).forEach(function (key) { safeSet(key, val);
safeSet(key, map[key]); cb();
}); };
cb(void 0, map);
};
Store.setDrive = function (key, val, cb) { // implement in alternative store
storeObj.drive[key] = val; ret.setBatch = function (map, cb) {
cb(); Object.keys(map).forEach(function (key) {
}; safeSet(key, map[key]);
var safeGet = window.safeGet = function (key) {
return storeObj[key];
};
Store.get = function (key, cb) {
cb(void 0, safeGet(key));
};
// implement in alternative store
Store.getBatch = function (keys, cb) {
var res = {};
keys.forEach(function (key) {
res[key] = safeGet(key);
});
cb(void 0, res);
};
Store.getDrive = function (key, cb) {
cb(void 0, storeObj.drive[key]);
};
var safeRemove = function (key) {
delete storeObj[key];
};
Store.remove = function (key, cb) {
safeRemove(key);
cb();
};
// implement in alternative store
Store.removeBatch = function (keys, cb) {
keys.forEach(function (key) {
safeRemove(key);
});
cb();
};
Store.keys = function (cb) {
cb(void 0, Object.keys(storeObj));
};
Store.addPad = function (href, path, name) {
filesOp.addPad(href, path, name);
};
Store.forgetPad = function (href, cb) {
filesOp.forgetPad(href);
cb();
};
Store.addTemplate = function (href) {
filesOp.addTemplate(href);
};
Store.listTemplates = function () {
return filesOp.listTemplates();
};
Store.getProxy = function () {
return exp;
};
Store.getLoginName = function () {
return storeObj.login_name;
};
var changeHandlers = Store.changeHandlers = [];
Store.change = function (f) {
if (typeof(f) !== 'function') {
throw new Error('[Store.change] callback must be a function');
}
changeHandlers.push(f);
if (changeHandlers.length === 1) {
// start listening for changes
/* TODO: listen for changes in the proxy
window.addEventListener('storage', function (e) {
changeHandlers.forEach(function (f) {
f({
key: e.key,
oldValue: e.oldValue,
newValue: e.newValue,
});
});
}); });
*/ cb(void 0, map);
} };
ret.setDrive = function (key, val, cb) {
storeObj.drive[key] = val;
cb();
};
var safeGet = function (key) {
return storeObj[key];
};
ret.get = function (key, cb) {
cb(void 0, safeGet(key));
};
// implement in alternative store
ret.getBatch = function (keys, cb) {
var res = {};
keys.forEach(function (key) {
res[key] = safeGet(key);
});
cb(void 0, res);
};
ret.getDrive = function (key, cb) {
cb(void 0, storeObj.drive[key]);
};
var safeRemove = function (key) {
delete storeObj[key];
};
ret.remove = function (key, cb) {
safeRemove(key);
cb();
};
// implement in alternative store
ret.removeBatch = function (keys, cb) {
keys.forEach(function (key) {
safeRemove(key);
});
cb();
};
ret.keys = function (cb) {
cb(void 0, Object.keys(storeObj));
};
ret.addPad = function (href, path, name) {
filesOp.addPad(href, path, name);
};
ret.forgetPad = function (href, cb) {
filesOp.forgetPad(href);
cb();
};
ret.addTemplate = function (href) {
filesOp.addTemplate(href);
};
ret.listTemplates = function () {
return filesOp.listTemplates();
};
ret.getProxy = function () {
return exp;
};
ret.getLoginName = function () {
return storeObj.login_name;
};
var changeHandlers = ret.changeHandlers = [];
ret.change = function (f) {};
return ret;
}; };
var onReady = function (f, proxy, storageKey) { var onReady = function (f, proxy, storageKey, exp) {
filesOp = FO.init(proxy.drive, { var fo = FO.init(proxy.drive, {
storageKey: storageKey storageKey: storageKey
}); });
storeObj = proxy; //storeObj = proxy;
ready = true; store = initStore(fo, proxy, exp);
if (typeof(f) === 'function') { if (typeof(f) === 'function') {
f(void 0, Store); f(void 0, store);
} }
}; };
@ -167,6 +150,8 @@ define([
logLevel: 1, logLevel: 1,
}; };
var exp = {};
window.addEventListener('storage', function (e) { window.addEventListener('storage', function (e) {
var key = e.key; var key = e.key;
if (e.key !== Cryptpad.userHashKey) { return; } if (e.key !== Cryptpad.userHashKey) { return; }
@ -175,8 +160,6 @@ define([
if (!o && n) { if (!o && n) {
window.location.reload(); window.location.reload();
} else if (o && !n) { } else if (o && !n) {
//window.location.reload();
//window.location.href = '/';
$(window).on('keyup', function (e) { $(window).on('keyup', function (e) {
if (e.keyCode === 27) { if (e.keyCode === 27) {
Cryptpad.removeLoadingScreen(); Cryptpad.removeLoadingScreen();
@ -192,6 +175,7 @@ define([
}); });
var rt = window.rt = Listmap.create(listmapConfig); var rt = window.rt = Listmap.create(listmapConfig);
exp.proxy = rt.proxy; exp.proxy = rt.proxy;
rt.proxy.on('create', function (info) { rt.proxy.on('create', function (info) {
exp.info = info; exp.info = info;
@ -199,44 +183,36 @@ define([
localStorage.FS_hash = Cryptpad.getEditHashFromKeys(info.channel, secret.keys); localStorage.FS_hash = Cryptpad.getEditHashFromKeys(info.channel, secret.keys);
} }
}).on('ready', function () { }).on('ready', function () {
if (ready) { return; } if (store) { return; } // the store is already ready, it is a reconnection
if (!rt.proxy.drive || typeof(rt.proxy.drive) !== 'object') { rt.proxy.drive = {}; } if (!rt.proxy.drive || typeof(rt.proxy.drive) !== 'object') { rt.proxy.drive = {}; }
var drive = rt.proxy.drive; var drive = rt.proxy.drive;
// Creating a new anon drive: import anon pads from localStorage // Creating a new anon drive: import anon pads from localStorage
if (!drive[Cryptpad.storageKey] || !Cryptpad.isArray(drive[Cryptpad.storageKey])) { if (!drive[Cryptpad.storageKey] || !Cryptpad.isArray(drive[Cryptpad.storageKey])) {
var oldStore = Cryptpad.getStore(true); Cryptpad.getLegacyPads(function (err, data) {
Cryptpad.getRecentPads(function (err, s) { drive[Cryptpad.storageKey] = data;
drive[Cryptpad.storageKey] = s; onReady(f, rt.proxy, Cryptpad.storageKey, exp);
onReady(f, rt.proxy, Cryptpad.storageKey); });
}, true);
return; return;
} }
onReady(f, rt.proxy, Cryptpad.storageKey); // Drive already exist: return the existing drive, don't load data from legacy store
onReady(f, rt.proxy, Cryptpad.storageKey, exp);
}) })
.on('disconnect', function (info) { .on('disconnect', function (info) {
//setEditable(false); // We only manage errors during the loading screen here. Other websocket errors are handled by the apps
if (info.error) { if (info.error) {
//Cryptpad.alert(Messages.websocketError);
if (typeof Cryptpad.storeError === "function") { if (typeof Cryptpad.storeError === "function") {
Cryptpad.storeError(); Cryptpad.storeError();
} }
return; return;
} }
//Cryptpad.alert(Messages.common_connectionLost);
}); });
}; };
Store.ready = function (f, Cryptpad) { Store.ready = function (f, Cryptpad) {
/*if (Cryptpad.parsePadUrl(window.location.href).type === "file") { if (store) { // Store.ready probably called twice, store already ready
if (typeof(f) === 'function') { if (typeof(f) === 'function') {
f(void 0, Cryptpad.getStore(true)); f(void 0, store);
}
return;
}*/
if (ready) {
if (typeof(f) === 'function') {
f(void 0, Store);
} }
} else { } else {
init(f, Cryptpad); init(f, Cryptpad);

View File

@ -115,8 +115,8 @@
<div class="page even"> <div class="page even">
<div class="info-container"> <div class="info-container">
<div class="left"> <div class="left">
<h2 data-localization="main_jotItDown"></h2> <h2 data-localization="main_writeItDown"></h2>
<p data-localization="main_jotItDown_p"></p> <p data-localization="main_writeItDown_p"></p>
</div> </div>
<div class="right image"> <div class="right image">
<img src="customize/images/realtime_small.png" alt="User account" /> <img src="customize/images/realtime_small.png" alt="User account" />

View File

@ -48,8 +48,8 @@
<div class="page even"> <div class="page even">
<div class="info-container"> <div class="info-container">
<div class="left"> <div class="left">
<h2 data-localization="main_jotItDown"></h2> <h2 data-localization="main_writeItDown"></h2>
<p data-localization="main_jotItDown_p"></p> <p data-localization="main_writeItDown_p"></p>
</div> </div>
<div class="right image"> <div class="right image">
<img src="customize/images/realtime_small.png" alt="User account" /> <img src="customize/images/realtime_small.png" alt="User account" />

View File

@ -103,8 +103,6 @@
out.notifyRenamed = "{0} heißt nun {1}"; out.notifyRenamed = "{0} heißt nun {1}";
out.notifyLeft = "{0} hat die gemeinsame Sitzung verlassen"; out.notifyLeft = "{0} hat die gemeinsame Sitzung verlassen";
out.disconnectAlert = 'Netzwerkverbindung verloren!';
out.tryIt = 'Probier\'s aus!'; out.tryIt = 'Probier\'s aus!';
out.recentPads = 'Deine letzten Pads (diese Liste ist nur in deinem Browser gespeichert))'; out.recentPads = 'Deine letzten Pads (diese Liste ist nur in deinem Browser gespeichert))';

View File

@ -100,8 +100,6 @@ define(function () {
out.notifyRenamed = "{0} ahora se conoce como {1}"; out.notifyRenamed = "{0} ahora se conoce como {1}";
out.notifyLeft = "{0} ha dejado la sesión de colaboración"; out.notifyLeft = "{0} ha dejado la sesión de colaboración";
out.disconnectAlert = '¡Conexión a la red perdida!';
out.tryIt = '¡PROBARLO!'; out.tryIt = '¡PROBARLO!';
out.recentPads = 'Tus documentos recientes (almacenadas solo en el navegador)'; out.recentPads = 'Tus documentos recientes (almacenadas solo en el navegador)';

View File

@ -118,8 +118,6 @@ define(function () {
out.notifyRenamed = "{0} a changé son nom en {1}"; out.notifyRenamed = "{0} a changé son nom en {1}";
out.notifyLeft = "{0} a quitté la session collaborative"; out.notifyLeft = "{0} a quitté la session collaborative";
out.disconnectAlert = 'Perte de la connexion au réseau !';
out.okButton = 'OK (Entrée)'; out.okButton = 'OK (Entrée)';
out.cancel = "Annuler"; out.cancel = "Annuler";

View File

@ -122,8 +122,6 @@ define(function () {
out.notifyRenamed = "{0} is now known as {1}"; out.notifyRenamed = "{0} is now known as {1}";
out.notifyLeft = "{0} has left the collaborative session"; out.notifyLeft = "{0} has left the collaborative session";
out.disconnectAlert = 'Network connection lost!';
out.okButton = 'OK (enter)'; out.okButton = 'OK (enter)';
out.cancel = "Cancel"; out.cancel = "Cancel";
@ -299,8 +297,8 @@ define(function () {
out.main_howitworks = 'How It Works'; out.main_howitworks = 'How It Works';
out.main_zeroKnowledge = 'Zero Knowledge'; out.main_zeroKnowledge = 'Zero Knowledge';
out.main_zeroKnowledge_p = "You don't have to trust that we <em>won't</em> look at your pads, with CryptPad's revolutionary Zero Knowledge Technology we <em>can't</em>. Learn more about how we protect your Privacy and Security."; out.main_zeroKnowledge_p = "You don't have to trust that we <em>won't</em> look at your pads, with CryptPad's revolutionary Zero Knowledge Technology we <em>can't</em>. Learn more about how we protect your Privacy and Security.";
out.main_jotItDown = 'Jot it down'; out.main_writeItDown = 'Write it down';
out.main_jotItDown_p = "The greatest projects come from the smallest ideas. Take down the moments of inspiration and unexpected ideas because you never know which one might be a breakthrough."; out.main_writeItDown_p = "The greatest projects come from the smallest ideas. Take down the moments of inspiration and unexpected ideas because you never know which one might be a breakthrough.";
out.main_share = 'Share the link, share the pad'; out.main_share = 'Share the link, share the pad';
out.main_share_p = "Grow your ideas together: conduct efficient meetings, collaborate on TODO lists and make quick presentations with all your friends and all your devices."; out.main_share_p = "Grow your ideas together: conduct efficient meetings, collaborate on TODO lists and make quick presentations with all your friends and all your devices.";
out.main_organize = 'Get organized'; out.main_organize = 'Get organized';

View File

@ -102,8 +102,6 @@ define(function () {
out.notifyRenamed = "{0} jest teraz znany jako {1}"; out.notifyRenamed = "{0} jest teraz znany jako {1}";
out.notifyLeft = "{0} opuścił sesję współpracy"; out.notifyLeft = "{0} opuścił sesję współpracy";
out.disconnectAlert = 'Utracono połączenie sieciowe!';
out.tryIt = 'Wypróbuj!'; out.tryIt = 'Wypróbuj!';
out.recentPads = 'Ostatnio otwarte dokumenty (przechowywane jedynie w twojej przeglądarce)'; out.recentPads = 'Ostatnio otwarte dokumenty (przechowywane jedynie w twojej przeglądarce)';

View File

@ -110,8 +110,6 @@ define(function () {
out.notifyRenamed = "{0} agora é conhecido como {1}"; out.notifyRenamed = "{0} agora é conhecido como {1}";
out.notifyLeft = "{0} deixou essa sessão colaborativa"; out.notifyLeft = "{0} deixou essa sessão colaborativa";
out.disconnectAlert = 'Conexão de rede perdida!';
out.tryIt = 'Experimente!'; out.tryIt = 'Experimente!';
out.recentPads = 'Seu bloco de nota recente (armazenado em seu navegador)'; out.recentPads = 'Seu bloco de nota recente (armazenado em seu navegador)';

View File

@ -699,7 +699,7 @@ define([
// inform of network disconnect // inform of network disconnect
setEditable(false); setEditable(false);
toolbar.failed(); toolbar.failed();
Cryptpad.alert(Messages.disconnectAlert); Cryptpad.alert(Messages.common_connectionLost);
}; };
var onConnectionChange = config.onConnectionChange = function (info) { var onConnectionChange = config.onConnectionChange = function (info) {
@ -710,7 +710,7 @@ define([
toolbar.reconnecting(info.myId); toolbar.reconnecting(info.myId);
Cryptpad.findOKButton().click(); Cryptpad.findOKButton().click();
} else { } else {
Cryptpad.alert(Messages.disconnectAlert); Cryptpad.alert(Messages.common_connectionLost);
} }
}; };

View File

@ -1,7 +1,7 @@
define([ define([
'/api/config?cb=' + Math.random().toString(16).slice(2), '/api/config?cb=' + Math.random().toString(16).slice(2),
'/customize/messages.js', '/customize/messages.js',
'/customize/store.js', '/customize/fsStore.js',
'/bower_components/chainpad-crypto/crypto.js', '/bower_components/chainpad-crypto/crypto.js',
'/bower_components/alertifyjs/dist/js/alertify.js', '/bower_components/alertifyjs/dist/js/alertify.js',
'/bower_components/spin.js/spin.min.js', '/bower_components/spin.js/spin.min.js',
@ -10,7 +10,7 @@ define([
'/customize/application_config.js', '/customize/application_config.js',
'/bower_components/jquery/dist/jquery.min.js', '/bower_components/jquery/dist/jquery.min.js',
], function (Config, Messages, Store, Crypto, Alertify, Spinner, Clipboard, FS, AppConfig) { ], function (Config, Messages, Store, Crypto, Alertify, Spinner, Clipboard, AppConfig) {
/* This file exposes functionality which is specific to Cryptpad, but not to /* This file exposes functionality which is specific to Cryptpad, but not to
any particular pad type. This includes functions for committing metadata any particular pad type. This includes functions for committing metadata
about pads to your local storage for future use and improved usability. about pads to your local storage for future use and improved usability.
@ -19,18 +19,11 @@ define([
*/ */
var $ = window.jQuery; var $ = window.jQuery;
// When set to true, USE_FS_STORE becomes the default store, but the localStorage store is
// still loaded for migration purpose. When false, the localStorage is used.
var USE_FS_STORE = AppConfig.USE_FS_STORE;
var storeToUse = USE_FS_STORE ? FS : Store;
var common = window.Cryptpad = { var common = window.Cryptpad = {
Messages: Messages, Messages: Messages,
Alertify: Alertify, Alertify: Alertify,
}; };
var store; var store;
var fsStore;
var find = common.find = function (map, path) { var find = common.find = function (map, path) {
return (map && path.reduce(function (p, n) { return (map && path.reduce(function (p, n) {
@ -38,15 +31,14 @@ define([
}, map)); }, map));
}; };
var getStore = common.getStore = function (legacy) { var getStore = common.getStore = function () {
if ((!USE_FS_STORE || legacy) && store) { return store; } if (store) { return store; }
if (USE_FS_STORE && !legacy && fsStore) { return fsStore; }
throw new Error("Store is not ready!"); throw new Error("Store is not ready!");
}; };
var getNetwork = common.getNetwork = function () { var getNetwork = common.getNetwork = function () {
if (USE_FS_STORE && fsStore) { if (store) {
if (fsStore.getProxy() && fsStore.getProxy().info) { if (store.getProxy() && store.getProxy().info) {
return fsStore.getProxy().info.network; return store.getProxy().info.network;
} }
} }
return; return;
@ -131,7 +123,6 @@ define([
}; };
var isLoggedIn = common.isLoggedIn = function () { var isLoggedIn = common.isLoggedIn = function () {
//return typeof getStore().getLoginName() === "string";
return typeof getUserHash() === "string"; return typeof getUserHash() === "string";
}; };
@ -373,6 +364,23 @@ define([
}); });
}; };
// Get the pads from localStorage to migrate them to the object store
var getLegacyPads = common.getLegacyPads = function (cb) {
require(['/customize/store.js'], function(Legacy) {
Legacy.ready(function (err, legacy) {
if (err) { cb(err, null); return; }
Legacy.get(storageKey, function (err2, recentPads) {
if (err2) { cb(err2, null); return; }
if (isArray(recentPads)) {
cb(void 0, migrateRecentPads(recentPads));
return;
}
cb(void 0, []);
});
});
});
};
var getHash = common.getHash = function () { var getHash = common.getHash = function () {
return window.location.hash.slice(1); return window.location.hash.slice(1);
}; };
@ -446,13 +454,13 @@ define([
}; };
// STORAGE // STORAGE
var setPadAttribute = common.setPadAttribute = function (attr, value, cb, legacy) { var setPadAttribute = common.setPadAttribute = function (attr, value, cb) {
getStore(legacy).setDrive([getHash(), attr].join('.'), value, function (err, data) { getStore().setDrive([getHash(), attr].join('.'), value, function (err, data) {
cb(err, data); cb(err, data);
}); });
}; };
var setAttribute = common.setAttribute = function (attr, value, cb, legacy) { var setAttribute = common.setAttribute = function (attr, value, cb) {
getStore(legacy).set(["cryptpad", attr].join('.'), value, function (err, data) { getStore().set(["cryptpad", attr].join('.'), value, function (err, data) {
cb(err, data); cb(err, data);
}); });
}; };
@ -461,13 +469,13 @@ define([
}; };
// STORAGE // STORAGE
var getPadAttribute = common.getPadAttribute = function (attr, cb, legacy) { var getPadAttribute = common.getPadAttribute = function (attr, cb) {
getStore(legacy).getDrive([getHash(), attr].join('.'), function (err, data) { getStore().getDrive([getHash(), attr].join('.'), function (err, data) {
cb(err, data); cb(err, data);
}); });
}; };
var getAttribute = common.getAttribute = function (attr, cb, legacy) { var getAttribute = common.getAttribute = function (attr, cb) {
getStore(legacy).get(["cryptpad", attr].join('.'), function (err, data) { getStore().get(["cryptpad", attr].join('.'), function (err, data) {
cb(err, data); cb(err, data);
}); });
}; };
@ -493,12 +501,8 @@ define([
// STORAGE // STORAGE
/* fetch and migrate your pad history from localStorage */ /* fetch and migrate your pad history from localStorage */
var getRecentPads = common.getRecentPads = function (cb, legacy) { var getRecentPads = common.getRecentPads = function (cb) {
var sstore = getStore(legacy); getStore().getDrive(storageKey, function (err, recentPads) {
if (legacy) {
sstore.getDrive = sstore.get;
}
sstore.getDrive(storageKey, function (err, recentPads) {
if (isArray(recentPads)) { if (isArray(recentPads)) {
cb(void 0, migrateRecentPads(recentPads)); cb(void 0, migrateRecentPads(recentPads));
return; return;
@ -509,21 +513,14 @@ define([
// STORAGE // STORAGE
/* commit a list of pads to localStorage */ /* commit a list of pads to localStorage */
var setRecentPads = common.setRecentPads = function (pads, cb, legacy) { var setRecentPads = common.setRecentPads = function (pads, cb) {
var sstore = getStore(legacy); getStore().setDrive(storageKey, pads, function (err, data) {
if (legacy) {
sstore.setDrive = sstore.set;
}
sstore.setDrive(storageKey, pads, function (err, data) {
cb(err, data); cb(err, data);
}); });
}; };
// STORAGE // STORAGE
var forgetFSPad = function (href, cb) { var forgetPad = common.forgetPad = function (href, cb) {
getStore().forgetPad(href, cb);
};
var forgetPad = common.forgetPad = function (href, cb, legacy) {
var parsed = parsePadUrl(href); var parsed = parsePadUrl(href);
var callback = function (err, data) { var callback = function (err, data) {
@ -532,7 +529,7 @@ define([
return; return;
} }
getStore(legacy).keys(function (err, keys) { getStore().keys(function (err, keys) {
if (err) { if (err) {
cb(err); cb(err);
return; return;
@ -545,35 +542,14 @@ define([
cb(); cb();
return; return;
} }
getStore(legacy).removeBatch(toRemove, function (err, data) { getStore().removeBatch(toRemove, function (err, data) {
cb(err, data); cb(err, data);
}); });
}); });
}; };
if (USE_FS_STORE && !legacy) { if (typeof(getStore().forgetPad) === "function") {
// TODO implement forgetPad in store.js getStore().forgetPad(href, callback);
forgetFSPad(href, callback);
return;
}
getRecentPads(function (err, recentPads) {
setRecentPads(recentPads.filter(function (pad) {
var p = parsePadUrl(pad.href);
// find duplicates
if (parsed.hash === p.hash && parsed.type === p.type) {
console.log("Found a duplicate");
return;
}
return true;
}), callback, legacy);
}, legacy);
if (typeof(getStore(legacy).forgetPad) === "function") {
// TODO implement forgetPad in store.js
getStore(legacy).forgetPad(href, callback);
} }
}; };
@ -626,7 +602,7 @@ define([
if (!contains) { if (!contains) {
var data = makePad(href, name); var data = makePad(href, name);
renamed.push(data); renamed.push(data);
if (USE_FS_STORE && typeof(getStore().addPad) === "function") { if (typeof(getStore().addPad) === "function") {
getStore().addPad(href, common.initialPath, common.initialName || name); getStore().addPad(href, common.initialPath, common.initialName || name);
} }
} }
@ -701,58 +677,47 @@ define([
f(void 0, env); f(void 0, env);
}; };
var todo = function () { Store.ready(function (err, storeObj) {
storeToUse.ready(function (err, store) { store = common.store = env.store = storeObj;
common.store = env.store = store;
if (USE_FS_STORE) {
fsStore = store;
}
$(function() { $(function() {
// Race condition : if document.body is undefined when alertify.js is loaded, Alertify // Race condition : if document.body is undefined when alertify.js is loaded, Alertify
// won't work. We have to reset it now to make sure it uses a correct "body" // won't work. We have to reset it now to make sure it uses a correct "body"
Alertify.reset(); Alertify.reset();
// Load the new pad when the hash has changed // Load the new pad when the hash has changed
var oldHash = document.location.hash.slice(1); var oldHash = document.location.hash.slice(1);
window.onhashchange = function () { window.onhashchange = function () {
var newHash = document.location.hash.slice(1); var newHash = document.location.hash.slice(1);
var parsedOld = parseHash(oldHash); var parsedOld = parseHash(oldHash);
var parsedNew = parseHash(newHash); var parsedNew = parseHash(newHash);
if (parsedOld && parsedNew && ( if (parsedOld && parsedNew && (
parsedOld.channel !== parsedNew.channel parsedOld.channel !== parsedNew.channel
|| parsedOld.mode !== parsedNew.mode || parsedOld.mode !== parsedNew.mode
|| parsedOld.key !== parsedNew.key)) { || parsedOld.key !== parsedNew.key)) {
document.location.reload(); document.location.reload();
return;
}
if (parsedNew) {
oldHash = newHash;
}
};
// Everything's ready, continue...
if($('#pad-iframe').length) {
var $iframe = $('#pad-iframe');
var iframe = $iframe[0];
var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
if (iframeDoc.readyState === 'complete') {
cb();
return;
}
$iframe.load(cb);
return; return;
} }
cb(); if (parsedNew) {
}); oldHash = newHash;
}, common); }
}; };
// If we use the fs store, make sure the localStorage or iframe store is ready
if (USE_FS_STORE) { // Everything's ready, continue...
Store.ready(todo); if($('#pad-iframe').length) {
return; var $iframe = $('#pad-iframe');
} var iframe = $iframe[0];
todo(); var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
if (iframeDoc.readyState === 'complete') {
cb();
return;
}
$iframe.load(cb);
return;
}
cb();
});
}, common);
}; };
var errorHandlers = []; var errorHandlers = [];
@ -1263,15 +1228,6 @@ define([
}; };
}; };
// All code which is called implicitly is found below
Store.ready(function (err, Store) {
if (err) {
console.error(err);
return;
}
store = Store;
});
$(function () { $(function () {
Messages._applyTranslation(); Messages._applyTranslation();
}); });

View File

@ -9,8 +9,9 @@ define([
'/common/cryptpad-common.js', '/common/cryptpad-common.js',
'/common/fileObject.js', '/common/fileObject.js',
'/common/toolbar.js', '/common/toolbar.js',
'/customize/application_config.js' '/customize/application_config.js',
], function (Config, Listmap, Crypto, TextPatcher, Messages, JSONSortify, Cryptpad, FO, Toolbar, AppConfig) { '/common/cryptget.js'
], function (Config, Listmap, Crypto, TextPatcher, Messages, JSONSortify, Cryptpad, FO, Toolbar, AppConfig, Get) {
var module = window.MODULE = {}; var module = window.MODULE = {};
var $ = window.jQuery; var $ = window.jQuery;
@ -1854,6 +1855,31 @@ define([
}); });
}; };
// TODO: move that function and use a more generic API
var migrateAnonDrive = function (proxy, cb) {
if (sessionStorage.migrateAnonDrive) {
// Make sure we have an FS_hash and we don't use it, otherwise just stop the migration and cb
if (!localStorage.FS_hash || !APP.loggedIn) {
delete sessionStorage.migrateAnonDrive;
if (typeof(cb) === "function") { cb(); }
}
// Get the content of FS_hash and then merge the objects, remove the migration key and cb
var todo = function (err, doc) {
if (err) { logError("Cannot migrate recent pads", err); return; }
var parsed;
try { parsed = JSON.parse(doc); } catch (e) { logError("Cannot parsed recent pads", e); }
if (parsed) {
$.extend(true, proxy, parsed);
}
delete sessionStorage.migrateAnonDrive;
if (typeof(cb) === "function") { cb(); }
};
Get.get(localStorage.FS_hash, todo);
} else {
if (typeof(cb) === "function") { cb(); }
}
};
// don't initialize until the store is ready. // don't initialize until the store is ready.
Cryptpad.ready(function () { Cryptpad.ready(function () {
APP.$bar = $iframe.find('#toolbar'); APP.$bar = $iframe.find('#toolbar');
@ -1950,23 +1976,13 @@ define([
}; };
var onReady = function () { var onReady = function () {
module.files = proxy; module.files = proxy;
if (JSON.stringify(proxy) === '{}') {
var store = Cryptpad.getStore(true);
var drive = proxy.drive = {};
store.get(Cryptpad.storageKey, function (err, s) {
drive[FILES_DATA] = s;
initLocalStorage();
init(proxy);
APP.userList.onChange();
Cryptpad.removeLoadingScreen();
});
return;
}
if (!proxy.drive || typeof(proxy.drive) !== 'object') { proxy.drive = {}; } if (!proxy.drive || typeof(proxy.drive) !== 'object') { proxy.drive = {}; }
initLocalStorage(); migrateAnonDrive(proxy, function () {
init(proxy); initLocalStorage();
APP.userList.onChange(); init(proxy);
Cryptpad.removeLoadingScreen(); APP.userList.onChange();
Cryptpad.removeLoadingScreen();
});
}; };
var onDisconnect = function (info) { var onDisconnect = function (info) {
setEditable(false); setEditable(false);

View File

@ -739,7 +739,7 @@ define([
setEditable(false); setEditable(false);
// TODO inform them that the session was torn down // TODO inform them that the session was torn down
toolbar.failed(); toolbar.failed();
Cryptpad.alert(Messages.disconnectAlert); Cryptpad.alert(Messages.common_connectionLost);
}; };
var onConnectionChange = realtimeOptions.onConnectionChange = function (info) { var onConnectionChange = realtimeOptions.onConnectionChange = function (info) {
@ -750,7 +750,7 @@ define([
toolbar.reconnecting(info.myId); toolbar.reconnecting(info.myId);
Cryptpad.findOKButton().click(); Cryptpad.findOKButton().click();
} else { } else {
Cryptpad.alert(Messages.disconnectAlert); Cryptpad.alert(Messages.common_connectionLost);
} }
}; };

View File

@ -782,7 +782,7 @@ define([
// inform of network disconnect // inform of network disconnect
setEditable(false); setEditable(false);
toolbar.failed(); toolbar.failed();
Cryptpad.alert(Messages.disconnectAlert); Cryptpad.alert(Messages.common_connectionLost);
}; };
var onConnectionChange = config.onConnectionChange = function (info) { var onConnectionChange = config.onConnectionChange = function (info) {
@ -793,7 +793,7 @@ define([
toolbar.reconnecting(info.myId); toolbar.reconnecting(info.myId);
Cryptpad.findOKButton().click(); Cryptpad.findOKButton().click();
} else { } else {
Cryptpad.alert(Messages.disconnectAlert); Cryptpad.alert(Messages.common_connectionLost);
} }
}; };