This commit is contained in:
yflory 2017-06-09 12:29:19 +02:00
parent f8c69573fd
commit 2a94bdaf05
4 changed files with 217 additions and 191 deletions

View File

@ -141,8 +141,11 @@ define([
var onReady = function (f, proxy, Cryptpad, exp) { var onReady = function (f, proxy, Cryptpad, exp) {
var fo = exp.fo = FO.init(proxy.drive, { var fo = exp.fo = FO.init(proxy.drive, {
Cryptpad: Cryptpad Cryptpad: Cryptpad,
rt: exp.realtime
}); });
var todo = function () {
fo.fixFiles();
//storeObj = proxy; //storeObj = proxy;
store = initStore(fo, proxy, exp); store = initStore(fo, proxy, exp);
@ -161,7 +164,7 @@ define([
var tokenKey = 'loginToken'; var tokenKey = 'loginToken';
if (Cryptpad.isLoggedIn()) { if (Cryptpad.isLoggedIn()) {
/* This isn't truly secure, since anyone who can read the user's object can /* This isn't truly secure, since anyone who can read the user's object can
set their local loginToken to match that in the object. However, it exposes set their local loginToken to match that in the object. However, it exposes
a UI that will work most of the time. */ a UI that will work most of the time. */
@ -212,6 +215,8 @@ define([
} }
}); });
}; };
fo.migrate(todo);
};
var initialized = false; var initialized = false;
@ -260,6 +265,7 @@ define([
var rt = window.rt = Listmap.create(listmapConfig); var rt = window.rt = Listmap.create(listmapConfig);
exp.realtime = rt.realtime;
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;
@ -291,10 +297,13 @@ define([
return; return;
} }
}) })
.on('change', ['drive'], function () { .on('change', [], function () {
var path = arguments[2]; var path = arguments[2];
var value = arguments[1]; var value = arguments[1];
if (path[1] === "migrate" && value === 1) { console.log('abcd');
console.log(arguments);
if (path[0] === 'drive' && path[1] === "migrate" && value === 1) {
console.log('PEWPEWPEW');
rt.network.disconnect(); rt.network.disconnect();
rt.realtime.abort(); rt.realtime.abort();
Cryptpad.alert("Disconnected while migration"); Cryptpad.alert("Disconnected while migration");

View File

@ -106,6 +106,7 @@ define([
var oldFo = FO.init(parsed.drive, { var oldFo = FO.init(parsed.drive, {
Cryptpad: Cryptpad Cryptpad: Cryptpad
}); });
var todo = function () {
oldFo.fixFiles(); oldFo.fixFiles();
var newData = Cryptpad.getStore().getProxy(); var newData = Cryptpad.getStore().getProxy();
var newFo = newData.fo; var newFo = newData.fo;
@ -151,6 +152,8 @@ define([
proxy.FS_hashes = []; proxy.FS_hashes = [];
} }
proxy.FS_hashes.push(localStorage.FS_hash); proxy.FS_hashes.push(localStorage.FS_hash);
};
oldFo.migrate(todo);
} }
if (typeof(cb) === "function") { cb(); } if (typeof(cb) === "function") { cb(); }
}; };

View File

@ -759,7 +759,101 @@ define([
* INTEGRITY CHECK * INTEGRITY CHECK
*/ */
exp.migrate = function (cb) {
// Make sure unsorted doesn't exist anymore
// Note: Unsorted only works with the old structure where pads are href
// It should be called before the migration code
var fixUnsorted = function () {
if (!files[UNSORTED] || !files[OLD_FILES_DATA]) { return; }
debug("UNSORTED still exists in the object, removing it...");
var us = files[UNSORTED];
if (us.length === 0) {
delete files[UNSORTED];
return;
}
var root = find([ROOT]);
us.forEach(function (el) {
if (typeof el !== "string") {
return;
}
var data = files[OLD_FILES_DATA].filter(function (x) {
return x.href === el;
});
if (data.length === 0) {
files[OLD_FILES_DATA].push({
href: el
});
}
return;
});
delete files[UNSORTED];
};
// mergeDrive...
var migrateToNewFormat = function (todo) {
if (!files[OLD_FILES_DATA]) {
return void todo();
}
try {
debug("Migrating file system...");
files.migrate = 1;
if (exp.rt) { exp.rt.sync(); }
window.setTimeout(function () {
var oldData = files[OLD_FILES_DATA].slice();
if (!files[FILES_DATA]) {
files[FILES_DATA] = {};
}
var newData = files[FILES_DATA];
//var oldFiles = oldData.map(function (o) { return o.href; });
oldData.forEach(function (obj) {
if (!obj || !obj.href) { return; }
var href = obj.href;
var id = Cryptpad.createRandomInteger();
var paths = findFile(href);
var data = obj;
var key = Cryptpad.createChannelId();
if (data) {
newData[id] = data;
} else {
newData[id] = {href: href};
}
paths.forEach(function (p) {
var parentPath = p.slice();
var okey = parentPath.pop(); // get the parent
var parent = find(parentPath);
if (isInTrashRoot(p)) {
parent.element = id;
newData[id].filename = p[1];
return;
}
if (isPathIn(p, ['hrefArray'])) {
parent[okey] = id;
return;
}
// else root or trash (not trashroot)
parent[key] = id;
newData[id].filename = okey;
delete parent[okey];
});
});
files[OLD_FILES_DATA] = undefined;
delete files[OLD_FILES_DATA];
files.migrate = undefined;
delete files.migrate;
console.log('done');
todo();
}, 300);
} catch(e) {
console.error(e);
todo();
}
};
fixUnsorted();
migrateToNewFormat(cb);
};
exp.fixFiles = function () { exp.fixFiles = function () {
console.error('.');
// Explore the tree and check that everything is correct: // Explore the tree and check that everything is correct:
// * 'root', 'trash', 'unsorted' and 'filesData' exist and are objects // * 'root', 'trash', 'unsorted' and 'filesData' exist and are objects
// * ROOT: Folders are objects, files are href // * ROOT: Folders are objects, files are href
@ -882,87 +976,6 @@ define([
}); });
}; };
// Make sure unsorted doesn't exist anymore
// Note: Unsorted only works with the old structure where pads are href
// It should be called before the migration code
var fixUnsorted = function () {
if (!files[UNSORTED] || !files[OLD_FILES_DATA]) { return; }
debug("UNSORTED still exists in the object, removing it...");
var us = files[UNSORTED];
if (us.length === 0) {
delete files[UNSORTED];
return;
}
var root = find([ROOT]);
us.forEach(function (el) {
if (typeof el !== "string") {
return;
}
var data = files[OLD_FILES_DATA].filter(function (x) {
return x.href === el;
});
if (data.length === 0) {
files[OLD_FILES_DATA].push({
href: el
});
}
return;
});
delete files[UNSORTED];
};
// mergeDrive...
var migrateToNewFormat = function () {
if (!files[OLD_FILES_DATA]) { return; }
try {
files.migrate = 1;
var oldData = files[OLD_FILES_DATA].slice();
if (!files[FILES_DATA]) {
files[FILES_DATA] = {};
}
var newData = files[FILES_DATA];
//var oldFiles = oldData.map(function (o) { return o.href; });
oldData.forEach(function (obj) {
if (!obj || !obj.href) { return; }
var href = obj.href;
var id = Cryptpad.createRandomInteger();
var paths = findFile(href);
var data = obj;
var key = Cryptpad.createChannelId();
if (data) {
newData[id] = data;
} else {
newData[id] = {href: href};
}
paths.forEach(function (p) {
var parentPath = p.slice();
var okey = parentPath.pop(); // get the parent
var parent = find(parentPath);
if (isInTrashRoot(p)) {
parent.element = id;
newData[id].filename = p[1];
return;
}
if (isPathIn(p, ['hrefArray'])) {
parent[okey] = id;
return;
}
// else root or trash (not trashroot)
parent[key] = id;
newData[id].filename = okey;
delete parent[okey];
});
});
files[OLD_FILES_DATA] = undefined;
delete files[OLD_FILES_DATA];
files.migrate = undefined;
delete files.migrate;
} catch(e) {
console.error(e);
}
};
fixUnsorted();
migrateToNewFormat();
fixRoot(); fixRoot();
fixTrashRoot(); fixTrashRoot();
if (!workgroup) { if (!workgroup) {

View File

@ -2504,6 +2504,7 @@ define([
module.resetTree(); module.resetTree();
return false; return false;
}).on('change', ['drive', 'migrate'], function () { }).on('change', ['drive', 'migrate'], function () {
console.log('OKOKOK');
var path = arguments[2]; var path = arguments[2];
var value = arguments[1]; var value = arguments[1];
if (path[1] === "migrate" && value === 1) { if (path[1] === "migrate" && value === 1) {