diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:44:51 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:44:51 +0000 |
commit | 9e3c08db40b8916968b9f30096c7be3f00ce9647 (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /browser/components/migration/360seMigrationUtils.sys.mjs | |
parent | Initial commit. (diff) | |
download | thunderbird-9e3c08db40b8916968b9f30096c7be3f00ce9647.tar.xz thunderbird-9e3c08db40b8916968b9f30096c7be3f00ce9647.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'browser/components/migration/360seMigrationUtils.sys.mjs')
-rw-r--r-- | browser/components/migration/360seMigrationUtils.sys.mjs | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/browser/components/migration/360seMigrationUtils.sys.mjs b/browser/components/migration/360seMigrationUtils.sys.mjs new file mode 100644 index 0000000000..91bf263d74 --- /dev/null +++ b/browser/components/migration/360seMigrationUtils.sys.mjs @@ -0,0 +1,191 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; + +import { MigrationUtils } from "resource:///modules/MigrationUtils.sys.mjs"; + +const lazy = {}; + +ChromeUtils.defineESModuleGetters(lazy, { + PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs", + Sqlite: "resource://gre/modules/Sqlite.sys.mjs", +}); + +XPCOMUtils.defineLazyGetter( + lazy, + "filenamesRegex", + () => /^360(?:default_ori|sefav)_([0-9_]+)\.favdb$/i +); + +const kBookmarksFileName = "360sefav.dat"; + +function Bookmarks(aProfileFolder) { + let file = aProfileFolder.clone(); + file.append(kBookmarksFileName); + + this._file = file; +} +Bookmarks.prototype = { + type: MigrationUtils.resourceTypes.BOOKMARKS, + + get exists() { + return this._file.exists() && this._file.isReadable(); + }, + + migrate(aCallback) { + return (async () => { + let folderMap = new Map(); + let toolbarBMs = []; + + let connection = await lazy.Sqlite.openConnection({ + path: this._file.path, + }); + + try { + let rows = await connection.execute( + `WITH RECURSIVE + bookmark(id, parent_id, is_folder, title, url, pos) AS ( + VALUES(0, -1, 1, '', '', 0) + UNION + SELECT f.id, f.parent_id, f.is_folder, f.title, f.url, f.pos + FROM tb_fav AS f + JOIN bookmark AS b ON f.parent_id = b.id + ORDER BY f.pos ASC + ) + SELECT id, parent_id, is_folder, title, url FROM bookmark WHERE id` + ); + + for (let row of rows) { + let id = parseInt(row.getResultByName("id"), 10); + let parent_id = parseInt(row.getResultByName("parent_id"), 10); + let is_folder = parseInt(row.getResultByName("is_folder"), 10); + let title = row.getResultByName("title"); + let url = row.getResultByName("url"); + + let bmToInsert; + + if (is_folder) { + bmToInsert = { + children: [], + title, + type: lazy.PlacesUtils.bookmarks.TYPE_FOLDER, + }; + folderMap.set(id, bmToInsert); + } else { + try { + new URL(url); + } catch (ex) { + console.error( + `Ignoring ${url} when importing from 360se because of exception: ${ex}` + ); + continue; + } + + bmToInsert = { + title, + url, + }; + } + + if (folderMap.has(parent_id)) { + folderMap.get(parent_id).children.push(bmToInsert); + } else if (parent_id === 0) { + toolbarBMs.push(bmToInsert); + } + } + } finally { + await connection.close(); + } + + if (toolbarBMs.length) { + let parentGuid = lazy.PlacesUtils.bookmarks.toolbarGuid; + await MigrationUtils.insertManyBookmarksWrapper(toolbarBMs, parentGuid); + } + })().then( + () => aCallback(true), + e => { + console.error(e); + aCallback(false); + } + ); + }, +}; + +export var Qihoo360seMigrationUtils = { + async getAlternativeBookmarks({ bookmarksPath, localState }) { + let lastModificationDate = new Date(0); + let path = bookmarksPath; + let profileFolder = PathUtils.parent(bookmarksPath); + + if (await IOUtils.exists(bookmarksPath)) { + try { + let { lastModified } = await IOUtils.stat(bookmarksPath); + lastModificationDate = new Date(lastModified); + } catch (ex) { + console.error(ex); + } + } + + // Somewhat similar to source profiles, but for bookmarks only + let subDir = + (localState.sync_login_info && localState.sync_login_info.filepath) || ""; + + if (subDir) { + let legacyBookmarksPath = PathUtils.join( + profileFolder, + subDir, + kBookmarksFileName + ); + if (await IOUtils.exists(legacyBookmarksPath)) { + try { + let { lastModified } = await IOUtils.stat(legacyBookmarksPath); + lastModificationDate = new Date(lastModified); + path = legacyBookmarksPath; + } catch (ex) { + console.error(ex); + } + } + } + + let dailyBackupPath = PathUtils.join(profileFolder, subDir, "DailyBackup"); + for (const entry of await IOUtils.getChildren(dailyBackupPath, { + ignoreAbsent: true, + })) { + let filename = PathUtils.filename(entry); + let matches = lazy.filenamesRegex.exec(filename); + if (!matches) { + continue; + } + + let entryDate = new Date(matches[1].replace(/_/g, "-")); + if (entryDate < lastModificationDate) { + continue; + } + + lastModificationDate = entryDate; + path = entry; + } + + if (PathUtils.filename(path) === kBookmarksFileName) { + let resource = this.getLegacyBookmarksResource(PathUtils.parent(path)); + return { resource }; + } + return { path }; + }, + + getLegacyBookmarksResource(aParentFolder) { + let parentFolder; + try { + parentFolder = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); + parentFolder.initWithPath(aParentFolder); + } catch (ex) { + console.error(ex); + return null; + } + + let bookmarks = new Bookmarks(parentFolder); + return bookmarks.exists ? bookmarks : null; + }, +}; |