static void openMailWindow(const nsACString& aFolderUri)
{
  nsresult rv;
  nsCOMPtr<nsIMsgMailSession> mailSession ( do_GetService(NS_MSGMAILSESSION_CONTRACTID, &rv));
  if (NS_FAILED(rv))
    return;

  nsCOMPtr<nsIMsgWindow> topMostMsgWindow;
  rv = mailSession->GetTopmostMsgWindow(getter_AddRefs(topMostMsgWindow));
  if (topMostMsgWindow)
  {
    if (!aFolderUri.IsEmpty())
    {
      nsCOMPtr<nsIMsgWindowCommands> windowCommands;
      topMostMsgWindow->GetWindowCommands(getter_AddRefs(windowCommands));
      if (windowCommands)
        windowCommands->SelectFolder(aFolderUri);
    }

    nsCOMPtr<nsIDOMWindow> domWindow;
    topMostMsgWindow->GetDomWindow(getter_AddRefs(domWindow));
    domWindow->Focus();
  }
  else
  {
    // the user doesn't have a mail window open already so open one for them...
    nsCOMPtr<nsIMessengerWindowService> messengerWindowService =
      do_GetService(NS_MESSENGERWINDOWSERVICE_CONTRACTID);
    // if we want to preselect the first account with new mail,
    // here is where we would try to generate a uri to pass in
    // (and add code to the messenger window service to make that work)
    if (messengerWindowService)
      messengerWindowService->OpenMessengerWindowWithUri(
                                "mail:3pane", nsCString(aFolderUri).get(), nsMsgKey_None);
  }
}
Exemple #2
0
nsresult
nsEnigMsgCompose::Init()
{
  nsresult rv;

  DEBUG_LOG(("nsEnigMsgCompose::Init: sendFlags=%p\n", mSendFlags));

  EMBool signMsg    = mSendFlags & nsIEnigmail::SEND_SIGNED;
  EMBool encryptMsg = mSendFlags & nsIEnigmail::SEND_ENCRYPTED;
  EMBool usePgpMime = mSendFlags & nsIEnigmail::SEND_PGP_MIME;

  mMultipartSigned = usePgpMime && signMsg && !encryptMsg;

  mWriter = do_CreateInstance(NS_ENIGMIMEWRITER_CONTRACTID, &rv);
  if (NS_FAILED(rv)) return rv;

  rv = mWriter->Init(mStream, PR_TRUE);
  if (NS_FAILED(rv)) return rv;

  nsCOMPtr<nsIPrompt> prompter;
  nsCOMPtr <nsIMsgMailSession> mailSession (do_GetService(NS_MSGMAILSESSION_CONTRACTID));
  if (mailSession) {
    nsCOMPtr<nsIMsgWindow> msgWindow;
    mailSession->GetTopmostMsgWindow(getter_AddRefs(msgWindow));
    if (msgWindow)
      msgWindow->GetPromptDialog(getter_AddRefs(prompter));
  }

  nsCOMPtr<nsIEnigmail> enigmailSvc = do_GetService(NS_ENIGMAIL_CONTRACTID, &rv);
  if (NS_FAILED(rv)) return rv;

  if (usePgpMime && signMsg && (! encryptMsg)) {
    // determine hash algorithm to use for PGP/MIME signed msg
    PRInt32 exitCode;
    PRUnichar* ha;

    rv = enigmailSvc->DetermineHashAlgorithm(prompter,
                                             mUIFlags,
                                             mSenderEmailAddr.get(),
                                             &ha,
                                             &exitCode);

    DEBUG_LOG(("nsEnigMsgCompose::Init: DetermineHash: rv=%d, exitCode=%d\n", rv, exitCode));

    if (NS_FAILED(rv))
      return rv;

    if (exitCode != 0)
      return NS_ERROR_SMTP_PASSWORD_UNDEFINED;

    mHashAlgorithm = NS_ConvertUTF16toUTF8(ha).get();
    DEBUG_LOG(("nsEnigMsgCompose::Init: hashAlgorithm=%s\n", mHashAlgorithm.get()));
  }

  nsString errorMsg;
  PRUint32 statusFlags;
  rv = enigmailSvc->EncryptMessageStart(nsnull, prompter,
                                        mUIFlags,
                                        mSenderEmailAddr.get(),
                                        mRecipients.get(),
                                        mBccAddr.get(),
                                        mHashAlgorithm.get(),
                                        mSendFlags,
                                        (nsIStreamListener*)(mWriter),
                                        &statusFlags,
                                        getter_Copies(errorMsg),
                                        getter_AddRefs(mPipeTrans) );
  if (NS_FAILED(rv))
    return rv;

  if (statusFlags & nsIEnigmail::MISSING_PASSPHRASE)
    return NS_ERROR_SMTP_PASSWORD_UNDEFINED;

  if (!mPipeTrans)
    return NS_OK;

  rv = enigmailSvc->StripWhitespace(mSendFlags,
                                    &mStripWhitespace);
  if (NS_FAILED(rv))
    return rv;

  mInitialized = PR_TRUE;

  return NS_OK;
}
Exemple #3
0
nsresult
nsEnigMsgCompose::FinishAux(EMBool aAbort,
                            nsIMsgSendReport* sendReport)
{
  nsresult rv;

  if (mMatchFrom > 0) {
    // Flush "buffer" for detecting lines beginning with "From "
    rv = WriteCopy(FromStr, mMatchFrom);
    if (NS_FAILED(rv)) return rv;
  }

  DEBUG_LOG(("nsEnigMsgCompose::FinishAux: \n"));

  if (mMultipartSigned) {
    rv = WriteSignedHeaders2();
    if (NS_FAILED(rv)) return rv;
  }

  // Wait for STDOUT to close
  rv = mPipeTrans->Join();
  if (NS_FAILED(rv)) return rv;

  if (aAbort) {
    // Terminate process
    mPipeTrans->Terminate();
    mPipeTrans = nsnull;

    return NS_ERROR_FAILURE;
  }

  rv = WriteFinalSeparator();
  if (NS_FAILED(rv)) return rv;

  // Count total bytes sent to writer
  PRUint32 cmdOutputLen;
  rv = mWriter->GetBytesWritten(&cmdOutputLen);
  if (NS_FAILED(rv)) return rv;

  // Exclude passthru bytes to determine STDOUT bytes
  cmdOutputLen -= mOutputLen;

  // Close STDOUT writer
  mWriter->Close();
  mWriter = nsnull;

  nsCOMPtr<nsIPrompt> prompter;
  nsCOMPtr <nsIMsgMailSession> mailSession (do_GetService(NS_MSGMAILSESSION_CONTRACTID));
  if (mailSession) {
    nsCOMPtr<nsIMsgWindow> msgWindow;
    mailSession->GetTopmostMsgWindow(getter_AddRefs(msgWindow));
    if (msgWindow)
      msgWindow->GetPromptDialog(getter_AddRefs(prompter));
  }

  nsCOMPtr<nsIEnigmail> enigmailSvc = do_GetService(NS_ENIGMAIL_CONTRACTID, &rv);
  if (NS_FAILED(rv)) return rv;

  PRInt32 exitCode;
  PRUint32 statusFlags;
  nsString errorMsg;
  rv = enigmailSvc->EncryptMessageEnd(nsnull,
                                      prompter,
                                      mUIFlags,
                                      mSendFlags,
                                      cmdOutputLen,
                                      mPipeTrans,
                                      &statusFlags,
                                      getter_Copies(errorMsg),
                                      &exitCode);
  if (NS_FAILED(rv)) return rv;

  if (exitCode != 0) {
    DEBUG_LOG(("nsEnigMsgCompose::FinishAux: ERROR EXIT %d\n", exitCode));
    return NS_ERROR_FAILURE;
  }

  return NS_OK;
}
nsresult
nsEnigMimeDecrypt::FinishAux(nsIMsgWindow* msgWindow, nsIURI* uri)
{
  // Enigmail stuff
  nsresult rv;
  nsCOMPtr<nsIThread> myThread;
  rv = ENIG_GET_THREAD(myThread);

  mUri = uri;
  nsCAutoString uriSpec("");

  if (mListener) {
    rv = mListener->OnStopRequest(nsnull, nsnull, 0);
    if (NS_FAILED(rv))
      return rv;

    nsCAutoString endLine;
    rv = mListener->GetEndLine(endLine);
    if (NS_FAILED(rv)) return rv;

    if (endLine.IsEmpty()) {
      ERROR_LOG(("nsEnigMimeDecrypt::FinishAux: ERROR MIME part not terminated\n"));
      return NS_ERROR_FAILURE;
    }

    mListener = nsnull;
  }

  rv = mBuffer->OnStopRequest(nsnull, nsnull, 0);
  if (NS_FAILED(rv))
    return rv;

  if (msgWindow) {
    nsCOMPtr<nsIMsgHeaderSink> headerSink;
    msgWindow->GetMsgHeaderSink(getter_AddRefs(headerSink));
    if (headerSink)
        headerSink->GetSecurityInfo(getter_AddRefs(mSecurityInfo));
  }
  DEBUG_LOG(("nsEnigMimeDecrypt::FinishAux: securityInfo=%p\n", mSecurityInfo.get()));

  nsCOMPtr<nsIPrompt> prompter;
  if (msgWindow) {
    msgWindow->GetPromptDialog(getter_AddRefs(prompter));
  }

  if (!prompter) {
    nsCOMPtr <nsIMsgMailSession> mailSession (do_GetService(NS_MSGMAILSESSION_CONTRACTID));
    if (mailSession) {
      nsCOMPtr<nsIMsgWindow> msgwin;
      mailSession->GetTopmostMsgWindow(getter_AddRefs(msgwin));
      if (msgwin)
        msgwin->GetPromptDialog(getter_AddRefs(prompter));
    }
  }

  DEBUG_LOG(("nsEnigMimeDecrypt::FinishAux: prompter=%p\n", prompter.get()));

  nsCOMPtr<nsIEnigmail> enigmailSvc = do_GetService(NS_ENIGMAIL_CONTRACTID, &rv);
  if (NS_FAILED(rv))
    return rv;

  nsString errorMsg;
  EMBool noOutput = PR_FALSE;
  PRUint32 statusFlags;

  rv = enigmailSvc->DecryptMessageStart(nsnull,
                                        prompter,
                                        mVerifyOnly,
                                        noOutput,
                                        nsnull,
                                        &statusFlags,
                                        getter_Copies(errorMsg),
                                        getter_AddRefs(mPipeTrans) );
  if (NS_FAILED(rv)) return rv;

  if (!mPipeTrans) {
    if (mSecurityInfo) {
      nsCOMPtr<nsIEnigMimeHeaderSink> enigHeaderSink = do_QueryInterface(mSecurityInfo);
      if (enigHeaderSink) {
        NS_NAMED_LITERAL_STRING(nullString, "");
        rv = enigHeaderSink->UpdateSecurityStatus(uriSpec, -1, statusFlags, nullString.get(), nullString.get(), nullString.get(), errorMsg.get(), nullString.get(), mUri);
      }
    }

    return NS_ERROR_FAILURE;
  }

  mIterations = 0;
  mCtFound = -1;
  nsCOMPtr<nsIInputStream> plainStream = nsnull;

  // read via pipeTransport.jsm
  nsCOMPtr<nsIRequest> request;
  rv = mPipeTrans->ReadInputStream(this, getter_AddRefs(request));
  NS_ENSURE_SUCCESS(rv, rv);

  // Write buffered data asyncronously to process
  nsCOMPtr<nsIInputStream> bufStream;
  rv = mBuffer->OpenInputStream(getter_AddRefs(bufStream));
  if (NS_FAILED(rv)) return rv;

  PRUint32 available;
  rv = bufStream->Available(&available);
  if (NS_FAILED(rv)) return rv;

  DEBUG_LOG(("nsEnigMimeDecrypt::FinishAux: available=%d\n", available));

  rv = mPipeTrans->WriteAsync(bufStream, available, PR_TRUE);
  if (NS_FAILED(rv)) return rv;

  // read via pipeTransport.jsm

  nsCOMPtr<nsIThread> currentThread;
  rv = ENIG_GET_THREAD(currentThread);
  NS_ENSURE_SUCCESS(rv, rv);

  mDone = PR_FALSE;

  // wait with returning until message is completely processed
  // (simulate synchronous function)
  while (! mDone) {
    EMBool pendingEvents;
    rv = currentThread->ProcessNextEvent(PR_TRUE, &pendingEvents);
    NS_ENSURE_SUCCESS(rv, rv);
  }

  return NS_OK;
}