From 6c4c5c135bb75ef271bc6717c775688499072200 Mon Sep 17 00:00:00 2001 From: yflory Date: Thu, 3 May 2018 17:59:22 +0200 Subject: [PATCH] Async migration --- www/common/migrate-user-object.js | 216 +++++++++++++++++------------- www/common/outer/async-store.js | 13 +- 2 files changed, 133 insertions(+), 96 deletions(-) diff --git a/www/common/migrate-user-object.js b/www/common/migrate-user-object.js index c5d45a73b..8c8e45639 100644 --- a/www/common/migrate-user-object.js +++ b/www/common/migrate-user-object.js @@ -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 // Versions: // 1: migrate pad attributes // 2: migrate indent settings (codemirror) - return function (userObject) { + return function (userObject, cb) { var version = userObject.version || 0; - // DEPRECATED - // Migration 1: pad attributes moved to filesData - var migratePadAttributesToData = function () { - return true; - }; - 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]; + nThen(function () { + // DEPRECATED + // Migration 1: pad attributes moved to filesData + var migratePadAttributesToData = function () { + return true; + }; + if (version < 1) { + migratePadAttributesToData(); } - if (typeof(userObject[useTabsKey]) !== "undefined") { - settings.codemirror = settings.codemirror || {}; - settings.codemirror.indentWithTabs = userObject[useTabsKey]; - delete userObject[useTabsKey]; + }).nThen(function () { + // 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") { + 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") { - settings.toolbar = settings.toolbar || {}; - settings.toolbar['userlist-drawer'] = userObject[drawer]; - delete userObject[drawer]; + }).nThen(function () { + // Migration 3: language from localStorage to settings + var migrateLanguage = function () { + 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") { - settings.poll = settings.poll || {}; - settings.poll['hide-text'] = userObject[polls]; - delete userObject[polls]; + }).nThen(function () { + // 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; } - }; - if (version < 2) { - migrateAttributes(); - Feedback.send('Migrate-2', true); - userObject.version = version = 2; - } - - - - // Migration 3: language from localStorage to settings - var migrateLanguage = function () { - 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); + }).nThen(function () { + // 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; } - }; - if (version < 5) { - migrateDates(); - Feedback.send('Migrate-5', true); - userObject.version = version = 5; - } + }).nThen(function (waitFor) { + console.log('start'); + var addChannelId = function () { + var data = userObject.drive.filesData; + 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(); + }); }; }); diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index 8dfe19991..dbc0bf941 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -1052,11 +1052,13 @@ define([ postMessage("DRIVE_LOG", msg); } }); - var todo = function () { + nThen(function (waitFor) { + userObject.migrate(waitFor()); + }).nThen(function (waitFor) { + Migrate(proxy, waitFor()); + }).nThen(function () { userObject.fixFiles(); - Migrate(proxy); - var requestLogin = function () { postMessage("REQUEST_LOGIN"); }; @@ -1119,8 +1121,7 @@ define([ proxy.on('change', [Constants.tokenKey], function () { postMessage("UPDATE_TOKEN", { token: proxy[Constants.tokenKey] }); }); - }; - userObject.migrate(todo); + }); }; var connect = function (data, cb) { @@ -1139,7 +1140,7 @@ define([ validateKey: secret.keys.validateKey || undefined, crypto: Crypto.createEncryptor(secret.keys), userName: 'fs', - logLevel: 1, + logLevel: 2, ChainPad: ChainPad, classic: true, };