From dc46cd9eccfd6555626868e9d526ad52927ec1ef Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Mon, 11 Nov 2019 01:26:42 -0500 Subject: Bug 1315662 - delete SMTP server login credentials when deleting the account or if hostname/username changes. Tag #1273 --- mailnews/compose/src/nsSmtpServer.cpp | 54 ++++++++++++++++++++++++----------- mailnews/compose/src/nsSmtpServer.h | 6 +++- 2 files changed, 42 insertions(+), 18 deletions(-) (limited to 'mailnews/compose') 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 mPrefBranch; nsCOMPtr 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; }; -- cgit v1.2.3