Async migration

This commit is contained in:
yflory
2018-05-03 17:59:22 +02:00
parent 91860186d1
commit 6c4c5c135b
2 changed files with 133 additions and 96 deletions

View File

@@ -1,106 +1,142 @@
define(['/common/common-feedback.js'], function (Feedback) { define([
'/common/common-feedback.js',
'/common/common-hash.js',
'/common/common-util.js',
'/bower_components/nthen/index.js',
], function (Feedback, Hash, Util, nThen) {
// Start migration check // Start migration check
// Versions: // Versions:
// 1: migrate pad attributes // 1: migrate pad attributes
// 2: migrate indent settings (codemirror) // 2: migrate indent settings (codemirror)
return function (userObject) { return function (userObject, cb) {
var version = userObject.version || 0; var version = userObject.version || 0;
// DEPRECATED nThen(function () {
// Migration 1: pad attributes moved to filesData // DEPRECATED
var migratePadAttributesToData = function () { // Migration 1: pad attributes moved to filesData
return true; var migratePadAttributesToData = function () {
}; return true;
if (version < 1) { };
migratePadAttributesToData(); if (version < 1) {
} migratePadAttributesToData();
// Migration 2: global attributes from root to 'settings' subobjects
var migrateAttributes = function () {
var drawer = 'cryptpad.userlist-drawer';
var polls = 'cryptpad.hide_poll_text';
var indentKey = 'cryptpad.indentUnit';
var useTabsKey = 'cryptpad.indentWithTabs';
var settings = userObject.settings = userObject.settings || {};
if (typeof(userObject[indentKey]) !== "undefined") {
settings.codemirror = settings.codemirror || {};
settings.codemirror.indentUnit = userObject[indentKey];
delete userObject[indentKey];
} }
if (typeof(userObject[useTabsKey]) !== "undefined") { }).nThen(function () {
settings.codemirror = settings.codemirror || {}; // Migration 2: global attributes from root to 'settings' subobjects
settings.codemirror.indentWithTabs = userObject[useTabsKey]; var migrateAttributes = function () {
delete userObject[useTabsKey]; var drawer = 'cryptpad.userlist-drawer';
var polls = 'cryptpad.hide_poll_text';
var indentKey = 'cryptpad.indentUnit';
var useTabsKey = 'cryptpad.indentWithTabs';
var settings = userObject.settings = userObject.settings || {};
if (typeof(userObject[indentKey]) !== "undefined") {
settings.codemirror = settings.codemirror || {};
settings.codemirror.indentUnit = userObject[indentKey];
delete userObject[indentKey];
}
if (typeof(userObject[useTabsKey]) !== "undefined") {
settings.codemirror = settings.codemirror || {};
settings.codemirror.indentWithTabs = userObject[useTabsKey];
delete userObject[useTabsKey];
}
if (typeof(userObject[drawer]) !== "undefined") {
settings.toolbar = settings.toolbar || {};
settings.toolbar['userlist-drawer'] = userObject[drawer];
delete userObject[drawer];
}
if (typeof(userObject[polls]) !== "undefined") {
settings.poll = settings.poll || {};
settings.poll['hide-text'] = userObject[polls];
delete userObject[polls];
}
};
if (version < 2) {
migrateAttributes();
Feedback.send('Migrate-2', true);
userObject.version = version = 2;
} }
if (typeof(userObject[drawer]) !== "undefined") { }).nThen(function () {
settings.toolbar = settings.toolbar || {}; // Migration 3: language from localStorage to settings
settings.toolbar['userlist-drawer'] = userObject[drawer]; var migrateLanguage = function () {
delete userObject[drawer]; if (!localStorage.CRYPTPAD_LANG) { return; }
var l = localStorage.CRYPTPAD_LANG;
userObject.settings.language = l;
};
if (version < 3) {
migrateLanguage();
Feedback.send('Migrate-3', true);
userObject.version = version = 3;
} }
if (typeof(userObject[polls]) !== "undefined") { }).nThen(function () {
settings.poll = settings.poll || {}; // Migration 4: allowUserFeedback to settings
settings.poll['hide-text'] = userObject[polls]; var migrateFeedback = function () {
delete userObject[polls]; var settings = userObject.settings = userObject.settings || {};
if (typeof(userObject['allowUserFeedback']) !== "undefined") {
settings.general = settings.general || {};
settings.general.allowUserFeedback = userObject['allowUserFeedback'];
delete userObject['allowUserFeedback'];
}
};
if (version < 4) {
migrateFeedback();
Feedback.send('Migrate-4', true);
userObject.version = version = 4;
} }
}; }).nThen(function () {
if (version < 2) { // Migration 5: dates to Number
migrateAttributes(); var migrateDates = function () {
Feedback.send('Migrate-2', true); var data = userObject.drive && userObject.drive.filesData;
userObject.version = version = 2; if (data) {
} for (var id in data) {
if (typeof data[id].ctime !== "number") {
data[id].ctime = +new Date(data[id].ctime);
}
// Migration 3: language from localStorage to settings if (typeof data[id].atime !== "number") {
var migrateLanguage = function () { data[id].atime = +new Date(data[id].atime);
if (!localStorage.CRYPTPAD_LANG) { return; } }
var l = localStorage.CRYPTPAD_LANG;
userObject.settings.language = l;
};
if (version < 3) {
migrateLanguage();
Feedback.send('Migrate-3', true);
userObject.version = version = 3;
}
// Migration 4: allowUserFeedback to settings
var migrateFeedback = function () {
var settings = userObject.settings = userObject.settings || {};
if (typeof(userObject['allowUserFeedback']) !== "undefined") {
settings.general = settings.general || {};
settings.general.allowUserFeedback = userObject['allowUserFeedback'];
delete userObject['allowUserFeedback'];
}
};
if (version < 4) {
migrateFeedback();
Feedback.send('Migrate-4', true);
userObject.version = version = 4;
}
// Migration 5: dates to Number
var migrateDates = function () {
var data = userObject.drive && userObject.drive.filesData;
if (data) {
for (var id in data) {
if (typeof data[id].ctime !== "number") {
data[id].ctime = +new Date(data[id].ctime);
}
if (typeof data[id].atime !== "number") {
data[id].atime = +new Date(data[id].atime);
} }
} }
};
if (version < 5) {
migrateDates();
Feedback.send('Migrate-5', true);
userObject.version = version = 5;
} }
}; }).nThen(function (waitFor) {
if (version < 5) { console.log('start');
migrateDates(); var addChannelId = function () {
Feedback.send('Migrate-5', true); var data = userObject.drive.filesData;
userObject.version = version = 5; var el, parsed;
} var n = nThen(function () {});
Object.keys(data).forEach(function (k) {
n = n.nThen(function (w) {
setTimeout(w(function () {
el = data[k];
parsed = Hash.parsePadUrl(el.href);
if (!el.href) { return; }
if (!el.channel) {
if (parsed.hashData && parsed.hashData.type === "file") {
// PASSWORD_FILES
el.channel = Util.base64ToHex(parsed.hashData.channel);
} else {
var secret = Hash.getSecrets(parsed.type, parsed.hash, el.password);
el.channel = secret.channel;
}
console.log('Adding missing channel in filesData ', el.channel);
}
}));
});
});
n.nThen(waitFor());
};
if (version < 6) {
addChannelId();
Feedback.send('Migrate-6', true);
userObject.version = version = 6;
}
}).nThen(function () {
console.log('done');
cb();
});
}; };
}); });

