diff options
author | Matt A. Tobin <email@mattatobin.com> | 2019-11-11 01:26:42 -0500 |
---|---|---|
committer | Matt A. Tobin <email@mattatobin.com> | 2019-11-11 01:26:42 -0500 |
commit | 656e8d6fef2a2ef69501337b3d0c8c4257070dc5 (patch) | |
tree | 5baef1316cad3e78b15512d259076d93cf9bd267 | |
parent | 47711961a40777a454be77209e60bfe640fd0c83 (diff) | |
download | uxp-656e8d6fef2a2ef69501337b3d0c8c4257070dc5.tar.gz |
Bug 1315662 - delete SMTP server login credentials when deleting the account or if hostname/username changes.
Tag mcp-graveyard/UXP#1273
-rw-r--r-- | mailnews/base/prefs/content/am-smtp.js | 5 | ||||
-rw-r--r-- | mailnews/compose/src/nsSmtpServer.cpp | 54 | ||||
-rw-r--r-- | mailnews/compose/src/nsSmtpServer.h | 6 |
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 f107a32ae5..44580bc204 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 ddbaa4e3ca..555993ad03 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 4473d7af83..9dbbe54b4c 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; }; |