/** * Content policy logic for compose windows * */ nsresult nsMsgContentPolicy::ComposeShouldLoad(nsIDocShell * aRootDocShell, nsISupports * aRequestingContext, nsIURI * aContentLocation, PRInt16 * aDecision) { nsresult rv; nsCOMPtr<nsIDOMWindowInternal> window(do_GetInterface(aRootDocShell, &rv)); NS_ENSURE_SUCCESS(rv, NS_OK); nsCOMPtr<nsIMsgComposeService> composeService (do_GetService(NS_MSGCOMPOSESERVICE_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv, NS_OK); nsCOMPtr<nsIMsgCompose> msgCompose; rv = composeService->GetMsgComposeForWindow(window, getter_AddRefs(msgCompose)); NS_ENSURE_SUCCESS(rv, NS_OK); nsCString originalMsgURI; msgCompose->GetOriginalMsgURI(getter_Copies(originalMsgURI)); NS_ENSURE_SUCCESS(rv, NS_OK); MSG_ComposeType composeType; rv = msgCompose->GetType(&composeType); NS_ENSURE_SUCCESS(rv, NS_OK); // Only allow remote content for new mail compositions. // Block remote content for all other types (drafts, templates, forwards, replies, etc) // unless there is an associated msgHdr which allows the load, or unless the image is being // added by the user and not the quoted message content... if (composeType == nsIMsgCompType::New) *aDecision = nsIContentPolicy::ACCEPT; else if (!originalMsgURI.IsEmpty()) { nsCOMPtr<nsIMsgDBHdr> msgHdr; rv = GetMsgDBHdrFromURI(originalMsgURI.get(), getter_AddRefs(msgHdr)); NS_ENSURE_SUCCESS(rv, NS_OK); AllowRemoteContentForMsgHdr(msgHdr, nsnull, aContentLocation, aDecision); // Special case image elements. When replying to a message, we want to allow the // user to add remote images to the message. But we don't want remote images // that are a part of the quoted content to load. Fortunately, after the quoted message // has been inserted into the document, mail compose flags remote content elements that came // from the original message with a moz-do-not-send attribute. if (*aDecision == nsIContentPolicy::REJECT_REQUEST) { PRBool insertingQuotedContent = PR_TRUE; msgCompose->GetInsertingQuotedContent(&insertingQuotedContent); nsCOMPtr<nsIDOMHTMLImageElement> imageElement = do_QueryInterface(aRequestingContext); if (!insertingQuotedContent && imageElement) { PRBool doNotSendAttrib; if (NS_SUCCEEDED(imageElement->HasAttribute(NS_LITERAL_STRING("moz-do-not-send"), &doNotSendAttrib)) && !doNotSendAttrib) *aDecision = nsIContentPolicy::ACCEPT; } } } return NS_OK; }
/** * This function is used to determine if we allow content for a remote message. * If we reject loading remote content, then we'll inform the message window * that this message has remote content (and hence we are not loading it). * * See ShouldAcceptRemoteContentForMsgHdr for the actual decisions that * determine if we are going to allow remote content. */ void nsMsgContentPolicy::ShouldAcceptContentForPotentialMsg(nsIURI *aOriginatorLocation, nsIURI *aContentLocation, PRInt16 *aDecision) { NS_PRECONDITION(*aDecision == nsIContentPolicy::REJECT_REQUEST, "AllowContentForPotentialMessage expects default decision to be reject!"); // Is it a mailnews url? nsresult rv; nsCOMPtr<nsIMsgMessageUrl> msgUrl(do_QueryInterface(aOriginatorLocation, &rv)); if (NS_FAILED(rv)) { // It isn't a mailnews url - so we accept the load here, and let other // content policies make the decision if we should be loading it or not. *aDecision = nsIContentPolicy::ACCEPT; return; } nsCString resourceURI; rv = msgUrl->GetUri(getter_Copies(resourceURI)); NS_ENSURE_SUCCESS(rv, ); nsCOMPtr<nsIMsgDBHdr> msgHdr; rv = GetMsgDBHdrFromURI(resourceURI.get(), getter_AddRefs(msgHdr)); NS_ENSURE_SUCCESS(rv, ); nsCOMPtr<nsIMsgMailNewsUrl> mailnewsUrl(do_QueryInterface(aOriginatorLocation, &rv)); NS_ENSURE_SUCCESS(rv, ); // Get a decision on whether or not to allow remote content for this message // header. *aDecision = ShouldAcceptRemoteContentForMsgHdr(msgHdr, aOriginatorLocation, aContentLocation); // If we're not allowing the remote content, tell the nsIMsgWindow loading // this url that this is the case, so that the UI knows to show the remote // content header bar, so the user can override if they wish. if (*aDecision == nsIContentPolicy::REJECT_REQUEST) { nsCOMPtr<nsIMsgWindow> msgWindow; (void)mailnewsUrl->GetMsgWindow(getter_AddRefs(msgWindow)); if (msgWindow) { nsCOMPtr<nsIRunnable> event = new RemoteContentNotifierEvent(msgWindow, msgHdr); // Post this as an event because it can cause dom mutations, and we // get called at a bad time to be causing dom mutations. if (event) NS_DispatchToCurrentThread(event); } } }
/** * Content policy logic for compose windows * */ void nsMsgContentPolicy::ComposeShouldLoad(nsIMsgCompose *aMsgCompose, nsISupports *aRequestingContext, nsIURI *aContentLocation, PRInt16 *aDecision) { NS_PRECONDITION(*aDecision == nsIContentPolicy::REJECT_REQUEST, "ComposeShouldLoad expects default decision to be reject!"); nsresult rv; nsCString originalMsgURI; rv = aMsgCompose->GetOriginalMsgURI(getter_Copies(originalMsgURI)); NS_ENSURE_SUCCESS(rv, ); MSG_ComposeType composeType; rv = aMsgCompose->GetType(&composeType); NS_ENSURE_SUCCESS(rv, ); // Only allow remote content for new mail compositions or mailto // Block remote content for all other types (drafts, templates, forwards, replies, etc) // unless there is an associated msgHdr which allows the load, or unless the image is being // added by the user and not the quoted message content... if (composeType == nsIMsgCompType::New || composeType == nsIMsgCompType::MailToUrl) *aDecision = nsIContentPolicy::ACCEPT; else if (!originalMsgURI.IsEmpty()) { nsCOMPtr<nsIMsgDBHdr> msgHdr; rv = GetMsgDBHdrFromURI(originalMsgURI.get(), getter_AddRefs(msgHdr)); NS_ENSURE_SUCCESS(rv, ); *aDecision = ShouldAcceptRemoteContentForMsgHdr(msgHdr, nsnull, aContentLocation); // Special case image elements. When replying to a message, we want to allow // the user to add remote images to the message. But we don't want remote // images that are a part of the quoted content to load. Fortunately, after // the quoted message has been inserted into the document, mail compose // flags remote content elements that came from the original message with a // moz-do-not-send attribute. if (*aDecision == nsIContentPolicy::REJECT_REQUEST) { bool insertingQuotedContent = true; aMsgCompose->GetInsertingQuotedContent(&insertingQuotedContent); nsCOMPtr<nsIDOMHTMLImageElement> imageElement(do_QueryInterface(aRequestingContext)); if (!insertingQuotedContent && imageElement) { bool doNotSendAttrib; if (NS_SUCCEEDED(imageElement->HasAttribute(NS_LITERAL_STRING("moz-do-not-send"), &doNotSendAttrib)) && !doNotSendAttrib) *aDecision = nsIContentPolicy::ACCEPT; } } }
nsresult nsMailboxUrl::GetFolder(nsIMsgFolder **msgFolder) { // if we have a RDF URI, then try to get the folder for that URI and then ask the folder // for it's charset.... nsCString uri; GetUri(getter_Copies(uri)); NS_ENSURE_TRUE(!uri.IsEmpty(), NS_ERROR_FAILURE); nsCOMPtr<nsIMsgDBHdr> msg; GetMsgDBHdrFromURI(uri.get(), getter_AddRefs(msg)); if (!msg) return NS_ERROR_FAILURE; return msg->GetFolder(msgFolder); }
nsresult nsMsgSendLater::SetOrigMsgDisposition() { if (!mMessage) return NS_ERROR_NULL_POINTER; // We're finished sending a queued message. We need to look at mMessage // and see if we need to set replied/forwarded // flags for the original message that this message might be a reply to // or forward of. nsCString originalMsgURIs; nsCString queuedDisposition; mMessage->GetStringProperty(ORIG_URI_PROPERTY, getter_Copies(originalMsgURIs)); mMessage->GetStringProperty(QUEUED_DISPOSITION_PROPERTY, getter_Copies(queuedDisposition)); if (!queuedDisposition.IsEmpty()) { nsTArray<nsCString> uriArray; ParseString(originalMsgURIs, ',', uriArray); for (uint32_t i = 0; i < uriArray.Length(); i++) { nsCOMPtr <nsIMsgDBHdr> msgHdr; nsresult rv = GetMsgDBHdrFromURI(uriArray[i].get(), getter_AddRefs(msgHdr)); NS_ENSURE_SUCCESS(rv,rv); if (msgHdr) { // get the folder for the message resource nsCOMPtr<nsIMsgFolder> msgFolder; msgHdr->GetFolder(getter_AddRefs(msgFolder)); if (msgFolder) { nsMsgDispositionState dispositionSetting = nsIMsgFolder::nsMsgDispositionState_Replied; if (queuedDisposition.Equals("forwarded")) dispositionSetting = nsIMsgFolder::nsMsgDispositionState_Forwarded; msgFolder->AddMessageDispositionState(msgHdr, dispositionSetting); } } } } return NS_OK; }
NS_IMETHODIMP nsPop3Sink::IncorporateComplete(nsIMsgWindow *aMsgWindow, int32_t aSize) { if (m_buildMessageUri && !m_baseMessageUri.IsEmpty() && m_newMailParser && m_newMailParser->m_newMsgHdr) { nsMsgKey msgKey; m_newMailParser->m_newMsgHdr->GetMessageKey(&msgKey); m_messageUri.Truncate(); nsBuildLocalMessageURI(m_baseMessageUri.get(), msgKey, m_messageUri); } nsresult rv = WriteLineToMailbox(NS_LITERAL_CSTRING(MSG_LINEBREAK)); NS_ENSURE_SUCCESS(rv, rv); bool leaveOnServer = false; m_popServer->GetLeaveMessagesOnServer(&leaveOnServer); // We need to flush the output stream, in case mail filters move // the new message, which relies on all the data being flushed. rv = m_outFileStream->Flush(); // Make sure the message is written to the disk NS_ENSURE_SUCCESS(rv, rv); NS_ASSERTION(m_newMailParser, "could not get m_newMailParser"); if (m_newMailParser) { // PublishMsgHdr clears m_newMsgHdr, so we need a comptr to // hold onto it. nsCOMPtr<nsIMsgDBHdr> hdr = m_newMailParser->m_newMsgHdr; NS_ASSERTION(hdr, "m_newMailParser->m_newMsgHdr wasn't set"); if (!hdr) return NS_ERROR_FAILURE; nsCOMPtr<nsIMsgLocalMailFolder> localFolder = do_QueryInterface(m_folder); bool doSelect = false; // aSize is only set for partial messages. For full messages, // check to see if we're replacing an old partial message. if (!aSize && localFolder) (void) localFolder->DeleteDownloadMsg(hdr, &doSelect); // If a header already exists for this message (for example, when // getting a complete message when a partial exists), then update the new // header from the old. if (!m_origMessageUri.IsEmpty() && localFolder) { nsCOMPtr <nsIMsgDBHdr> oldMsgHdr; rv = GetMsgDBHdrFromURI(m_origMessageUri.get(), getter_AddRefs(oldMsgHdr)); if (NS_SUCCEEDED(rv) && oldMsgHdr) localFolder->UpdateNewMsgHdr(oldMsgHdr, hdr); } if (m_downloadingToTempFile) { // close file to give virus checkers a chance to do their thing... m_outFileStream->Flush(); m_outFileStream->Close(); m_newMailParser->FinishHeader(); // need to re-open the inbox file stream. bool exists; m_tmpDownloadFile->Exists(&exists); if (!exists) return HandleTempDownloadFailed(aMsgWindow); nsCOMPtr <nsIInputStream> inboxInputStream = do_QueryInterface(m_outFileStream); rv = MsgReopenFileStream(m_tmpDownloadFile, inboxInputStream); NS_ENSURE_SUCCESS(rv, HandleTempDownloadFailed(aMsgWindow)); if (m_outFileStream) { int64_t tmpDownloadFileSize; uint32_t msgSize; hdr->GetMessageSize(&msgSize); // we need to clone because nsLocalFileUnix caches its stat result, // so it doesn't realize the file has changed size. nsCOMPtr <nsIFile> tmpClone; rv = m_tmpDownloadFile->Clone(getter_AddRefs(tmpClone)); NS_ENSURE_SUCCESS(rv, rv); tmpClone->GetFileSize(&tmpDownloadFileSize); if (msgSize > tmpDownloadFileSize) rv = NS_MSG_ERROR_WRITING_MAIL_FOLDER; else rv = m_newMailParser->AppendMsgFromStream(inboxInputStream, hdr, msgSize, m_folder); if (NS_FAILED(rv)) return HandleTempDownloadFailed(aMsgWindow); m_outFileStream->Close(); // close so we can truncate. m_tmpDownloadFile->SetFileSize(0); } else { return HandleTempDownloadFailed(aMsgWindow); // need to give an error here. } } else { m_msgStore->FinishNewMessage(m_outFileStream, hdr); } m_newMailParser->PublishMsgHeader(aMsgWindow); // run any reply/forward filter after we've finished with the // temp quarantine file, and/or moved the message to another folder. m_newMailParser->ApplyForwardAndReplyFilter(aMsgWindow); if (aSize) hdr->SetUint32Property("onlineSize", aSize); // if DeleteDownloadMsg requested it, select the new message else if (doSelect) (void) localFolder->SelectDownloadMsg(); } #ifdef DEBUG printf("Incorporate message complete.\n"); #endif nsCOMPtr<nsIPop3Service> pop3Service(do_GetService(NS_POP3SERVICE_CONTRACTID1, &rv)); NS_ENSURE_SUCCESS(rv, rv); pop3Service->NotifyDownloadProgress(m_folder, ++m_numMsgsDownloaded, m_numNewMessages); return NS_OK; }
nsresult nsFolderCompactState::GetMessage(nsIMsgDBHdr **message) { return GetMsgDBHdrFromURI(m_messageUri.get(), message); }