NS_IMETHODIMP nsPop3Service::VerifyLogon(nsIMsgIncomingServer *aServer, nsIUrlListener *aUrlListener, nsIMsgWindow *aMsgWindow, nsIURI **aURL) { NS_ENSURE_ARG_POINTER(aServer); nsCString popHost; nsCString popUser; PRInt32 popPort = -1; nsresult rv = aServer->GetHostName(popHost); NS_ENSURE_SUCCESS(rv, rv); if (popHost.IsEmpty()) return NS_MSG_INVALID_OR_MISSING_SERVER; rv = aServer->GetPort(&popPort); NS_ENSURE_SUCCESS(rv, rv); rv = aServer->GetUsername(popUser); NS_ENSURE_SUCCESS(rv, rv); if (popUser.IsEmpty()) return NS_MSG_SERVER_USERNAME_MISSING; nsCString escapedUsername; MsgEscapeString(popUser, nsINetUtil::ESCAPE_XALPHAS, escapedUsername); nsCOMPtr<nsIPop3IncomingServer> popServer = do_QueryInterface(aServer, &rv); NS_ENSURE_SUCCESS(rv, rv); // now construct a pop3 url... // we need to escape the username because it may contain // characters like / % or @ char *urlSpec = PR_smprintf("pop3://%s@%s:%d/?verifyLogon", escapedUsername.get(), popHost.get(), popPort); NS_ENSURE_TRUE(urlSpec, NS_ERROR_OUT_OF_MEMORY); nsCOMPtr<nsIURI> url; rv = BuildPop3Url(urlSpec, nsnull, popServer, aUrlListener, getter_AddRefs(url), aMsgWindow); PR_smprintf_free(urlSpec); if (NS_SUCCEEDED(rv) && url) { rv = RunPopUrl(aServer, url); if (NS_SUCCEEDED(rv) && aURL) url.forget(aURL); } return rv; }
NS_IMETHODIMP nsPop3Service::NewURI(const nsACString &aSpec, const char *aOriginCharset, // ignored nsIURI *aBaseURI, nsIURI **_retval) { nsresult rv = NS_ERROR_FAILURE; if (!_retval) return rv; nsCAutoString folderUri(aSpec); nsCOMPtr<nsIRDFResource> resource; PRInt32 offset = folderUri.Find("?"); if (offset != -1) folderUri.Truncate(offset); const nsCString &flatSpec = PromiseFlatCString(aSpec); const char *uidl = PL_strstr(flatSpec.get(), "uidl="); if (!uidl) return NS_ERROR_FAILURE; nsCOMPtr<nsIRDFService> rdfService(do_GetService(kRDFServiceCID, &rv)); if (NS_FAILED(rv)) return rv; rv = rdfService->GetResource(folderUri, getter_AddRefs(resource)); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIMsgFolder> folder = do_QueryInterface(resource, &rv); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIMsgIncomingServer> server; nsLocalFolderScanState folderScanState; nsCOMPtr<nsIMsgLocalMailFolder> localFolder = do_QueryInterface(folder); nsCOMPtr <nsIMailboxUrl> mailboxUrl = do_QueryInterface(aBaseURI); nsCOMPtr<nsIFileSpec> path; rv = folder->GetPath(getter_AddRefs(path)); if (NS_FAILED(rv)) return rv; nsFileSpec fileSpec; path->GetFileSpec(&fileSpec); folderScanState.m_fileSpec = &fileSpec; if (mailboxUrl && localFolder) { rv = localFolder->GetFolderScanState(&folderScanState); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr <nsIMsgDBHdr> msgHdr; nsCOMPtr<nsIMsgMessageUrl> msgUrl = do_QueryInterface(mailboxUrl, &rv); NS_ENSURE_SUCCESS(rv,rv); msgUrl->GetMessageHeader(getter_AddRefs(msgHdr)); // we do this to get the account key if (msgHdr) localFolder->GetUidlFromFolder(&folderScanState, msgHdr); if (!folderScanState.m_accountKey.IsEmpty()) { nsCOMPtr<nsIMsgAccountManager> accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); if (accountManager) { nsCOMPtr <nsIMsgAccount> account; accountManager->GetAccount(folderScanState.m_accountKey.get(), getter_AddRefs(account)); if (account) account->GetIncomingServer(getter_AddRefs(server)); } } } if (!server) rv = folder->GetServer(getter_AddRefs(server)); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIPop3IncomingServer> popServer = do_QueryInterface(server,&rv); if (NS_FAILED(rv)) return rv; nsXPIDLCString hostname; nsXPIDLCString username; server->GetHostName(getter_Copies(hostname)); server->GetUsername(getter_Copies(username)); PRInt32 port; server->GetPort(&port); if (port == -1) port = POP3_PORT; // we need to escape the username because it may contain // characters like / % or @ nsXPIDLCString escapedUsername; *((char **)getter_Copies(escapedUsername)) = nsEscape(username, url_XAlphas); nsCAutoString popSpec("pop://"); popSpec += escapedUsername; popSpec += "@"; popSpec += hostname; popSpec += ":"; popSpec.AppendInt(port); popSpec += "?"; popSpec += uidl; nsCOMPtr<nsIUrlListener> urlListener = do_QueryInterface(folder, &rv); if (NS_FAILED(rv)) return rv; rv = BuildPop3Url(popSpec.get(), folder, popServer, urlListener, _retval, nsnull); if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIMsgMailNewsUrl> mailnewsurl = do_QueryInterface(*_retval, &rv); if (NS_SUCCEEDED(rv)) { // escape the username before we call SetUsername(). we do this because GetUsername() // will unescape the username mailnewsurl->SetUsername(escapedUsername); } nsCOMPtr<nsIPop3URL> popurl = do_QueryInterface(mailnewsurl, &rv); if (NS_SUCCEEDED(rv)) { nsCAutoString messageUri (aSpec); messageUri.ReplaceSubstring("mailbox:", "mailbox-message:"); messageUri.ReplaceSubstring("?number=", "#"); offset = messageUri.Find("&"); if (offset != -1) messageUri.Truncate(offset); popurl->SetMessageUri(messageUri.get()); nsCOMPtr<nsIPop3Sink> pop3Sink; rv = popurl->GetPop3Sink(getter_AddRefs(pop3Sink)); if (NS_SUCCEEDED(rv)) pop3Sink->SetBuildMessageUri(PR_TRUE); } } return rv; }
nsresult nsPop3Service::GetMail(PRBool downloadNewMail, nsIMsgWindow* aMsgWindow, nsIUrlListener * aUrlListener, nsIMsgFolder *aInbox, nsIPop3IncomingServer *aPopServer, nsIURI ** aURL) { NS_ENSURE_ARG_POINTER(aInbox); nsXPIDLCString popHost; nsXPIDLCString popUser; PRInt32 popPort = -1; nsCOMPtr<nsIMsgIncomingServer> server; nsCOMPtr<nsIURI> url; server = do_QueryInterface(aPopServer); nsCOMPtr <nsIMsgLocalMailFolder> destLocalFolder = do_QueryInterface(aInbox); if (destLocalFolder) { PRBool destFolderTooBig; destLocalFolder->WarnIfLocalFileTooBig(aMsgWindow, &destFolderTooBig); if (destFolderTooBig) return NS_MSG_ERROR_WRITING_MAIL_FOLDER; } if (!server) return NS_MSG_INVALID_OR_MISSING_SERVER; nsresult rv = server->GetHostName(getter_Copies(popHost)); NS_ENSURE_SUCCESS(rv, rv); if (!((const char *)popHost)) return NS_MSG_INVALID_OR_MISSING_SERVER; rv = server->GetPort(&popPort); NS_ENSURE_SUCCESS(rv, rv); rv = server->GetUsername(getter_Copies(popUser)); NS_ENSURE_SUCCESS(rv, rv); if (!((const char *)popUser)) return NS_MSG_SERVER_USERNAME_MISSING; nsXPIDLCString escapedUsername; *((char**)getter_Copies(escapedUsername)) = nsEscape(popUser, url_XAlphas); if (NS_SUCCEEDED(rv) && aPopServer) { // now construct a pop3 url... // we need to escape the username because it may contain // characters like / % or @ char * urlSpec = (downloadNewMail) ? PR_smprintf("pop3://%s@%s:%d", (const char *)escapedUsername, (const char *)popHost, popPort) : PR_smprintf("pop3://%s@%s:%d/?check", (const char *)escapedUsername, (const char *)popHost, popPort); rv = BuildPop3Url(urlSpec, aInbox, aPopServer, aUrlListener, getter_AddRefs(url), aMsgWindow); PR_Free(urlSpec); } if (NS_SUCCEEDED(rv) && url) rv = RunPopUrl(server, url); if (aURL && url) // we already have a ref count on pop3url... NS_IF_ADDREF(*aURL = url); return rv; }
nsresult nsPop3Service::GetMail(bool downloadNewMail, nsIMsgWindow *aMsgWindow, nsIUrlListener *aUrlListener, nsIMsgFolder *aInbox, nsIPop3IncomingServer *aPopServer, nsIURI **aURL) { NS_ENSURE_ARG_POINTER(aInbox); PRInt32 popPort = -1; nsCOMPtr<nsIMsgIncomingServer> server; nsCOMPtr<nsIURI> url; server = do_QueryInterface(aPopServer); NS_ENSURE_TRUE(server, NS_MSG_INVALID_OR_MISSING_SERVER); nsCOMPtr<nsIMsgLocalMailFolder> destLocalFolder = do_QueryInterface(aInbox); if (destLocalFolder) { bool destFolderTooBig; destLocalFolder->WarnIfLocalFileTooBig(aMsgWindow, &destFolderTooBig); if (destFolderTooBig) return NS_MSG_ERROR_WRITING_MAIL_FOLDER; } nsCString popHost; nsCString popUser; nsresult rv = server->GetHostName(popHost); NS_ENSURE_SUCCESS(rv, rv); if (popHost.IsEmpty()) return NS_MSG_INVALID_OR_MISSING_SERVER; rv = server->GetPort(&popPort); NS_ENSURE_SUCCESS(rv, rv); rv = server->GetUsername(popUser); NS_ENSURE_SUCCESS(rv, rv); if (popUser.IsEmpty()) return NS_MSG_SERVER_USERNAME_MISSING; nsCString escapedUsername; MsgEscapeString(popUser, nsINetUtil::ESCAPE_XALPHAS, escapedUsername); if (NS_SUCCEEDED(rv) && aPopServer) { // now construct a pop3 url... // we need to escape the username because it may contain // characters like / % or @ char * urlSpec = (downloadNewMail) ? PR_smprintf("pop3://%s@%s:%d", escapedUsername.get(), popHost.get(), popPort) : PR_smprintf("pop3://%s@%s:%d/?check", escapedUsername.get(), popHost.get(), popPort); rv = BuildPop3Url(urlSpec, aInbox, aPopServer, aUrlListener, getter_AddRefs(url), aMsgWindow); PR_smprintf_free(urlSpec); NS_ENSURE_SUCCESS(rv, rv); } NS_ENSURE_TRUE(url, rv); if (NS_SUCCEEDED(rv)) rv = RunPopUrl(server, url); if (aURL) // we already have a ref count on pop3url... NS_IF_ADDREF(*aURL = url); return rv; }
NS_IMETHODIMP nsPop3Service::NewURI(const nsACString &aSpec, const char *aOriginCharset, // ignored nsIURI *aBaseURI, nsIURI **_retval) { NS_ENSURE_ARG_POINTER(_retval); nsCAutoString folderUri(aSpec); nsCOMPtr<nsIRDFResource> resource; PRInt32 offset = folderUri.FindChar('?'); if (offset != kNotFound) folderUri.SetLength(offset); const char *uidl = PL_strstr(nsCString(aSpec).get(), "uidl="); NS_ENSURE_TRUE(uidl, NS_ERROR_FAILURE); nsresult rv; nsCOMPtr<nsIRDFService> rdfService(do_GetService(kRDFServiceCID, &rv)); NS_ENSURE_SUCCESS(rv, rv); rv = rdfService->GetResource(folderUri, getter_AddRefs(resource)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIMsgFolder> folder = do_QueryInterface(resource, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIMsgIncomingServer> server; nsLocalFolderScanState folderScanState; nsCOMPtr<nsIMsgLocalMailFolder> localFolder = do_QueryInterface(folder); nsCOMPtr<nsIMailboxUrl> mailboxUrl = do_QueryInterface(aBaseURI); if (mailboxUrl && localFolder) { rv = localFolder->GetFolderScanState(&folderScanState); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIMsgDBHdr> msgHdr; nsMsgKey msgKey; mailboxUrl->GetMessageKey(&msgKey); folder->GetMessageHeader(msgKey, getter_AddRefs(msgHdr)); // we do this to get the account key if (msgHdr) localFolder->GetUidlFromFolder(&folderScanState, msgHdr); if (!folderScanState.m_accountKey.IsEmpty()) { nsCOMPtr<nsIMsgAccountManager> accountManager = do_GetService(NS_MSGACCOUNTMANAGER_CONTRACTID, &rv); if (accountManager) { nsCOMPtr<nsIMsgAccount> account; accountManager->GetAccount(folderScanState.m_accountKey, getter_AddRefs(account)); if (account) account->GetIncomingServer(getter_AddRefs(server)); } } } if (!server) rv = folder->GetServer(getter_AddRefs(server)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIPop3IncomingServer> popServer = do_QueryInterface(server,&rv); NS_ENSURE_SUCCESS(rv, rv); nsCString hostname; nsCString username; server->GetHostName(hostname); server->GetUsername(username); PRInt32 port; server->GetPort(&port); if (port == -1) port = nsIPop3URL::DEFAULT_POP3_PORT; // we need to escape the username because it may contain // characters like / % or @ nsCString escapedUsername; MsgEscapeString(username, nsINetUtil::ESCAPE_XALPHAS, escapedUsername); nsCAutoString popSpec("pop://"); popSpec += escapedUsername; popSpec += "@"; popSpec += hostname; popSpec += ":"; popSpec.AppendInt(port); popSpec += "?"; popSpec += uidl; nsCOMPtr<nsIUrlListener> urlListener = do_QueryInterface(folder, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = BuildPop3Url(popSpec.get(), folder, popServer, urlListener, _retval, nsnull); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIMsgMailNewsUrl> mailnewsurl = do_QueryInterface(*_retval, &rv); if (NS_SUCCEEDED(rv)) { // escape the username before we call SetUsername(). we do this because GetUsername() // will unescape the username mailnewsurl->SetUsername(escapedUsername); } nsCOMPtr<nsIPop3URL> popurl = do_QueryInterface(mailnewsurl, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString messageUri (aSpec); if (!strncmp(messageUri.get(), "mailbox:", 8)) messageUri.Replace(0, 8, "mailbox-message:"); offset = messageUri.Find("?number="); if (offset != kNotFound) messageUri.Replace(offset, 8, "#"); offset = messageUri.FindChar('&'); if (offset != kNotFound) messageUri.SetLength(offset); popurl->SetMessageUri(messageUri.get()); nsCOMPtr<nsIPop3Sink> pop3Sink; rv = popurl->GetPop3Sink(getter_AddRefs(pop3Sink)); NS_ENSURE_SUCCESS(rv, rv); pop3Sink->SetBuildMessageUri(true); return NS_OK; }