Exemple #1
0
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((""));
    }