NS_IMETHODIMP nsSmtpServer::ForgetPassword() { nsresult rv; nsCOMPtr<nsILoginManager> loginMgr = do_GetService(NS_LOGINMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); // Get the current server URI without the username nsCAutoString serverUri(NS_LITERAL_CSTRING("smtp://")); nsCString hostname; rv = GetHostname(hostname); if (NS_SUCCEEDED(rv) && !hostname.IsEmpty()) { nsCString escapedHostname; *((char **)getter_Copies(escapedHostname)) = nsEscape(hostname.get(), url_Path); // not all servers have a hostname serverUri.Append(escapedHostname); } PRUint32 count; nsILoginInfo** logins; NS_ConvertUTF8toUTF16 currServer(serverUri); nsCString serverCUsername; rv = GetUsername(serverCUsername); NS_ENSURE_SUCCESS(rv, rv); NS_ConvertUTF8toUTF16 serverUsername(serverCUsername); rv = loginMgr->FindLogins(&count, currServer, EmptyString(), currServer, &logins); NS_ENSURE_SUCCESS(rv, rv); // There should only be one-login stored for this url, however just in case // there isn't. nsString username; for (PRUint32 i = 0; i < count; ++i) { if (NS_SUCCEEDED(logins[i]->GetUsername(username)) && username.Equals(serverUsername)) { // If this fails, just continue, we'll still want to remove the password // from our local cache. loginMgr->RemoveLogin(logins[i]); } } NS_FREE_XPCOM_ISUPPORTS_POINTER_ARRAY(count, logins); rv = SetPassword(EmptyCString()); m_logonFailed = PR_TRUE; return rv; }
nsresult nsSmtpServer::GetPasswordWithoutUI() { nsresult rv; nsCOMPtr<nsILoginManager> loginMgr(do_GetService(NS_LOGINMANAGER_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv, rv); NS_ConvertASCIItoUTF16 serverUri(GetServerURIInternal(false)); uint32_t numLogins = 0; nsILoginInfo** logins = nullptr; rv = loginMgr->FindLogins(&numLogins, serverUri, EmptyString(), serverUri, &logins); // Login manager can produce valid fails, e.g. NS_ERROR_ABORT when a user // cancels the master password dialog. Therefore handle that here, but don't // warn about it. if (NS_FAILED(rv)) return rv; // Don't abort here, if we didn't find any or failed, then we'll just have // to prompt. if (numLogins > 0) { nsCString serverCUsername; rv = GetUsername(serverCUsername); NS_ConvertASCIItoUTF16 serverUsername(serverCUsername); nsString username; for (uint32_t i = 0; i < numLogins; ++i) { rv = logins[i]->GetUsername(username); NS_ENSURE_SUCCESS(rv, rv); if (username.Equals(serverUsername)) { nsString password; rv = logins[i]->GetPassword(password); NS_ENSURE_SUCCESS(rv, rv); LossyCopyUTF16toASCII(password, m_password); break; } } } NS_FREE_XPCOM_ISUPPORTS_POINTER_ARRAY(numLogins, logins); return NS_OK; }