Dactyloidae/mailnews/base/util/mailnewsMigrator.js

203 lines
6.8 KiB
JavaScript

/* 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);
}