void OESettings::SetSmtpServer(char *pSmtpServer, HKEY hKey, nsIMsgIdentity *id, char *pIncomgUserName, PRInt32 authMethodIncoming) { // set the id.smtpserver accordingly // first we have to calculate the smtp user name which is based on sicily if (!hKey || !id || !pIncomgUserName || !pSmtpServer) return; nsCString smtpServerKey, userName; BYTE *pBytes; // smtp user name depends on sicily which may or not exist PRInt32 useSicily = 0; if (pBytes = nsOERegUtil::GetValueBytes(hKey, "SMTP Use Sicily")){ useSicily = *(PRInt32 *)pBytes; nsOERegUtil::FreeValueBytes(pBytes); } switch (useSicily) { case 1 : case 3 : // has to go in whether empty or no // shouldn't be empty but better safe than sorry if (pBytes = nsOERegUtil::GetValueBytes(hKey, "SMTP User Name")){ userName = (char *)pBytes; // this may be empty; shouldn't be non-existent nsOERegUtil::FreeValueBytes(pBytes); } break; case 2 : userName = pIncomgUserName; break; default : break; // initial userName == "" } nsresult rv; nsCOMPtr<nsISmtpService> smtpService(do_GetService(NS_SMTPSERVICE_CONTRACTID, &rv)); if (NS_SUCCEEDED(rv) && smtpService) { nsCOMPtr<nsISmtpServer> foundServer; // don't try to make another server // regardless if username doesn't match rv = smtpService->FindServer(userName.get(), pSmtpServer, getter_AddRefs(foundServer)); if (NS_SUCCEEDED(rv) && foundServer) { // set our account keyed to this smptserver key foundServer->GetKey(getter_Copies(smtpServerKey)); id->SetSmtpServerKey(smtpServerKey); IMPORT_LOG1("SMTP server already exists: %s\n", pSmtpServer); } else { nsCOMPtr<nsISmtpServer> smtpServer; PRInt32 port; rv = smtpService->CreateSmtpServer(getter_AddRefs(smtpServer)); if (NS_SUCCEEDED(rv) && smtpServer) { pBytes = nsOERegUtil::GetValueBytes(hKey, "SMTP Port"); if (pBytes) { smtpServer->SetPort(*(PRInt32 *) pBytes); port = *(PRInt32 *) pBytes; nsOERegUtil::FreeValueBytes(pBytes); } pBytes = nsOERegUtil::GetValueBytes(hKey,"SMTP Secure Connection"); if (pBytes) { if (*(PRInt32 *)pBytes == 1) { // Outlook Express does not support STARTTLS without KB933612 fix. if (IsKB933612Applied() && port != 465) smtpServer->SetSocketType(nsMsgSocketType::alwaysSTARTTLS); else smtpServer->SetSocketType(nsMsgSocketType::SSL); } else { smtpServer->SetSocketType(nsMsgSocketType::plain); } nsOERegUtil::FreeValueBytes(pBytes); } smtpServer->SetUsername(userName); switch (useSicily) { case 1 : smtpServer->SetAuthMethod(nsMsgAuthMethod::secure); break; case 2 : // requires SMTP authentication to use the incoming server settings smtpServer->SetAuthMethod(authMethodIncoming); break; case 3 : smtpServer->SetAuthMethod(nsMsgAuthMethod::passwordCleartext); break; default: smtpServer->SetAuthMethod(nsMsgAuthMethod::none); } smtpServer->SetHostname(nsDependentCString(pSmtpServer)); smtpServer->GetKey(getter_Copies(smtpServerKey)); id->SetSmtpServerKey(smtpServerKey); IMPORT_LOG1("Created new SMTP server: %s\n", pSmtpServer); } } } }
void OESettings::SetSmtpServer(const nsString &aSmtpServer, nsIWindowsRegKey *aKey, nsIMsgIdentity *aId, const nsString &aIncomgUserName, int32_t authMethodIncoming) { // set the id.smtpserver accordingly // first we have to calculate the smtp user name which is based on sicily if (!aKey || !aId || aIncomgUserName.IsEmpty() || aSmtpServer.IsEmpty()) return; nsCString smtpServerKey; // smtp user name depends on sicily which may or not exist uint32_t useSicily = 0; nsresult rv = aKey->ReadIntValue(NS_LITERAL_STRING("SMTP Use Sicily"), &useSicily); nsAutoString userName; switch (useSicily) { case 1: case 3: // has to go in whether empty or no // shouldn't be empty but better safe than sorry aKey->ReadStringValue(NS_LITERAL_STRING("SMTP User Name"), userName); break; case 2: userName = aIncomgUserName; break; default: break; // initial userName == "" } nsCOMPtr<nsISmtpService> smtpService(do_GetService(NS_SMTPSERVICE_CONTRACTID, &rv)); if (NS_SUCCEEDED(rv) && smtpService) { nsCOMPtr<nsISmtpServer> foundServer; // don't try to make another server // regardless if username doesn't match nsAutoCString nativeUserName; NS_CopyUnicodeToNative(userName, nativeUserName); nsAutoCString nativeSmtpServer; NS_CopyUnicodeToNative(aSmtpServer, nativeSmtpServer); rv = smtpService->FindServer(nativeUserName.get(), nativeSmtpServer.get(), getter_AddRefs(foundServer)); if (NS_SUCCEEDED(rv) && foundServer) { // set our account keyed to this smptserver key foundServer->GetKey(getter_Copies(smtpServerKey)); aId->SetSmtpServerKey(smtpServerKey); IMPORT_LOG1("SMTP server already exists: %s\n", nativeSmtpServer.get()); } else { nsCOMPtr<nsISmtpServer> smtpServer; rv = smtpService->CreateServer(getter_AddRefs(smtpServer)); if (NS_SUCCEEDED(rv) && smtpServer) { uint32_t port = 0; rv = aKey->ReadIntValue(NS_LITERAL_STRING("SMTP Port"), &port); if (NS_SUCCEEDED(rv) && port) smtpServer->SetPort(static_cast<int32_t>(port)); int32_t socketType = nsMsgSocketType::plain; uint32_t secureConnection = 0; rv = aKey->ReadIntValue(NS_LITERAL_STRING("SMTP Secure Connection"), &secureConnection); if (NS_SUCCEEDED(rv) && secureConnection == 1) { // Outlook Express does not support STARTTLS without KB933612 fix. if (IsKB933612Applied() && port != 465) socketType = nsMsgSocketType::alwaysSTARTTLS; else socketType = nsMsgSocketType::SSL; } smtpServer->SetSocketType(socketType); smtpServer->SetUsername(nativeUserName); switch (useSicily) { case 1 : smtpServer->SetAuthMethod(nsMsgAuthMethod::secure); break; case 2 : // requires SMTP authentication to use the incoming server settings smtpServer->SetAuthMethod(authMethodIncoming); break; case 3 : smtpServer->SetAuthMethod(nsMsgAuthMethod::passwordCleartext); break; default: smtpServer->SetAuthMethod(nsMsgAuthMethod::none); } smtpServer->SetHostname(nativeSmtpServer); smtpServer->GetKey(getter_Copies(smtpServerKey)); aId->SetSmtpServerKey(smtpServerKey); IMPORT_LOG1("Created new SMTP server: %s\n", nativeSmtpServer.get()); } } } }