diff options
Diffstat (limited to 'mailnews/base/util/mailnewsMigrator.js')
-rw-r--r-- | mailnews/base/util/mailnewsMigrator.js | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/mailnews/base/util/mailnewsMigrator.js b/mailnews/base/util/mailnewsMigrator.js new file mode 100644 index 000000000..2e3be6906 --- /dev/null +++ b/mailnews/base/util/mailnewsMigrator.js @@ -0,0 +1,203 @@ +/* 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/. */ + +/** + * Migrate profile (prefs and other files) from older versions of Mailnews to + * current. + * This should be run at startup. It migrates as needed: each migration + * function should be written to be a no-op when the value is already migrated + * or was never used in the old version. + */ + +this.EXPORTED_SYMBOLS = [ "migrateMailnews" ]; + +Components.utils.import("resource:///modules/errUtils.js"); +Components.utils.import("resource://gre/modules/Services.jsm"); +Components.utils.import("resource:///modules/mailServices.js"); +var Ci = Components.interfaces; +var kServerPrefVersion = 1; +var kSmtpPrefVersion = 1; +var kABRemoteContentPrefVersion = 1; +var kDefaultCharsetsPrefVersion = 1; + +function migrateMailnews() +{ + try { + MigrateServerAuthPref(); + } catch (e) { logException(e); } + + try { + MigrateABRemoteContentSettings(); + } catch (e) { logException(e); } + + try { + MigrateDefaultCharsets(); + } catch (e) { logException(e); } +} + +/** + * Migrates from pref useSecAuth to pref authMethod + */ +function MigrateServerAuthPref() +{ + try { + // comma-separated list of all accounts. + var accounts = Services.prefs.getCharPref("mail.accountmanager.accounts") + .split(","); + for (let i = 0; i < accounts.length; i++) + { + let accountKey = accounts[i]; // e.g. "account1" + if (!accountKey) + continue; + let serverKey = Services.prefs.getCharPref("mail.account." + accountKey + + ".server"); + let server = "mail.server." + serverKey + "."; + if (Services.prefs.prefHasUserValue(server + "authMethod")) + continue; + if (!Services.prefs.prefHasUserValue(server + "useSecAuth") && + !Services.prefs.prefHasUserValue(server + "auth_login")) + continue; + if (Services.prefs.prefHasUserValue(server + "migrated")) + continue; + // auth_login = false => old-style auth + // else: useSecAuth = true => "secure auth" + // else: cleartext pw + let auth_login = true; + let useSecAuth = false; // old default, default pref now removed + try { + auth_login = Services.prefs.getBoolPref(server + "auth_login"); + } catch (e) {} + try { + useSecAuth = Services.prefs.getBoolPref(server + "useSecAuth"); + } catch (e) {} + + Services.prefs.setIntPref(server + "authMethod", + auth_login ? (useSecAuth ? + Ci.nsMsgAuthMethod.secure : + Ci.nsMsgAuthMethod.passwordCleartext) : + Ci.nsMsgAuthMethod.old); + Services.prefs.setIntPref(server + "migrated", kServerPrefVersion); + } + + // same again for SMTP servers + var smtpservers = Services.prefs.getCharPref("mail.smtpservers").split(","); + for (let i = 0; i < smtpservers.length; i++) + { + if (!smtpservers[i]) + continue; + let server = "mail.smtpserver." + smtpservers[i] + "."; + if (Services.prefs.prefHasUserValue(server + "authMethod")) + continue; + if (!Services.prefs.prefHasUserValue(server + "useSecAuth") && + !Services.prefs.prefHasUserValue(server + "auth_method")) + continue; + if (Services.prefs.prefHasUserValue(server + "migrated")) + continue; + // auth_method = 0 => no auth + // else: useSecAuth = true => "secure auth" + // else: cleartext pw + let auth_method = 1; + let useSecAuth = false; + try { + auth_method = Services.prefs.getIntPref(server + "auth_method"); + } catch (e) {} + try { + useSecAuth = Services.prefs.getBoolPref(server + "useSecAuth"); + } catch (e) {} + + Services.prefs.setIntPref(server + "authMethod", + auth_method ? (useSecAuth ? + Ci.nsMsgAuthMethod.secure : + Ci.nsMsgAuthMethod.passwordCleartext) : + Ci.nsMsgAuthMethod.none); + Services.prefs.setIntPref(server + "migrated", kSmtpPrefVersion); + } + } catch(e) { logException(e); } +} + +/** + * The address book used to contain information about wheather to allow remote + * content for a given contact. Now we use the permission manager for that. + * Do a one-time migration for it. + */ +function MigrateABRemoteContentSettings() +{ + if (Services.prefs.prefHasUserValue("mail.ab_remote_content.migrated")) + return; + + // Search through all of our local address books looking for a match. + let enumerator = MailServices.ab.directories; + while (enumerator.hasMoreElements()) + { + let migrateAddress = function(aEmail) { + let uri = Services.io.newURI( + "chrome://messenger/content/email=" + aEmail, null, null); + Services.perms.add(uri, "image", Services.perms.ALLOW_ACTION); + } + + let addrbook = enumerator.getNext() + .QueryInterface(Components.interfaces.nsIAbDirectory); + try { + // If it's a read-only book, don't try to find a card as we we could never + // have set the AllowRemoteContent property. + if (addrbook.readOnly) + continue; + + let childCards = addrbook.childCards; + while (childCards.hasMoreElements()) + { + let card = childCards.getNext() + .QueryInterface(Components.interfaces.nsIAbCard); + + if (card.getProperty("AllowRemoteContent", false) == false) + continue; // not allowed for this contact + + if (card.primaryEmail) + migrateAddress(card.primaryEmail); + + if (card.getProperty("SecondEmail", "")) + migrateAddress(card.getProperty("SecondEmail", "")); + } + } catch (e) { logException(e); } + } + + Services.prefs.setIntPref("mail.ab_remote_content.migrated", + kABRemoteContentPrefVersion); +} + +/** + * If the default sending or viewing charset is one that is no longer available, + * change it back to the default. + */ +function MigrateDefaultCharsets() +{ + if (Services.prefs.prefHasUserValue("mail.default_charsets.migrated")) + return; + + let charsetConvertManager = Components.classes['@mozilla.org/charset-converter-manager;1'] + .getService(Components.interfaces.nsICharsetConverterManager); + + let sendCharsetStr = Services.prefs.getComplexValue( + "mailnews.send_default_charset", + Components.interfaces.nsIPrefLocalizedString).data; + + try { + charsetConvertManager.getCharsetTitle(sendCharsetStr); + } catch (e) { + Services.prefs.clearUserPref("mailnews.send_default_charset"); + } + + let viewCharsetStr = Services.prefs.getComplexValue( + "mailnews.view_default_charset", + Components.interfaces.nsIPrefLocalizedString).data; + + try { + charsetConvertManager.getCharsetTitle(viewCharsetStr); + } catch (e) { + Services.prefs.clearUserPref("mailnews.view_default_charset"); + } + + Services.prefs.setIntPref("mail.default_charsets.migrated", + kDefaultCharsetsPrefVersion); +} |