Migration script
This commit is contained in:
@@ -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,9 +81,11 @@ 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);
|
||||||
|
SF.checkMigration(secondaryKey, sf.rt.proxy, uo, function () {
|
||||||
cb(sf.rt, sf.metadata);
|
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); }
|
||||||
return sf.rt;
|
return sf.rt;
|
||||||
@@ -85,13 +132,15 @@ define([
|
|||||||
if (!sf.queue) {
|
if (!sf.queue) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sf.queue.forEach(function (obj) {
|
|
||||||
var leave = function () { SF.leave(secret.channel, teamId); };
|
|
||||||
obj.store.manager.addProxy(obj.id, rt.proxy, leave, secondaryKey);
|
|
||||||
obj.cb(rt, info.metadata);
|
|
||||||
});
|
|
||||||
sf.leave = info.leave;
|
sf.leave = info.leave;
|
||||||
sf.metadata = info.metadata;
|
sf.metadata = info.metadata;
|
||||||
|
sf.queue.forEach(function (obj) {
|
||||||
|
var leave = function () { SF.leave(secret.channel, teamId); };
|
||||||
|
var uo = obj.store.manager.addProxy(obj.id, rt, leave, secondaryKey);
|
||||||
|
SF.checkMigration(secondaryKey, rt.proxy, uo, function () {
|
||||||
|
obj.cb(sf.rt, sf.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);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user