fix for #9761. when doing the client-side cancel check, compare against all the identities.
This commit is contained in:
Родитель
3b6299569f
Коммит
ca8581acec
|
@ -67,6 +67,7 @@
|
||||||
#include "nsIMsgMailSession.h"
|
#include "nsIMsgMailSession.h"
|
||||||
#include "nsIMsgIdentity.h"
|
#include "nsIMsgIdentity.h"
|
||||||
#include "nsINetSupportDialogService.h"
|
#include "nsINetSupportDialogService.h"
|
||||||
|
#include "nsIMsgAccountManager.h"
|
||||||
|
|
||||||
#define PREF_NEWS_MAX_ARTICLES "news.max_articles"
|
#define PREF_NEWS_MAX_ARTICLES "news.max_articles"
|
||||||
#define PREF_NEWS_MARK_OLD_READ "news.mark_old_read"
|
#define PREF_NEWS_MARK_OLD_READ "news.mark_old_read"
|
||||||
|
@ -104,6 +105,12 @@ static NS_DEFINE_CID(kNNTPArticleListCID, NS_NNTPARTICLELIST_CID);
|
||||||
static NS_DEFINE_CID(kNNTPHostCID, NS_NNTPHOST_CID);
|
static NS_DEFINE_CID(kNNTPHostCID, NS_NNTPHOST_CID);
|
||||||
static NS_DEFINE_CID(kCMsgMailSessionCID, NS_MSGMAILSESSION_CID);
|
static NS_DEFINE_CID(kCMsgMailSessionCID, NS_MSGMAILSESSION_CID);
|
||||||
static NS_DEFINE_CID(kCNetSupportDialogCID, NS_NETSUPPORTDIALOG_CID);
|
static NS_DEFINE_CID(kCNetSupportDialogCID, NS_NETSUPPORTDIALOG_CID);
|
||||||
|
static NS_DEFINE_CID(kCMsgAccountManagerCID, NS_MSGACCOUNTMANAGER_CID);
|
||||||
|
|
||||||
|
typedef struct _cancelInfoEntry {
|
||||||
|
char *from;
|
||||||
|
char *old_from;
|
||||||
|
} cancelInfoEntry;
|
||||||
|
|
||||||
// quiet compiler warnings by defining these function prototypes
|
// quiet compiler warnings by defining these function prototypes
|
||||||
char *NET_ExplainErrorDetails (int code, ...);
|
char *NET_ExplainErrorDetails (int code, ...);
|
||||||
|
@ -3698,12 +3705,93 @@ PRInt32 nsNNTPProtocol::StartCancel()
|
||||||
return (status);
|
return (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRBool nsNNTPProtocol::CheckIfAuthor(nsISupports *aElement, void *data)
|
||||||
|
{
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
cancelInfoEntry *cancelInfo = (cancelInfoEntry*) data;
|
||||||
|
|
||||||
|
if (cancelInfo->from) {
|
||||||
|
#ifdef DEBUG_NEWS
|
||||||
|
printf("already found a match, no need to go any further\n");
|
||||||
|
#endif
|
||||||
|
// keep going
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsCOMPtr<nsIMsgIdentity> identity = do_QueryInterface(aElement, &rv);
|
||||||
|
if (NS_FAILED(rv)) {
|
||||||
|
// keep going
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (identity) {
|
||||||
|
identity->GetEmail(&cancelInfo->from);
|
||||||
|
#ifdef DEBUG_NEWS
|
||||||
|
printf("from = %s\n", cancelInfo->from);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
nsCOMPtr<nsIMsgHeaderParser> parser;
|
||||||
|
rv = nsComponentManager::CreateInstance(kCHeaderParserCID,
|
||||||
|
nsnull,
|
||||||
|
nsIMsgHeaderParser::GetIID(),
|
||||||
|
getter_AddRefs(parser));
|
||||||
|
|
||||||
|
if (NS_FAILED(rv)) {
|
||||||
|
PR_FREEIF(cancelInfo->from);
|
||||||
|
cancelInfo->from = nsnull;
|
||||||
|
|
||||||
|
// keep going
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_NEWS
|
||||||
|
printf("got a header parser...\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char *us = nsnull;
|
||||||
|
char *them = nsnull;
|
||||||
|
nsresult rv1 = parser->ExtractHeaderAddressMailboxes(nsnull, cancelInfo->from, &us);
|
||||||
|
nsresult rv2 = parser->ExtractHeaderAddressMailboxes(nsnull, cancelInfo->old_from, &them);
|
||||||
|
|
||||||
|
#ifdef DEBUG_NEWS
|
||||||
|
printf("us = %s, them = %s\n", us, them);
|
||||||
|
#endif
|
||||||
|
if ((NS_FAILED(rv1) || NS_FAILED(rv2) || PL_strcasecmp(us, them))) {
|
||||||
|
#ifdef DEBUG_NEWS
|
||||||
|
printf("no match. don't set cancel email\n");
|
||||||
|
#endif
|
||||||
|
PR_FREEIF(cancelInfo->from);
|
||||||
|
cancelInfo->from = nsnull;
|
||||||
|
|
||||||
|
PR_FREEIF(us);
|
||||||
|
PR_FREEIF(them);
|
||||||
|
|
||||||
|
// keep going
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#ifdef DEBUG_NEWS
|
||||||
|
printf("got a match!\n");
|
||||||
|
#endif
|
||||||
|
// we have a match, stop.
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PRInt32 nsNNTPProtocol::Cancel()
|
PRInt32 nsNNTPProtocol::Cancel()
|
||||||
{
|
{
|
||||||
int status = 0;
|
int status = 0;
|
||||||
nsresult rv = NS_OK;
|
nsresult rv = NS_OK;
|
||||||
char *id, *subject, *newsgroups, *distribution, *other_random_headers, *body;
|
char *id = nsnull;
|
||||||
char *from, *old_from;
|
char *subject = nsnull;
|
||||||
|
char *newsgroups = nsnull;
|
||||||
|
char *distribution = nsnull;
|
||||||
|
char *other_random_headers = nsnull;
|
||||||
|
char *body = nsnull;
|
||||||
|
cancelInfoEntry cancelInfo;
|
||||||
|
|
||||||
int L;
|
int L;
|
||||||
#ifdef USE_LIBMSG
|
#ifdef USE_LIBMSG
|
||||||
MSG_CompositionFields *fields = NULL;
|
MSG_CompositionFields *fields = NULL;
|
||||||
|
@ -3725,8 +3813,9 @@ PRInt32 nsNNTPProtocol::Cancel()
|
||||||
|
|
||||||
newsgroups = m_cancelNewsgroups;
|
newsgroups = m_cancelNewsgroups;
|
||||||
distribution = m_cancelDistribution;
|
distribution = m_cancelDistribution;
|
||||||
old_from = m_cancelFromHdr;
|
|
||||||
id = m_cancelID;
|
id = m_cancelID;
|
||||||
|
cancelInfo.old_from = m_cancelFromHdr;
|
||||||
|
cancelInfo.from = nsnull;
|
||||||
|
|
||||||
#ifdef NECKO
|
#ifdef NECKO
|
||||||
NS_WITH_SERVICE(nsIPrompt, dialog, kCNetSupportDialogCID, &rv);
|
NS_WITH_SERVICE(nsIPrompt, dialog, kCNetSupportDialogCID, &rv);
|
||||||
|
@ -3742,26 +3831,9 @@ PRInt32 nsNNTPProtocol::Cancel()
|
||||||
m_cancelDistribution = nsnull;
|
m_cancelDistribution = nsnull;
|
||||||
m_cancelFromHdr = nsnull;
|
m_cancelFromHdr = nsnull;
|
||||||
m_cancelID = nsnull;
|
m_cancelID = nsnull;
|
||||||
|
|
||||||
L = PL_strlen (id);
|
L = PL_strlen (id);
|
||||||
|
|
||||||
#ifdef UNREADY_CODE
|
|
||||||
from = MIME_MakeFromField ();
|
|
||||||
#else
|
|
||||||
// get the current identity from the news session....
|
|
||||||
NS_WITH_SERVICE(nsIMsgMailSession,newsSession,kCMsgMailSessionCID,&rv);
|
|
||||||
if (NS_SUCCEEDED(rv) && newsSession) {
|
|
||||||
nsCOMPtr<nsIMsgIdentity> identity;
|
|
||||||
rv = newsSession->GetCurrentIdentity(getter_AddRefs(identity));
|
|
||||||
if (NS_SUCCEEDED(rv) && identity) {
|
|
||||||
identity->GetEmail(&from);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef DEBUG_NEWS
|
|
||||||
printf("post the cancel message as %s\n",from);
|
|
||||||
#endif /* DEBUG_NEWS */
|
|
||||||
#endif /* UNREADY_CODE */
|
|
||||||
|
|
||||||
subject = (char *) PR_Malloc (L + 20);
|
subject = (char *) PR_Malloc (L + 20);
|
||||||
other_random_headers = (char *) PR_Malloc (L + 20);
|
other_random_headers = (char *) PR_Malloc (L + 20);
|
||||||
body = (char *) PR_Malloc (PL_strlen (XP_AppCodeName) + 100);
|
body = (char *) PR_Malloc (PL_strlen (XP_AppCodeName) + 100);
|
||||||
|
@ -3786,31 +3858,19 @@ PRInt32 nsNNTPProtocol::Cancel()
|
||||||
#ifdef DEBUG_NEWS
|
#ifdef DEBUG_NEWS
|
||||||
printf("CANCELCHK not supported\n");
|
printf("CANCELCHK not supported\n");
|
||||||
#endif
|
#endif
|
||||||
nsCOMPtr<nsIMsgHeaderParser> parser;
|
|
||||||
PRBool ok = PR_FALSE;
|
|
||||||
|
|
||||||
rv = nsComponentManager::CreateInstance(kCHeaderParserCID,
|
|
||||||
nsnull,
|
|
||||||
nsIMsgHeaderParser::GetIID(),
|
|
||||||
getter_AddRefs(parser));
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(rv)) {
|
// get the current identity from the news session....
|
||||||
#ifdef DEBUG_NEWS
|
NS_WITH_SERVICE(nsIMsgAccountManager,accountManager,kCMsgAccountManagerCID,&rv);
|
||||||
printf("got a header parser...\n");
|
if (NS_SUCCEEDED(rv) && accountManager) {
|
||||||
#endif
|
nsCOMPtr<nsISupportsArray> identities;
|
||||||
char *us = nsnull;
|
rv = accountManager->GetAllIdentities(getter_AddRefs(identities));
|
||||||
char *them = nsnull;
|
if (NS_FAILED(rv)) return rv;
|
||||||
nsresult rv1 = parser->ExtractHeaderAddressMailboxes(nsnull, from, &us);
|
|
||||||
nsresult rv2 = parser->ExtractHeaderAddressMailboxes(nsnull, old_from, &them);
|
// CheckIfAuthor will set cancelInfo.from if a match is found
|
||||||
#ifdef DEBUG_sspitzer
|
identities->EnumerateForwards(CheckIfAuthor, (void *)&cancelInfo);
|
||||||
printf("us = %s, them = %s\n", us, them);
|
|
||||||
#endif
|
|
||||||
ok = (NS_SUCCEEDED(rv1) && NS_SUCCEEDED(rv2) && !PL_strcasecmp(us, them));
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(rv1)) PR_Free(us);
|
|
||||||
if (NS_SUCCEEDED(rv2)) PR_Free(them);
|
|
||||||
}
|
}
|
||||||
if (!ok) {
|
|
||||||
|
if (!cancelInfo.from) {
|
||||||
alertText = UNTIL_STRING_BUNDLES_MK_NNTP_CANCEL_DISALLOWED;
|
alertText = UNTIL_STRING_BUNDLES_MK_NNTP_CANCEL_DISALLOWED;
|
||||||
if (dialog) {
|
if (dialog) {
|
||||||
// until #7770 is fixed, we can't do dialogs on Linux from here
|
// until #7770 is fixed, we can't do dialogs on Linux from here
|
||||||
|
@ -3829,6 +3889,11 @@ PRInt32 nsNNTPProtocol::Cancel()
|
||||||
ClearFlag(NNTP_PAUSE_FOR_READ);
|
ClearFlag(NNTP_PAUSE_FOR_READ);
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
#ifdef DEBUG_NEWS
|
||||||
|
printf("CANCELCHK not supported, so post the cancel message as %s\n",cancelInfo.from);
|
||||||
|
#endif /* DEBUG_NEWS */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#ifdef DEBUG_NEWS
|
#ifdef DEBUG_NEWS
|
||||||
|
@ -3854,7 +3919,7 @@ PRInt32 nsNNTPProtocol::Cancel()
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!from || !subject || !other_random_headers || !body) {
|
if (!subject || !other_random_headers || !body) {
|
||||||
status = MK_OUT_OF_MEMORY;
|
status = MK_OUT_OF_MEMORY;
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
|
@ -3876,7 +3941,7 @@ PRInt32 nsNNTPProtocol::Cancel()
|
||||||
PL_strcat (body, "." CRLF);
|
PL_strcat (body, "." CRLF);
|
||||||
|
|
||||||
#ifdef USE_LIBMSG
|
#ifdef USE_LIBMSG
|
||||||
fields = MSG_CreateCompositionFields(from, 0, 0, 0, 0, 0, newsgroups,
|
fields = MSG_CreateCompositionFields(cancelInfo.from, 0, 0, 0, 0, 0, newsgroups,
|
||||||
0, 0, subject, id, other_random_headers,
|
0, 0, subject, id, other_random_headers,
|
||||||
0, 0, news_url);
|
0, 0, news_url);
|
||||||
#endif
|
#endif
|
||||||
|
@ -3894,7 +3959,7 @@ PRInt32 nsNNTPProtocol::Cancel()
|
||||||
"%s" CRLF /* other_random_headers */
|
"%s" CRLF /* other_random_headers */
|
||||||
"%s" /* body */
|
"%s" /* body */
|
||||||
CRLF "." CRLF CRLF, /* trailing SMTP "." */
|
CRLF "." CRLF CRLF, /* trailing SMTP "." */
|
||||||
from, newsgroups, subject, id,
|
cancelInfo.from, newsgroups, subject, id,
|
||||||
other_random_headers, body);
|
other_random_headers, body);
|
||||||
|
|
||||||
nsCOMPtr<nsIMsgMailNewsUrl> mailnewsurl = do_QueryInterface(m_runningURL);
|
nsCOMPtr<nsIMsgMailNewsUrl> mailnewsurl = do_QueryInterface(m_runningURL);
|
||||||
|
@ -3937,15 +4002,16 @@ PRInt32 nsNNTPProtocol::Cancel()
|
||||||
|
|
||||||
FAIL:
|
FAIL:
|
||||||
PR_FREEIF (id);
|
PR_FREEIF (id);
|
||||||
PR_FREEIF (from);
|
PR_FREEIF (cancelInfo.old_from);
|
||||||
PR_FREEIF (old_from);
|
PR_FREEIF (cancelInfo.from);
|
||||||
PR_FREEIF (subject);
|
PR_FREEIF (subject);
|
||||||
PR_FREEIF (newsgroups);
|
PR_FREEIF (newsgroups);
|
||||||
PR_FREEIF (distribution);
|
PR_FREEIF (distribution);
|
||||||
PR_FREEIF (other_random_headers);
|
PR_FREEIF (other_random_headers);
|
||||||
PR_FREEIF (body);
|
PR_FREEIF (body);
|
||||||
PR_FREEIF (m_cancelMessageFile);
|
PR_FREEIF (m_cancelMessageFile);
|
||||||
|
m_cancelMessageFile = nsnull;
|
||||||
|
|
||||||
#ifdef USE_LIBMSG
|
#ifdef USE_LIBMSG
|
||||||
if (fields)
|
if (fields)
|
||||||
MSG_DestroyCompositionFields(fields);
|
MSG_DestroyCompositionFields(fields);
|
||||||
|
@ -4947,11 +5013,15 @@ nsresult nsNNTPProtocol::CloseSocket()
|
||||||
PR_FREEIF(m_responseText);
|
PR_FREEIF(m_responseText);
|
||||||
PR_FREEIF(m_dataBuf);
|
PR_FREEIF(m_dataBuf);
|
||||||
|
|
||||||
PR_FREEIF (m_cancelID);
|
PR_FREEIF(m_cancelNewsgroups);
|
||||||
PR_FREEIF (m_cancelFromHdr);
|
m_cancelNewsgroups = nsnull;
|
||||||
PR_FREEIF (m_cancelNewsgroups);
|
PR_FREEIF(m_cancelDistribution);
|
||||||
PR_FREEIF (m_cancelDistribution);
|
m_cancelDistribution = nsnull;
|
||||||
|
PR_FREEIF(m_cancelFromHdr);
|
||||||
|
m_cancelFromHdr = nsnull;
|
||||||
|
PR_FREEIF(m_cancelID);
|
||||||
|
m_cancelID = nsnull;
|
||||||
|
|
||||||
m_runningURL = null_nsCOMPtr();
|
m_runningURL = null_nsCOMPtr();
|
||||||
|
|
||||||
return nsMsgProtocol::CloseSocket();
|
return nsMsgProtocol::CloseSocket();
|
||||||
|
|
|
@ -178,7 +178,9 @@ private:
|
||||||
PRInt32 SendData(nsIURI * aURL, const char * dataBuffer);
|
PRInt32 SendData(nsIURI * aURL, const char * dataBuffer);
|
||||||
|
|
||||||
void ParseHeaderForCancel(char *buf);
|
void ParseHeaderForCancel(char *buf);
|
||||||
|
|
||||||
|
static PRBool CheckIfAuthor(nsISupports *aElement, void *data);
|
||||||
|
|
||||||
// part of temporary libmime converstion trick......these should go away once MIME uses a new stream
|
// part of temporary libmime converstion trick......these should go away once MIME uses a new stream
|
||||||
// converter interface...
|
// converter interface...
|
||||||
nsCOMPtr<nsIOutputStream> m_tempArticleStream;
|
nsCOMPtr<nsIOutputStream> m_tempArticleStream;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче