Migration script

pull/1/head
yflory 5 years ago
parent 9a0251f4ba
commit d3b03f46ea

@ -545,7 +545,7 @@ define([
var sfData = files.sharedFolders[id] || {}; var sfData = files.sharedFolders[id] || {};
var parsed = Hash.parsePadUrl(sfData.href); var parsed = Hash.parsePadUrl(sfData.href);
var secret = Hash.getSecrets('drive', parsed.hash, sfData.password); var secret = Hash.getSecrets('drive', parsed.hash, sfData.password);
manager.addProxy(id, f, null, secret.keys.secondaryKey); manager.addProxy(id, {proxy: f}, null, secret.keys.secondaryKey);
}); });
// UI containers // UI containers

@ -2034,7 +2034,7 @@ define([
pin: pin, pin: pin,
unpin: unpin, unpin: unpin,
loadSharedFolder: loadSharedFolder, loadSharedFolder: loadSharedFolder,
settings: proxy.settings settings: proxy.settings,
}, { }, {
outer: true, outer: true,
removeOwnedChannel: function (channel, cb) { Store.removeOwnedChannel('', channel, cb); }, removeOwnedChannel: function (channel, cb) { Store.removeOwnedChannel('', channel, cb); },
@ -2043,7 +2043,8 @@ define([
log: function (msg) { log: function (msg) {
// broadcast to all drive apps // broadcast to all drive apps
sendDriveEvent("DRIVE_LOG", msg); sendDriveEvent("DRIVE_LOG", msg);
} },
rt: store.realtime
}); });
var userObject = store.userObject = manager.user.userObject; var userObject = store.userObject = manager.user.userObject;
addSharedFolderHandler(); addSharedFolderHandler();