View File

@@ -1052,11 +1052,13 @@ define([
postMessage("DRIVE_LOG", msg); postMessage("DRIVE_LOG", msg);
} }
}); });
var todo = function () { nThen(function (waitFor) {
userObject.migrate(waitFor());
}).nThen(function (waitFor) {
Migrate(proxy, waitFor());
}).nThen(function () {
userObject.fixFiles(); userObject.fixFiles();
Migrate(proxy);
var requestLogin = function () { var requestLogin = function () {
postMessage("REQUEST_LOGIN"); postMessage("REQUEST_LOGIN");
}; };
@@ -1119,8 +1121,7 @@ define([
proxy.on('change', [Constants.tokenKey], function () { proxy.on('change', [Constants.tokenKey], function () {
postMessage("UPDATE_TOKEN", { token: proxy[Constants.tokenKey] }); postMessage("UPDATE_TOKEN", { token: proxy[Constants.tokenKey] });
}); });
}; });
userObject.migrate(todo);
}; };
var connect = function (data, cb) { var connect = function (data, cb) {
@@ -1139,7 +1140,7 @@ define([
validateKey: secret.keys.validateKey || undefined, validateKey: secret.keys.validateKey || undefined,
crypto: Crypto.createEncryptor(secret.keys), crypto: Crypto.createEncryptor(secret.keys),
userName: 'fs', userName: 'fs',
logLevel: 1, logLevel: 2,
ChainPad: ChainPad, ChainPad: ChainPad,
classic: true, classic: true,
}; };