summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt A. Tobin <email@mattatobin.com>2019-11-11 01:26:42 -0500
committerMatt A. Tobin <email@mattatobin.com>2019-11-11 01:26:42 -0500
commitdc46cd9eccfd6555626868e9d526ad52927ec1ef (patch)
tree5baef1316cad3e78b15512d259076d93cf9bd267
parent7047b11cf0126c784fca3aab78d78cd2d85d7d8f (diff)
downloadUXP-dc46cd9eccfd6555626868e9d526ad52927ec1ef.tar
UXP-dc46cd9eccfd6555626868e9d526ad52927ec1ef.tar.gz
UXP-dc46cd9eccfd6555626868e9d526ad52927ec1ef.tar.lz
UXP-dc46cd9eccfd6555626868e9d526ad52927ec1ef.tar.xz
UXP-dc46cd9eccfd6555626868e9d526ad52927ec1ef.zip
Bug 1315662 - delete SMTP server login credentials when deleting the account or if hostname/username changes.
Tag #1273
-rw-r--r--mailnews/base/prefs/content/am-smtp.js5
-rw-r--r--mailnews/compose/src/nsSmtpServer.cpp54
-rw-r--r--mailnews/compose/src/nsSmtpServer.h6
3 files changed, 47 insertions, 18 deletions
diff --git a/mailnews/base/prefs/content/am-smtp.js b/mailnews/base/prefs/content/am-smtp.js
index f107a32ae..44580bc20 100644
--- a/mailnews/base/prefs/content/am-smtp.js
+++ b/mailnews/base/prefs/content/am-smtp.js
@@ -54,6 +54,11 @@ var gSmtpServerListWindow =
if (!cancel)
{
+ // Remove password information first.
+ try {
+ server.forgetPassword();
+ } catch (e) { /* It is OK if this fails. */ }
+ // Remove the server.
MailServices.smtp.deleteServer(server);
parent.replaceWithDefaultSmtpServer(server.key);
this.refreshServerList("", true);
diff --git a/mailnews/compose/src/nsSmtpServer.cpp b/mailnews/compose/src/nsSmtpServer.cpp
index ddbaa4e3c..555993ad0 100644
--- a/mailnews/compose/src/nsSmtpServer.cpp
+++ b/mailnews/compose/src/nsSmtpServer.cpp
@@ -121,6 +121,18 @@ nsresult nsSmtpServer::getPrefs()
return NS_OK;
}
+// This function is intentionally called the same as in nsIMsgIncomingServer.
+nsresult
+nsSmtpServer::OnUserOrHostNameChanged(const nsACString& oldName,
+ const nsACString& newName,
+ bool hostnameChanged)
+{
+ // Reset password so that users are prompted for new password for the new user/host.
+ (void)ForgetPassword();
+
+ return NS_OK;
+}
+
NS_IMETHODIMP
nsSmtpServer::GetHostname(nsACString &aHostname)
{
@@ -137,12 +149,22 @@ nsSmtpServer::GetHostname(nsACString &aHostname)
NS_IMETHODIMP
nsSmtpServer::SetHostname(const nsACString &aHostname)
{
+ nsCString oldName;
+ nsresult rv = GetHostname(oldName);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // A few things to take care of if we're changing the hostname.
+ if (!oldName.Equals(aHostname, nsCaseInsensitiveCStringComparator())) {
+ rv = OnUserOrHostNameChanged(oldName, aHostname, true);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
if (!aHostname.IsEmpty())
return mPrefBranch->SetCharPref("hostname", PromiseFlatCString(aHostname).get());
// If the pref value is already empty, ClearUserPref will return
// NS_ERROR_UNEXPECTED, so don't check the rv here.
- mPrefBranch->ClearUserPref("hostname");
+ (void)mPrefBranch->ClearUserPref("hostname");
return NS_OK;
}
@@ -284,12 +306,22 @@ nsSmtpServer::GetUsername(nsACString &aUsername)
NS_IMETHODIMP
nsSmtpServer::SetUsername(const nsACString &aUsername)
{
+ // Need to take care of few things if we're changing the username.
+ nsCString oldName;
+ nsresult rv = GetUsername(oldName);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ if (!oldName.Equals(aUsername)) {
+ rv = OnUserOrHostNameChanged(oldName, aUsername, false);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
if (!aUsername.IsEmpty())
return mPrefBranch->SetCharPref("username", PromiseFlatCString(aUsername).get());
// If the pref value is already empty, ClearUserPref will return
// NS_ERROR_UNEXPECTED, so don't check the rv here.
- mPrefBranch->ClearUserPref("username");
+ (void)mPrefBranch->ClearUserPref("username");
return NS_OK;
}
@@ -575,22 +607,10 @@ nsSmtpServer::ForgetPassword()
NS_ENSURE_SUCCESS(rv, rv);
// Get the current server URI without the username
- nsAutoCString serverUri(NS_LITERAL_CSTRING("smtp://"));
-
- nsCString hostname;
- rv = GetHostname(hostname);
-
- if (NS_SUCCEEDED(rv) && !hostname.IsEmpty()) {
- nsCString escapedHostname;
- MsgEscapeString(hostname, nsINetUtil::ESCAPE_URL_PATH, escapedHostname);
- // not all servers have a hostname
- serverUri.Append(escapedHostname);
- }
-
uint32_t count;
nsILoginInfo** logins;
- NS_ConvertUTF8toUTF16 currServer(serverUri);
+ NS_ConvertASCIItoUTF16 serverUri(GetServerURIInternal(false));
nsCString serverCUsername;
rv = GetUsername(serverCUsername);
@@ -598,8 +618,8 @@ nsSmtpServer::ForgetPassword()
NS_ConvertUTF8toUTF16 serverUsername(serverCUsername);
- rv = loginMgr->FindLogins(&count, currServer, EmptyString(),
- currServer, &logins);
+ rv = loginMgr->FindLogins(&count, serverUri, EmptyString(),
+ serverUri, &logins);
NS_ENSURE_SUCCESS(rv, rv);
// There should only be one-login stored for this url, however just in case
diff --git a/mailnews/compose/src/nsSmtpServer.h b/mailnews/compose/src/nsSmtpServer.h
index 4473d7af8..9dbbe54b4 100644
--- a/mailnews/compose/src/nsSmtpServer.h
+++ b/mailnews/compose/src/nsSmtpServer.h
@@ -30,13 +30,17 @@ private:
nsCString mKey;
nsCOMPtr<nsIPrefBranch> mPrefBranch;
nsCOMPtr<nsIPrefBranch> mDefPrefBranch;
-
+
nsresult getPrefs();
void getIntPrefWithDefault(const char *prefName, int32_t *val,
int32_t defval);
nsresult GetPasswordWithoutUI();
nsCString GetServerURIInternal(const bool aIncludeUsername);
+ nsresult OnUserOrHostNameChanged(const nsACString& oldName,
+ const nsACString& newName,
+ bool hostnameChanged);
+
nsCString m_password;
bool m_logonFailed;
};