@ -19,7 +19,52 @@ define([
var allSharedFolders = {}; var allSharedFolders = {};
SF.load = function (config, id, data, cb) { // No version: visible edit
// Version 2: encrypted edit links
SF.checkMigration = function (secondaryKey, proxy, uo, cb) {
if (true) { // XXX remove this block to enable migration at load time
// FIXME history
return void cb();
}
var drive = proxy.drive || proxy;
// View access: can't migrate
if (!secondaryKey) { return void cb(); }
// Already migrated: nothing to do
if (drive.version >= 2) { return void cb(); }
// Not yet migrating: migrate
if (!drive.migrateRo) { return void uo.migrateReadOnly(cb); }
// Already migrating: wait for the end...
var done = false;
var to;
var it = setInterval(function () {
if (drive.version >= 2) {
done = true;
clearTimeout(to);
clearInterval(it);
return void cb();
}
}, 100);
var to = setTimeout(function () {
clearInterval(it);
uo.migrateReadOnly(function () {
done = true;
cb();
});
}, 20000);
var path = proxy.drive ? ['drive', 'version'] : ['version'];
proxy.on('change', path, function () {
if (done) { return; }
if (drive.version >= 2) {
done = true;
clearTimeout(to);
clearInterval(it);
cb();
}
});
};
SF.load = function (config, id, data, _cb) {
var cb = Util.once(_cb);
var network = config.network; var network = config.network;
var store = config.store; var store = config.store;
var teamId = store.id || -1; var teamId = store.id || -1;
@ -36,8 +81,10 @@ define([
// The shared folder is already loaded, return its data // The shared folder is already loaded, return its data
setTimeout(function () { setTimeout(function () {
var leave = function () { SF.leave(secret.channel, teamId); }; var leave = function () { SF.leave(secret.channel, teamId); };
store.manager.addProxy(id, sf.rt.proxy, leave, secondaryKey); var uo = store.manager.addProxy(id, sf.rt, leave, secondaryKey);
cb(sf.rt, sf.metadata); SF.checkMigration(secondaryKey, sf.rt.proxy, uo, function () {
cb(sf.rt, sf.metadata);
});
}); });
sf.team.push(teamId); sf.team.push(teamId);
if (handler) { handler(id, sf.rt); } if (handler) { handler(id, sf.rt); }
@ -85,13 +132,15 @@ define([
if (!sf.queue) { if (!sf.queue) {
return; return;
} }
sf.leave = info.leave;
sf.metadata = info.metadata;
sf.queue.forEach(function (obj) { sf.queue.forEach(function (obj) {
var leave = function () { SF.leave(secret.channel, teamId); }; var leave = function () { SF.leave(secret.channel, teamId); };
obj.store.manager.addProxy(obj.id, rt.proxy, leave, secondaryKey); var uo = obj.store.manager.addProxy(obj.id, rt, leave, secondaryKey);
obj.cb(rt, info.metadata); SF.checkMigration(secondaryKey, rt.proxy, uo, function () {
obj.cb(sf.rt, sf.metadata);
});
}); });
sf.leave = info.leave;
sf.metadata = info.metadata;
sf.ready = true; sf.ready = true;
delete sf.queue; delete sf.queue;
}); });

@ -181,6 +181,7 @@ define([
}; };
}; };
var secret;
team.pin = function (data, cb) { return void cb({error: 'EFORBIDDEN'}); }; team.pin = function (data, cb) { return void cb({error: 'EFORBIDDEN'}); };
team.unpin = function (data, cb) { return void cb({error: 'EFORBIDDEN'}); }; team.unpin = function (data, cb) { return void cb({error: 'EFORBIDDEN'}); };
nThen(function (waitFor) { nThen(function (waitFor) {
@ -216,7 +217,6 @@ define([
}); });
}; };
var teamData = ctx.store.proxy.teams[team.id]; var teamData = ctx.store.proxy.teams[team.id];
var secret;
if (teamData) { if (teamData) {
secret = Hash.getSecrets('team', teamData.hash, teamData.password); secret = Hash.getSecrets('team', teamData.hash, teamData.password);
} }
@ -229,7 +229,6 @@ define([
settings: { settings: {
drive: Util.find(ctx.store, ['proxy', 'settings', 'drive']) drive: Util.find(ctx.store, ['proxy', 'settings', 'drive'])
}, },
editKey: secret && secret.keys.secondaryKey
}, { }, {
outer: true, outer: true,
removeOwnedChannel: function (channel, cb) { removeOwnedChannel: function (channel, cb) {
@ -250,13 +249,16 @@ define([
log: function (msg) { log: function (msg) {
// broadcast to all drive apps // broadcast to all drive apps
team.sendEvent("DRIVE_LOG", msg); team.sendEvent("DRIVE_LOG", msg);
} },
rt: team.realtime,
editKey: secret && secret.keys.secondaryKey
}); });
team.userObject = manager.user.userObject; team.userObject = manager.user.userObject;
team.userObject.fixFiles(); team.userObject.fixFiles();
}).nThen(function (waitFor) { }).nThen(function (waitFor) {
ctx.teams[id] = team; ctx.teams[id] = team;
registerChangeEvents(ctx, team, proxy); registerChangeEvents(ctx, team, proxy);
SF.checkMigration(secret && secret.keys.secondaryKey, proxy, team.userObject, waitFor());
SF.loadSharedFolders(ctx.Store, ctx.store.network, team, team.userObject, waitFor); SF.loadSharedFolders(ctx.Store, ctx.store.network, team, team.userObject, waitFor);
}).nThen(function () { }).nThen(function () {
if (!team.rpc) { return; } if (!team.rpc) { return; }

@ -413,6 +413,45 @@ define([
* INTEGRITY CHECK * INTEGRITY CHECK
*/ */
var onSync = function (next) {
if (exp.rt) {
exp.rt.sync();
Realtime.whenRealtimeSyncs(exp.rt, next);
} else {
window.setTimeout(next, 1000);
}
};
exp.migrateReadOnly = function (cb) {
if (!config.editKey) { return void cb({error: 'EFORBIDDEN'}); }
if (files.version >= 2) { return void cb(); } // Already migrated, nothing to do
files.migrateRo = 1;
var next = function () {
var copy = JSON.parse(JSON.stringify(files));
Object.keys(copy[FILES_DATA]).forEach(function (id) {
var data = copy[FILES_DATA][id] || {};
// If this pad has a visible href, encrypt it
// "&& data.roHref" is here to make sure this is not a "file"
if (data.href && data.roHref && !data.fileType && data.href.indexOf('#') !== -1) {
data.href = exp.cryptor.encrypt(data.href);
}
});
Object.keys(copy[SHARED_FOLDERS] || {}).forEach(function (id) {
var data = copy[SHARED_FOLDERS][id] || {};
// If this folder has a visible href, encrypt it
if (data.href && data.roHref && !data.fileType && data.href.indexOf('#') !== -1) {
data.href = exp.cryptor.encrypt(data.href);
}
});
copy.version = 2;
delete copy.migrateRo;
files = copy;
onSync(cb);
};
onSync(next);
};
exp.migrate = function (cb) { exp.migrate = function (cb) {
// Make sure unsorted doesn't exist anymore // Make sure unsorted doesn't exist anymore
// Note: Unsorted only works with the old structure where pads are href // Note: Unsorted only works with the old structure where pads are href
@ -491,13 +530,7 @@ define([
delete files.migrate; delete files.migrate;
todo(); todo();
}; };
if (exp.rt) { onSync(next);
exp.rt.sync();
// TODO
Realtime.whenRealtimeSyncs(exp.rt, next);
} else {
window.setTimeout(next, 1000);
}
} catch(e) { } catch(e) {
console.error(e); console.error(e);
todo(); todo();

@ -14,25 +14,26 @@ define([
}; };
// Add a shared folder to the list // Add a shared folder to the list
var addProxy = function (Env, id, proxy, leave, editKey) { var addProxy = function (Env, id, lm, leave, editKey) {
var cfg = getConfig(Env); var cfg = getConfig(Env);
cfg.sharedFolder = true; cfg.sharedFolder = true;
cfg.id = id; cfg.id = id;
cfg.editKey = editKey; cfg.editKey = editKey;
var userObject = UserObject.init(proxy, cfg); cfg.rt = lm.realtime;
var userObject = UserObject.init(lm.proxy, cfg);
if (userObject.fixFiles) { if (userObject.fixFiles) {
// Only in outer // Only in outer
userObject.fixFiles(); userObject.fixFiles();
} }
Env.folders[id] = { Env.folders[id] = {
proxy: proxy, proxy: lm.proxy,
userObject: userObject, userObject: userObject,
leave: leave leave: leave
}; };
return userObject; return userObject;
}; };
// TODO: Remove a shared folder from the list // XXX: Remove a shared folder from the list
var removeProxy = function (Env, id) { var removeProxy = function (Env, id) {
var f = Env.folders[id]; var f = Env.folders[id];
if (!f) { return; } if (!f) { return; }

@ -2,12 +2,11 @@ define([
'/customize/application_config.js', '/customize/application_config.js',
'/common/common-util.js', '/common/common-util.js',
'/common/common-hash.js', '/common/common-hash.js',
'/common/common-realtime.js',
'/common/common-constants.js', '/common/common-constants.js',
'/common/outer/userObject.js', '/common/outer/userObject.js',
'/customize/messages.js', '/customize/messages.js',
'/bower_components/chainpad-crypto/crypto.js', '/bower_components/chainpad-crypto/crypto.js',
], function (AppConfig, Util, Hash, Realtime, Constants, OuterFO, Messages, Crypto) { ], function (AppConfig, Util, Hash, Constants, OuterFO, Messages, Crypto) {
var module = {}; var module = {};
var ROOT = module.ROOT = "root"; var ROOT = module.ROOT = "root";

@ -52,7 +52,7 @@ define([
folders[fId] = folders[fId] || {}; folders[fId] = folders[fId] || {};
copyObjectValue(folders[fId], newObj); copyObjectValue(folders[fId], newObj);
if (manager && oldIds.indexOf(fId) === -1) { if (manager && oldIds.indexOf(fId) === -1) {
manager.addProxy(fId, folders[fId], null, secret.keys.secondaryKey); manager.addProxy(fId, { proxy: folders[fId] }, null, secret.keys.secondaryKey);
} }
})); }));
}); });

@ -61,7 +61,7 @@ define([
folders[fId] = folders[fId] || {}; folders[fId] = folders[fId] || {};
copyObjectValue(folders[fId], newObj); copyObjectValue(folders[fId], newObj);
if (manager && oldIds.indexOf(fId) === -1) { if (manager && oldIds.indexOf(fId) === -1) {
manager.addProxy(fId, folders[fId], null, secret.keys.secondaryKey); manager.addProxy(fId, { proxy: folders[fId] }, null, secret.keys.secondaryKey);
} }
})); }));
}); });

Loading…
Cancel
Save