1782 lines
66 KiB
C++
1782 lines
66 KiB
C++
#include "pch.hxx"
|
|
#include <prsht.h>
|
|
#include <msident.h>
|
|
#include "acctman.h"
|
|
#include <icwacct.h>
|
|
#include <strconst.h>
|
|
#include "dllmain.h"
|
|
#include "acctui.h"
|
|
#include "server.h"
|
|
#include <shlwapi.h>
|
|
#include "acctimp.h"
|
|
#include <icwwiz.h>
|
|
#include <wininet.h>
|
|
#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);
|
|
}
|
|
}
|
|
}
|