From 0fc1d47d1bb75010f7035039f51be971d10f778a Mon Sep 17 00:00:00 2001 From: "morse%netscape.com" Date: Thu, 19 Sep 2002 01:42:19 +0000 Subject: [PATCH] bug 160425, forgets previously saved passwords if mail server unavailable, r=jag, sr=jst --- extensions/wallet/src/nsWalletService.cpp | 2 +- extensions/wallet/src/singsign.cpp | 35 +++++++++++++++++++---- extensions/wallet/src/singsign.h | 4 +++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/extensions/wallet/src/nsWalletService.cpp b/extensions/wallet/src/nsWalletService.cpp index 70596761a2cd..98fcdebb00df 100644 --- a/extensions/wallet/src/nsWalletService.cpp +++ b/extensions/wallet/src/nsWalletService.cpp @@ -289,7 +289,7 @@ NS_IMETHODIMP nsWalletlibService::Observe(nsISupports *aSubject, const char *aTo nsCAutoString spec; uri->GetSpec(spec); if (NS_SUCCEEDED(uri->GetSpec(spec))) - SI_RemoveUser(spec.get(), nsnull); + SINGSIGN_RemoveUserAfterLoginFailure(spec.get(), nsnull, PR_TRUE); } } return NS_OK; diff --git a/extensions/wallet/src/singsign.cpp b/extensions/wallet/src/singsign.cpp index 32e247426355..d48d7289267c 100644 --- a/extensions/wallet/src/singsign.cpp +++ b/extensions/wallet/src/singsign.cpp @@ -659,6 +659,17 @@ si_CompareEncryptedToEncrypted(const nsString& crypt1, const nsString& crypt2) { * Managing Signon List * ************************/ +static PRUint32 +SecondsFromPRTime(PRTime prTime) { + PRInt64 microSecondsPerSecond, intermediateResult; + PRUint32 seconds; + + LL_I2L(microSecondsPerSecond, PR_USEC_PER_SEC); + LL_DIV(intermediateResult, prTime, microSecondsPerSecond); + LL_L2UI(seconds, intermediateResult); + return seconds; +} + MOZ_DECL_CTOR_COUNTER(si_SignonDataStruct) class si_SignonDataStruct { @@ -691,6 +702,7 @@ public: } MOZ_COUNT_DTOR(si_SignonUserStruct); } + PRUint32 time; nsVoidArray signonData_list; // elements are si_SignonDataStruct }; @@ -789,7 +801,7 @@ si_GetURL(const char * passwordRealm) { /* Remove a user node from a given URL node */ PRIVATE PRBool -si_RemoveUser(const char *passwordRealm, const nsString& userName, PRBool save, PRBool notify, PRBool first = PR_FALSE) { +si_RemoveUser(const char *passwordRealm, const nsString& userName, PRBool save, PRBool loginFailure, PRBool notify, PRBool first = PR_FALSE) { si_SignonURLStruct * url; si_SignonUserStruct * user; si_SignonDataStruct * data; @@ -828,6 +840,9 @@ si_RemoveUser(const char *passwordRealm, const nsString& userName, PRBool save, si_unlock_signon_list(); return PR_FALSE; /* user not found so nothing to remove */ foundUser: ; + if (loginFailure && (user->time + 300) < SecondsFromPRTime(PR_Now())) { + return PR_FALSE; /* password was set more than 5 minutes (300 seconds) ago */ + } } /* free the user node */ @@ -853,7 +868,13 @@ si_RemoveUser(const char *passwordRealm, const nsString& userName, PRBool save, PUBLIC nsresult SINGSIGN_RemoveUser(const char *host, const PRUnichar *user, PRBool notify) { - PRBool rv = si_RemoveUser(host, nsAutoString(user), PR_TRUE, notify); + PRBool rv = si_RemoveUser(host, nsAutoString(user), PR_TRUE, PR_FALSE, notify); + return rv ? NS_OK : NS_ERROR_FAILURE; +} + +PUBLIC nsresult +SINGSIGN_RemoveUserAfterLoginFailure(const char *host, const PRUnichar *user, PRBool notify) { + PRBool rv = si_RemoveUser(host, nsAutoString(user), PR_TRUE, PR_TRUE, notify); return rv ? NS_OK : NS_ERROR_FAILURE; } @@ -1247,7 +1268,7 @@ PUBLIC void SI_RemoveAllSignonData() { if (si_PartiallyLoaded) { /* repeatedly remove first user node of first URL node */ - while (si_RemoveUser(NULL, nsAutoString(), PR_FALSE, PR_FALSE, PR_TRUE)) { + while (si_RemoveUser(NULL, nsAutoString(), PR_FALSE, PR_FALSE, PR_FALSE, PR_TRUE)) { } } si_PartiallyLoaded = PR_FALSE; @@ -1272,7 +1293,7 @@ PUBLIC void SI_DeleteAll() { if (si_PartiallyLoaded) { /* repeatedly remove first user node of first URL node */ - while (si_RemoveUser(NULL, nsAutoString(), PR_FALSE, PR_TRUE, PR_TRUE)) { + while (si_RemoveUser(NULL, nsAutoString(), PR_FALSE, PR_FALSE, PR_TRUE, PR_TRUE)) { } } si_PartiallyLoaded = PR_FALSE; @@ -1563,6 +1584,7 @@ si_PutData(const char * passwordRealm, nsVoidArray * signonData, PRBool save) { if (!si_CompareEncryptedToEncrypted(data->value, data2->value)) { si_signon_list_changed = PR_TRUE; data->value = data2->value; + user->time = SecondsFromPRTime(PR_Now()); /* commenting out because I don't see how such randomizing could ever have worked. */ // si_Randomize(data->value); } @@ -1630,11 +1652,13 @@ si_PutData(const char * passwordRealm, nsVoidArray * signonData, PRBool save) { * we will be reversing the order when reading in. */ if (save) { + user->time = SecondsFromPRTime(PR_Now()); url->signonUser_list.InsertElementAt(user, 0); si_signon_list_changed = PR_TRUE; si_SaveSignonDataLocked("signons", PR_TRUE); si_unlock_signon_list(); } else { + user->time = 0; url->signonUser_list.AppendElement(user); } } @@ -2105,6 +2129,7 @@ si_RememberSignonData // data2->value = data1->value; if (NS_SUCCEEDED(si_Encrypt(data1->value, data->value))) { + user->time = SecondsFromPRTime(PR_Now()); si_signon_list_changed = PR_TRUE; si_SaveSignonDataLocked("signons", PR_TRUE); si_unlock_signon_list(); @@ -2457,7 +2482,7 @@ SINGSIGN_PromptUsernameAndPassword si_RememberSignonDataFromBrowser (passwordRealm, nsAutoString(*user), nsAutoString(*pwd)); } else if (remembered) { /* a login was remembered but user unchecked the box; we forget the remembered login */ - si_RemoveUser(passwordRealm, username, PR_TRUE, PR_TRUE); + si_RemoveUser(passwordRealm, username, PR_TRUE, PR_FALSE, PR_TRUE); } /* cleanup and return */ diff --git a/extensions/wallet/src/singsign.h b/extensions/wallet/src/singsign.h index 540a2a7a6c3f..0d17c94e356d 100644 --- a/extensions/wallet/src/singsign.h +++ b/extensions/wallet/src/singsign.h @@ -104,6 +104,10 @@ extern nsresult SINGSIGN_RemoveUser (const char* passwordRealm, const PRUnichar *userName, PRBool notify); +extern nsresult +SINGSIGN_RemoveUserAfterLoginFailure + (const char* passwordRealm, const PRUnichar *userName, PRBool notify); + extern nsresult SINGSIGN_RemoveReject (const char* host);