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; }
NS_IMETHODIMP nsSmtpServer::GetPasswordWithUI(const PRUnichar *aPromptMessage, const PRUnichar *aPromptTitle, nsIAuthPrompt* aDialog, nsACString &aPassword) { if (!m_password.IsEmpty()) return GetPassword(aPassword); // We need to get a password, but see if we can get it from the password // manager without requiring a prompt. nsresult rv = GetPasswordWithoutUI(); if (rv == NS_ERROR_ABORT) return NS_MSG_PASSWORD_PROMPT_CANCELLED; // Now re-check if we've got a password or not, if we have, then we // don't need to prompt the user. if (!m_password.IsEmpty()) { aPassword = m_password; return NS_OK; } NS_ENSURE_ARG_POINTER(aDialog); // PromptPassword needs the username as well. nsCString serverUri(GetServerURIInternal(true)); bool okayValue = true; nsString uniPassword; rv = aDialog->PromptPassword(aPromptTitle, aPromptMessage, NS_ConvertASCIItoUTF16(serverUri).get(), nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY, getter_Copies(uniPassword), &okayValue); NS_ENSURE_SUCCESS(rv, rv); // If the user pressed cancel, just return an empty string. if (!okayValue) { aPassword.Truncate(); return NS_MSG_PASSWORD_PROMPT_CANCELLED; } NS_LossyConvertUTF16toASCII password(uniPassword); rv = SetPassword(password); NS_ENSURE_SUCCESS(rv, rv); aPassword = password; return NS_OK; }
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; }
void CNcdNodeLink::InternalizeL( RReadStream& aStream ) { DLTRACEIN(("")); // Read all the membervariable values from the stream and // set the values for this object. // First get the data to the tmp variables. So, we can be sure // that there is enough memory to set the member variables. HBufC* timeStamp( NULL ); HBufC* catalogsSourceName( NULL ); HBufC* remoteUri( NULL ); HBufC* serverUri( NULL ); TInt64 linkDownloadTime( 0 ); TInt description( 0 ); TInt validUntilDelta( 0 ); TBool validUntilAutoUpdate( EFalse ); TBool remoteFlag( RemoteFlag() ); CNcdNodeIdentifier* parentIdentifier( NULL ); CNcdNodeIdentifier* requestParentIdentifier( NULL ); CNcdNodeIdentifier* metaDataIdentifier( NULL ); InternalizeDesL( timeStamp, aStream ); CleanupStack::PushL( timeStamp ); InternalizeDesL( catalogsSourceName, aStream ); CleanupStack::PushL( catalogsSourceName ); InternalizeDesL( remoteUri, aStream ); CleanupStack::PushL( remoteUri ); InternalizeDesL( serverUri, aStream ); CleanupStack::PushL( serverUri ); aStream >> linkDownloadTime; description = aStream.ReadInt32L(); validUntilDelta = aStream.ReadInt32L(); validUntilAutoUpdate = aStream.ReadInt32L(); remoteFlag = aStream.ReadInt32L(); // The parent identifier will contain at least empty values. parentIdentifier = CNcdNodeIdentifier::NewLC( aStream ); requestParentIdentifier = CNcdNodeIdentifier::NewLC( aStream ); metaDataIdentifier = CNcdNodeIdentifier::NewLC( aStream ); // Now that descriptors were succesfully created we // may delete old info and replaced it by new data. delete iMetaDataIdentifier; iMetaDataIdentifier = metaDataIdentifier; CleanupStack::Pop( metaDataIdentifier ); delete iRequestParentIdentifier; iRequestParentIdentifier = requestParentIdentifier; CleanupStack::Pop( requestParentIdentifier ); delete iParentIdentifier; iParentIdentifier = parentIdentifier; CleanupStack::Pop( parentIdentifier ); delete iServerUri; iServerUri = serverUri; CleanupStack::Pop( serverUri ); delete iRemoteUri; iRemoteUri = remoteUri; CleanupStack::Pop( remoteUri ); delete iCatalogsSourceName; iCatalogsSourceName = catalogsSourceName; CleanupStack::Pop( catalogsSourceName ); delete iTimeStamp; iTimeStamp = timeStamp; CleanupStack::Pop( timeStamp ); iLinkDownloadTime = linkDownloadTime; // We can be sure that enumeration is same as TInt iDescription = static_cast<MNcdPreminetProtocolEntityRef::TDescription>(description); iValidUntilDelta = validUntilDelta; iValidUntilAutoUpdate = validUntilAutoUpdate; iRemoteFlag = remoteFlag; // Handle the query data TInt queryCount = aStream.ReadInt32L(); // Reset old array if it contains data iQueries.Reset(); for ( TInt i = 0; i < queryCount; ++i ) { // Because all the other info has been already set, // here we just skip insertion if it failed for some reason. // Insert the queries that you can. TRAP_IGNORE( iQueries.Append( aStream.ReadInt32L() ) ); } DLTRACEOUT(("")); }