#include "pch.hxx" #include #include #include "acctman.h" #include #include #include "dllmain.h" #include "acctui.h" #include "server.h" #include #include "acctimp.h" #include #include #include "resource.h" #include "demand.h" ASSERTDATA enum { NNTP = 0, POP3, IMAP, HTTP, LDAP }; HRESULT HandleIdentity(LPCSTR pszSection, LPCSTR pszFile, CONNECTINFO *pci, DWORD dwFlags, IUserIdentityManager *pIdMan); HRESULT HandleGlobalSettings(LPCSTR lpFile); HRESULT CreateMailAccount(CAccountManager *pAcctMgr, LPCSTR szFile, LPCSTR szMailSection, CONNECTINFO *pci, HKEY hkey, LPSTR pszAcctId, DWORD cchSizeAcctID, DWORD dwFlags); HRESULT CreateNewsAccount(CAccountManager *pAcctMgr, LPCSTR szFile, LPCSTR szNewsSection, LPCSTR szMailSection, CONNECTINFO *pci, HKEY hkey, IUserIdentity *pId, LPSTR pszAcctId, DWORD cchSizeAcctId, DWORD dwFlags); HRESULT CreateLDAPAccount(CAccountManager *pAcctMgr, LPCSTR szFile, LPCSTR szLDAPSection, CONNECTINFO *pci); HRESULT GetAccount(DWORD type, CAccountManager *pAcctMgr, LPCSTR szSection, LPCSTR szFile, IImnAccount **ppAcct); HRESULT DeleteAccount(DWORD type, CAccountManager *pAcctMgr, LPCSTR szSection, LPCSTR szFile); void HandleMultipleAccounts(ACCTTYPE type, CAccountManager *pAcctMgr, LPCSTR pszFile, LPCSTR szSection, CONNECTINFO *pci, HKEY hkey, IUserIdentity *pId, DWORD dwFlags); void SetSignature(LPCSTR szMailSigSection, LPCSTR szNewsSigSection, LPCSTR pszMailId, LPCSTR pszNewsId, LPCSTR szFile, HKEY hkey, CAccountManager *pAcctMgr); void DoDefaultClient(LPCSTR szFile, BOOL fMail); void DoMailBranding(LPCSTR szFile, LPCSTR szMailSection, HKEY hkey); void DoNewsBranding(LPCSTR szFile, LPCSTR szNewsSection, HKEY hkey); void DoBranding(LPCSTR szFile, LPCSTR szOESection, HKEY hkey); void SetHelp(LPCSTR szFile, LPCSTR szURLSection, HKEY hkey); void SubscribeNewsgroups(IImnAccount *pAcct, LPCSTR szSection, LPCSTR szFile, HKEY hkey); void SetRegDw(LPCSTR szFile, LPCSTR szSection, LPCSTR szValue, HKEY hkey, LPCSTR szRegValue); void SetRegProp(LPCSTR szFile, LPCSTR szSection, LPCSTR szValue, HKEY hkey, LPCSTR szRegValue); void SetRegLockPropLM(LPCSTR szFile, LPCSTR szSection, LPCSTR szValue, HKEY hkeyLM, LPCSTR szRegValue, HKEY hkeyCU); BOOL GetSectionNames(LPSTR psz, DWORD cch, char chSep, DWORD *pcNames); static const char c_sz1[] = "1"; static const char c_szRegRootMail[] = STR_REG_PATH_ROOT "\\Mail"; static const char c_szRegRootNews[] = STR_REG_PATH_ROOT "\\News"; static const char c_szRegRootRules[] = STR_REG_PATH_ROOT "\\Rules"; static const char c_szRegRootSigs[] = STR_REG_PATH_ROOT "\\Signatures"; /////////////////////////////////////////////////////////////////////////////// // INS file section names static const char c_szIdentitySection[] = "Identities"; static const char c_szMailSection[] = "Internet_Mail"; static const char c_szNewsSection[] = "Internet_News"; static const char c_szLDAPSection[] = "LDAP"; static const char c_szMailSigSection[] = "Mail_Signature"; static const char c_szNewsSigSection[] = "Signature"; static const char c_szURLSection[] = "URL"; static const char c_szOESection[] = "Outlook_Express"; static const char c_szGlobalSection[] = "Outlook_Express_Global"; // /////////////////////////////////////////////////////////////////////////////// static const char c_szAcctName[] = "Account_Name"; static const char c_szReplyAddr[] = "Reply_To_Address"; static const char c_szIEConnect[] = "Use_IE_Connection"; static const char c_szUseSSL[] = "Use_SSL"; static const char c_szOldServer[] = "Server_Old"; static const char c_szMultiAccounts[] = "Multiple_Accounts"; static const char c_szNone[] = "none"; static const char c_szBase64[] = "base 64"; static const char c_szQuotedPrintable[] = "quoted printable"; static const char c_szMime[] = "mime"; static const char c_szUuencode[] = "uuencode"; static const char c_szDeleteAccount[] = "Delete_Account"; /////////////////////////////////////////////////////////////////////////////// // identity values static const char c_szGUID[] = "GUID"; static const char c_szUserName[] = "User_Name"; static const char c_szRegInsGUID[] = "INS File GUID"; // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // [URL] section values static const char c_szHelpPage[] = "Help_Page"; // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // [Internet_Mail] section values static const char c_szMailName[] = "Email_Name"; static const char c_szMailAddr[] = "Email_Address"; static const char c_szPopServer[] = "POP_Server"; static const char c_szPopPort[] = "POP_Server_Port_Number"; static const char c_szMailLogon[] = "POP_Logon_Name"; static const char c_szMailPassword[] = "POP_Logon_Password"; static const char c_szPopLeaveOnServer[] = "POP_Leave_On_Server"; static const char c_szPopRemoveOnDelete[] = "POP_Remove_When_Deleted"; static const char c_szSmtpServer[] = "SMTP_Server"; static const char c_szSmtpPort[] = "SMTP_Server_Port_Number"; static const char c_szSmtpUseSSL[] = "Use_SSL_Send"; static const char c_szSmtpLogonReq[] = "SMTP_Logon_Required"; static const char c_szSmtpLogon[] = "SMTP_Logon_Name"; static const char c_szSmtpPassword[] = "SMTP_Logon_Password"; static const char c_szSmtpLogonUsingSPA[] = "SMTP_Logon_Using_SPA"; static const char c_szLogonUsingSPA[] = "Logon_Using_SPA"; static const char c_szUseImap[] = "Use_IMAP"; static const char c_szImapServer[] = "IMAP_Server"; static const char c_szImapPort[] = "IMAP_Server_Port_Number"; static const char c_szImapLogon[] = "IMAP_Logon_Name"; static const char c_szImapPassword[] = "IMAP_Logon_Password"; static const char c_szImapRoot[] = "IMAP_Root_Folder"; static const char c_szImapSentItems[] = "IMAP_Sent_Items"; static const char c_szImapDrafts[] = "IMAP_Drafts"; static const char c_szImapPoll[] = "Poll_Subscribed_Folders"; static const char c_szService[] = "Service"; static const char c_szHttpUrl[] = "HTTP_Mail_Root_URL"; static const char c_szHttpLogon[] = "HTTP_Mail_Logon_Name"; static const char c_szHttpPassword[] = "HTTP_Mail_Logon_Password"; static const char c_szHttpPoll[] = "HTTP_Poll_Folders"; static const char c_szMsnCom[] = "MSN_COM"; static const char c_szWinTitle[] = "Window_Title"; static const char c_szInfopane[] = "Infopane"; static const char c_szWelcomeMsg[] = "Welcome_Message"; static const char c_szProfWelcomeName[] = "Welcome_Name"; static const char c_szProfWelcomeEmail[] = "Welcome_Address"; static const char c_szPollTime[] = "PollTime"; static const char c_szStartAtInbox[] = "Start_at_Inbox"; static const char c_szJunkMail[] = "Junk_Mail_Filtering"; static const char c_szHTMLMsgs[] = "HTML_Msgs"; // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // [Internet_News] section values static const char c_szNewsName[] = "News_Name"; static const char c_szNewsAddr[] = "News_Address"; static const char c_szNewsServer[] = "NNTP_Server"; static const char c_szNewsPort[] = "NNTP_Server_Port_Number"; static const char c_szNewsLogon[] = "NNTP_Logon_Name"; static const char c_szNewsPassword[] = "NNTP_Logon_Password"; static const char c_szNewsLogonRequired[] = "Logon_Required"; static const char c_szNewsgroups[] = "Newsgroups"; // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // [LDAP] section values static const char c_szLDAPServer[] = "Server"; static const char c_szLDAPFriendlyName[] = "FriendlyName"; static const char c_szLDAPHomePage[] = "HomePage"; static const char c_szLDAPSearchBase[] = "SearchBase"; static const char c_szLDAPAuthType[] = "AuthType"; static const char c_szLDAPCheckNames[] = "CheckNames"; static const char c_szLDAPUserName[] = "UserName"; static const char c_szLDAPPassword[] = "Password"; static const char c_szLDAPLogo[] = "Bitmap"; static const char c_szLDAPPort[] = "LDAP_Server_Port_Number"; static const char c_szLDAPResults[] = "Maximum_Results"; static const char c_szLDAPTimeout[] = "Search_Timeout"; // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // [Outlook_Express] section values static const char c_szFolderBar[] = "Folder_Bar"; static const char c_szFolderList[] = "Folder_List"; static const char c_szOutlookBar[] = "Outlook_Bar"; static const char c_szStatusBar[] = "Status_Bar"; static const char c_szContacts[] = "Contacts"; static const char c_szTipOfTheDay[] = "Tip_Day"; static const char c_szToolbar[] = "Toolbar"; static const char c_szToolbarText[] = "Show_Toolbar_Text"; static const char c_szPreviewPane[] = "Preview_Pane"; static const char c_szPreviewHeader[] = "Show_Preview_Header"; static const char c_szPreviewSide[] = "Show_Preview_Beside_Msgs"; static const char c_szMigration[] = "Migration"; static const char c_szSecZone[] = "Security_Zone"; static const char c_szSecZoneLocked[] = "Security_Zone_Locked"; static const char c_szMapiWarn[] = "Warn_on_Mapi_Send"; static const char c_szMapiWarnLocked[] = "Warn_on_Mapi_Send_Locked"; static const char c_szSafeAttach[] = "Safe_Attachments"; static const char c_szSafeAttachLocked[] = "Safe_Attachments_Locked"; static const char c_szSendEncoding[] = "Send_Language_Encoding"; static const char c_szReadEncoding[] = "Read_Language_Encoding"; static const char c_szMailEncoding[] = "HTML_Mail_Encoding"; static const char c_szNewsEncoding[] = "HTML_News_Encoding"; static const char c_szMailEnglishHeader[] = "HTML_Mail_Allow_English_Mail_Headers"; static const char c_szNewsEnglishHeader[] = "HTML_News_Allow_English_Mail_Headers"; static const char c_szMailPlainEncoding[] = "Plain_Text_Mail_Encoding"; static const char c_szNewsPlainEncoding[] = "Plain_Text_News_Encoding"; static const char c_szMailPlainEnglishHeader[] = "Plain_Text_Allow_English_Mail_Headers"; static const char c_szNewsPlainEnglishHeader[] = "Plain_Text_Allow_English_News_Headers"; static const char c_szRequestReadReceipts[] = "Request_read_receipts"; static const char c_szReadReceiptResponse[] = "Read_receipt_response"; static const char c_szSendReceiptsToList[] = "Send_receipts_to_list"; static const char c_szRequestReadReceiptsLocked[] = "Request_read_receipts_locked"; static const char c_szReadReceiptResponseLocked[] = "Read_receipt_response_locked"; static const char c_szSendReceiptsToListLocked[] = "Send_receipts_to_list_locked"; // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // [Outlook_Express_Global] section values static const char c_szReadOnlyAccts[] = "Read_Only"; static const char c_szDisableAccts[] = "Disable_Account_Access"; static const char c_szInsHideMessenger[] = "Hide_Messenger"; static const char c_szHideMSN[] = "Hide_MSN"; static const char c_szServiceName[] = "Service_Name"; static const char c_szServiceURL[] = "Service_URL"; static const char c_szAccountNumber[] = "Account_Number"; static const char c_szInsEnableHttpmail[] = "Enable_HTTPMail"; // /////////////////////////////////////////////////////////////////////////////// static const char c_szUseSig[] = "Use_Signature"; static const char c_szProfSigText[] = "Signature_Text"; static const char c_szUseMailForNews[] = "Use_Mail_For_News"; static const char c_szMailSigKey[] = "MailIEAK"; static const char c_szNewsSigKey[] = "NewsIEAK"; static const char c_szDefClient[] = "Default_Client"; static const char c_szRegProfile[] = "InternetProfile"; #define CBPROFILEBUF 0x07fff // From mailnews\inc\goptions.h #define SIGFLAG_AUTONEW 0x0001 // automatically add sig to new messages #define SIGFLAG_AUTOREPLY 0x0002 // automatically add sig to reply/forward messages HRESULT WINAPI CreateAccountsFromFile(LPSTR lpFile, DWORD dwFlags) { return(CreateAccountsFromFileEx(lpFile, NULL, dwFlags)); } HRESULT WINAPI CreateAccountsFromFileEx(LPSTR lpFile, CONNECTINFO *pci, DWORD dwFlags) { GUID guid; IUserIdentityManager *pIdMan; IUserIdentity *pId; HKEY hkey; CAccountManager *pAcctMgr; LPSTR sz, psz; LPCSTR pszMailSig, pszNewsSig; CONNECTINFO ci; DWORD cch, type, dw, cb, i; HRESULT hr; char szMailId[CCHMAX_ACCOUNT_NAME], szNewsId[CCHMAX_ACCOUNT_NAME]; hr = CoInitialize(NULL); if (SUCCEEDED(hr)) { if (!g_pMalloc || !MemAlloc((void **)&sz, CBPROFILEBUF)) { hr = E_OUTOFMEMORY; } else { hr = CoCreateInstance(CLSID_UserIdentityManager, NULL, CLSCTX_INPROC_SERVER, IID_IUserIdentityManager, (LPVOID *)&pIdMan); if (SUCCEEDED(hr)) { if (!!(dwFlags & CAFF_USE_AUTODIAL)) { cb = sizeof(DWORD); if (ERROR_SUCCESS == SHGetValue(HKEY_CURRENT_USER, c_szEnableAutoDialPath, c_RegKeyEnableAutoDial, &type, &dw, &cb) && !!dw && #pragma prefast(suppress:282, "the value of cb has to be changed between the first and second calls to SHGetValue") (cb = sizeof(ci.szConnectoid)) && ERROR_SUCCESS == SHGetValue(HKEY_CURRENT_USER, c_szDefConnPath, c_szRegProfile, &type, ci.szConnectoid, &cb) && !FIsEmpty(ci.szConnectoid)) { ci.cbSize = sizeof(CONNECTINFO); ci.type = CONNECT_RAS; pci = &ci; } } cch = GetPrivateProfileSection(c_szIdentitySection, sz, CBPROFILEBUF, lpFile); if ((cch != 0) && (cch != (CBPROFILEBUF - 2))) { if (GetSectionNames(sz, cch, 0, &dw)) { for (i = 0, psz = sz; i < dw; i++) { HandleIdentity(psz, lpFile, pci, dwFlags, pIdMan); psz += (lstrlen(psz) + 1); } } } else { cch = GetPrivateProfileSectionNames(sz, CBPROFILEBUF, lpFile); if (cch != 0) { if (!!(dwFlags & CAFF_CURRENT_USER)) guid = UID_GIBC_CURRENT_USER; else guid = UID_GIBC_DEFAULT_USER; hr = pIdMan->GetIdentityByCookie(&guid, &pId); if (SUCCEEDED(hr)) { hr = pId->OpenIdentityRegKey(KEY_READ | KEY_WRITE, &hkey); if (SUCCEEDED(hr)) { hr = HrCreateAccountManager((IImnAccountManager **)&pAcctMgr); if (SUCCEEDED(hr)) { hr = pAcctMgr->InitUser(NULL, guid, 0); if (SUCCEEDED(hr)) { *szMailId = 0; *szNewsId = 0; pszMailSig = NULL; pszNewsSig = NULL; psz = sz; while (*psz != 0) { if (0 == lstrcmpi(psz, c_szMailSection)) { CreateMailAccount(pAcctMgr, lpFile, c_szMailSection, pci, hkey, szMailId, ARRAYSIZE(szMailId), dwFlags); DoMailBranding(lpFile, c_szMailSection, hkey); HandleMultipleAccounts(ACCT_MAIL, pAcctMgr, lpFile, c_szMailSection, pci, hkey, pId, dwFlags); } else if (0 == lstrcmpi(psz, c_szNewsSection)) { CreateNewsAccount(pAcctMgr, lpFile, c_szNewsSection, c_szMailSection, pci, hkey, pId, szNewsId, ARRAYSIZE(szNewsId), dwFlags); DoNewsBranding(lpFile, c_szNewsSection, hkey); HandleMultipleAccounts(ACCT_NEWS, pAcctMgr, lpFile, c_szNewsSection, pci, hkey, pId, dwFlags); } else if (0 == lstrcmpi(psz, c_szLDAPSection)) { CreateLDAPAccount(pAcctMgr, lpFile, c_szLDAPSection, pci); HandleMultipleAccounts(ACCT_DIR_SERV, pAcctMgr, lpFile, c_szLDAPSection, pci, hkey, pId, dwFlags); } else if (0 == lstrcmpi(psz, c_szURLSection)) { SetHelp(lpFile, c_szURLSection, hkey); } else if (0 == lstrcmpi(psz, c_szOESection)) { DoBranding(lpFile, c_szOESection, hkey); } else if (0 == lstrcmpi(psz, c_szMailSigSection)) { pszMailSig = c_szMailSigSection; } else if (0 == lstrcmpi(psz, c_szNewsSigSection)) { pszNewsSig = c_szNewsSigSection; } psz += (lstrlen(psz) + 1); } SetSignature(pszMailSig, pszNewsSig, (*szMailId != 0) ? szMailId : NULL, (*szNewsId != 0) ? szNewsId : NULL, lpFile, hkey, pAcctMgr); } pAcctMgr->Release(); } RegCloseKey(hkey); } pId->Release(); } } } HandleGlobalSettings(lpFile); DoDefaultClient(lpFile, TRUE); DoDefaultClient(lpFile, FALSE); pIdMan->Release(); } MemFree(sz); } CoUninitialize(); } return(hr); } HRESULT HandleGlobalSettings(LPCSTR lpFile) { HKEY hkey; HRESULT hr; DWORD dw, disp, cb; char sz[512], szT[512], szKey[MAX_PATH]; if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, c_szRegFlat, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw)) { SetRegProp(lpFile, c_szGlobalSection, c_szDisableAccts, hkey, c_szRegValNoModifyAccts); dw = GetPrivateProfileString(c_szGlobalSection, c_szInsEnableHttpmail, c_szEmpty, sz, ARRAYSIZE(sz), lpFile); if (dw > 0) { dw = (0 == lstrcmpi(sz, c_szYes) || 0 == lstrcmpi(sz, c_sz1)); RegSetValueEx(hkey, c_szEnableHTTPMail, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); } RegCloseKey(hkey); } if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, c_szRegFlat, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw)) { SetRegDw(lpFile, c_szGlobalSection, c_szInsHideMessenger, hkey, c_szHideMessenger); SetRegProp(lpFile, c_szGlobalSection, c_szHideMSN, hkey, c_szRegDisableHotmail); RegCloseKey(hkey); } dw = GetPrivateProfileString(c_szGlobalSection, c_szServiceURL, c_szEmpty, sz, ARRAYSIZE(sz), lpFile); if (dw > 0) { cb = ARRAYSIZE(szT); hr = UrlGetPart(sz, szT, &cb, URL_PART_HOSTNAME, 0); if (FAILED(hr)) StrCpyN(szT, sz, ARRAYSIZE(szT)); wnsprintf(szKey, ARRAYSIZE(szKey), c_szPathFileFmt, c_szHTTPMailServiceRoot, szT); if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &disp)) { RegSetValueEx(hkey, c_szHTTPMailSignUp, 0, REG_SZ, (LPBYTE)sz, dw + 1); dw = GetPrivateProfileString(c_szGlobalSection, c_szServiceName, c_szEmpty, sz, ARRAYSIZE(sz), lpFile); if (dw > 0) RegSetValueEx(hkey, c_szHTTPMailServiceName, 0, REG_SZ, (LPBYTE)sz, dw + 1); SetRegDw(lpFile, c_szGlobalSection, c_szAccountNumber, hkey, c_szHTTPMailAcctNumber); RegCloseKey(hkey); } } return(S_OK); } void HandleConnectInfo(IImnAccount *pAcct, CONNECTINFO *pci, BOOL fUseIEConnection) { DWORD type; Assert(pAcct != NULL); if (fUseIEConnection) { pAcct->SetPropDw(AP_RAS_CONNECTION_TYPE, CONNECTION_TYPE_INETSETTINGS); return; } if (pci != NULL) type = pci->type; else type = CONNECT_LAN; pAcct->SetPropDw(AP_RAS_CONNECTION_TYPE, type); if (type == CONNECT_RAS) { Assert(pci != NULL); pAcct->SetPropSz(AP_RAS_CONNECTOID, pci->szConnectoid); } } void GetPropSz(LPCSTR szSection, LPCSTR szValue, LPCSTR szSection2, LPCSTR szValue2, LPCSTR szFile, IImnAccount *pAcct, DWORD prop, BOOL *pfComplete) { char sz[512]; DWORD dw; HRESULT hr; Assert(szSection != NULL); Assert(szValue != NULL); Assert(szFile != NULL); Assert(pAcct != NULL); dw = GetPrivateProfileString(szSection, szValue, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw == 0 && szSection2 != NULL) { Assert(szValue2 != NULL); dw = GetPrivateProfileString(szSection2, szValue2, c_szEmpty, sz, ARRAYSIZE(sz), szFile); } if (dw > 0) { pAcct->SetPropSz(prop, sz); } else if (pfComplete != NULL) { dw = 0; hr = pAcct->GetProp(prop, NULL, &dw); if (dw == 0) *pfComplete = FALSE; } } void GetPropDw(LPCSTR szSection, LPCSTR szValue, LPCSTR szFile, IImnAccount *pAcct, DWORD prop) { DWORD dw; dw = GetPrivateProfileInt(szSection, szValue, -1, szFile); if (dw != -1) pAcct->SetPropDw(prop, dw); } void GetPropBool(LPCSTR szSection, LPCSTR szValue, LPCSTR szFile, IImnAccount *pAcct, DWORD prop) { DWORD dw; char sz[512]; dw = GetPrivateProfileString(szSection, szValue, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { dw = (0 == lstrcmpi(sz, c_szYes) || 0 == lstrcmpi(sz, c_sz1)); pAcct->SetPropDw(prop, dw); } } BOOL GetBool(LPCSTR szSection, LPCSTR szValue, LPCSTR szFile) { DWORD dw; char sz[512]; dw = GetPrivateProfileString(szSection, szValue, c_szEmpty, sz, ARRAYSIZE(sz), szFile); return(dw > 0 && (0 == lstrcmpi(sz, c_szYes) || 0 == lstrcmpi(sz, c_sz1))); } void SetRegProp(LPCSTR szFile, LPCSTR szSection, LPCSTR szValue, HKEY hkey, LPCSTR szRegValue) { char sz[16]; DWORD dw; dw = GetPrivateProfileString(szSection, szValue, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { dw = (0 == lstrcmpi(sz, c_szYes) || 0 == lstrcmpi(sz, c_sz1)); RegSetValueEx(hkey, szRegValue, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); } } void SetRegDw(LPCSTR szFile, LPCSTR szSection, LPCSTR szValue, HKEY hkey, LPCSTR szRegValue) { DWORD dw; dw = GetPrivateProfileInt(szSection, szValue, -1, szFile); if (dw != -1) RegSetValueEx(hkey, szRegValue, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); } HRESULT CreateMailAccount(CAccountManager *pAcctMgr, LPCSTR szFile, LPCSTR szMailSection, CONNECTINFO *pci, HKEY hkey, LPSTR pszAcctId, DWORD cchSizeAcctID, DWORD dwFlags) { IImnAccount *pAcct; HRESULT hr; DWORD dw; char sz[512]; int type; BOOL fSicily, fDelete, fComplete = TRUE; Assert(pAcctMgr != NULL); Assert(szFile != NULL); if (GetBool(szMailSection, c_szUseImap, szFile)) type = IMAP; else if (GetPrivateProfileString(szMailSection, c_szHttpUrl, c_szEmpty, sz, ARRAYSIZE(sz), szFile) > 0) type = HTTP; else type = POP3; fDelete = (BOOL)GetPrivateProfileInt(szMailSection, c_szDeleteAccount, 0, szFile); if (fDelete) { DeleteAccount(type, pAcctMgr, szMailSection, szFile); return(S_OK); } if (SUCCEEDED(hr = GetAccount(type, pAcctMgr, szMailSection, szFile, &pAcct))) { Assert(pAcct != NULL); if (type == POP3) { GetPropDw(szMailSection, c_szPopPort, szFile, pAcct, AP_POP3_PORT); GetPropBool(szMailSection, c_szUseSSL, szFile, pAcct, AP_POP3_SSL); GetPropBool(szMailSection, c_szPopLeaveOnServer, szFile, pAcct, AP_POP3_LEAVE_ON_SERVER); GetPropBool(szMailSection, c_szPopRemoveOnDelete, szFile, pAcct, AP_POP3_REMOVE_DELETED); fSicily = GetBool(szMailSection, c_szLogonUsingSPA, szFile); pAcct->SetPropDw(AP_POP3_USE_SICILY, fSicily); // IE5 Bug #65821: Even if SPA (Sicily) is turned on, we store the account name and password GetPropSz(szMailSection, c_szMailLogon, NULL, NULL, szFile, pAcct, AP_POP3_USERNAME, &fComplete); GetPropSz(szMailSection, c_szMailPassword, NULL, NULL, szFile, pAcct, AP_POP3_PASSWORD, NULL); } else if (type == IMAP) { GetPropDw(szMailSection, c_szImapPort, szFile, pAcct, AP_IMAP_PORT); GetPropBool(szMailSection, c_szUseSSL, szFile, pAcct, AP_IMAP_SSL); GetPropSz(szMailSection, c_szImapRoot, NULL, NULL, szFile, pAcct, AP_IMAP_ROOT_FOLDER, NULL); GetPropSz(szMailSection, c_szImapSentItems, NULL, NULL, szFile, pAcct, AP_IMAP_SENTITEMSFLDR, NULL); GetPropSz(szMailSection, c_szImapDrafts, NULL, NULL, szFile, pAcct, AP_IMAP_DRAFTSFLDR, NULL); GetPropBool(szMailSection, c_szImapPoll, szFile, pAcct, AP_IMAP_POLL); fSicily = GetBool(szMailSection, c_szLogonUsingSPA, szFile); pAcct->SetPropDw(AP_IMAP_USE_SICILY, fSicily); // IE5 Bug #65821: Even if SPA (Sicily) is turned on, we store the account name and password GetPropSz(szMailSection, c_szImapLogon, NULL, NULL, szFile, pAcct, AP_IMAP_USERNAME, &fComplete); GetPropSz(szMailSection, c_szImapPassword, NULL, NULL, szFile, pAcct, AP_IMAP_PASSWORD, NULL); } else { fSicily = GetBool(szMailSection, c_szLogonUsingSPA, szFile); pAcct->SetPropDw(AP_HTTPMAIL_USE_SICILY, fSicily); // IE5 Bug #65821: Even if SPA (Sicily) is turned on, we store the account name and password GetPropSz(szMailSection, c_szHttpLogon, NULL, NULL, szFile, pAcct, AP_HTTPMAIL_USERNAME, &fComplete); GetPropSz(szMailSection, c_szHttpPassword, NULL, NULL, szFile, pAcct, AP_HTTPMAIL_PASSWORD, NULL); GetPropBool(c_szMailSection, c_szHttpPoll, szFile, pAcct, AP_HTTPMAIL_POLL); GetPropBool(szMailSection, c_szMsnCom, szFile, pAcct, AP_HTTPMAIL_DOMAIN_MSN); } GetPropSz(szMailSection, c_szMailName, NULL, NULL, szFile, pAcct, AP_SMTP_DISPLAY_NAME, &fComplete); GetPropSz(szMailSection, c_szMailAddr, NULL, NULL, szFile, pAcct, AP_SMTP_EMAIL_ADDRESS, &fComplete); GetPropSz(szMailSection, c_szReplyAddr, NULL, NULL, szFile, pAcct, AP_SMTP_REPLY_EMAIL_ADDRESS, NULL); if (type != HTTP) { GetPropSz(szMailSection, c_szSmtpServer, NULL, NULL, szFile, pAcct, AP_SMTP_SERVER, &fComplete); GetPropDw(szMailSection, c_szSmtpPort, szFile, pAcct, AP_SMTP_PORT); GetPropBool(szMailSection, c_szSmtpUseSSL, szFile, pAcct, AP_SMTP_SSL); dw = GetPrivateProfileString(szMailSection, c_szSmtpLogonReq, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { if (0 == lstrcmpi(sz, c_szYes) || 0 == lstrcmpi(sz, c_sz1)) { // IE5 Bug #67153: If SMTP logon required, but SPA not set, assume username/pass is provided fSicily = GetBool(szMailSection, c_szSmtpLogonUsingSPA, szFile); pAcct->SetPropDw(AP_SMTP_USE_SICILY, fSicily ? SMTP_AUTH_SICILY : SMTP_AUTH_USE_SMTP_SETTINGS); // IE5 Bug #67153: Even if SPA (Sicily) is turned on, we store the account name and password GetPropSz(szMailSection, c_szSmtpLogon, NULL, NULL, szFile, pAcct, AP_SMTP_USERNAME, NULL); GetPropSz(szMailSection, c_szSmtpPassword, NULL, NULL, szFile, pAcct, AP_SMTP_PASSWORD, NULL); } else { pAcct->SetPropDw(AP_SMTP_USE_SICILY, SMTP_AUTH_NONE); pAcct->SetPropSz(AP_SMTP_USERNAME, NULL); pAcct->SetPropSz(AP_SMTP_PASSWORD, NULL); } } } GetPropSz(szMailSection, c_szService, NULL, NULL, szFile, pAcct, AP_SERVICE, NULL); GetPropDw(c_szGlobalSection, c_szReadOnlyAccts, szFile, pAcct, AP_SERVER_READ_ONLY); HandleConnectInfo(pAcct, pci, GetBool(szMailSection, c_szIEConnect, szFile)); hr = pAcct->SaveChanges(); if (SUCCEEDED(hr)) { if (0 == (dwFlags & CAFF_NO_SET_DEFAULT)) pAcct->SetAsDefault(); if (SUCCEEDED(pAcct->GetPropSz(AP_ACCOUNT_ID, sz, ARRAYSIZE(sz)))) { if (pszAcctId != NULL) StrCpyN(pszAcctId, sz, cchSizeAcctID); if (!fComplete) pAcctMgr->SetIncompleteAccount(ACCT_MAIL, sz); } } pAcct->Release(); } return(hr); } HRESULT CreateNewsAccount(CAccountManager *pAcctMgr, LPCSTR szFile, LPCSTR szNewsSection, LPCSTR szMailSection, CONNECTINFO *pci, HKEY hkey, IUserIdentity *pId, LPSTR pszAcctId, DWORD cchSizeAcctId, DWORD dwFlags) { IImnAccount *pAcct; HRESULT hr; DWORD dw; char sz[512]; BOOL fSPA, fDelete, fComplete = TRUE; Assert(pAcctMgr != NULL); Assert(szFile != NULL); fDelete = (BOOL)GetPrivateProfileInt(szNewsSection, c_szDeleteAccount, 0, szFile); if (fDelete) { DeleteAccount(NNTP, pAcctMgr, szNewsSection, szFile); return(S_OK); } if (SUCCEEDED(hr = GetAccount(NNTP, pAcctMgr, szNewsSection, szFile, &pAcct))) { Assert(pAcct != NULL); GetPropSz(szNewsSection, c_szNewsName, szMailSection, c_szMailName, szFile, pAcct, AP_NNTP_DISPLAY_NAME, &fComplete); GetPropSz(szNewsSection, c_szNewsAddr, szMailSection, c_szMailAddr, szFile, pAcct, AP_NNTP_EMAIL_ADDRESS, &fComplete); GetPropSz(szNewsSection, c_szReplyAddr, szMailSection, c_szReplyAddr, szFile, pAcct, AP_NNTP_REPLY_EMAIL_ADDRESS, NULL); GetPropDw(szNewsSection, c_szNewsPort, szFile, pAcct, AP_NNTP_PORT); GetPropBool(szNewsSection, c_szUseSSL, szFile, pAcct, AP_NNTP_SSL); fSPA = FALSE; if (GetBool(szNewsSection, c_szNewsLogonRequired, szFile)) { fSPA = GetBool(szNewsSection, c_szLogonUsingSPA, szFile); // IE5 Bug #65821: Even if SPA (Sicily) is turned on, we store the account name and password GetPropSz(szNewsSection, c_szNewsLogon, NULL, NULL, szFile, pAcct, AP_NNTP_USERNAME, &fComplete); GetPropSz(szNewsSection, c_szNewsPassword, NULL, NULL, szFile, pAcct, AP_NNTP_PASSWORD, NULL); } pAcct->SetPropDw(AP_NNTP_USE_SICILY, fSPA); GetPropDw(c_szGlobalSection, c_szReadOnlyAccts, szFile, pAcct, AP_SERVER_READ_ONLY); HandleConnectInfo(pAcct, pci, GetBool(szNewsSection, c_szIEConnect, szFile)); hr = pAcct->SaveChanges(); if (SUCCEEDED(hr)) { if (0 == (dwFlags & CAFF_NO_SET_DEFAULT)) pAcct->SetAsDefault(); if (SUCCEEDED(pAcct->GetPropSz(AP_ACCOUNT_ID, sz, ARRAYSIZE(sz)))) { if (pszAcctId != NULL) StrCpyN(pszAcctId, sz, cchSizeAcctId); if (!fComplete) pAcctMgr->SetIncompleteAccount(ACCT_NEWS, sz); } dw = GetPrivateProfileString(szNewsSection, c_szNewsgroups, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) SubscribeNewsgroups(pAcct, sz, szFile, hkey); } pAcct->Release(); } return(hr); } HRESULT CreateLDAPAccount(CAccountManager *pAcctMgr, LPCSTR szFile, LPCSTR szLDAPSection, CONNECTINFO *pci) { IImnAccount *pAcct; HRESULT hr; int i; char sz[512]; DWORD dw; BOOL fDelete; Assert(pAcctMgr != NULL); Assert(szFile != NULL); fDelete = (BOOL)GetPrivateProfileInt(szLDAPSection, c_szDeleteAccount, 0, szFile); if (fDelete) { DeleteAccount(LDAP, pAcctMgr, szLDAPSection, szFile); return(S_OK); } if (SUCCEEDED(hr = GetAccount(LDAP, pAcctMgr, szLDAPSection, szFile, &pAcct))) { Assert(pAcct != NULL); GetPropSz(szLDAPSection, c_szLDAPSearchBase, NULL, NULL, szFile, pAcct, AP_LDAP_SEARCH_BASE, NULL); GetPropSz(szLDAPSection, c_szLDAPHomePage, NULL, NULL, szFile, pAcct, AP_LDAP_URL, NULL); GetPropSz(szLDAPSection, c_szLDAPLogo, NULL, NULL, szFile, pAcct, AP_LDAP_LOGO, NULL); GetPropDw(szLDAPSection, c_szLDAPPort, szFile, pAcct, AP_LDAP_PORT); GetPropBool(szLDAPSection, c_szUseSSL, szFile, pAcct, AP_LDAP_SSL); GetPropDw(szLDAPSection, c_szLDAPResults, szFile, pAcct, AP_LDAP_SEARCH_RETURN); GetPropDw(szLDAPSection, c_szLDAPTimeout, szFile, pAcct, AP_LDAP_TIMEOUT); dw = GetBool(szLDAPSection, c_szLDAPCheckNames, szFile); pAcct->SetPropDw(AP_LDAP_RESOLVE_FLAG, dw); i = GetPrivateProfileInt(szLDAPSection, c_szLDAPAuthType, -1, szFile); if (i >= LDAP_AUTH_ANONYMOUS && i <= LDAP_AUTH_MAX) { if (i > LDAP_AUTH_ANONYMOUS) { GetPropSz(szLDAPSection, c_szLDAPUserName, NULL, NULL, szFile, pAcct, AP_LDAP_USERNAME, NULL); GetPropSz(szLDAPSection, c_szLDAPPassword, NULL, NULL, szFile, pAcct, AP_LDAP_PASSWORD, NULL); } pAcct->SetPropDw(AP_LDAP_AUTHENTICATION, (DWORD)i); } GetPropDw(c_szGlobalSection, c_szReadOnlyAccts, szFile, pAcct, AP_SERVER_READ_ONLY); hr = pAcct->SaveChanges(); pAcct->Release(); } return(hr); } typedef struct tagACCTPROPS { ACCTTYPE type; DWORD dwSrv; DWORD dwPropSrv; LPCSTR szSrv; DWORD dwMatch; LPCSTR szMatch; } ACCTPROPS; static const ACCTPROPS g_rgProps[LDAP + 1] = { { ACCT_NEWS, SRV_NNTP, AP_NNTP_SERVER, c_szNewsServer, AP_NNTP_USERNAME, c_szNewsLogon }, { ACCT_MAIL, SRV_POP3, AP_POP3_SERVER, c_szPopServer, AP_SMTP_EMAIL_ADDRESS, c_szMailAddr, }, { ACCT_MAIL, SRV_IMAP, AP_IMAP_SERVER, c_szImapServer, AP_SMTP_EMAIL_ADDRESS, c_szMailAddr, }, { ACCT_MAIL, SRV_HTTPMAIL, AP_HTTPMAIL_SERVER, c_szHttpUrl, AP_SMTP_EMAIL_ADDRESS, c_szMailAddr, }, { ACCT_DIR_SERV, SRV_LDAP, AP_LDAP_SERVER, c_szLDAPServer, AP_LDAP_USERNAME, c_szLDAPUserName, } }; HRESULT GetAccount(DWORD type, CAccountManager *pAcctMgr, LPCSTR szSection, LPCSTR szFile, IImnAccount **ppAcct) { IImnEnumAccounts *pEnum; HRESULT hr; DWORD dw; BOOL fOldSrv; const ACCTPROPS *pProps; IImnAccount *pAcct; char szSrv[CCHMAX_SERVER_NAME], szMatch[CCHMAX_ACCT_PROP_SZ], sz[CCHMAX_ACCT_PROP_SZ], szOldSrv[CCHMAX_SERVER_NAME]; LPSTR pszSrv; Assert(pAcctMgr != NULL); Assert(szSection != NULL); Assert(szFile != NULL); Assert(ppAcct != NULL); *ppAcct = NULL; pProps = &g_rgProps[type]; *szSrv = 0; dw = GetPrivateProfileString(szSection, pProps->szSrv, c_szEmpty, szSrv, ARRAYSIZE(szSrv), szFile); if (*szSrv == 0) return(E_FAIL); *szOldSrv = 0; dw = GetPrivateProfileString(szSection, c_szOldServer, c_szEmpty, szOldSrv, ARRAYSIZE(szOldSrv), szFile); if (fOldSrv = (*szOldSrv != 0)) pszSrv = szOldSrv; else pszSrv = szSrv; *szMatch = 0; dw = GetPrivateProfileString(szSection, pProps->szMatch, c_szEmpty, szMatch, ARRAYSIZE(szMatch), szFile); hr = S_FALSE; if (S_OK == pAcctMgr->Enumerate(pProps->dwSrv, &pEnum)) { Assert(pEnum != NULL); // try to find a duplicate account while (S_OK == pEnum->GetNext(&pAcct)) { Assert(pAcct != NULL); *sz = 0; pAcct->GetPropSz(pProps->dwPropSrv, sz, ARRAYSIZE(sz)); if (0 == lstrcmpi(sz, pszSrv)) { // the servers are the same for the accounts so this may be a match *sz = 0; pAcct->GetPropSz(pProps->dwMatch, sz, ARRAYSIZE(sz)); if (fOldSrv) { hr = S_OK; } else if (*szMatch != 0 && *sz != 0) { if (0 == lstrcmpi(sz, szMatch)) hr = S_OK; } else if (*szMatch == 0) { if (*sz == 0) hr = S_OK; else hr = E_FAIL; } else { Assert(*sz == 0); hr = S_OK; } } if (hr == S_OK) { *ppAcct = pAcct; break; } pAcct->Release(); if (hr != S_FALSE) break; } pEnum->Release(); } if (hr == S_FALSE) { Assert(*ppAcct == NULL); if (SUCCEEDED(hr = pAcctMgr->CreateAccountObject(pProps->type, &pAcct))) { pAcct->SetPropSz(pProps->dwPropSrv, szSrv); dw = GetPrivateProfileString(szSection, (type == LDAP) ? c_szLDAPFriendlyName : c_szAcctName, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw == 0) StrCpyN(sz, szSrv, ARRAYSIZE(sz)); hr = pAcctMgr->GetUniqueAccountName(sz, ARRAYSIZE(sz)); if (SUCCEEDED(hr)) { pAcct->SetPropSz(AP_ACCOUNT_NAME, sz); *ppAcct = pAcct; } } } else if (hr == S_OK) { Assert(pAcct != NULL); if (fOldSrv) pAcct->SetPropSz(pProps->dwPropSrv, szSrv); dw = GetPrivateProfileString(szSection, (type == LDAP) ? c_szLDAPFriendlyName : c_szAcctName, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { if (SUCCEEDED(pAcct->GetPropSz(AP_ACCOUNT_NAME, szMatch, ARRAYSIZE(szMatch)))) { if (0 != lstrcmp(sz, szMatch)) { if (SUCCEEDED(pAcctMgr->GetUniqueAccountName(sz, ARRAYSIZE(sz)))) pAcct->SetPropSz(AP_ACCOUNT_NAME, sz); } } } } return(hr); } HRESULT DeleteAccount(DWORD type, CAccountManager *pAcctMgr, LPCSTR szSection, LPCSTR szFile) { IImnEnumAccounts *pEnum; DWORD dw; const ACCTPROPS *pProps; IImnAccount *pAcct; char szSrv[CCHMAX_SERVER_NAME], sz[CCHMAX_ACCT_PROP_SZ]; Assert(pAcctMgr != NULL); Assert(szSection != NULL); Assert(szFile != NULL); pProps = &g_rgProps[type]; *szSrv = 0; dw = GetPrivateProfileString(szSection, pProps->szSrv, c_szEmpty, szSrv, ARRAYSIZE(szSrv), szFile); if (*szSrv == 0) return(E_FAIL); if (S_OK == pAcctMgr->Enumerate(pProps->dwSrv, &pEnum)) { Assert(pEnum != NULL); // try to find a duplicate account while (S_OK == pEnum->GetNext(&pAcct)) { Assert(pAcct != NULL); *sz = 0; pAcct->GetPropSz(pProps->dwPropSrv, sz, ARRAYSIZE(sz)); if (0 == lstrcmpi(sz, szSrv)) { pAcct->Delete(); } pAcct->Release(); } pEnum->Release(); } return(S_OK); } void FixSignature(LPSTR psz) { Assert(psz != NULL); while (*psz != 0) { if (!IsDBCSLeadByte(*psz) && *psz == '\\' && *(psz + 1) == 'n') { *psz = 0x0d; psz++; *psz = 0x0a; psz++; } else { psz = CharNextA(psz); } } } void SetSignature(LPCSTR szMailSigSection, LPCSTR szNewsSigSection, LPCSTR pszMailId, LPCSTR pszNewsId, LPCSTR szFile, HKEY hkey, CAccountManager *pAcctMgr) { BOOL fMailForNews; HKEY hkeyT; IImnAccount *pAcct; char sz[1024], szKey[MAX_PATH], szT[CCHMAX_STRINGRES]; DWORD dw, cb; if (szMailSigSection != NULL) { if (GetBool(szMailSigSection, c_szUseSig, szFile)) { dw = GetPrivateProfileString(szMailSigSection, c_szProfSigText, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { FixSignature(sz); fMailForNews = GetBool(szMailSigSection, c_szUseMailForNews, szFile); wnsprintf(szKey, ARRAYSIZE(szKey), c_szPathFileFmt, c_szRegRootSigs, c_szMailSigKey); if (ERROR_SUCCESS == RegCreateKeyEx(hkey, szKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkeyT, &dw)) { LoadString(g_hInstRes, idsMailSignature, szT, ARRAYSIZE(szT)); RegSetValueEx(hkeyT, c_szSigName, 0, REG_SZ, (LPBYTE)szT, lstrlen(szT) + 1); RegSetValueEx(hkeyT, c_szSigText, 0, REG_SZ, (LPBYTE)sz, lstrlen(sz) + 1); dw = 1; RegSetValueEx(hkeyT, c_szSigType, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); RegCloseKey(hkeyT); if (fMailForNews) { SHSetValue(hkey, c_szRegRootSigs, c_szRegDefSig, REG_SZ, (LPBYTE)c_szMailSigKey, lstrlen(c_szMailSigKey) + 1); } else if (pszMailId != NULL) { if (SUCCEEDED(pAcctMgr->FindAccount(AP_ACCOUNT_ID, pszMailId, &pAcct))) { pAcct->SetPropSz(AP_SMTP_SIGNATURE, (LPSTR)c_szMailSigKey); pAcct->SaveChanges(); pAcct->Release(); } } } if (fMailForNews) { // Turn on "Add signatures to all outgoing messages" if (ERROR_SUCCESS == RegCreateKeyEx(hkey, c_szRegRoot, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hkeyT, &dw)) { dw = 0; // Read any existing value cb = sizeof(dw); RegQueryValueEx(hkeyT, c_szSigFlags, 0, NULL, (LPBYTE)&dw, &cb); // Turn on checkbox dw |= SIGFLAG_AUTONEW; // Write back new value RegSetValueEx(hkeyT, c_szSigFlags, 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw)); RegCloseKey(hkeyT); } // Per spec, don't even worry about News Sig section return; } } } } if (szNewsSigSection != NULL) { if (GetBool(szNewsSigSection, c_szUseSig, szFile)) { dw = GetPrivateProfileString(szNewsSigSection, c_szProfSigText, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { FixSignature(sz); wnsprintf(szKey, ARRAYSIZE(szKey), c_szPathFileFmt, c_szRegRootSigs, c_szNewsSigKey); if (ERROR_SUCCESS == RegCreateKeyEx(hkey, szKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkeyT, &dw)) { LoadString(g_hInstRes, idsNewsSignature, szT, ARRAYSIZE(szT)); RegSetValueEx(hkeyT, c_szSigName, 0, REG_SZ, (LPBYTE)szT, lstrlen(szT) + 1); RegSetValueEx(hkeyT, c_szSigText, 0, REG_SZ, (LPBYTE)sz, lstrlen(sz) + 1); dw = 1; RegSetValueEx(hkeyT, c_szSigType, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); RegCloseKey(hkeyT); if (pszNewsId != NULL) { if (SUCCEEDED(pAcctMgr->FindAccount(AP_ACCOUNT_ID, pszNewsId, &pAcct))) { pAcct->SetPropSz(AP_NNTP_SIGNATURE, (LPSTR)c_szNewsSigKey); pAcct->SaveChanges(); pAcct->Release(); } } } } } } } static const char c_szRegClient[] = "Software\\Clients\\Mail\\Outlook Express"; static const char c_szDllPath[] = "DLLPath"; static const char c_szSetDefMail[] = "SetDefaultMailHandler"; static const char c_szSetDefNews[] = "SetDefaultNewsHandler"; typedef HRESULT (WINAPI *PFN_SETDEFCLIENT)(DWORD); void DoDefaultClient(LPCSTR szFile, BOOL fMail) { HINSTANCE hlib; PFN_SETDEFCLIENT pfn; char szDll[MAX_PATH]; DWORD dw, type; if (GetBool(fMail ? c_szMailSection : c_szNewsSection, c_szDefClient, szFile)) { dw = sizeof(szDll); if (ERROR_SUCCESS == SHGetValue(HKEY_LOCAL_MACHINE, c_szRegClient, c_szDllPath, &type, (LPVOID)szDll, &dw)) { hlib = LoadLibrary(szDll); if (hlib != NULL) { pfn = (PFN_SETDEFCLIENT)GetProcAddress(hlib, fMail ? c_szSetDefMail : c_szSetDefNews); if (pfn != NULL) pfn(0); FreeLibrary(hlib); } } } } void DoMailBranding(LPCSTR szFile, LPCSTR szMailSection, HKEY hkeyUser) { HKEY hkey; DWORD dw; int i; char sz[1024]; if (ERROR_SUCCESS == RegCreateKeyEx(hkeyUser, c_szRegRoot, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw)) { dw = GetPrivateProfileString(szMailSection, c_szWinTitle, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0 && !FIsEmpty(sz)) RegSetValueEx(hkey, c_szWindowTitle, 0, REG_SZ, (LPBYTE)sz, dw + 1); dw = GetPrivateProfileString(szMailSection, c_szInfopane, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0 && !FIsEmpty(sz)) { RegSetValueEx(hkey, c_szRegBodyBarPath, 0, REG_SZ, (LPBYTE)sz, dw + 1); dw = 1; RegSetValueEx(hkey, c_szShowBodyBar, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); } SetRegProp(szFile, szMailSection, c_szStartAtInbox, hkey, c_szRegLaunchInbox); RegCloseKey(hkey); } if (ERROR_SUCCESS == RegCreateKeyEx(hkeyUser, c_szRegRootMail, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw)) { dw = GetPrivateProfileString(szMailSection, c_szWelcomeMsg, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0 && !FIsEmpty(sz)) { RegSetValueEx(hkey, c_szWelcomeHtm, 0, REG_SZ, (LPBYTE)sz, dw + 1); dw = GetPrivateProfileString(szMailSection, c_szProfWelcomeName, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0 && !FIsEmpty(sz)) RegSetValueEx(hkey, c_szWelcomeName, 0, REG_SZ, (LPBYTE)sz, dw + 1); dw = GetPrivateProfileString(szMailSection, c_szProfWelcomeEmail, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0 && !FIsEmpty(sz)) RegSetValueEx(hkey, c_szWelcomeEmail, 0, REG_SZ, (LPBYTE)sz, dw + 1); // Tell OE we need a welcome msg... dw = 1; RegSetValueEx(hkey, c_szNeedWelcomeMsg, 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw)); } dw = GetPrivateProfileString(szMailSection, c_szPollTime, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0 && !FIsEmpty(sz)) { i = StrToInt(sz); if (i <= 0) { dw = 0xffffffff; } else { if (i > 120) i = 120; dw = (DWORD)i * 60 * 1000; } RegSetValueEx(hkey, c_szRegPollForMail, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); } // Turn on Sending HTML msgs for Mail? SetRegDw(szFile, szMailSection, c_szHTMLMsgs, hkey, c_szMsgSendHtml); RegCloseKey(hkey); } if (ERROR_SUCCESS == RegCreateKeyEx(hkeyUser, c_szRegRootRules, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw)) { SetRegProp(szFile, szMailSection, c_szJunkMail, hkey, c_szRegFilterJunk); RegCloseKey(hkey); } } void DoNewsBranding(LPCSTR szFile, LPCSTR szNewsSection, HKEY hkeyUser) { HKEY hkey; DWORD dw; if (ERROR_SUCCESS == RegCreateKeyEx(hkeyUser, c_szRegRootNews, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw)) { // Turn on Sending HTML msgs for News? SetRegDw(szFile, szNewsSection, c_szHTMLMsgs, hkey, c_szMsgSendHtml); RegCloseKey(hkey); } } void SubscribeNewsgroups(IImnAccount *pAcct, LPCSTR szSection, LPCSTR szFile, HKEY hkey) { char *sz, szPath[MAX_PATH], szId[CCHMAX_ACCOUNT_NAME]; DWORD dw, cGroups, type; Assert(pAcct != NULL); Assert(szSection != NULL); Assert(szFile != NULL); if (SUCCEEDED(pAcct->GetPropSz(AP_ACCOUNT_ID, szId, ARRAYSIZE(szId)))) { if (MemAlloc((void **)&sz, CBPROFILEBUF)) { dw = GetPrivateProfileSection(szSection, sz, CBPROFILEBUF, szFile); if ((dw > 0) && (dw != (CBPROFILEBUF - 2))) { if (GetSectionNames(sz, dw, ',', &cGroups) && cGroups > 0) { wnsprintf(szPath, ARRAYSIZE(szPath), c_szPathFileFmt, c_szRegRootSubscribe, szId); RegSetValue(hkey, szPath, REG_SZ, sz, lstrlen(sz) + 1); } } MemFree(sz); } } } void SetHelp(LPCSTR szFile, LPCSTR szURLSection, HKEY hkey) { char sz[INTERNET_MAX_URL_LENGTH]; DWORD dw; dw = GetPrivateProfileString(szURLSection, c_szHelpPage, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { SHSetValue(hkey, c_szRegRoot, c_szRegHelpUrl, REG_SZ, (LPBYTE)sz, lstrlen(sz) + 1); } } HRESULT HandleIdentity(LPCSTR pszSection, LPCSTR pszFile, CONNECTINFO *pci, DWORD dwFlags, IUserIdentityManager *pIdMan) { HRESULT hr; CAccountManager *pAcctMgr; IPrivateIdentityManager *pPrivIdMgr; IEnumUserIdentity *pEnum; IUserIdentity *pId; HKEY hkey; char sz[256], szT[256], szGuid[256], szMailId[CCHMAX_ACCOUNT_NAME], szNewsId[CCHMAX_ACCOUNT_NAME]; DWORD dw, dwT, type, cb; WCHAR szwUserName[CCH_USERNAME_MAX_LENGTH + 1]; Assert(pszSection != NULL); Assert(pszFile != NULL); Assert(pIdMan != NULL); dw = GetPrivateProfileString(pszSection, c_szGUID, c_szEmpty, szGuid, ARRAYSIZE(szGuid), pszFile); if (dw > 0) { dw = GetPrivateProfileString(pszSection, c_szUserName, c_szEmpty, sz, ARRAYSIZE(sz), pszFile); if (dw > 0) { // try to find this identity hr = pIdMan->EnumIdentities(&pEnum); if (FAILED(hr)) return(hr); pId = NULL; hkey = NULL; while (hr == S_OK) { hr = pEnum->Next(1, (IUnknown **)&pId, &dw); if (hr == S_OK) { Assert(pId != NULL); hr = pId->OpenIdentityRegKey(KEY_READ | KEY_WRITE, &hkey); if (SUCCEEDED(hr)) { // check if it matches cb = sizeof(szT); if (ERROR_SUCCESS == RegQueryValueEx(hkey, c_szRegInsGUID, NULL, &type, (LPBYTE)szT, &cb)) { if (0 == lstrcmp(szT, szGuid)) break; } RegCloseKey(hkey); hkey = NULL; } pId->Release(); pId = NULL; } } pEnum->Release(); // if we can't find the user, create a new identity if (pId == NULL) { if (MultiByteToWideChar(CP_ACP, 0, sz, -1, szwUserName, CCH_USERNAME_MAX_LENGTH) == 0) return(E_FAIL); hr = pIdMan->QueryInterface(IID_IPrivateIdentityManager, (void **)&pPrivIdMgr); if (FAILED(hr)) return(hr); hr = pPrivIdMgr->CreateIdentity(szwUserName, &pId); if (SUCCEEDED(hr)) { hr = pId->OpenIdentityRegKey(KEY_READ | KEY_WRITE, &hkey); if (SUCCEEDED(hr)) RegSetValueEx(hkey, c_szRegInsGUID, 0, REG_SZ, (LPBYTE)szGuid, lstrlen(szGuid) + 1); } pPrivIdMgr->Release(); } // set values for the identity Assert(pId != NULL); Assert(hkey != NULL); GUID guid; hr = HrCreateAccountManager((IImnAccountManager **)&pAcctMgr); if (SUCCEEDED(hr) && SUCCEEDED(pId->GetCookie(&guid))) { hr = pAcctMgr->InitUser(NULL, guid, 0); if (SUCCEEDED(hr)) { *szMailId = 0; *szNewsId = 0; dw = GetPrivateProfileString(pszSection, c_szMailSection, c_szEmpty, sz, ARRAYSIZE(sz), pszFile); if (dw > 0) { CreateMailAccount(pAcctMgr, pszFile, sz, pci, hkey, szMailId, ARRAYSIZE(szMailId), dwFlags); DoMailBranding(pszFile, sz, hkey); HandleMultipleAccounts(ACCT_MAIL, pAcctMgr, pszFile, sz, pci, hkey, pId, dwFlags); } dwT = GetPrivateProfileString(pszSection, c_szNewsSection, c_szEmpty, szT, ARRAYSIZE(szT), pszFile); if (dwT > 0) { CreateNewsAccount(pAcctMgr, pszFile, szT, (dw > 0) ? sz : NULL, pci, hkey, pId, szNewsId, ARRAYSIZE(szNewsId), dwFlags); HandleMultipleAccounts(ACCT_NEWS, pAcctMgr, pszFile, sz, pci, hkey, pId, dwFlags); } dw = GetPrivateProfileString(pszSection, c_szLDAPSection, c_szEmpty, sz, ARRAYSIZE(sz), pszFile); if (dw > 0) { CreateLDAPAccount(pAcctMgr, pszFile, sz, pci); HandleMultipleAccounts(ACCT_DIR_SERV, pAcctMgr, pszFile, sz, pci, hkey, pId, dwFlags); } dw = GetPrivateProfileString(pszSection, c_szMailSigSection, c_szEmpty, sz, ARRAYSIZE(sz), pszFile); dwT = GetPrivateProfileString(pszSection, c_szNewsSigSection, c_szEmpty, szT, ARRAYSIZE(szT), pszFile); SetSignature((dw > 0) ? sz : NULL, (dw > 0) ? szT : NULL, (*szMailId != 0) ? szMailId : NULL, (*szNewsId != 0) ? szNewsId : NULL, pszFile, hkey, pAcctMgr); SetHelp(pszFile, c_szURLSection, hkey); dw = GetPrivateProfileString(pszSection, c_szOESection, c_szEmpty, sz, ARRAYSIZE(sz), pszFile); if (dw > 0) DoBranding(pszFile, sz, hkey); } pAcctMgr->Release(); } RegCloseKey(hkey); pId->Release(); } } return(S_OK); } void SetHtmlEncoding(LPCSTR szFile, LPCSTR szSection, LPCSTR szValue, HKEY hkey, LPCSTR szRegValue) { char sz[32]; DWORD dw; dw = GetPrivateProfileString(szSection, szValue, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { dw = 0; if (0 == lstrcmpi(sz, c_szNone)) dw = 4; else if (0 == lstrcmpi(sz, c_szBase64)) dw = 1; else if (0 == lstrcmpi(sz, c_szQuotedPrintable)) dw = 3; if (dw != 0) RegSetValueEx(hkey, szRegValue, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); } } void SetPlainEncoding(LPCSTR szFile, LPCSTR szSection, LPCSTR szValue, HKEY hkey, LPCSTR szRegValue) { char sz[32]; DWORD dw; dw = GetPrivateProfileString(szSection, szValue, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { dw = -1; if (0 == lstrcmpi(sz, c_szMime)) dw = 1; else if (0 == lstrcmpi(sz, c_szUuencode)) dw = 0; if (dw != -1) RegSetValueEx(hkey, szRegValue, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); } } void DoBranding(LPCSTR szFile, LPCSTR szOESection, HKEY hkeyUser) { HKEY hkey; DWORD dw; int i; char sz[1024]; HKEY hkeyLM; if (ERROR_SUCCESS == RegCreateKeyEx(hkeyUser, c_szRegRoot, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw)) { dw = GetPrivateProfileString(szOESection, c_szFolderBar, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { dw = (0 != lstrcmpi(sz, c_szYes) && 0 != lstrcmpi(sz, c_sz1)); RegSetValueEx(hkey, c_szRegHideFolderBar, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); } SetRegProp(szFile, szOESection, c_szFolderList, hkey, c_szShowTree); SetRegProp(szFile, szOESection, c_szOutlookBar, hkey, c_szRegShowOutlookBar); SetRegProp(szFile, szOESection, c_szStatusBar, hkey, c_szShowStatus); SetRegProp(szFile, szOESection, c_szContacts, hkey, c_szRegShowContacts); SetRegProp(szFile, szOESection, c_szTipOfTheDay, hkey, c_szRegTipOfTheDay); SetRegProp(szFile, szOESection, c_szToolbar, hkey, c_szShowToolbarIEAK); SetRegProp(szFile, szOESection, c_szMigration, hkey, c_szMigrationPerformed); //Keys for Return Receipts admin SetRegProp(szFile, szOESection, c_szRequestReadReceipts, hkey, c_szRequestMDN); SetRegProp(szFile, szOESection, c_szReadReceiptResponse, hkey, c_szSendMDN); SetRegProp(szFile, szOESection, c_szSendReceiptsToList, hkey, c_szSendReceiptToList); if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, STR_REG_PATH_POLICY, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkeyLM, &dw)) { //Lock Keys for Return Receipts admin SetRegLockPropLM(szFile, szOESection, c_szReadReceiptResponseLocked, hkeyLM, c_szSendMDNLocked, hkey); SetRegLockPropLM(szFile, szOESection, c_szSendReceiptsToListLocked, hkeyLM, c_szSendReceiptToListLocked, hkey); SetRegLockPropLM(szFile, szOESection, c_szRequestReadReceiptsLocked, hkeyLM, c_szRequestMDNLocked, hkey); RegCloseKey(hkeyLM); } dw = GetPrivateProfileInt(szOESection, c_szToolbarText, 666, szFile); if (dw == 0 || dw == 1) { if (dw == 0) dw = 2; RegSetValueEx(hkey, c_szRegToolbarText, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); } dw = GetPrivateProfileInt(szOESection, c_szSecZone, 666, szFile); if (dw == 0 || dw == 1) { dw += 3; RegSetValueEx(hkey, c_szRegSecurityZone, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); } dw = GetPrivateProfileInt(szOESection, c_szSecZoneLocked, 666, szFile); if (dw == 0 || dw == 1) RegSetValueEx(hkey, c_szRegSecurityZoneLocked, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD)); RegCloseKey(hkey); } if (ERROR_SUCCESS == RegCreateKeyEx(hkeyUser, c_szRegRootMail, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw)) { SetRegProp(szFile, szOESection, c_szPreviewPane, hkey, c_szRegShowHybrid); SetRegProp(szFile, szOESection, c_szPreviewHeader, hkey, c_szMailShowHeaderInfo); SetRegProp(szFile, szOESection, c_szPreviewSide, hkey, c_szRegSplitDir); SetRegDw(szFile, szOESection, c_szSendEncoding, hkey, c_szDefaultCodePage); SetHtmlEncoding(szFile, szOESection, c_szMailEncoding, hkey, c_szMsgHTMLEncoding); SetRegProp(szFile, szOESection, c_szMailEnglishHeader, hkey, c_szMsgHTMLAllow8bit); SetPlainEncoding(szFile, szOESection, c_szMailPlainEncoding, hkey, c_szMsgPlainMime); SetRegProp(szFile, szOESection, c_szMailPlainEnglishHeader, hkey, c_szMsgPlainAllow8bit); SetRegProp(szFile, szOESection, c_szMapiWarn, hkey, c_szRegAppSend); SetRegProp(szFile, szOESection, c_szMapiWarnLocked, hkey, c_szRegAppSendLocked); SetRegProp(szFile, szOESection, c_szSafeAttach, hkey, c_szRegSafeAttachments); SetRegProp(szFile, szOESection, c_szSafeAttachLocked, hkey, c_szRegSafeAttachmentsLocked); RegCloseKey(hkey); } if (ERROR_SUCCESS == RegCreateKeyEx(hkeyUser, c_szRegRootNews, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw)) { SetRegProp(szFile, szOESection, c_szPreviewPane, hkey, c_szRegShowHybrid); SetRegProp(szFile, szOESection, c_szPreviewHeader, hkey, c_szNewsShowHeaderInfo); SetRegProp(szFile, szOESection, c_szPreviewSide, hkey, c_szRegSplitDir); SetHtmlEncoding(szFile, szOESection, c_szNewsEncoding, hkey, c_szMsgHTMLEncoding); SetRegProp(szFile, szOESection, c_szNewsEnglishHeader, hkey, c_szMsgHTMLAllow8bit); SetPlainEncoding(szFile, szOESection, c_szNewsPlainEncoding, hkey, c_szMsgPlainMime); SetRegProp(szFile, szOESection, c_szNewsPlainEnglishHeader, hkey, c_szMsgPlainAllow8bit); RegCloseKey(hkey); } if (ERROR_SUCCESS == RegCreateKeyEx(hkeyUser, c_szRegInternational, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw)) { SetRegDw(szFile, szOESection, c_szReadEncoding, hkey, c_szDefaultCodePage); RegCloseKey(hkey); } } void SetRegLockPropLM(LPCSTR szFile, LPCSTR szSection, LPCSTR szValue, HKEY hkeyLM, LPCSTR szRegValue, HKEY hkeyCU) { char sz[16]; DWORD dw; dw = GetPrivateProfileString(szSection, szValue, c_szEmpty, sz, ARRAYSIZE(sz), szFile); if (dw > 0) { dw = (0 == lstrcmpi(sz, c_szYes) || 0 == lstrcmpi(sz, c_sz1)); if (ERROR_SUCCESS != RegSetValueEx(hkeyLM, szRegValue, 0, REG_DWORD, (LPBYTE)&dw, sizeof(DWORD))) { //Try to set in HKCU SetRegProp(szFile, szSection, szValue, hkeyCU, szRegValue); } } } BOOL GetSectionNames(LPSTR psz, DWORD cch, char chSep, DWORD *pcNames) { LPSTR pszT, pszNames; BOOL fEOL; Assert(psz != NULL); Assert(cch > 0); Assert(pcNames != NULL); *pcNames = 0; pszNames = psz; while (*psz != 0) { pszT = psz; while (*psz != 0 && *psz != '=') { *pszNames = *psz; psz++; pszNames++; } fEOL = (*psz == 0); if (psz > pszT) { *pszNames = chSep; pszNames++; (*pcNames)++; } if (!fEOL) { psz++; while (*psz != 0) psz++; } psz++; } *pszNames = 0; pszNames++; return(*pcNames > 0); } void HandleMultipleAccounts(ACCTTYPE type, CAccountManager *pAcctMgr, LPCSTR pszFile, LPCSTR szSection, CONNECTINFO *pci, HKEY hkey, IUserIdentity *pId, DWORD dwFlags) { DWORD dw, cch, i; char sz[1024], *psz, *pszT; dw = GetPrivateProfileString(szSection, c_szMultiAccounts, c_szEmpty, sz, ARRAYSIZE(sz), pszFile); if (dw > 0) { if (MemAlloc((void **)&psz, CBPROFILEBUF)) { cch = GetPrivateProfileSection(sz, psz, CBPROFILEBUF, pszFile); if ((cch != 0) && (cch != (CBPROFILEBUF - 2))) { if (GetSectionNames(psz, cch, 0, &dw)) { for (i = 0, pszT = psz; i < dw; i++) { switch (type) { case ACCT_MAIL: CreateMailAccount(pAcctMgr, pszFile, pszT, pci, hkey, NULL, 0, dwFlags); break; case ACCT_NEWS: CreateNewsAccount(pAcctMgr, pszFile, pszT, NULL, pci, hkey, pId, NULL, 0, dwFlags); break; case ACCT_DIR_SERV: CreateLDAPAccount(pAcctMgr, pszFile, pszT, pci); break; default: Assert(FALSE); break; } pszT += (lstrlen(pszT) + 1); } } } MemFree(psz); } } }