From 74e5265d3921f18c7d626004e898837adb466d0c Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Sun, 10 Nov 2019 17:53:59 -0500 Subject: Bug 516464 - Remove passwords from cache when password manager contents are changed to prevent stale password attempts. Tag #1273 --- mailnews/base/util/nsMsgIncomingServer.cpp | 42 +++++++++++++++++++++++++++++- mailnews/base/util/nsMsgIncomingServer.h | 6 ++++- mailnews/build/nsMailModule.cpp | 14 +++++----- mailnews/compose/src/nsMsgSendLater.cpp | 2 +- 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/mailnews/base/util/nsMsgIncomingServer.cpp b/mailnews/base/util/nsMsgIncomingServer.cpp index a1e897f12..2677e149a 100644 --- a/mailnews/base/util/nsMsgIncomingServer.cpp +++ b/mailnews/base/util/nsMsgIncomingServer.cpp @@ -49,6 +49,7 @@ #include "nsIMsgFilter.h" #include "nsIArray.h" #include "nsArrayUtils.h" +#include "nsIObserverService.h" #define PORT_NOT_SET -1 @@ -64,12 +65,51 @@ nsMsgIncomingServer::nsMsgIncomingServer(): { } +nsresult nsMsgIncomingServer::Init() +{ + // We need to know when the password manager changes. + nsCOMPtr observerService = + mozilla::services::GetObserverService(); + NS_ENSURE_TRUE(observerService, NS_ERROR_UNEXPECTED); + + observerService->AddObserver(this, "passwordmgr-storage-changed", false); + observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false); + return NS_OK; +} + nsMsgIncomingServer::~nsMsgIncomingServer() { } NS_IMPL_ISUPPORTS(nsMsgIncomingServer, nsIMsgIncomingServer, - nsISupportsWeakReference) + nsISupportsWeakReference, nsIObserver) + +NS_IMETHODIMP +nsMsgIncomingServer::Observe(nsISupports *aSubject, const char* aTopic, + const char16_t *aData) +{ + nsresult rv; + + // When the state of the password manager changes we need to clear the + // password from the cache in case the user just removed it. + if (strcmp(aTopic, "passwordmgr-storage-changed") == 0) + { + rv = ForgetSessionPassword(); + NS_ENSURE_SUCCESS(rv,rv); + } + else if (strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID) == 0) + { + // Now remove ourselves from the observer service as well. + nsCOMPtr observerService = + mozilla::services::GetObserverService(); + NS_ENSURE_TRUE(observerService, NS_ERROR_UNEXPECTED); + + observerService->RemoveObserver(this, "passwordmgr-storage-changed"); + observerService->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID); + } + + return NS_OK; +} NS_IMETHODIMP nsMsgIncomingServer::SetServerBusy(bool aServerBusy) diff --git a/mailnews/base/util/nsMsgIncomingServer.h b/mailnews/base/util/nsMsgIncomingServer.h index 0c4219cd2..d19bdc930 100644 --- a/mailnews/base/util/nsMsgIncomingServer.h +++ b/mailnews/base/util/nsMsgIncomingServer.h @@ -21,6 +21,7 @@ #include "nsIMsgFilterPlugin.h" #include "nsDataHashtable.h" #include "nsIMsgPluggableStore.h" +#include "nsIObserver.h" class nsIMsgFolderCache; class nsIMsgProtocolInfo; @@ -36,13 +37,16 @@ class nsIMsgProtocolInfo; #define IMETHOD_VISIBILITY NS_VISIBILITY_DEFAULT class NS_MSG_BASE nsMsgIncomingServer : public nsIMsgIncomingServer, - public nsSupportsWeakReference + public nsSupportsWeakReference, + public nsIObserver { public: nsMsgIncomingServer(); + nsresult Init(); NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIMSGINCOMINGSERVER + NS_DECL_NSIOBSERVER protected: virtual ~nsMsgIncomingServer(); diff --git a/mailnews/build/nsMailModule.cpp b/mailnews/build/nsMailModule.cpp index 4f63a27bc..d0bcabe96 100644 --- a/mailnews/build/nsMailModule.cpp +++ b/mailnews/build/nsMailModule.cpp @@ -602,7 +602,7 @@ NS_DEFINE_NAMED_CID(NS_MSGCOMPUTILS_CID); //////////////////////////////////////////////////////////////////////////////// NS_GENERIC_FACTORY_CONSTRUCTOR(JaCppAbDirectoryDelegator) NS_GENERIC_FACTORY_CONSTRUCTOR(JaCppComposeDelegator) -NS_GENERIC_FACTORY_CONSTRUCTOR(JaCppIncomingServerDelegator) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(JaCppIncomingServerDelegator, Init) NS_GENERIC_FACTORY_CONSTRUCTOR(JaCppMsgFolderDelegator) NS_GENERIC_FACTORY_CONSTRUCTOR(JaCppSendDelegator) NS_GENERIC_FACTORY_CONSTRUCTOR(JaCppUrlDelegator) @@ -620,7 +620,7 @@ NS_DEFINE_NAMED_CID(JACPPURLDELEGATOR_CID); NS_GENERIC_FACTORY_CONSTRUCTOR(nsImapUrl) NS_GENERIC_FACTORY_CONSTRUCTOR(nsImapProtocol) NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsIMAPHostSessionList, Init) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsImapIncomingServer) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsImapIncomingServer, Init) NS_GENERIC_FACTORY_CONSTRUCTOR(nsImapService) NS_GENERIC_FACTORY_CONSTRUCTOR(nsImapMailFolder) NS_GENERIC_FACTORY_CONSTRUCTOR(nsImapMockChannel) @@ -646,14 +646,14 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsPop3Service) NS_GENERIC_FACTORY_CONSTRUCTOR(nsNoneService) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgLocalMailFolder) NS_GENERIC_FACTORY_CONSTRUCTOR(nsParseMailMessageState) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsPop3IncomingServer) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsRssIncomingServer) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsPop3IncomingServer, Init) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsRssIncomingServer, Init) NS_GENERIC_FACTORY_CONSTRUCTOR(nsRssService) #ifdef HAVE_MOVEMAIL -NS_GENERIC_FACTORY_CONSTRUCTOR(nsMovemailIncomingServer) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsMovemailIncomingServer, Init) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMovemailService) #endif /* HAVE_MOVEMAIL */ -NS_GENERIC_FACTORY_CONSTRUCTOR(nsNoIncomingServer) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsNoIncomingServer, Init) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgBrkMBoxStore) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgMaildirStore) @@ -728,7 +728,7 @@ NS_DEFINE_NAMED_CID(NS_FTS3TOKENIZER_CID); //////////////////////////////////////////////////////////////////////////////// NS_GENERIC_FACTORY_CONSTRUCTOR(nsNntpUrl) NS_GENERIC_FACTORY_CONSTRUCTOR(nsNntpService) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsNntpIncomingServer) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsNntpIncomingServer, Init) NS_GENERIC_FACTORY_CONSTRUCTOR(nsNNTPArticleList) NS_GENERIC_FACTORY_CONSTRUCTOR(nsNNTPNewsgroupPost) NS_GENERIC_FACTORY_CONSTRUCTOR(nsNNTPNewsgroupList) diff --git a/mailnews/compose/src/nsMsgSendLater.cpp b/mailnews/compose/src/nsMsgSendLater.cpp index 97206f12b..66c90fc0b 100644 --- a/mailnews/compose/src/nsMsgSendLater.cpp +++ b/mailnews/compose/src/nsMsgSendLater.cpp @@ -154,7 +154,7 @@ nsMsgSendLater::Observe(nsISupports *aSubject, const char* aTopic, mTimerSet = false; } - else if (!strcmp(aTopic, "xpcom-shutdown")) + else if (!strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID)) { // We're shutting down. Unsubscribe from the unsentFolder notifications // they aren't any use to us now, we don't want to start sending more -- cgit v1.2.3