diff --git a/directory/xpcom/base/src/nsLDAPProtocolHandler.js b/directory/xpcom/base/src/nsLDAPProtocolHandler.js index 90e1d4ba63..50689535e0 100644 --- a/directory/xpcom/base/src/nsLDAPProtocolHandler.js +++ b/directory/xpcom/base/src/nsLDAPProtocolHandler.js @@ -58,13 +58,8 @@ function makeProtocolHandler(aProtocol, aDefaultPort) { .createInstance(Components.interfaces.nsIURI); if (url instanceof Components.interfaces.nsILDAPURL) -#ifdef USE_TK_LOGIN_MANAGER url.init(Components.interfaces.nsIStandardURL.URLTYPE_STANDARD, aDefaultPort, aSpec, aOriginCharset, aBaseURI); -#else - url.init(Components.interfaces.nsIStandardURL.URLTYPE_STANDARD, - -1, aSpec, aOriginCharset, aBaseURI); -#endif return url; }, diff --git a/mail/base/content/msgMail3PaneWindow.js b/mail/base/content/msgMail3PaneWindow.js index 3ae19018aa..71430d10c3 100644 --- a/mail/base/content/msgMail3PaneWindow.js +++ b/mail/base/content/msgMail3PaneWindow.js @@ -947,14 +947,10 @@ function loadStartFolder(initialUri) // the news url comes in here. if (isLoginAtStartUpEnabled && masterPasswordSet()) { - let passwordMgr = Components.classes["@mozilla.org/passwordmanager;1"] - .getService(Components.interfaces.nsIPasswordManagerInternal); - if (passwordMgr) + let loginMgr = Components.classes["@mozilla.org/login-manager;1"] + .getService(Components.interfaces.nsILoginManager); + if (loginMgr) { - let hostFound = new Object; - let userNameFound = new Object; - let passwordFound = new Object; - // Get password entry corresponding to the default server. // This will block the UI until the use enters something. // This throws an exception if the user cancels. For now, I'm @@ -963,9 +959,8 @@ function loadStartFolder(initialUri) // and exit the app if they don't. But this assumes the // default server password is stored. try { - passwordMgr.findPasswordEntry(defaultServer.serverURI, "", "", - hostFound, userNameFound, - passwordFound); + loginMgr.findLogins({}, defaultServer.serverURI, null, + defaultServer.serverURI, {}); } catch(ex) {}; } } diff --git a/mail/confvars.sh b/mail/confvars.sh index c95f76643d..6576b60077 100755 --- a/mail/confvars.sh +++ b/mail/confvars.sh @@ -62,5 +62,4 @@ else MOZ_APP_VERSION=`cat $topsrcdir/$MOZ_BUILD_APP/config/version.txt` fi THUNDERBIRD_VERSION=$MOZ_APP_VERSION -MOZ_EXTENSIONS_DEFAULT=" wallet" MOZ_NO_XPCOM_OBSOLETE=1 diff --git a/mail/installer/removed-files.in b/mail/installer/removed-files.in index b5ca0b4129..4d542acd34 100644 --- a/mail/installer/removed-files.in +++ b/mail/installer/removed-files.in @@ -36,7 +36,8 @@ components/rdf.dll components/spellchk.dll components/txmgr.dll components/uconv.dll -components/wallet.dll +components/@DLL_PREFIX@wallet@DLL_SUFFIX@ +components/@DLL_PREFIX@walletviewers@DLL_SUFFIX@ components/webbrwsr.dll components/wlltvwrs.dll components/xmlextras.dll @@ -140,6 +141,8 @@ components/uconv.xpt components/unicharutil.xpt components/uriloader.xpt components/wallet.xpt +components/walleteditor.xpt +components/walletpreview.xpt components/webbrowserpersist.xpt components/webBrowser_core.xpt components/webshell_idls.xpt @@ -204,6 +207,13 @@ defaults/isp/en-US/movemail.rdf defaults/isp/en-US/dotmac.rdf defaults/isp/en-US/ defaults/isp/ +defaults/wallet/VcardSchema.tbl +defaults/wallet/FieldSchema.tbl +defaults/wallet/SchemaConcat.tbl +defaults/wallet/DistinguishedSchema.tbl +defaults/wallet/SchemaStrings.tbl +defaults/wallet/PositionalSchema.tbl +defaults/wallet/StateSchema.tbl isp/gmail.rdf components/@DLL_PREFIX@xpcom_compat_c@DLL_SUFFIX@ diff --git a/mail/installer/windows/packages-static b/mail/installer/windows/packages-static index 9a13e00fee..ed94e09f95 100644 --- a/mail/installer/windows/packages-static +++ b/mail/installer/windows/packages-static @@ -148,9 +148,13 @@ bin\nsldap32v60.dll bin\nsldappr32v60.dll bin\nsldif32v60.dll -; wallet -bin\components\wallet.xpt -bin\components\signonviewer.xpt +; login manager +bin\components\loginmgr.xpt +bin\components\nsLoginInfo.js +bin\components\nsLoginManager.js +bin\components\nsLoginManagerPrompter.js +bin\components\storage-Legacy.js +bin\components\storage-mozStorage.js ; download progress bin\components\nsHelperAppDlg.js diff --git a/mail/locales/en-US/chrome/communicator/wallet/SignonViewer.dtd b/mail/locales/en-US/chrome/communicator/wallet/SignonViewer.dtd deleted file mode 100644 index f00b99d692..0000000000 --- a/mail/locales/en-US/chrome/communicator/wallet/SignonViewer.dtd +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/mail/locales/en-US/chrome/communicator/wallet/SignonViewer.properties b/mail/locales/en-US/chrome/communicator/wallet/SignonViewer.properties deleted file mode 100644 index 75cc5761dc..0000000000 --- a/mail/locales/en-US/chrome/communicator/wallet/SignonViewer.properties +++ /dev/null @@ -1,10 +0,0 @@ -encrypted = %S (encrypted) -close=Close -hidePasswords=Hide Passwords -showPasswords=Show Passwords -noMasterPasswordPrompt=Are you sure you wish to show your passwords? -removeAllPasswordsPrompt=Are you sure you wish to remove all passwords? -removeAllPasswordsTitle=Remove all passwords - -# Default user name in the view passwords dialog -noUserNameForPassword= diff --git a/mail/locales/en-US/chrome/communicator/wallet/wallet.properties b/mail/locales/en-US/chrome/communicator/wallet/wallet.properties deleted file mode 100644 index d7522037b7..0000000000 --- a/mail/locales/en-US/chrome/communicator/wallet/wallet.properties +++ /dev/null @@ -1,83 +0,0 @@ -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** -IncorrectKey_TryAgain? = Master password incorrect. Do you want to try again? -WantToCaptureForm? = Do you want to remember the values you filled in? -WantToSavePasswordObscured? = Password Manager can remember this logon and enter it automatically the next time you return to this website.##Do you want Password Manager to remember this logon? -WantToSavePasswordEncrypted? = Password Manager can remember this logon and enter it automatically the next time you return to this website.##Do you want Password Manager to remember this logon? -xWantToSavePasswordObscured? = Do you want to remember your user name and password?##Stored values are not password protected. -xWantToSavePasswordEncrypted? = Do you want to remember your user name and password?##Stored values are password protected. -#translator's note: # in following line will be converted to linefeed by program -firstPassword = A master password will be used to protect sensitive single-signon information stored on your hard drive. Future releases will strongly encrypt this data for maximum protection.##Select a master password.#(Leave fields blank if you don't want to use a master password).# -password = Enter your master password. -#translator's note: # in following line will be converted to linefeed by program -newPassword = Select a new master password.#(Leave fields blank if you don't want to use a master password).# -enterPassword = Enter a master password -confirmPassword = Retype the master password -confirmFailed_TryAgain? = The two master passwords were not identical. Please enter the same master password in both fields. -SelectUser = Select a username to be entered on this form. -SelectUserWhosePasswordIsBeingChanged = Select the user whose password is being changed. -PasswordNotification = For your convenience, the browser can remember your user names and passwords so you won't have to re-type them in the future. Your passwords will be obscured before being saved on your hard drive. Do you want this feature enabled? -WalletNotification = You can save information that you enter on forms and later automatically prefill that information on other forms. To save such information, select Edit/Save Form Info from the menu while viewing the form. -noPrefills = There are no fields that can be prefilled. -Never = Never for this site -Confirm = Confirm -PromptForPassword = Password -PromptForData = Prompt -SaveTheseValuesObscured = Use Password Manager to remember these values. -SaveTheseValuesEncrypted = Use Password Manager to remember these values. -SaveThisValueObscured = Use Password Manager to remember this value. -SaveThisValueEncrypted = Use Password Manager to remember this value. -SaveThisPasswordObscured= Use Password Manager to remember this password. -SaveThisPasswordEncrypted = Use Password Manager to remember this password. -xSaveTheseValuesObscured = Remember these values. Stored values are not password protected. -xSaveTheseValuesEncrypted = Remember these values. Stored values are password protected. -xSaveThisValueObscured = Remember this value. Stored values are not password protected. -xSaveThisValueEncrypted = Remember this value. Stored values are password protected. -UserName = User Name -Password = Password -SelectUserTitleLine = Select User -NoPasswordsEverSaved = No passwords have ever been saved. -Captured = Data has been captured. -NotCaptured = There is nothing to capture. -UnableToCapture = Unable to capture data. -Converted = Stored data has been converted. -AllDataWillBeCleared = All stored data will be erased. -NotConverted = Unable to convert stored data. -PasswordNotChanged = Unable to change the password that protects your sensitive information. -PasswordExpired = Your sensitive information is now locked. -PasswordNotExpired = Unable to lock your sensitive information. -Caveat = Saving Passwords and Other Sensitive Information##Password Manager and Form Manager will save passwords, user names, and other sensitive information and enter them for you automatically when they are required.#This sensitive information is stored on your computer in a file that's difficult, but not impossible, to read.#If other people have access to your computer, you may want to password protect the stored sensitive information by choosing a Master Password.#If you choose to password protect your stored information, you will be asked to provide your Master Password from time to time. This approach provides better security but is slightly less convenient. -CaveatTitle = Alert diff --git a/mail/locales/en-US/chrome/messenger/news.properties b/mail/locales/en-US/chrome/messenger/news.properties index ff29087053..518792cd72 100644 --- a/mail/locales/en-US/chrome/messenger/news.properties +++ b/mail/locales/en-US/chrome/messenger/news.properties @@ -47,6 +47,8 @@ cancelDisallowed=This message does not appear to be from you. You may only canc cancelConfirm=Are you sure you want to cancel this message? messageCancelled=Message cancelled. enterUsername=Please enter a username for news server access: +enterUsernameTitle=News Server Username Required +saveUsername=Use Password Manager to remember this value. enterPassword=Please enter a password for news server access: enterPasswordTitle=News Server Password Required okButtonText=Download diff --git a/mail/locales/jar.mn b/mail/locales/jar.mn index 3c592eb2d4..feeb61881e 100644 --- a/mail/locales/jar.mn +++ b/mail/locales/jar.mn @@ -153,6 +153,3 @@ locale/@AB_CD@/mozldap/ldap.properties (%chrome/mozldap/ldap.properties) % locale communicator @AB_CD@ %locale/@AB_CD@/communicator/ locale/@AB_CD@/communicator/utilityOverlay.dtd (%chrome/communicator/utilityOverlay.dtd) - locale/@AB_CD@/communicator/wallet/wallet.properties (%chrome/communicator/wallet/wallet.properties) -+ locale/@AB_CD@/communicator/wallet/SignonViewer.properties (%chrome/communicator/wallet/SignonViewer.properties) -+ locale/@AB_CD@/communicator/wallet/SignonViewer.dtd (%chrome/communicator/wallet/SignonViewer.dtd) diff --git a/mailnews/addrbook/src/nsAbLDAPListenerBase.cpp b/mailnews/addrbook/src/nsAbLDAPListenerBase.cpp index 040c871586..c08d941033 100644 --- a/mailnews/addrbook/src/nsAbLDAPListenerBase.cpp +++ b/mailnews/addrbook/src/nsAbLDAPListenerBase.cpp @@ -46,13 +46,8 @@ #include "nsIProxyObjectManager.h" #include "nsILDAPMessage.h" #include "nsILDAPErrors.h" -#ifdef USE_TK_LOGIN_MANAGER #include "nsILoginManager.h" #include "nsILoginInfo.h" -#else -#include "nsCategoryManagerUtils.h" -#include "nsComponentManagerUtils.h" -#endif #include "nsServiceManagerUtils.h" #include "nsXPCOMCIDInternal.h" @@ -328,7 +323,6 @@ nsresult nsAbLDAPListenerBase::OnLDAPMessageBind(nsILDAPMessage *aMessage) if (errCode == nsILDAPErrors::INAPPROPRIATE_AUTH || errCode == nsILDAPErrors::INVALID_CREDENTIALS) { -#ifdef USE_TK_LOGIN_MANAGER // Login failed, so try again - but first remove the existing login(s) // so that the user gets prompted. This may not be the best way of doing // things, we need to review that later. @@ -365,29 +359,6 @@ nsresult nsAbLDAPListenerBase::OnLDAPMessageBind(nsILDAPMessage *aMessage) } } NS_FREE_XPCOM_ISUPPORTS_POINTER_ARRAY(count, logins); -#else - // make sure the wallet service has been created, and in doing so, - // pass in a login-failed message to tell it to forget this passwd. - // - // apparently getting passwords stored in the wallet - // doesn't require the service to be running, which is why - // this might not exist yet. - // - rv = NS_CreateServicesFromCategory("passwordmanager", - mDirectoryUrl, - "login-failed"); - if (NS_FAILED(rv)) - { - NS_ERROR("nsLDAPAutoCompleteSession::ForgetPassword(): error" - " creating password manager service"); - // not much to do at this point, though conceivably we could - // pop up a dialog telling the user to go manually delete - // this password in the password manager. - return rv; - } - - // Login failed, so try again -#endif // XXX We should probably pop up an error dialog telling // the user that the login failed here, rather than just bringing diff --git a/mailnews/addrbook/test/unit/test_ldap1.js b/mailnews/addrbook/test/unit/test_ldap1.js index 03cbcb05f8..a3f7bc4094 100644 --- a/mailnews/addrbook/test/unit/test_ldap1.js +++ b/mailnews/addrbook/test/unit/test_ldap1.js @@ -5,7 +5,7 @@ const kLDAPDirectory = 0; // defined in nsDirPrefs.h const kLDAPUriPrefix = "moz-abldapdirectory://"; -const kLDAPTestSpec = "ldap://invalidhost:389//dc=intranet??sub?(objectclass=*)"; +const kLDAPTestSpec = "ldap://invalidhost//dc=intranet??sub?(objectclass=*)"; function run_test() { // Test - Create an LDAP directory diff --git a/mailnews/base/public/nsIMsgIncomingServer.idl b/mailnews/base/public/nsIMsgIncomingServer.idl index e5d1be17b9..6e71d40548 100644 --- a/mailnews/base/public/nsIMsgIncomingServer.idl +++ b/mailnews/base/public/nsIMsgIncomingServer.idl @@ -58,7 +58,7 @@ interface nsILocalFile; * often you will want to add extra interfaces that give you server-specific * attributes and methods. */ -[scriptable, uuid(b51b27f6-4c36-44ef-8457-52b40d2056ce)] +[scriptable, uuid(2795ee91-7231-4c3b-a6ed-ea9a721371fa)] interface nsIMsgIncomingServer : nsISupports { /** @@ -128,11 +128,6 @@ interface nsIMsgIncomingServer : nsISupports { /* forget the password in memory and in single signon database */ void forgetPassword(); - /** - * logon succeeded - persist password, if user chooses. - */ - void storePassword(); - /* forget the password in memory which is cached for the session */ void forgetSessionPassword(); diff --git a/mailnews/base/util/Makefile.in b/mailnews/base/util/Makefile.in index 4e8abf3e0a..53f2053e31 100644 --- a/mailnews/base/util/Makefile.in +++ b/mailnews/base/util/Makefile.in @@ -84,6 +84,8 @@ REQUIRES = xpcom \ htmlparser \ content \ layout \ + loginmgr \ + pipnss \ $(NULL) CPPSRCS = \ diff --git a/mailnews/base/util/nsMsgDBFolder.cpp b/mailnews/base/util/nsMsgDBFolder.cpp index 7c3db97c2e..1d08fbdfce 100644 --- a/mailnews/base/util/nsMsgDBFolder.cpp +++ b/mailnews/base/util/nsMsgDBFolder.cpp @@ -71,7 +71,6 @@ #include "nsIMsgMailSession.h" #include "nsIRDFService.h" #include "nsTextFormatter.h" -#include "nsCPasswordManager.h" #include "nsMsgDBCID.h" #include "nsInt64.h" #include "nsReadLine.h" @@ -97,6 +96,8 @@ #include "nsITransactionManager.h" #include "nsMsgReadStateTxn.h" #include "nsAutoPtr.h" +#include "nsIPK11TokenDB.h" +#include "nsIPK11Token.h" #define oneHour 3600000000U #include "nsMsgUtils.h" @@ -2232,79 +2233,55 @@ nsMsgDBFolder::SetLastMessageLoaded(nsMsgKey aMsgKey) return NS_OK; } -nsresult nsMsgDBFolder::PromptForCachePassword(nsIMsgIncomingServer *server, nsIMsgWindow *aWindow, PRBool &passwordCorrect) +// Returns true if: a) there is no need to prompt or b) the user is already +// logged in or c) the user logged in successfully. +PRBool nsMsgDBFolder::PromptForMasterPasswordIfNecessary() { - PRBool userDidntCancel; - passwordCorrect = PR_FALSE; - nsCOMPtr bundle; - nsresult rv = GetBaseStringBundle(getter_AddRefs(bundle)); - NS_ENSURE_SUCCESS(rv, rv); - nsCString hostName; - nsCString userName; - nsString passwordTemplate; - nsCString password; - nsString passwordTitle; - nsString passwordPromptString; + nsresult rv; + nsCOMPtr accountManager = + do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, PR_FALSE); - server->GetRealHostName(hostName); - server->GetRealUsername(userName); - bundle->GetStringFromName(NS_LITERAL_STRING("passwordTitle").get(), getter_Copies(passwordTitle)); - bundle->GetStringFromName(NS_LITERAL_STRING("passwordPrompt").get(), getter_Copies(passwordTemplate)); - - NS_ConvertASCIItoUTF16 userNameStr(userName); - NS_ConvertASCIItoUTF16 hostNameStr(hostName); + PRBool userNeedsToAuthenticate = PR_FALSE; + // if we're PasswordProtectLocalCache, then we need to find out if the server + // is authenticated. + (void) accountManager->GetUserNeedsToAuthenticate(&userNeedsToAuthenticate); + if (!userNeedsToAuthenticate) + return PR_TRUE; - const PRUnichar *stringParams[2] = { userNameStr.get(), hostNameStr.get() }; + // Do we have a master password? + nsCOMPtr tokenDB = + do_GetService(NS_PK11TOKENDB_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, PR_FALSE); - rv = bundle->FormatStringFromName( - NS_LITERAL_STRING("passwordPrompt").get(), stringParams, 2, - getter_Copies(passwordPromptString )); - NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr token; + rv = tokenDB->GetInternalKeyToken(getter_AddRefs(token)); + NS_ENSURE_SUCCESS(rv, PR_FALSE); - do + PRBool result; + rv = token->CheckPassword(EmptyString().get(), &result); + NS_ENSURE_SUCCESS(rv, PR_FALSE); + + if (result) { - rv = server->GetPasswordWithUI(passwordPromptString, - passwordTitle, - aWindow, - &userDidntCancel, - password); - if (rv != NS_MSG_PASSWORD_PROMPT_CANCELLED && !password.IsEmpty()) - { - nsCOMPtr passwordMgrInt = do_GetService(NS_PASSWORDMANAGER_CONTRACTID, &rv); - if(passwordMgrInt) - { - // Get the current server URI - nsCString currServerUri; - rv = server->GetServerURI(currServerUri); - NS_ENSURE_SUCCESS(rv, rv); - - currServerUri.Insert('x', 0); - nsCAutoString hostFound; - nsAutoString userNameFound; - nsAutoString passwordFound; - - // Get password entry corresponding to the host URI we are passing in. - rv = passwordMgrInt->FindPasswordEntry(currServerUri, EmptyString(), EmptyString(), - hostFound, userNameFound, - passwordFound); - if (NS_FAILED(rv)) - break; - // compare the user-entered password with the saved password with - // the munged uri. - passwordCorrect = password.Equals(NS_ConvertUTF16toUTF8(passwordFound)); - if (!passwordCorrect) - server->SetPassword(EmptyCString()); - else - { - nsCOMPtr accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID); - if (accountManager) - accountManager->SetUserNeedsToAuthenticate(PR_FALSE); - } - } - } + // We don't have a master password, so this function isn't supported, + // therefore just tell account manager we've authenticated and return true. + accountManager->SetUserNeedsToAuthenticate(PR_FALSE); + return PR_TRUE; } - while (NS_SUCCEEDED(rv) && rv != NS_MSG_PASSWORD_PROMPT_CANCELLED && userDidntCancel && !passwordCorrect); - return (!passwordCorrect) ? NS_ERROR_FAILURE : rv; + + // We have a master password, so try and login to the slot. + rv = token->Login(PR_FALSE); + if (NS_FAILED(rv)) + // Login failed, so we didn't get a password (e.g. prompt cancelled). + return PR_FALSE; + + // Double-check that we are now logged in + rv = token->IsLoggedIn(&result); + NS_ENSURE_SUCCESS(rv, PR_FALSE); + + accountManager->SetUserNeedsToAuthenticate(!result); + return result; } // this gets called after the last junk mail classification has run. diff --git a/mailnews/base/util/nsMsgDBFolder.h b/mailnews/base/util/nsMsgDBFolder.h index 82081071a7..0c95d3fb92 100644 --- a/mailnews/base/util/nsMsgDBFolder.h +++ b/mailnews/base/util/nsMsgDBFolder.h @@ -148,7 +148,10 @@ protected: nsresult AddDirectorySeparator(nsILocalFile *path); nsresult CheckIfFolderExists(const nsAString& newFolderName, nsIMsgFolder *parentFolder, nsIMsgWindow *msgWindow); - nsresult PromptForCachePassword(nsIMsgIncomingServer *server, nsIMsgWindow *aWindow, PRBool &passwordCorrect); + // Returns true if: a) there is no need to prompt or b) the user is already + // logged in or c) the user logged in successfully. + static PRBool PromptForMasterPasswordIfNecessary(); + // offline support methods. nsresult StartNewOfflineMessage(); nsresult WriteStartOfNewLocalMessage(); diff --git a/mailnews/base/util/nsMsgIncomingServer.cpp b/mailnews/base/util/nsMsgIncomingServer.cpp index badd29a5d6..fe98755ed4 100644 --- a/mailnews/base/util/nsMsgIncomingServer.cpp +++ b/mailnews/base/util/nsMsgIncomingServer.cpp @@ -1,4 +1,4 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -62,7 +62,6 @@ #include "nsIRelativeFilePref.h" #include "nsIDocShell.h" #include "nsIAuthPrompt.h" -#include "nsIObserverService.h" #include "nsNetUtil.h" #include "nsIWindowWatcher.h" #include "nsIStringBundle.h" @@ -71,9 +70,10 @@ #include "nsRDFCID.h" #include "nsIInterfaceRequestor.h" #include "nsIInterfaceRequestorUtils.h" +#include "nsILoginInfo.h" +#include "nsILoginManager.h" #include "nsIMsgAccountManager.h" -#include "nsCPasswordManager.h" #include "nsIMsgMdnGenerator.h" #include "nsMsgFolderFlags.h" #include "nsMsgUtils.h" @@ -693,6 +693,65 @@ NS_IMETHODIMP nsMsgIncomingServer::GetServerRequiresPasswordForBiff(PRBool *aSer return NS_OK; } +void nsMsgIncomingServer::GetPasswordWithoutUI(nsACString &aPassword) +{ + aPassword.Truncate(); + + nsresult rv; + nsCOMPtr loginMgr(do_GetService(NS_LOGINMANAGER_CONTRACTID, + &rv)); + NS_ENSURE_SUCCESS(rv, ); + + // Get the current server URI + nsCString currServerUri; + rv = GetLocalStoreType(currServerUri); + NS_ENSURE_SUCCESS(rv, ); + + currServerUri.AppendLiteral("://"); + + nsCString temp; + rv = GetHostName(temp); + NS_ENSURE_SUCCESS(rv, ); + + currServerUri.Append(temp); + + NS_ConvertUTF8toUTF16 currServer(currServerUri); + + PRUint32 numLogins = 0; + nsILoginInfo** logins = nsnull; + rv = loginMgr->FindLogins(&numLogins, currServer, EmptyString(), + currServer, &logins); + + // Don't abort here, if we didn't find any or failed, then we'll just have + // to prompt. + if (NS_SUCCEEDED(rv) && numLogins > 0) + { + nsCString serverCUsername; + rv = GetUsername(serverCUsername); + NS_ENSURE_SUCCESS(rv, ); + + NS_ConvertUTF8toUTF16 serverUsername(serverCUsername); + + nsString username; + for (PRUint32 i = 0; i < numLogins; ++i) + { + rv = logins[i]->GetUsername(username); + NS_ENSURE_SUCCESS(rv, ); + + if (username.Equals(serverUsername)) + { + nsString password; + rv = logins[i]->GetPassword(password); + NS_ENSURE_SUCCESS(rv, ); + + m_password = NS_LossyConvertUTF16toASCII(password); + break; + } + } + NS_FREE_XPCOM_ISUPPORTS_POINTER_ARRAY(numLogins, logins); + } +} + NS_IMETHODIMP nsMsgIncomingServer::GetPasswordWithUI(const nsAString& aPromptMessage, const nsAString& aPromptTitle, @@ -707,28 +766,8 @@ nsMsgIncomingServer::GetPasswordWithUI(const nsAString& aPromptMessage, const { // let's see if we have the password in the password manager and // can avoid this prompting thing. This makes it easier to get embedders - // to get up and running w/o a password prompting UI. We already depend on - // nsIPasswordManagerInternal so this doesn't introduce a new dependency. - nsCOMPtr passwordMgrInt = do_GetService(NS_PASSWORDMANAGER_CONTRACTID, &rv); - if(passwordMgrInt) - { - // Get the current server URI - nsCString currServerUri; - rv = GetServerURI(currServerUri); - NS_ENSURE_SUCCESS(rv, rv); - - nsCAutoString hostFound; - nsAutoString userNameFound; - nsAutoString passwordFound; - - // Get password entry corresponding to the host URI we are passing in. - if (NS_SUCCEEDED(passwordMgrInt->FindPasswordEntry(currServerUri, EmptyString(), EmptyString(), - hostFound, userNameFound, passwordFound))) - { - LossyCopyUTF16toASCII(passwordFound, m_password); - *okayValue = PR_TRUE; - } - } + // to get up and running w/o a password prompting UI. + GetPasswordWithoutUI(aPassword); } if (m_password.IsEmpty()) { @@ -746,9 +785,22 @@ nsMsgIncomingServer::GetPasswordWithUI(const nsAString& aPromptMessage, const if (dialog) { nsCString serverUri; - rv = GetServerURI(serverUri); + rv = GetLocalStoreType(serverUri); NS_ENSURE_SUCCESS(rv, rv); + serverUri.AppendLiteral("://"); + nsCString temp; + rv = GetRealUsername(temp); + NS_ENSURE_SUCCESS(rv, rv); + + serverUri.Append(temp); + serverUri.AppendLiteral("@"); + + rv = GetRealHostName(temp); + NS_ENSURE_SUCCESS(rv, rv); + + serverUri.Append(temp); + // we pass in the previously used password, if any, into PromptPassword // so that it will appear as ******. This means we can't use an nsString // and getter_Copies. @@ -756,10 +808,11 @@ nsMsgIncomingServer::GetPasswordWithUI(const nsAString& aPromptMessage, const if (!aPassword.IsEmpty()) uniPassword = ToNewUnicode(NS_ConvertASCIItoUTF16(aPassword)); - PRUint32 savePasswordType = PasswordProtectLocalCache() ? nsIAuthPrompt::SAVE_PASSWORD_FOR_SESSION : nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY; - rv = dialog->PromptPassword(nsString(aPromptTitle).get(), nsString(aPromptMessage).get(), - NS_ConvertASCIItoUTF16(serverUri).get(), savePasswordType, - &uniPassword, okayValue); + rv = dialog->PromptPassword(PromiseFlatString(aPromptTitle).get(), + PromiseFlatString(aPromptMessage).get(), + NS_ConvertASCIItoUTF16(serverUri).get(), + nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, + &uniPassword, okayValue); nsAutoString uniPasswordAdopted; uniPasswordAdopted.Adopt(uniPassword); NS_ENSURE_SUCCESS(rv, rv); @@ -778,61 +831,57 @@ nsMsgIncomingServer::GetPasswordWithUI(const nsAString& aPromptMessage, const return GetPassword(aPassword); } -NS_IMETHODIMP -nsMsgIncomingServer::StorePassword() -{ - nsresult rv; - - // we only need to store this if we're password protecting the local cache. - // Otherwise, the password manager handles storing the password if the user - // checks the "remember password" box. - if (!PasswordProtectLocalCache()) - return NS_OK; - - nsCString pwd; - rv = GetPassword(pwd); - NS_ENSURE_SUCCESS(rv, rv); - - nsCString serverSpec; - rv = GetServerURI(serverSpec); - NS_ENSURE_SUCCESS(rv,rv); - - // We're password protecting the local cache, we're going to munge the uri in the password mgr to - // start with 'x', so that we can remember the password in order to challenge the user, w/o having the - // password mgr automatically use the password. - serverSpec.Insert('x', 0); - nsCOMPtr uri; - NS_NewURI(getter_AddRefs(uri), serverSpec); - - //this is need to make sure wallet service has been created - rv = CreateServicesForPasswordManager(); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr observerService = do_GetService("@mozilla.org/observer-service;1", &rv); - NS_ENSURE_SUCCESS(rv,rv); - rv = observerService->NotifyObservers(uri, "login-succeeded", NS_ConvertUTF8toUTF16(pwd).get()); - NS_ENSURE_SUCCESS(rv,rv); - nsCOMPtr accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID); - if (accountManager) - accountManager->SetUserNeedsToAuthenticate(PR_FALSE); - return rv; -} - NS_IMETHODIMP nsMsgIncomingServer::ForgetPassword() { - //this is needed to make sure the wallet service has been created - nsresult rv = CreateServicesForPasswordManager(); + nsresult rv; + nsCOMPtr loginMgr = + do_GetService(NS_LOGINMANAGER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr passwordMgr = do_GetService(NS_PASSWORDMANAGER_CONTRACTID, &rv); - if (NS_SUCCEEDED(rv) && passwordMgr) + + // Get the current server URI + nsCString currServerUri; + rv = GetLocalStoreType(currServerUri); + NS_ENSURE_SUCCESS(rv, rv); + + currServerUri.AppendLiteral("://"); + + nsCString temp; + rv = GetHostName(temp); + NS_ENSURE_SUCCESS(rv, rv); + + currServerUri.Append(temp); + + PRUint32 count; + nsILoginInfo** logins; + + NS_ConvertUTF8toUTF16 currServer(currServerUri); + + 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) { - // Get the current server URI - nsCString currServerUri; - rv = GetServerURI(currServerUri); - NS_ENSURE_SUCCESS(rv, rv); - passwordMgr->RemoveUser(currServerUri, EmptyString()); + 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); + return SetPassword(EmptyCString()); } @@ -901,17 +950,6 @@ nsMsgIncomingServer::SetLocalPath(nsILocalFile *aLocalPath) return SetFileValue("directory-rel", "directory", aLocalPath); } -PRBool nsMsgIncomingServer::PasswordProtectLocalCache() -{ - nsCOMPtr prefs(do_GetService(NS_PREFSERVICE_CONTRACTID)); - NS_ENSURE_TRUE(prefs, PR_FALSE); - - PRBool passwordProtectLocalCache; - nsresult rv = prefs->GetBoolPref( "mail.password_protect_local_cache", &passwordProtectLocalCache); - NS_ENSURE_SUCCESS(rv, PR_FALSE); - return passwordProtectLocalCache; -} - NS_IMETHODIMP nsMsgIncomingServer::GetLocalStoreType(nsACString& aResult) { @@ -1635,35 +1673,14 @@ nsMsgIncomingServer::GetPasswordPromptRequired(PRBool *aPasswordIsRequired) // If the password is empty, check to see if it is stored and to be retrieved if (m_password.IsEmpty()) { - nsCOMPtr passwordMgrInt = do_GetService(NS_PASSWORDMANAGER_CONTRACTID, &rv); - if(NS_SUCCEEDED(rv) && passwordMgrInt) { + nsCString password; + GetPasswordWithoutUI(password); - // Get the current server URI - nsCString currServerUri; - rv = GetServerURI(currServerUri); - NS_ENSURE_SUCCESS(rv, rv); - - // Obtain the server URI which is in the format ://@. - // Password manager uses the same format when it stores the password on user's request. - nsCAutoString hostFound; - nsAutoString userNameFound; - nsAutoString passwordFound; - - // Get password entry corresponding to the host URI we are passing in. - rv = passwordMgrInt->FindPasswordEntry(currServerUri, EmptyString(), EmptyString(), - hostFound, userNameFound, passwordFound); - if (NS_FAILED(rv)) - return NS_OK; - - // If a match is found, password element is filled in. Convert the - // obtained password and store it for the session. - if (!passwordFound.IsEmpty()) - { - if (PasswordProtectLocalCache()) // hmm, shouldn't be in here, so remove it. - ForgetPassword(); - else - rv = SetPassword(NS_LossyConvertUTF16toASCII(passwordFound)); - } + // If a match is found, password element is filled in. Convert the + // obtained password and store it for the session. + if (!password.IsEmpty()) + { + rv = SetPassword(password); } } *aPasswordIsRequired = m_password.IsEmpty(); diff --git a/mailnews/base/util/nsMsgIncomingServer.h b/mailnews/base/util/nsMsgIncomingServer.h index bf66a23fb6..c468e00139 100644 --- a/mailnews/base/util/nsMsgIncomingServer.h +++ b/mailnews/base/util/nsMsgIncomingServer.h @@ -78,9 +78,10 @@ class NS_MSG_BASE nsMsgIncomingServer : public nsIMsgIncomingServer, protected: nsCString m_serverKey; + void GetPasswordWithoutUI(nsACString &aPassword); + nsresult ConfigureTemporaryReturnReceiptsFilter(nsIMsgFilterList *filterList); nsresult ConfigureTemporaryServerSpamFilters(nsIMsgFilterList *filterList); - PRBool PasswordProtectLocalCache(); nsCOMPtr m_rootFolder; nsCOMPtr m_retentionSettings; diff --git a/mailnews/base/util/nsMsgProtocol.cpp b/mailnews/base/util/nsMsgProtocol.cpp index ca5d9e53df..faf58d8e17 100644 --- a/mailnews/base/util/nsMsgProtocol.cpp +++ b/mailnews/base/util/nsMsgProtocol.cpp @@ -646,9 +646,12 @@ NS_IMETHODIMP nsMsgProtocol::GetSecurityInfo(nsISupports * *aSecurityInfo) return NS_ERROR_NOT_IMPLEMENTED; } -NS_IMETHODIMP nsMsgProtocol::GetName(nsACString &aName) +NS_IMETHODIMP nsMsgProtocol::GetName(nsACString &result) { - return NS_ERROR_NOT_IMPLEMENTED; + if (m_url) + return m_url->GetSpec(result); + result.Truncate(); + return NS_OK; } diff --git a/mailnews/base/util/nsMsgUtils.cpp b/mailnews/base/util/nsMsgUtils.cpp index e62f756139..02d9f7dda9 100644 --- a/mailnews/base/util/nsMsgUtils.cpp +++ b/mailnews/base/util/nsMsgUtils.cpp @@ -66,8 +66,6 @@ #include "nsIPrefLocalizedString.h" #include "nsIRelativeFilePref.h" #include "nsAppDirectoryServiceDefs.h" -#include "nsICategoryManager.h" -#include "nsCategoryManagerUtils.h" #include "nsISpamSettings.h" #include "nsISignatureVerifier.h" #include "nsICryptoHash.h" @@ -93,9 +91,6 @@ static NS_DEFINE_CID(kCNntpUrlCID, NS_NNTPURL_CID); #define ILLEGAL_FOLDER_CHARS_AS_FIRST_LETTER "." #define ILLEGAL_FOLDER_CHARS_AS_LAST_LETTER ".~ " -#define NS_PASSWORDMANAGER_CATEGORY "passwordmanager" -static PRBool gInitPasswordManager = PR_FALSE; - nsresult GetMessageServiceContractIDForURI(const char *uri, nsCString &contractID) { nsresult rv = NS_OK; @@ -830,19 +825,6 @@ nsresult EscapeFromSpaceLine(nsIOutputStream *outputStream, char *start, const c return NS_OK; } -nsresult CreateServicesForPasswordManager() -{ - if (!gInitPasswordManager) - { - // Initialize the password manager category - gInitPasswordManager = PR_TRUE; - return NS_CreateServicesFromCategory(NS_PASSWORDMANAGER_CATEGORY, - nsnull, - NS_PASSWORDMANAGER_CATEGORY); - } - return NS_OK; -} - nsresult IsRFC822HeaderFieldName(const char *aHdr, PRBool *aResult) { NS_ENSURE_ARG_POINTER(aHdr); diff --git a/mailnews/base/util/nsMsgUtils.h b/mailnews/base/util/nsMsgUtils.h index 18130cc976..9f75085971 100644 --- a/mailnews/base/util/nsMsgUtils.h +++ b/mailnews/base/util/nsMsgUtils.h @@ -118,8 +118,6 @@ NS_MSG_BASE nsresult NS_SetPersistentFile(const char *relPrefName, nsILocalFile *aFile, nsIPrefBranch *prefBranch = nsnull); -NS_MSG_BASE nsresult CreateServicesForPasswordManager(); - NS_MSG_BASE nsresult IsRFC822HeaderFieldName(const char *aHdr, PRBool *aResult); NS_MSG_BASE nsresult NS_GetUnicharPreferenceWithDefault(nsIPrefBranch *prefBranch, //can be null, if so uses the root branch diff --git a/mailnews/compose/src/Makefile.in b/mailnews/compose/src/Makefile.in index 76ace32cc3..b323fb4af8 100644 --- a/mailnews/compose/src/Makefile.in +++ b/mailnews/compose/src/Makefile.in @@ -83,6 +83,7 @@ REQUIRES = xpcom \ windowwatcher \ gfx \ zipwriter \ + loginmgr \ $(NULL) ifdef MOZ_THUNDERBIRD diff --git a/mailnews/compose/src/nsSmtpServer.cpp b/mailnews/compose/src/nsSmtpServer.cpp index 6aa80f60c1..be105e3793 100644 --- a/mailnews/compose/src/nsSmtpServer.cpp +++ b/mailnews/compose/src/nsSmtpServer.cpp @@ -36,21 +36,19 @@ * * ***** END LICENSE BLOCK ***** */ -#include "msgCore.h" #include "nsIPrefService.h" #include "nsIPrefBranch.h" #include "nsEscape.h" #include "nsSmtpServer.h" -#include "nsIObserverService.h" #include "nsNetUtil.h" #include "nsIAuthPrompt.h" -#include "nsReadableUtils.h" -#include "nsISmtpUrl.h" #include "nsMsgUtils.h" #include "nsIMsgAccountManager.h" #include "nsMsgBaseCID.h" #include "nsISmtpService.h" #include "nsMsgCompCID.h" +#include "nsILoginInfo.h" +#include "nsILoginManager.h" NS_IMPL_ADDREF(nsSmtpServer) NS_IMPL_RELEASE(nsSmtpServer) @@ -453,15 +451,20 @@ nsSmtpServer::GetPasswordWithUI(const PRUnichar * aPromptMessage, const rv = GetServerURI(serverUri); if (NS_FAILED(rv)) return rv; + nsCOMPtr prefBranch(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); + NS_ENSURE_SUCCESS(rv, rv); + PRBool passwordProtectLocalCache = PR_FALSE; - (void) prefBranch->GetBoolPref( "mail.password_protect_local_cache", &passwordProtectLocalCache); + (void) prefBranch->GetBoolPref("mail.password_protect_local_cache", + &passwordProtectLocalCache); - PRUint32 savePasswordType = (passwordProtectLocalCache) ? nsIAuthPrompt::SAVE_PASSWORD_FOR_SESSION : nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY; rv = aDialog->PromptPassword(aPromptTitle, aPromptMessage, - NS_ConvertASCIItoUTF16(serverUri).get(), savePasswordType, - getter_Copies(uniPassword), &okayValue); + NS_ConvertASCIItoUTF16(serverUri).get(), + passwordProtectLocalCache ? nsIAuthPrompt::SAVE_PASSWORD_NEVER + : nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, + getter_Copies(uniPassword), &okayValue); if (NS_FAILED(rv)) return rv; @@ -505,9 +508,20 @@ nsSmtpServer::GetUsernamePasswordWithUI(const PRUnichar * aPromptMessage, const rv = GetServerURI(serverUri); if (NS_FAILED(rv)) return rv; + + nsCOMPtr prefBranch(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); + NS_ENSURE_SUCCESS(rv, rv); + + PRBool passwordProtectLocalCache = PR_FALSE; + + (void) prefBranch->GetBoolPref("mail.password_protect_local_cache", + &passwordProtectLocalCache); + rv = aDialog->PromptUsernameAndPassword(aPromptTitle, aPromptMessage, - NS_ConvertASCIItoUTF16(serverUri).get(), nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, - getter_Copies(uniUsername), getter_Copies(uniPassword), &okayValue); + NS_ConvertASCIItoUTF16(serverUri).get(), + passwordProtectLocalCache ? nsIAuthPrompt::SAVE_PASSWORD_NEVER + : nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, + getter_Copies(uniUsername), getter_Copies(uniPassword), &okayValue); if (NS_FAILED(rv)) return rv; @@ -542,37 +556,64 @@ nsSmtpServer::GetUsernamePasswordWithUI(const PRUnichar * aPromptMessage, const NS_IMETHODIMP nsSmtpServer::ForgetPassword() { - nsresult rv; - nsCOMPtr observerService = do_GetService("@mozilla.org/observer-service;1", &rv); - NS_ENSURE_SUCCESS(rv,rv); + nsresult rv; + nsCOMPtr loginMgr = + do_GetService(NS_LOGINMANAGER_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); - nsCString serverUri; - rv = GetServerURI(serverUri); - if (NS_FAILED(rv)) - return rv; + // Get the current server URI without the username + nsCAutoString serverUri(NS_LITERAL_CSTRING("smtp://")); - nsCOMPtr uri; - NS_NewURI(getter_AddRefs(uri), serverUri); + nsCString hostname; + rv = GetHostname(hostname); - //this is need to make sure wallet service has been created - rv = CreateServicesForPasswordManager(); - NS_ENSURE_SUCCESS(rv, rv); + 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); + } - rv = observerService->NotifyObservers(uri, "login-failed", nsnull); - NS_ENSURE_SUCCESS(rv,rv); + PRUint32 count; + nsILoginInfo** logins; - rv = SetPassword(EmptyCString()); - m_logonFailed = PR_TRUE; - return rv; + 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; } NS_IMETHODIMP nsSmtpServer::GetServerURI(nsACString &aResult) { - nsCAutoString uri; - - uri.AssignLiteral("smtp"); - uri.AppendLiteral("://"); + nsCAutoString uri(NS_LITERAL_CSTRING("smtp://")); nsCString username; nsresult rv = GetUsername(username); diff --git a/mailnews/compose/test/unit/test_smtpPassword2.js b/mailnews/compose/test/unit/test_smtpPassword2.js new file mode 100644 index 0000000000..df6cc31c44 --- /dev/null +++ b/mailnews/compose/test/unit/test_smtpPassword2.js @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/** + * Extra tests for SMTP passwords (forgetPassword) + */ + +const kUser1 = "testsmtp"; +const kUser2 = "testsmtpa"; +const kProtocol = "smtp"; +const kHostname = "localhost"; +const kServerUrl = kProtocol + "://" + kHostname; + +function run_test() +{ + // Login Manager + var loginMgr = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager); + + // Passwords File (generated from Mozilla 1.8 branch). + var signons = do_get_file("../mailnews/test/data/signons-mailnews1.8-multiple.txt"); + + // Copy the file to the profile directory for a PAB + signons.copyTo(gProfileDir, "signons.txt"); + + // Set up the basic accounts and folders. + loadLocalMailAccount(); + + var smtpServer1 = getBasicSmtpServer(); + var smtpServer2 = getBasicSmtpServer(); + + smtpServer1.authMethod = 1; + smtpServer1.username = kUser1; + smtpServer2.authMethod = 1; + smtpServer2.username = kUser2; + + var i; + var count = {}; + + // Test - Check there are two logins to begin with. + var logins = loginMgr.findLogins(count, kServerUrl, null, kServerUrl); + + do_check_eq(count.value, 2); + + // These will either be one way around or the other. + if (logins[0].username == kUser1) { + do_check_eq(logins[1].username, kUser2); + } else { + do_check_eq(logins[0].username, kUser2); + do_check_eq(logins[1].username, kUser1); + } + + // Test - Remove a login via the incoming server + smtpServer1.forgetPassword(); + + logins = logins = loginMgr.findLogins(count, kServerUrl, null, kServerUrl); + + // should be one login left for kUser2 + do_check_eq(count.value, 1); + do_check_eq(logins[0].username, kUser2); + + // Test - Remove the other login via the incoming server + smtpServer2.forgetPassword(); + + logins = logins = loginMgr.findLogins(count, kServerUrl, null, kServerUrl); + + // should be one login left for kUser2 + do_check_eq(count.value, 0); + do_check_eq(logins.length, 0); +} diff --git a/mailnews/imap/src/nsImapIncomingServer.cpp b/mailnews/imap/src/nsImapIncomingServer.cpp index 178a312940..0864087ce1 100644 --- a/mailnews/imap/src/nsImapIncomingServer.cpp +++ b/mailnews/imap/src/nsImapIncomingServer.cpp @@ -2050,7 +2050,14 @@ NS_IMETHODIMP nsImapIncomingServer::SetUserAuthenticated(PRBool aUserAuthenticat { m_userAuthenticated = aUserAuthenticated; if (aUserAuthenticated) - StorePassword(); + { + nsresult rv; + nsCOMPtr accountManager = + do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + accountManager->SetUserNeedsToAuthenticate(PR_FALSE); + } return NS_OK; } diff --git a/mailnews/imap/src/nsImapMailFolder.cpp b/mailnews/imap/src/nsImapMailFolder.cpp index 41cbb4bcaf..f9b858548b 100644 --- a/mailnews/imap/src/nsImapMailFolder.cpp +++ b/mailnews/imap/src/nsImapMailFolder.cpp @@ -769,26 +769,11 @@ NS_IMETHODIMP nsImapMailFolder::UpdateFolder(nsIMsgWindow *msgWindow, nsIUrlList return goOnline->ProcessNextOperation(); } } - else // we're offline - check if we're password protecting the offline store - { - nsCOMPtr accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - PRBool userNeedsToAuthenticate = PR_FALSE; - // if we're PasswordProtectLocalCache, then we need to find out if the server is authenticated. - (void) accountManager->GetUserNeedsToAuthenticate(&userNeedsToAuthenticate); - if (userNeedsToAuthenticate) - { - nsCOMPtr server; - rv = GetServer(getter_AddRefs(server)); - if (NS_SUCCEEDED(rv)) - { - PRBool passwordMatches = PR_FALSE; - rv = PromptForCachePassword(server, msgWindow, passwordMatches); - if (!passwordMatches) - return NS_ERROR_FAILURE; - } - } - } + + // Check it we're password protecting the local store. + if (!PromptForMasterPasswordIfNecessary()) + return NS_ERROR_FAILURE; + if (!canOpenThisFolder) selectFolder = PR_FALSE; // don't run select if we can't select the folder... diff --git a/mailnews/imap/src/nsImapProtocol.cpp b/mailnews/imap/src/nsImapProtocol.cpp index 2bcef6eb5c..bf6ad4273b 100644 --- a/mailnews/imap/src/nsImapProtocol.cpp +++ b/mailnews/imap/src/nsImapProtocol.cpp @@ -8764,7 +8764,10 @@ NS_IMETHODIMP nsImapMockChannel::SetSecurityInfo(nsISupports *aSecurityInfo) NS_IMETHODIMP nsImapMockChannel::GetName(nsACString &result) { - return NS_ERROR_NOT_IMPLEMENTED; + if (m_url) + return m_url->GetSpec(result); + result.Truncate(); + return NS_OK; } NS_IMETHODIMP nsImapMockChannel::IsPending(PRBool *result) diff --git a/mailnews/local/src/nsLocalMailFolder.cpp b/mailnews/local/src/nsLocalMailFolder.cpp index 5cfb7ccde6..ed8015179a 100644 --- a/mailnews/local/src/nsLocalMailFolder.cpp +++ b/mailnews/local/src/nsLocalMailFolder.cpp @@ -597,38 +597,9 @@ nsMsgLocalMailFolder::UpdateFolder(nsIMsgWindow *aWindow) (void) RefreshSizeOnDisk(); nsresult rv; - nsCOMPtr accountManager = - do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - PRBool userNeedsToAuthenticate = PR_FALSE; - // if we're PasswordProtectLocalCache, then we need to find out if the server is authenticated. - (void) accountManager->GetUserNeedsToAuthenticate(&userNeedsToAuthenticate); - if (userNeedsToAuthenticate) - { - nsCOMPtr server; - rv = GetServer(getter_AddRefs(server)); - NS_ENSURE_SUCCESS(rv, NS_MSG_INVALID_OR_MISSING_SERVER); - // need to check if this is a pop3 or no mail server to determine which password - // we should challenge the user with. - nsCOMPtr serverToAuthenticateAgainst; - nsCOMPtr noIncomingServer = do_QueryInterface(server); - if (noIncomingServer) - { - nsCOMPtr defaultAccount; - accountManager->GetDefaultAccount(getter_AddRefs(defaultAccount)); - if (defaultAccount) - defaultAccount->GetIncomingServer(getter_AddRefs(serverToAuthenticateAgainst)); - } - else - GetServer(getter_AddRefs(serverToAuthenticateAgainst)); - if (serverToAuthenticateAgainst) - { - PRBool passwordMatches = PR_FALSE; - rv = PromptForCachePassword(serverToAuthenticateAgainst, aWindow, passwordMatches); - if (!passwordMatches) - return NS_ERROR_FAILURE; - } - } + if (!PromptForMasterPasswordIfNecessary()) + return NS_ERROR_FAILURE; + //If we don't currently have a database, get it. Otherwise, the folder has been updated (presumably this //changes when we download headers when opening inbox). If it's updated, send NotifyFolderLoaded. if(!mDatabase) diff --git a/mailnews/local/src/nsPop3Sink.cpp b/mailnews/local/src/nsPop3Sink.cpp index 13217c2359..c1b6d4738b 100644 --- a/mailnews/local/src/nsPop3Sink.cpp +++ b/mailnews/local/src/nsPop3Sink.cpp @@ -108,13 +108,6 @@ nsPop3Sink::SetUserAuthenticated(PRBool authed) { m_authed = authed; m_popServer->SetAuthenticated(authed); - if (authed) - { - nsCOMPtr server = do_QueryInterface(m_popServer); - if (!server) - return NS_ERROR_UNEXPECTED; - return server->StorePassword(); - } return NS_OK; } diff --git a/mailnews/local/test/unit/test_pop3Password3.js b/mailnews/local/test/unit/test_pop3Password3.js new file mode 100644 index 0000000000..f9fce0a38e --- /dev/null +++ b/mailnews/local/test/unit/test_pop3Password3.js @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/** + * Extra tests for POP3 passwords (forgetPassword) + */ + +const kUser1 = "testpop3"; +const kUser2 = "testpop3a"; +const kProtocol = "pop3"; +const kHostname = "localhost"; +const kServerUrl = "mailbox://" + kHostname; + +function run_test() +{ + // Login Manager + var loginMgr = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager); + + // Passwords File (generated from Mozilla 1.8 branch). + var signons = do_get_file("../mailnews/test/data/signons-mailnews1.8-multiple.txt"); + + // Copy the file to the profile directory for a PAB + signons.copyTo(gProfileDir, "signons.txt"); + + // Set up the basic accounts and folders. + // We would use createPop3ServerAndLocalFolders() however we want to have + // a different username and NO password for this test (as we expect to load + // it from signons.txt). + loadLocalMailAccount(); + + var acctMgr = Cc["@mozilla.org/messenger/account-manager;1"] + .getService(Ci.nsIMsgAccountManager); + + var incomingServer1 = acctMgr.createIncomingServer(kUser1, kHostname, + kProtocol); + + var incomingServer2 = acctMgr.createIncomingServer(kUser2, kHostname, + kProtocol); + + var i; + var count = {}; + + // Test - Check there are two logins to begin with. + var logins = loginMgr.findLogins(count, kServerUrl, null, kServerUrl); + + do_check_eq(count.value, 2); + + // These will either be one way around or the other. + if (logins[0].username == kUser1) { + do_check_eq(logins[1].username, kUser2); + } else { + do_check_eq(logins[0].username, kUser2); + do_check_eq(logins[1].username, kUser1); + } + + // Test - Remove a login via the incoming server + incomingServer1.forgetPassword(); + + logins = loginMgr.findLogins(count, kServerUrl, null, kServerUrl); + + // should be one login left for kUser2 + do_check_eq(count.value, 1); + do_check_eq(logins[0].username, kUser2); + + // Test - Remove the other login via the incoming server + incomingServer2.forgetPassword(); + + logins = loginMgr.findLogins(count, kServerUrl, null, kServerUrl); + + // should be one login left for kUser2 + do_check_eq(count.value, 0); + do_check_eq(logins.length, 0); +} diff --git a/mailnews/news/src/Makefile.in b/mailnews/news/src/Makefile.in index 99654f1a33..db8fcb8301 100644 --- a/mailnews/news/src/Makefile.in +++ b/mailnews/news/src/Makefile.in @@ -69,6 +69,8 @@ REQUIRES = xpcom \ nkcache \ windowwatcher \ unicharutil \ + embed_base \ + loginmgr \ $(NULL) CPPSRCS = \ diff --git a/mailnews/news/src/nsNNTPProtocol.cpp b/mailnews/news/src/nsNNTPProtocol.cpp index a3d9d3d032..2e7d5a6e24 100644 --- a/mailnews/news/src/nsNNTPProtocol.cpp +++ b/mailnews/news/src/nsNNTPProtocol.cpp @@ -2660,6 +2660,9 @@ PRInt32 nsNNTPProtocol::BeginAuthorization() nsString usernamePromptText; GetNewsStringByName("enterUsername", getter_Copies(usernamePromptText)); + nsString usernamePromptTitleText; + GetNewsStringByName("enterUsernameTitle", + getter_Copies(usernamePromptTitleText)); if (m_newsFolder) { if (!m_msgWindow) { nsCOMPtr mailnewsurl = do_QueryInterface(m_runningURL); @@ -2667,7 +2670,9 @@ PRInt32 nsNNTPProtocol::BeginAuthorization() rv = mailnewsurl->GetMsgWindow(getter_AddRefs(m_msgWindow)); } - rv = m_newsFolder->GetGroupUsernameWithUI(usernamePromptText, EmptyString(), m_msgWindow, username); + rv = m_newsFolder->GetGroupUsernameWithUI(usernamePromptText, + usernamePromptTitleText, + m_msgWindow, username); } else return(MK_NNTP_AUTH_FAILED); diff --git a/mailnews/news/src/nsNewsFolder.cpp b/mailnews/news/src/nsNewsFolder.cpp index ae5de85cf6..9a4814f09b 100644 --- a/mailnews/news/src/nsNewsFolder.cpp +++ b/mailnews/news/src/nsNewsFolder.cpp @@ -76,7 +76,6 @@ #include "nsIPrompt.h" #include "nsIWindowWatcher.h" -#include "nsIObserverService.h" #include "nsNetUtil.h" #include "nsIAuthPrompt.h" #include "nsIURL.h" @@ -96,6 +95,11 @@ #include "nsArrayUtils.h" #include "nsIMsgFolderNotificationService.h" #include "nsIMutableArray.h" +#include "nsILoginInfo.h" +#include "nsILoginManager.h" +#include "nsIPromptService.h" +#include "nsEmbedCID.h" +#include "nsIDOMWindow.h" static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); @@ -1068,8 +1072,6 @@ nsresult nsMsgNewsFolder::CreateNewsgroupPasswordUrlForSignon(const nsACString& nsresult nsMsgNewsFolder::CreateNewsgroupUrlForSignon(const nsACString& inUriStr, const char *ref, nsACString& result) { nsresult rv; - PRInt32 port = 0; - nsCOMPtr url = do_CreateInstance(NS_STANDARDURL_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv,rv); @@ -1099,8 +1101,9 @@ nsresult nsMsgNewsFolder::CreateNewsgroupUrlForSignon(const nsACString& inUriStr NS_ENSURE_SUCCESS(rv, rv); } + PRInt32 port = 0; rv = url->GetPort(&port); - if (NS_FAILED(rv)) return rv; + NS_ENSURE_SUCCESS(rv, rv); if (port <= 0) { @@ -1112,61 +1115,110 @@ nsresult nsMsgNewsFolder::CreateNewsgroupUrlForSignon(const nsACString& inUriStr nsresult rv = server->GetSocketType(&socketType); NS_ENSURE_SUCCESS(rv, rv); - rv = url->SetPort((socketType == nsIMsgIncomingServer::useSSL) ? - nsINntpUrl::DEFAULT_NNTPS_PORT : nsINntpUrl::DEFAULT_NNTP_PORT); - NS_ENSURE_SUCCESS(rv, rv); + // Only set this for ssl newsgroups as for non-ssl connections, we don't + // need to specify the port as it is the default for the protocol and + // password manager "blanks" those out. + if (socketType == nsIMsgIncomingServer::useSSL) + { + rv = url->SetPort(nsINntpUrl::DEFAULT_NNTPS_PORT); + NS_ENSURE_SUCCESS(rv, rv); + } } - rv = url->SetRef(nsDependentCString(ref)); + if (ref) + { + rv = url->SetRef(nsDependentCString(ref)); + NS_ENSURE_SUCCESS(rv, rv); + + return url->GetSpec(result); + } + + // If the url doesn't have a path, make sure we don't get a '/' on the end + // as that will confuse searching in password manager. + nsCString spec; + rv = url->GetSpec(spec); NS_ENSURE_SUCCESS(rv, rv); - return url->GetSpec(result); + if (!spec.IsEmpty() && spec[spec.Length() - 1] == '/') + result = StringHead(spec, spec.Length() - 1); + else + result = spec; + + return NS_OK; } NS_IMETHODIMP nsMsgNewsFolder::ForgetGroupUsername() { - nsresult rv; - nsCOMPtr observerService = do_GetService("@mozilla.org/observer-service;1", &rv); - NS_ENSURE_SUCCESS(rv,rv); - - rv = SetGroupUsername(EmptyCString()); - if (NS_FAILED(rv)) return rv; + nsCString hostname; + nsresult rv = CreateNewsgroupUrlForSignon(mURI, nsnull, hostname); + NS_ENSURE_SUCCESS(rv, rv); nsCString signonURL; rv = CreateNewsgroupUsernameUrlForSignon(mURI, signonURL); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr uri; - NS_NewURI(getter_AddRefs(uri), signonURL); - - //this is need to make sure wallet service has been created - rv = CreateServicesForPasswordManager(); NS_ENSURE_SUCCESS(rv, rv); - return observerService->NotifyObservers(uri, "login-failed", nsnull); + nsCOMPtr loginMgr = + do_GetService(NS_LOGINMANAGER_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + PRUint32 count; + nsILoginInfo** logins; + + // XXX we don't support multiple logins per news server, so just delete any + // we find. + rv = loginMgr->FindLogins(&count, NS_ConvertASCIItoUTF16(hostname), + EmptyString(), + NS_ConvertASCIItoUTF16(signonURL), &logins); + NS_ENSURE_SUCCESS(rv, rv); + + // There should only be one-login stored for this url, however just in case + // there isn't. + for (PRUint32 i = 0; i < count; ++i) + { + // 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); + + return NS_OK; } NS_IMETHODIMP nsMsgNewsFolder::ForgetGroupPassword() { - nsresult rv = NS_OK; - nsCOMPtr observerService = do_GetService("@mozilla.org/observer-service;1", &rv); - NS_ENSURE_SUCCESS(rv,rv); - - rv = SetGroupPassword(EmptyCString()); - if (NS_FAILED(rv)) return rv; + nsCString hostname; + nsresult rv = CreateNewsgroupUrlForSignon(mURI, nsnull, hostname); + NS_ENSURE_SUCCESS(rv, rv); nsCString signonURL; rv = CreateNewsgroupPasswordUrlForSignon(mURI, signonURL); - if (NS_FAILED(rv)) return rv; - - nsCOMPtr uri; - NS_NewURI(getter_AddRefs(uri), signonURL); - - //this is need to make sure wallet service has been created - rv = CreateServicesForPasswordManager(); NS_ENSURE_SUCCESS(rv, rv); - return observerService->NotifyObservers(uri, "login-failed", nsnull); + nsCOMPtr loginMgr = + do_GetService(NS_LOGINMANAGER_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + PRUint32 count; + nsILoginInfo** logins; + + // XXX we don't support multiple logins per news server, so just delete any + // we find. + rv = loginMgr->FindLogins(&count, NS_ConvertASCIItoUTF16(hostname), + EmptyString(), + NS_ConvertASCIItoUTF16(signonURL), &logins); + NS_ENSURE_SUCCESS(rv, rv); + + // There should only be one-login stored for this url, however just in case + // there isn't. + for (PRUint32 i = 0; i < count; ++i) + { + // 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); + + return SetGroupPassword(EmptyCString()); } // change order of subfolders (newsgroups) @@ -1340,13 +1392,79 @@ nsMsgNewsFolder::GetGroupUsernameWithUI(const nsAString& aPromptMessage, nsCString signonURL; rv = CreateNewsgroupUsernameUrlForSignon(mURI, signonURL); - if (NS_FAILED(rv)) return rv; + if (NS_FAILED(rv)) + return rv; - rv = dialog->Prompt(nsString(aPromptTitle).get(), nsString(aPromptMessage).get(), - NS_ConvertASCIItoUTF16(signonURL).get(), - nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, NS_ConvertASCIItoUTF16(mPrevUsername).get(), - getter_Copies(uniGroupUsername), &okayValue); - if (NS_FAILED(rv)) return rv; + // This is the hostname without the #username or #password on the end. + nsCString hostnameURL; + rv = CreateNewsgroupUrlForSignon(mURI, nsnull, hostnameURL); + NS_ENSURE_SUCCESS(rv, rv); + + // Due to the way the new login manager doesn't want to let us save + // usernames in the password field, unfortunately the way mailnews has + // worked historically, means we need to do this. + // So we have to first check manully, then prompt, the save separately if + // we want to get a value. + nsCOMPtr loginMgr = + do_GetService(NS_LOGINMANAGER_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + PRUint32 count = 0; + nsILoginInfo **logins = nsnull; + rv = loginMgr->FindLogins(&count, NS_ConvertASCIItoUTF16(hostnameURL), + EmptyString(), NS_ConvertASCIItoUTF16(signonURL), &logins); + NS_ENSURE_SUCCESS(rv, rv); + + if (count > 0) + { + nsString username; + rv = logins[0]->GetPassword(username); + + NS_FREE_XPCOM_ISUPPORTS_POINTER_ARRAY(count, logins); + + NS_ENSURE_SUCCESS(rv, rv); + + NS_LossyConvertUTF16toASCII result(username); + + // Just use the first as that is all we should have + rv = SetGroupUsername(result); + if (NS_FAILED(rv)) + return rv; + + mPrevUsername = aGroupUsername = result; + return NS_OK; + } + NS_FREE_XPCOM_ISUPPORTS_POINTER_ARRAY(count, logins); + + + // No logins, so time to prompt. Toolkit password manager doesn't let us + // use nsIAuthPrompt.prompt in the way we'd like currently, and it doesn't + // let us store username-only passwords. So go direct to the dialog and + // cut out the middle-man. + nsCOMPtr promptSvc = + do_GetService(NS_PROMPTSERVICE_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + PRBool saveUsername = PR_FALSE; + + nsCOMPtr bundleService = do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr bundle; + rv = bundleService->CreateBundle(NEWS_MSGS_URL, getter_AddRefs(bundle)); + NS_ENSURE_SUCCESS(rv, rv); + + nsString saveUsernameText; + rv = bundle->GetStringFromName(NS_LITERAL_STRING("saveUsername").get(), + getter_Copies(saveUsernameText)); + NS_ENSURE_SUCCESS(rv, rv); + + rv = promptSvc->Prompt(nsnull, nsString(aPromptTitle).get(), + nsString(aPromptMessage).get(), + getter_Copies(uniGroupUsername), + saveUsernameText.get(), &saveUsername, + &okayValue); + NS_ENSURE_SUCCESS(rv, rv); if (!okayValue) // if the user pressed cancel, just return NULL; { @@ -1354,6 +1472,36 @@ nsMsgNewsFolder::GetGroupUsernameWithUI(const nsAString& aPromptMessage, return rv; } + if (saveUsername) + { + nsCOMPtr login = + do_CreateInstance("@mozilla.org/login-manager/loginInfo;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + + rv = login->SetHostname(NS_ConvertASCIItoUTF16(hostnameURL)); + NS_ENSURE_SUCCESS(rv, rv); + + rv = login->SetHttpRealm(NS_ConvertASCIItoUTF16(signonURL)); + NS_ENSURE_SUCCESS(rv, rv); + + rv = login->SetPassword(uniGroupUsername); + NS_ENSURE_SUCCESS(rv, rv); + + // Apparently there is a small difference between empty strings and null + // strings, but setting these to empty works for us. + rv = login->SetUsername(EmptyString()); + NS_ENSURE_SUCCESS(rv, rv); + + rv = login->SetUsernameField(EmptyString()); + NS_ENSURE_SUCCESS(rv, rv); + + rv = login->SetPasswordField(EmptyString()); + NS_ENSURE_SUCCESS(rv, rv); + + rv = loginMgr->AddLogin(login); + NS_ENSURE_SUCCESS(rv, rv); + } + // we got a username back, remember it rv = SetGroupUsername(NS_LossyConvertUTF16toASCII(uniGroupUsername)); if (NS_FAILED(rv)) return rv; diff --git a/mailnews/news/test/unit/test_nntpPassword3.js b/mailnews/news/test/unit/test_nntpPassword3.js new file mode 100644 index 0000000000..5a3da87eef --- /dev/null +++ b/mailnews/news/test/unit/test_nntpPassword3.js @@ -0,0 +1,65 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/** + * Extra tests for forgetting newsgroup usernames and passwords. + */ + +do_import_script("../mailnews/test/resources/mailTestUtils.js"); + +const kUsername = "testnews"; +const kPassword = "newstest"; +const kProtocol = "nntp"; +const kHostname = "localhost"; +const kServerUrl = "news://" + kHostname; + +function run_test() +{ + // Login Manager + var loginMgr = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager); + + // Passwords File (generated from Mozilla 1.8 branch). + var signons = do_get_file("../mailnews/test/data/signons-mailnews1.8.txt"); + + // Copy the file to the profile directory for a PAB + signons.copyTo(gProfileDir, "signons.txt"); + + // Set up the basic accounts and folders. + loadLocalMailAccount(); + + var acctMgr = Cc["@mozilla.org/messenger/account-manager;1"] + .getService(Ci.nsIMsgAccountManager); + + var incomingServer = acctMgr.createIncomingServer(null, kHostname, + kProtocol); + + var i; + var count = {}; + + // Test - Check there is a password to begin with... + var logins = loginMgr.findLogins(count, kServerUrl, null, + kServerUrl + "/#password"); + + do_check_eq(count.value, 1); + do_check_eq(logins[0].password, kPassword); + + // ...and a username. + var logins = loginMgr.findLogins(count, kServerUrl, null, + kServerUrl + "/#username"); + + do_check_eq(count.value, 1); + do_check_eq(logins[0].password, kUsername); + + // Test - Remove the news password login via the incoming server + incomingServer.forgetPassword(); + + logins = logins = loginMgr.findLogins(count, kServerUrl, null, + kServerUrl + "/#password"); + + // should be no passwords left... + do_check_eq(count.value, 0); + + logins = logins = loginMgr.findLogins(count, kServerUrl, null, + kServerUrl + "/#username"); + + // ...and no usernames left either. + do_check_eq(count.value, 0); +} diff --git a/mailnews/test/data/signons-mailnews1.8-multiple.txt b/mailnews/test/data/signons-mailnews1.8-multiple.txt new file mode 100644 index 0000000000..e4470caa31 --- /dev/null +++ b/mailnews/test/data/signons-mailnews1.8-multiple.txt @@ -0,0 +1,26 @@ +#2c +. +mailbox://testpop3@localhost +\=username=\ +~ +*\=password=\ +~cG9wM3Rlc3Q= +. +mailbox://testpop3a@localhost +\=username=\ +~ +*\=password=\ +~c210cHRlc3Q= +. +smtp://testsmtp@localhost +\=username=\ +~ +*\=password=\ +~c210cHRlc3Q= +. +smtp://testsmtpa@localhost +\=username=\ +~ +*\=password=\ +~cG9wM3Rlc3Q= +. diff --git a/suite/confvars.sh b/suite/confvars.sh index 17f354108e..55b7f48e87 100755 --- a/suite/confvars.sh +++ b/suite/confvars.sh @@ -48,7 +48,7 @@ MOZ_SUITE=1 MOZ_APP_VERSION=`cat $topsrcdir/$MOZ_BUILD_APP/config/version.txt` SEAMONKEY_VERSION=$MOZ_APP_VERSION MOZ_NO_XPCOM_OBSOLETE=1 -MOZ_EXTENSIONS_DEFAULT=" wallet venkman inspector irc gnomevfs reporter" +MOZ_EXTENSIONS_DEFAULT=" venkman inspector irc gnomevfs reporter" MOZ_PLACES=1 MOZ_UPDATER=1 MOZ_HELP_VIEWER=1 diff --git a/suite/installer/removed-files.in b/suite/installer/removed-files.in index d3d8064566..11699dc55b 100644 --- a/suite/installer/removed-files.in +++ b/suite/installer/removed-files.in @@ -77,6 +77,7 @@ components/nsUnsetDefaultMail.js components/nsXmlRpcClient.js components/progressDlg.xpt components/search.xpt +components/sigonviewer.xpt components/sidebar.xpt components/@DLL_PREFIX@srchsvc@DLL_SUFFIX@ components/suitetypeaheadfind.xpt @@ -84,9 +85,21 @@ components/@DLL_PREFIX@suitetypeaheadfind@DLL_SUFFIX@ components/urlwidgt.xpt components/util.xpt components/venkman-service.js +components/@DLL_PREFIX@wallet@DLL_SUFFIX@ +components/@DLL_PREFIX@walletviewers@DLL_SUFFIX@ +components/wallet.xpt +components/walleteditor.xpt +components/walletpreview.xpt components/@DLL_PREFIX@xmlextras@DLL_SUFFIX@ components/winhooks.xpt components/xml-rpc.xpt +defaults/wallet/VcardSchema.tbl +defaults/wallet/FieldSchema.tbl +defaults/wallet/SchemaConcat.tbl +defaults/wallet/DistinguishedSchema.tbl +defaults/wallet/SchemaStrings.tbl +defaults/wallet/PositionalSchema.tbl +defaults/wallet/StateSchema.tbl @DLL_PREFIX@xpistub@DLL_SUFFIX@ res/cmessage.txt LICENSE diff --git a/suite/installer/unix/packages b/suite/installer/unix/packages index db3e1f43f5..4526def374 100644 --- a/suite/installer/unix/packages +++ b/suite/installer/unix/packages @@ -190,7 +190,6 @@ bin/components/satchel.xpt bin/components/saxparser.xpt bin/components/shistory.xpt bin/components/shellservice.xpt -bin/components/signonviewer.xpt bin/components/spellchecker.xpt bin/components/storage.xpt bin/components/libstoragecomps.so @@ -214,11 +213,6 @@ bin/components/libuniversalchardet.so bin/components/update.xpt bin/components/uriloader.xpt bin/components/urlformatter.xpt -bin/components/libwallet.so -bin/components/libwalletviewers.so -bin/components/wallet.xpt -bin/components/walleteditor.xpt -bin/components/walletpreview.xpt bin/components/webBrowser_core.xpt bin/components/webbrowserpersist.xpt bin/components/libwebbrwsr.so @@ -281,6 +275,7 @@ bin/components/nsURLFormatter.js bin/components/nsWebHandlerApp.js bin/components/pluginGlue.js bin/components/storage-Legacy.js +bin/components/storage-mozStorage.js bin/components/txEXSLTRegExFunctions.js ; Modules @@ -356,15 +351,6 @@ bin/defaults/autoconfig/* bin/defaults/pref/* bin/greprefs/* -; Wallet schemas -bin/defaults/wallet/VcardSchema.tbl -bin/defaults/wallet/FieldSchema.tbl -bin/defaults/wallet/SchemaConcat.tbl -bin/defaults/wallet/DistinguishedSchema.tbl -bin/defaults/wallet/SchemaStrings.tbl -bin/defaults/wallet/PositionalSchema.tbl -bin/defaults/wallet/StateSchema.tbl - ; LDAP components need to be in the browser for AutoConfig bin/libldap60.so bin/libldif60.so diff --git a/suite/installer/windows/packages b/suite/installer/windows/packages index 36d2d8bbbf..8a5953c1dc 100644 --- a/suite/installer/windows/packages +++ b/suite/installer/windows/packages @@ -192,7 +192,6 @@ bin\components\satchel.xpt bin\components\saxparser.xpt bin\components\shellservice.xpt bin\components\shistory.xpt -bin\components\signonviewer.xpt bin\components\storage.xpt bin\components\strgcmps.dll bin\components\suite.dll @@ -212,10 +211,6 @@ bin\components\universalchardet.dll bin\components\update.xpt bin\components\uriloader.xpt bin\components\urlformatter.xpt -bin\components\wallet.dll -bin\components\wallet.xpt -bin\components\walleteditor.xpt -bin\components\walletpreview.xpt bin\components\webBrowser_core.xpt bin\components\webbrowserpersist.xpt bin\components\webbrwsr.dll @@ -281,6 +276,7 @@ bin\components\nsUpdateService.js bin\components\nsURLFormatter.js bin\components\pluginGlue.js bin\components\storage-Legacy.js +bin\components\storage-mozStorage.js bin\components\txEXSLTRegExFunctions.js bin\components\nsAboutAbout.js bin\components\nsDefaultCLH.js @@ -403,13 +399,6 @@ bin\res\entityTables\* bin\res\dtd\* bin\res\fonts\* bin\res\html\* -bin\defaults\wallet\VcardSchema.tbl -bin\defaults\wallet\FieldSchema.tbl -bin\defaults\wallet\SchemaConcat.tbl -bin\defaults\wallet\DistinguishedSchema.tbl -bin\defaults\wallet\SchemaStrings.tbl -bin\defaults\wallet\PositionalSchema.tbl -bin\defaults\wallet\StateSchema.tbl ; MathML, optional for MathML charset conversion bin\components\ucvmath.dll diff --git a/suite/locales/en-US/chrome/mailnews/news.properties b/suite/locales/en-US/chrome/mailnews/news.properties index ff29087053..518792cd72 100644 --- a/suite/locales/en-US/chrome/mailnews/news.properties +++ b/suite/locales/en-US/chrome/mailnews/news.properties @@ -47,6 +47,8 @@ cancelDisallowed=This message does not appear to be from you. You may only canc cancelConfirm=Are you sure you want to cancel this message? messageCancelled=Message cancelled. enterUsername=Please enter a username for news server access: +enterUsernameTitle=News Server Username Required +saveUsername=Use Password Manager to remember this value. enterPassword=Please enter a password for news server access: enterPasswordTitle=News Server Password Required okButtonText=Download