|
|
/////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1993-1996 Microsoft Corporation. All Rights Reserved.
//
// MODULE: Server.cpp
//
// PURPOSE: Contains the dialog callback and supporting functions for
// the Add/Remove news server dialog.
//
#include "pch.hxx"
#include <mimeole.h>
#include <commctrl.h>
#include <wininet.h>
#include <shlwapi.h>
#include <shlwapip.h>
#include <ras.h>
#include "imnact.h"
#include "acctman.h"
#include "connect.h"
#include "acctui.h"
#include "server.h"
#include "strconst.h"
#include "dllmain.h"
#include <icwcfg.h>
#include "resource.h"
#include "accthelp.h"
#include <icwacct.h>
#include <acctimp.h>
#include "icwwiz.h"
#include <wincrypt.h>
#include <wintrust.h>
#include <cryptdlg.h>
#include "htmlhelp.h"
#include "shared.h"
#include "oeconprp.h"
#include "demand.h"
#ifdef _UNICODE
#define _T(x) L ## x
#else
#define _T(x) x
#endif
ASSERTDATA
typedef struct tagFilterInfo { TCHAR *szEmail; BOOL fEncryption; DWORD dwFlags; } ACCTFILTERINFO;
typedef struct tagSVRDLGINFO { SERVER_TYPE sfType; DWORD dwDirty; BOOL dwInit; BOOL fNoValidate; } SVRDLGINFO;
typedef struct tagSECPAGEINFO { PCCERT_CONTEXT pCert; HCERTSTORE hCertStore; PCCERT_CONTEXT pEncryptCert; } SECPAGEINFO;
typedef struct tagSMTPAUTHINFO { BOOL fDirty; SMTPAUTHTYPE authtype; CHAR szUserName[CCHMAX_USERNAME]; CHAR szPassword[CCHMAX_PASSWORD]; BOOL fPromptPassword; } SMTPAUTHINFO, *LPSMTPAUTHINFO;
INT_PTR CALLBACK ServerProp_GeneralDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK ServerProp_ServerDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK ServerProp_AdvancedDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK SmtpLogonSettingsDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK MailServer_GeneralDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK MailServer_ServersDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK MailServer_SecurityDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK MailServer_AdvancedDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK MailServer_IMAPDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK DirServer_GeneralDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK DirServer_AdvancedDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void ImapRemoveTrailingHC(LPSTR pszPath, UINT uiLen); BOOL ValidateAccountName(HWND hwnd, HWND hwndEdit, IImnAccount *pAcct, int *pidsError); void GetAccountName(HWND hwndEdit, IImnAccount *pAcct);
void InitUserInformation(HWND hwnd, IImnAccount *pAcct, BOOL fNews); BOOL ValidateUserInformation(HWND hwnd, IImnAccount *pAcct, BOOL fNews, HWND *phwndErr, int *puIdsErr, BOOL fApply); void GetUserInformation(HWND hwnd, IImnAccount *pAcct, BOOL fNews);
BOOL ValidateServerName(HWND hwnd, HWND hwndEdit, IImnAccount *pAcct, DWORD dwPropSvr, int *pidsError, BOOL fApply); void GetServerName(HWND hwndEdit, IImnAccount *pAcct, DWORD dwPropSvr);
BOOL ValidateLogonSettings(HWND hwnd, DWORD dwDlgFlags, HWND *phwndError, int *pidsError); void GetLogonSettings(HWND hwnd, IImnAccount *pAcct, BOOL fLogon, DWORD srv);
BOOL fWarnDomainName(HWND hwnd, DWORD dwDlgFlags, LPTSTR pszPreviousLoginName);
int CALLBACK PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam);
BOOL ValidateCertificate(HWND hwnd, IImnAccount *pAcct, SVRDLGINFO *psdi, HWND *phwndErr, int *puIdsErr); BOOL DoCertDialog(HWND hwndOwner, HWND hwndEmail, PCCERT_CONTEXT *ppCert, HCERTSTORE hCertStore, int *pidsError, DWORD dwFlags, BOOL fEncription); BOOL CertFilterFunction(PCCERT_CONTEXT pCertContext, LPARAM dwEmailAddr, DWORD dwFlags, DWORD); void GetCertificate(HWND hwnd, IImnAccount *pAcct, SVRDLGINFO *psdi); DWORD InitCertificateData(TCHAR * szEmail, SVRDLGINFO *psdi, IImnAccount *pAcct);
DWORD InitEncryptData(TCHAR * szEmail, SECPAGEINFO *psdi, IImnAccount *pAcct); int CheckKeyUsage(PCCERT_CONTEXT pCert, DWORD dwFlag); HRESULT HrGetHighestSymcaps(LPBYTE * ppbSymcap, ULONG *pcbSymcap); BOOL AdvSec_FillEncAlgCombo(HWND hwnd, IImnAccount *pAcct, PCCERT_CONTEXT * prgCerts); BOOL AdvSec_GetEncryptAlgCombo(HWND hwnd, IImnAccount *pAcct);
void GetDigitalID(HWND hwnd);
DWORD DwGenerateTrustedChain( HWND hwnd, DWORD dwFlags, PCCERT_CONTEXT pcCertToTest, DWORD dwToIgnore, BOOL fFullSearch, DWORD * pcChain, PCCERT_CONTEXT ** prgChain);
#define SERVERPROP_PAGEMAX 7
typedef struct tagSERVERPROP_PAGE { UINT uDlgId; DLGPROC pfnDlg; } SERVERPROP_PAGE;
typedef struct tagSERVERPROP_PARAMS { UINT uIcon; UINT idsCaption; SERVERPROP_PAGE rgPage[SERVERPROP_PAGEMAX]; } SERVERPROP_PARAMS;
static const SERVERPROP_PARAMS c_rgServerPropParams[ACCT_LAST] = { // news
{ idiNewsServer, idsNewsAcctProperties, {{iddServerProp_General, ServerProp_GeneralDlgProc}, {iddServerProp_Server, ServerProp_ServerDlgProc}, {iddServerProp_Connect, ConnectPage_DlgProc}, {iddServerProp_Advanced, ServerProp_AdvancedDlgProc}, {0, NULL}, {0, NULL}, {0, NULL}} },
// mail
{ idiMailServer, idsMailAcctProperties, {{iddMailSvrProp_General, MailServer_GeneralDlgProc}, {iddMailSvrProp_Servers, MailServer_ServersDlgProc}, {iddMailSvrProp_HttpServer, MailServer_ServersDlgProc}, {iddServerProp_Connect, ConnectPage_DlgProc}, {iddMailSvrProp_Security, MailServer_SecurityDlgProc}, {iddMailSvrProp_Advanced, MailServer_AdvancedDlgProc}, {iddMailSvrProp_IMAP, MailServer_IMAPDlgProc}} },
// directory service
{ idiLDAPServer, idsDirSrvAcctProperties, {{iddDirServProp_General, DirServer_GeneralDlgProc}, {iddDirServProp_Advanced, DirServer_AdvancedDlgProc}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}} } };
// generate static prop tables for each of the protocols
#define GEN_PROPS(type) \
{ \ AP_##type##_SERVER, \ AP_##type##_USERNAME, \ AP_##type##_PASSWORD, \ AP_##type##_PROMPT_PASSWORD, \ AP_##type##_USE_SICILY \ }
static MAILSERVERPROPSINFO c_rgMailServerProps[] = { GEN_PROPS(POP3), GEN_PROPS(IMAP), GEN_PROPS(HTTPMAIL), GEN_PROPS(NNTP), { AP_LDAP_SERVER, AP_LDAP_USERNAME, AP_LDAP_PASSWORD, 0, AP_LDAP_AUTHENTICATION } };
#undef GEN_PROPS
// Public constants
BOOL GetServerProps(SERVER_TYPE serverType, LPMAILSERVERPROPSINFO *psp) { Assert(psp);
switch (serverType) { case SERVER_MAIL: *psp = &c_rgMailServerProps[0]; break;
case SERVER_IMAP: *psp = &c_rgMailServerProps[1]; break;
case SERVER_HTTPMAIL: *psp = &c_rgMailServerProps[2]; break;
case SERVER_NEWS: *psp = &c_rgMailServerProps[3]; break;
case SERVER_LDAP: *psp = &c_rgMailServerProps[4]; break;
default: *psp = NULL; break; }
return (NULL != *psp); }
void MarkPageDirty(HWND hwnd, LPARAM page) { PropSheet_QuerySiblings(GetParent(hwnd), SM_SETDIRTY, page); PropSheet_Changed(GetParent(hwnd), hwnd); }
int HandleQuerySiblings(HWND hwnd, SVRDLGINFO *psdi, IImnAccount *pAcct, WPARAM wParam, LPARAM lParam) { int fRet; DWORD dwPage, *pdw; TCHAR sz[CCHMAX_ACCT_PROP_SZ]; HWND hwndT, hwndPage; ULONG uidsError, idCtrl, idd;
Assert(psdi != NULL); Assert(pAcct != NULL);
fRet = TRUE;
switch (wParam) { case MSM_GETSERVERTYPE: Assert(lParam != NULL); Assert(psdi->sfType == SERVER_MAIL || psdi->sfType == SERVER_IMAP || psdi->sfType == SERVER_HTTPMAIL); *((SERVER_TYPE *)lParam) = psdi->sfType; break;
case MSM_GETEMAILADDRESS: GetDlgItemText(hwnd, IDE_EMAIL_ADDRESS, sz, ARRAYSIZE(sz)); StrCpyN((LPTSTR)lParam, sz, CCHMAX_EMAIL_ADDRESS); break;
case MSM_GETDISPLAYNAME: GetDlgItemText(hwnd, IDE_DISPLAY_NAME, sz, ARRAYSIZE(sz)); StrCpyN((LPTSTR)lParam, sz, CCHMAX_DISPLAY_NAME); break;
case SM_SETDIRTY: if (!!(psdi->dwInit & lParam)) psdi->dwDirty = (psdi->dwDirty | (DWORD) lParam); break;
case SM_SAVECHANGES: pdw = (DWORD *)lParam; if (!!(psdi->dwInit & *pdw) && psdi->dwDirty != 0) { psdi->dwDirty = (psdi->dwDirty & ~(*pdw)); if (psdi->dwDirty == 0) { uidsError = 0; dwPage = PAGE_SERVER;
if (psdi->sfType == SERVER_MAIL || psdi->sfType == SERVER_IMAP) { if (FAILED(pAcct->GetPropSz(AP_SMTP_SERVER, sz, ARRAYSIZE(sz)))) { uidsError = idsEnterSmtpServer; idCtrl = IDC_SMTP_EDIT; idd = iddMailSvrProp_Servers; } else if (psdi->sfType == SERVER_MAIL && FAILED(pAcct->GetPropSz(AP_POP3_SERVER, sz, ARRAYSIZE(sz)))) { uidsError = idsEnterPop3Server; idCtrl = IDC_POP3_EDIT; idd = iddMailSvrProp_Servers; } else if (psdi->sfType == SERVER_IMAP && FAILED(pAcct->GetPropSz(AP_IMAP_SERVER, sz, ARRAYSIZE(sz)))) { uidsError = idsEnterIMAPServer; idCtrl = IDC_POP3_EDIT; idd = iddMailSvrProp_Servers; } else if (psdi->sfType == SERVER_HTTPMAIL && FAILED(pAcct->GetPropSz(AP_HTTPMAIL_SERVER, sz, ARRAYSIZE(sz)))) { uidsError = idsEnterHTTPMailServer; idCtrl = IDC_POP3_EDIT; idd = iddMailSvrProp_Servers; } } else if (psdi->sfType == SERVER_NEWS) { if (FAILED(pAcct->GetPropSz(AP_NNTP_SERVER, sz, ARRAYSIZE(sz)))) { uidsError = idsEnterIMAPServer; idCtrl = IDC_NEWSNAME_EDIT; idd = iddServerProp_Server; } }
if (uidsError != 0) { AcctMessageBox(hwnd, MAKEINTRESOURCE(idsAccountManager), MAKEINTRESOURCE(uidsError), 0, MB_ICONEXCLAMATION | MB_OK);
SendMessage(GetParent(hwnd), PSM_SETCURSELID, 0, (LPARAM)idd); hwndPage = PropSheet_GetCurrentPageHwnd(GetParent(hwnd));
psdi->dwDirty = (psdi->dwDirty | dwPage); PropSheet_Changed(GetParent(hwnd), hwndPage);
hwndT = GetDlgItem(hwndPage, idCtrl); SendMessage(hwndT, EM_SETSEL, 0, -1); SetFocus(hwndT);
*pdw = (DWORD)-1;
break; }
pAcct->SaveChanges(); } } break;
case SM_INITIALIZED: psdi->dwInit = (psdi->dwInit | (DWORD) lParam); break;
default: fRet = FALSE; break; }
return(fRet); }
BOOL InvalidAcctProp(HWND hwndPage, HWND hwndEdit, int idsError, UINT idPage) { HWND hwndCurr, hwndParent;
Assert(hwndPage != NULL); Assert(idPage != 0);
hwndParent = GetParent(hwndPage);
if (idsError != 0) AcctMessageBox(hwndPage, MAKEINTRESOURCE(idsAccountManager), MAKEINTRESOURCE(idsError), 0, MB_ICONEXCLAMATION | MB_OK);
hwndCurr = PropSheet_GetCurrentPageHwnd(hwndParent); if (hwndCurr != hwndPage) SendMessage(hwndParent, PSM_SETCURSELID, 0, (LPARAM)idPage);
if (hwndEdit != NULL) { SendMessage(hwndEdit, EM_SETSEL, 0, -1); SetFocus(hwndEdit); }
SetWindowLongPtr(hwndPage, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
return(TRUE); }
void InitAcctPropEdit(HWND hwnd, IImnAccount *pAcct, DWORD dwProp, UINT cchMax) { TCHAR sz[CCHMAX_ACCT_PROP_SZ];
Assert(pAcct != NULL);
SetIntlFont(hwnd); if (SUCCEEDED(pAcct->GetPropSz(dwProp, sz, ARRAYSIZE(sz)))) SetWindowText(hwnd, sz); SendMessage(hwnd, EM_LIMITTEXT, cchMax, 0L); }
// -----------------------------------------------------------------------------
// CAccount::ShowProperties
// -----------------------------------------------------------------------------
STDMETHODIMP CAccount::ShowProperties(HWND hwndParent, DWORD dwFlags) { HRESULT hr; int i, iReturn; PROPSHEETPAGE *ppsp, psp[SERVERPROP_PAGEMAX]; PROPSHEETHEADER psh; SERVERPROP_PARAMS *pProp; SERVERPROP_PAGE *pPage; TCHAR szFmt[256], sz[512]; DWORD dw = 0; BOOL fIMAP; BOOL fHttp; INITCOMMONCONTROLSEX icex = { sizeof(icex), ICC_FLAGS };
Assert(m_AcctType < ACCT_LAST);
// Find out if we're an IMAP server
GetServerTypes(&dw); fIMAP = !!(dw & SRV_IMAP); fHttp = !!(dw & SRV_HTTPMAIL);
if (0 != (dwFlags & ~ACCTDLG_ALL)) return(E_INVALIDARG);
if (m_fNoModifyAccts) return(S_FALSE);
InitCommonControlsEx(&icex);
pProp = (SERVERPROP_PARAMS *)&c_rgServerPropParams[m_AcctType];
psh.nPages = 0;
ppsp = psp; ZeroMemory(psp, sizeof(PROPSHEETPAGE) * 4);
for (pPage = pProp->rgPage, i = 0; i < SERVERPROP_PAGEMAX; pPage++, i++) { if (pPage->pfnDlg == NULL) break;
if (pPage->uDlgId == iddMailSvrProp_Security && !!(dwFlags & ACCTDLG_NO_SECURITY)) continue;
if (pPage->uDlgId == iddMailSvrProp_IMAP && FALSE == fIMAP) continue;
if (pPage->uDlgId == iddMailSvrProp_Advanced && fHttp) continue;
if (pPage->uDlgId == iddMailSvrProp_Servers && fHttp) continue;
if (pPage->uDlgId == iddMailSvrProp_HttpServer && !fHttp) continue;
ppsp->dwSize = sizeof(PROPSHEETPAGE); ppsp->dwFlags = PSP_DEFAULT; ppsp->hInstance = g_hInstRes; if ((pPage->uDlgId == iddServerProp_Connect) && (!!(dwFlags & ACCTDLG_BACKUP_CONNECT))) { ppsp->pszTemplate = MAKEINTRESOURCE(iddServerProp_Connect2); } else { ppsp->pszTemplate = MAKEINTRESOURCE(pPage->uDlgId); } ppsp->pfnDlgProc = pPage->pfnDlg;
//swap out the dialog id and the function proc if
if (((pPage->uDlgId == iddServerProp_Connect) || (pPage->uDlgId == iddServerProp_Connect2)) && (!!(dwFlags & ACCTDLG_INTERNETCONNECTION))) { ppsp->pszTemplate = MAKEINTRESOURCE(iddServerProp_ConnectOE); ppsp->pfnDlgProc = OEConnProp_DlgProc; }
ppsp->lParam = (LPARAM)this; ppsp++; psh.nPages++; }
psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = PSH_USEICONID | PSH_PROPSHEETPAGE; psh.hwndParent = hwndParent; psh.hInstance = g_hInstRes; psh.pszIcon = MAKEINTRESOURCE(pProp->uIcon); if (*m_szName != 0) { LoadString(g_hInstRes, idsAcctPropsFmt, szFmt, ARRAYSIZE(szFmt)); wnsprintf(sz, ARRAYSIZE(sz), szFmt, m_szName); psh.pszCaption = sz; } else { psh.pszCaption = (LPTSTR)IntToPtr(pProp->idsCaption); } psh.nStartPage = 0; psh.ppsp = psp;
// bug 21535
psh.dwFlags |= PSH_USECALLBACK; psh.pfnCallback = PropSheetProc;
m_dwDlgFlags = dwFlags;
iReturn = (int) PropertySheet(&psh);
if (iReturn < 0) hr = E_FAIL; else if (iReturn == 0) hr = S_FALSE; else hr = S_OK;
return(hr); }
//
// FUNCTION: ServerProp_Create()
//
// PURPOSE: Invokes the news server property sheet.
//
// PARAMETERS:
// <in> hwndParent - Handle that will be the parent of this dialog.
// <in> stType - Type of server. Must be in the SERVER_TYPE enum.
// <in> pszName - Friendly name for the server.
// <in> fNew - TRUE to add a new server.
//
// RETURN VALUE:
// TRUE if successful, or FALSE otherwise.
//
BOOL ServerProp_Create(HWND hwndParent, DWORD dwFlags, LPTSTR pszName, IImnAccount **ppAccount) { TCHAR szServer[CCHMAX_SERVER_NAME]; IImnAccount *pAcct; BOOL fReturn = FALSE;
Assert(IsWindow(hwndParent)); Assert(pszName != NULL);
// Get the server object from the account manager
if (FAILED(g_pAcctMan->FindAccount(AP_ACCOUNT_NAME, pszName, &pAcct))) return (FALSE);
Assert(pAcct != NULL);
if (S_OK == pAcct->ShowProperties(hwndParent, dwFlags)) { fReturn = TRUE;
if (ppAccount) { *ppAccount = pAcct; (*ppAccount)->AddRef(); } }
SafeRelease(pAcct);
return (fReturn); }
void UpdateAcctTitle(HWND hwnd, int idCtrl, ACCTTYPE AcctType) { TCHAR sz[512], szAcct[CCHMAX_ACCOUNT_NAME], szFmt[256]; int id, cch;
cch = GetDlgItemText(hwnd, idCtrl, szAcct, ARRAYSIZE(szAcct)); if (cch == 0) { LoadString(g_hInstRes, c_rgServerPropParams[AcctType].idsCaption, sz, ARRAYSIZE(sz)); } else { LoadString(g_hInstRes, idsAcctPropsFmt, szFmt, ARRAYSIZE(szFmt)); wnsprintf(sz, ARRAYSIZE(sz), szFmt, szAcct); }
PropSheet_SetTitle(GetParent(hwnd), 0, sz); }
const static HELPMAP g_rgCtxMapNewsGen[] = { {IDC_SERVERNAME_EDIT, IDH_MAIL_ACCOUNT}, {IDE_DISPLAY_NAME, IDH_NEWS_SERV_NAME}, {IDE_ORG_NAME, IDH_NEWS_SERV_ORG}, {IDE_EMAIL_ADDRESS, IDH_NEWS_SERV_EMAIL_ADD}, {IDE_REPLYTO_EMAIL_ADDRESS, IDH_MAIL_SERV_ADV_REPLY_TO}, {IDC_NEWSPOLL_CHECK, IDH_INCLUDE_NEWS_ACCOUNT}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC2, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC3, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC4, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC5, IDH_INETCOMM_GROUPBOX}, {0, 0}};
INT_PTR CALLBACK ServerProp_GeneralDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL fRet; DWORD dw; int idsError; HWND hwndT; NMHDR *pnmhdr; SVRDLGINFO *psdi; CAccount *pAcct; TCHAR szBuffer[CCHMAX_ACCOUNT_NAME];
pAcct = (CAccount *)GetWindowLongPtr(hwnd, DWLP_USER); psdi = (SVRDLGINFO *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: if (!MemAlloc((void **)&psdi, sizeof(SVRDLGINFO))) return(-1); ZeroMemory(psdi, sizeof(SVRDLGINFO)); psdi->sfType = SERVER_NEWS; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)psdi);
// Get the ServerParams and store them in our extra bytes
pAcct = (CAccount*) ((PROPSHEETPAGE*) lParam)->lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) pAcct);
InitUserInformation(hwnd, pAcct, TRUE);
InitAcctPropEdit(GetDlgItem(hwnd, IDC_SERVERNAME_EDIT), pAcct, AP_ACCOUNT_NAME, CCHMAX_ACCOUNT_NAME - 1);
// Poll this account...
if (!!(pAcct->m_dwDlgFlags & ACCTDLG_NO_NEWSPOLL)) ShowWindow(GetDlgItem(hwnd, IDC_NEWSPOLL_CHECK), SW_HIDE);
if (SUCCEEDED(pAcct->GetPropDw(AP_NNTP_POLL, &dw))) CheckDlgButton(hwnd, IDC_NEWSPOLL_CHECK, dw ? BST_CHECKED : BST_UNCHECKED); else CheckDlgButton(hwnd, IDC_NEWSPOLL_CHECK, BST_UNCHECKED);
psdi->dwInit = (psdi->dwInit | PAGE_GEN); PropSheet_UnChanged(GetParent(hwnd), hwnd); return(TRUE);
case WM_DESTROY: psdi = (SVRDLGINFO *)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (psdi != NULL) MemFree(psdi); break;
case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapNewsGen));
case WM_COMMAND: if (LOWORD(wParam) == IDC_NEWSPOLL_CHECK) { MarkPageDirty(hwnd, PAGE_GEN); } else if (HIWORD(wParam) == EN_CHANGE) { if (LOWORD(wParam) == IDC_SERVERNAME_EDIT) UpdateAcctTitle(hwnd, IDC_SERVERNAME_EDIT, ACCT_NEWS); MarkPageDirty(hwnd, PAGE_GEN); } return (TRUE);
case PSM_QUERYSIBLINGS: return(HandleQuerySiblings(hwnd, psdi, pAcct, wParam, lParam));
case WM_NOTIFY: pnmhdr = (NMHDR *)lParam; switch (pnmhdr->code) { case PSN_APPLY: // BEGIN validation
hwndT = GetDlgItem(hwnd, IDC_SERVERNAME_EDIT); if (!ValidateAccountName(hwnd, hwndT, pAcct, &idsError)) return(InvalidAcctProp(hwnd, hwndT, idsError, iddServerProp_General));
fRet = ValidateUserInformation(hwnd, pAcct, TRUE, &hwndT, &idsError, pnmhdr->code == PSN_APPLY); if (!fRet) return(InvalidAcctProp(hwnd, hwndT, idsError, iddServerProp_General));
// END validation
hwndT = GetDlgItem(hwnd, IDC_SERVERNAME_EDIT); GetAccountName(hwndT, pAcct);
GetUserInformation(hwnd, pAcct, TRUE);
// News Polling
pAcct->SetPropDw(AP_NNTP_POLL, (DWORD) IsDlgButtonChecked(hwnd, IDC_NEWSPOLL_CHECK));
PropSheet_UnChanged(GetParent(hwnd), hwnd); dw = PAGE_GEN; PropSheet_QuerySiblings(GetParent(hwnd), SM_SAVECHANGES, (LPARAM)&dw); if (dw == -1) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE); } break; } return(TRUE); }
return (FALSE); }
BOOL ValidateServerName(HWND hwnd, HWND hwndEdit, IImnAccount *pAcct, DWORD dwPropSvr, int *pidsError, BOOL fApply) { HRESULT hr; int idsSvr, idsPrompt; ULONG cbSize; TCHAR sz[CCHMAX_SERVER_NAME]; DWORD dw;
Assert(hwndEdit != NULL); Assert(pAcct != NULL); Assert(pidsError != NULL);
*pidsError = 0;
switch(dwPropSvr) { case AP_LDAP_SERVER: idsSvr = idsEnterLdapServer; idsPrompt = idsInvalidLdapServer; break; case AP_IMAP_SERVER: idsSvr = idsEnterIMAPServer; idsPrompt = idsInvalidIMAPServer; break; case AP_NNTP_SERVER: idsSvr = idsEnterNntpServer; idsPrompt = idsInvalidNntpServer; break; case AP_POP3_SERVER: idsSvr = idsEnterPop3Server; idsPrompt = idsInvalidPop3Server; break; case AP_SMTP_SERVER: idsSvr = idsEnterSmtpServer; idsPrompt = idsInvalidSmtpServer; break; case AP_HTTPMAIL_SERVER: idsSvr = idsEnterHTTPMailServer; idsPrompt = idsInvalidHTTPMailServer; break; default: Assert(FALSE); break; }
cbSize = GetWindowText(hwndEdit, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, TRUE, TRUE, &cbSize); if (cbSize == 0) { // it is legal to have no smtp server with httpmail
if (dwPropSvr != AP_SMTP_SERVER || FAILED(pAcct->GetServerTypes(&dw)) || !(dw & SRV_HTTPMAIL)) { *pidsError = idsSvr; return(FALSE); } } // if the server hasn't changed, we don't need to validate it
if (0 == SendMessage(hwndEdit, EM_GETMODIFY, 0, 0)) return(TRUE); hr = pAcct->ValidateProperty(dwPropSvr, (LPBYTE)sz, 0); if (FAILED(hr)) { *pidsError = idsSvr; return(FALSE); } else if (hr == S_NonStandardValue && fApply) { if (IDNO == AcctMessageBox(hwnd, MAKEINTRESOURCE(idsAccountManager), MAKEINTRESOURCE(idsPrompt), NULL, MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2)) return(FALSE); }
return(TRUE); }
void GetServerName(HWND hwndEdit, IImnAccount *pAcct, DWORD dwPropSvr) { ULONG cbSize; TCHAR sz[CCHMAX_SERVER_NAME];
Assert(hwndEdit != NULL); Assert(pAcct != NULL);
if (0 != SendMessage(hwndEdit, EM_GETMODIFY, 0, 0)) { cbSize = GetWindowText(hwndEdit, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, TRUE, TRUE, &cbSize); if (cbSize == 0) pAcct->SetProp(dwPropSvr, NULL, 0); else pAcct->SetPropSz(dwPropSvr, sz);
if (dwPropSvr == AP_POP3_SERVER) pAcct->SetProp(AP_IMAP_SERVER, NULL, 0); else if (dwPropSvr == AP_IMAP_SERVER) { DWORD dw;
pAcct->SetProp(AP_POP3_SERVER, NULL, 0); if (FAILED(pAcct->GetPropDw(AP_IMAP_DIRTY, &dw))) dw = 0;
dw |= IMAP_FLDRLIST_DIRTY; pAcct->SetPropDw(AP_IMAP_DIRTY, dw); }
SendMessage(hwndEdit, EM_SETMODIFY, 0, 0); } }
BOOL ValidateLogonSettings(HWND hwnd, DWORD dwDlgFlags, HWND *phwndError, int *pidsError) { TCHAR sz[CCHMAX_ACCT_PROP_SZ]; HWND hwndT; ULONG cbSize;
Assert(hwnd != NULL); Assert(phwndError != NULL); Assert(pidsError != NULL);
BOOL fOE = ISFLAGSET(dwDlgFlags, ACCTDLG_OE); BOOL fSPA = IsDlgButtonChecked(hwnd, IDC_LOGONSSPI_CHECK);
*phwndError = NULL; *pidsError = 0;
hwndT = GetDlgItem(hwnd, IDC_ACCTNAME_EDIT); cbSize = GetWindowText(hwndT, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, TRUE, TRUE, &cbSize); if (fOE && cbSize == 0) { *phwndError = hwndT; *pidsError = idsEnterAcctName; return (FALSE); }
return (TRUE); }
BOOL fWarnDomainName(HWND hwnd, DWORD dwDlgFlags, LPTSTR pszPreviousLoginName) { TCHAR sz[CCHMAX_ACCT_PROP_SZ]; HWND hwndT; ULONG cbSize; BOOL fret = TRUE; BOOL fOE = TRUE; fOE = ISFLAGSET(dwDlgFlags, ACCTDLG_OE);
hwndT = GetDlgItem(hwnd, IDC_ACCTNAME_EDIT); cbSize = GetWindowText(hwndT, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, TRUE, TRUE, &cbSize);
if (fOE && (lstrcmp(pszPreviousLoginName, sz) != 0)) { if (ValidEmailAddressParts(sz, NULL, 0, NULL, 0) != S_OK) { if (IDNO == AcctMessageBox(hwnd, MAKEINTRESOURCE(idsAccountManager), MAKEINTRESOURCE(idsAccountNameErr), NULL, MB_YESNO)) { fret = FALSE; goto exit; } } }
exit: return fret; }
void GetLogonSettings(HWND hwnd, IImnAccount *pAcct, BOOL fLogon, DWORD srv) { HWND hwndT; ULONG cbSize; TCHAR sz[CCHMAX_ACCT_PROP_SZ]; DWORD dw, fOldSicily = FALSE; LPMAILSERVERPROPSINFO pServerProps = NULL; BOOL fIMAPDirty = FALSE;
Assert(pAcct != NULL);
switch (srv) { case SRV_POP3: GetServerProps(SERVER_MAIL, &pServerProps); break;
case SRV_IMAP: GetServerProps(SERVER_IMAP, &pServerProps); break;
case SRV_HTTPMAIL: GetServerProps(SERVER_HTTPMAIL, &pServerProps); break;
case SRV_NNTP: GetServerProps(SERVER_NEWS, &pServerProps); break;
case SRV_LDAP: GetServerProps(SERVER_LDAP, &pServerProps); break;
default: break; }
Assert(NULL != pServerProps);
// Record old SPA setting so we can tell if user went between cleartext/SPA (IMAP dirty)
pAcct->GetPropDw(pServerProps->useSicily, &fOldSicily);
pAcct->SetProp(pServerProps->userName, NULL, 0); pAcct->SetProp(pServerProps->password, NULL, 0); pAcct->SetProp(pServerProps->useSicily, NULL, 0); if (0 != pServerProps->promptPassword) pAcct->SetProp(pServerProps->promptPassword, NULL, 0);
if (fLogon) { // Get User Account Name
hwndT = GetDlgItem(hwnd, IDC_ACCTNAME_EDIT);
// For IMAP, set dirty flag if username changed or went from SPA to cleartext
if (fOldSicily || (SRV_IMAP == srv && SendMessage(hwndT, EM_GETMODIFY, 0, 0))) fIMAPDirty = TRUE;
cbSize = GetWindowText(hwndT, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, TRUE, TRUE, &cbSize); pAcct->SetPropSz(pServerProps->userName, sz);
// Get Password if user didn't tell us to always prompt for it
if (0 != pServerProps->promptPassword) { dw = !IsDlgButtonChecked(hwnd, IDC_REMEMBER_PASSWORD); pAcct->SetPropDw(pServerProps->promptPassword, dw); } else // There is no LDAP setting to always prompt for password
dw = FALSE;
if (FALSE == dw) { cbSize = GetDlgItemText(hwnd, IDC_ACCTPASS_EDIT, sz, ARRAYSIZE(sz)); if (cbSize > 0) pAcct->SetPropSz(pServerProps->password, sz); }
if (!IsDlgButtonChecked(hwnd, IDC_LOGONSSPI_CHECK)) { dw = LDAP_AUTH_PASSWORD; }
else { if (srv != SRV_LDAP) pAcct->SetPropDw(pServerProps->useSicily, TRUE);
// For IMAP, set dirty flag if we went from cleartext to SPA
if (FALSE == fOldSicily) fIMAPDirty = TRUE;
dw = LDAP_AUTH_MEMBER_SYSTEM; } } else { dw = LDAP_AUTH_ANONYMOUS; }
if (srv == SRV_LDAP) pAcct->SetPropDw(pServerProps->useSicily, dw);
if (fIMAPDirty) { if (FAILED(pAcct->GetPropDw(AP_IMAP_DIRTY, &dw))) dw = 0;
dw |= IMAP_FLDRLIST_DIRTY; pAcct->SetPropDw(AP_IMAP_DIRTY, dw); } }
void Server_EnableLogonWindows(HWND hwnd, BOOL fEnable) { HWND hwndT; BOOL fPromptPassword;
hwndT = GetDlgItem(hwnd, IDC_REMEMBER_PASSWORD); if (hwndT != NULL) { fPromptPassword = (BST_CHECKED != SendMessage(hwndT, BM_GETCHECK, 0, 0)); EnableWindow(hwndT, fEnable); } else { fPromptPassword = FALSE; } EnableWindow(GetDlgItem(hwnd, IDC_LOGONSSPI_CHECK), fEnable); EnableWindow(GetDlgItem(hwnd, IDC_ACCTNAME_EDIT), fEnable); EnableWindow(GetDlgItem(hwnd, IDC_ACCTNAME_STATIC), fEnable); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_EDIT), fEnable && !fPromptPassword); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_STATIC), fEnable); }
const static HELPMAP g_rgCtxMapNewsSvr[] = { {IDC_NEWSNAME_EDIT, IDH_NEWS_SERV_INCOMING}, {IDC_LOGON_CHECK, IDH_INETCOMM_SERVER_REQ_LOGON}, {IDC_ACCTNAME_EDIT, IDH_MAIL_SERV_POP3_ACCT}, {IDC_ACCTNAME_STATIC, IDH_MAIL_SERV_POP3_ACCT}, {IDC_ACCTPASS_EDIT, IDH_MAIL_SERV_PWORD}, {IDC_ACCTPASS_STATIC, IDH_MAIL_SERV_PWORD}, {IDC_LOGONSSPI_CHECK, IDH_MAIL_LOGON_USING_SICILY}, {IDC_REMEMBER_PASSWORD, 503}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {0, 0}};
INT_PTR CALLBACK ServerProp_ServerDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HRESULT hr; int idsError; WORD wNotifyCode, wID; BOOL fRet, fLogon, fValid; TCHAR sz[CCHMAX_ACCT_PROP_SZ]; CAccount *pAcct; DWORD flag; HWND hwndT; ULONG cbSize; NMHDR *pnmhdr;
fRet = TRUE; pAcct = (CAccount *)GetWindowLongPtr(hwnd, DWLP_USER);
switch (uMsg) { case WM_INITDIALOG: // Get the ServerParams and store them in our extra bytes
pAcct = (CAccount *)((PROPSHEETPAGE *) lParam)->lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM)pAcct);
InitAcctPropEdit(GetDlgItem(hwnd, IDC_NEWSNAME_EDIT), pAcct, AP_NNTP_SERVER, CCHMAX_SERVER_NAME - 1);
fLogon = FALSE;
if (SUCCEEDED(pAcct->GetPropDw(AP_NNTP_USE_SICILY, (LPDWORD)&flag)) && flag) { CheckDlgButton(hwnd, IDC_LOGONSSPI_CHECK, BST_CHECKED); fLogon = TRUE; }
if (SUCCEEDED(pAcct->GetPropSz(AP_NNTP_USERNAME, sz, ARRAYSIZE(sz))) && *sz != 0) { SetDlgItemText(hwnd, IDC_ACCTNAME_EDIT, sz);
if (SUCCEEDED(pAcct->GetPropSz(AP_NNTP_PASSWORD, sz, ARRAYSIZE(sz)))) SetDlgItemText(hwnd, IDC_ACCTPASS_EDIT, sz);
fLogon = TRUE; }
if (FAILED(pAcct->GetPropDw(AP_NNTP_PROMPT_PASSWORD, &flag))) flag = FALSE; CheckDlgButton(hwnd, IDC_REMEMBER_PASSWORD, flag ? BST_UNCHECKED : BST_CHECKED);
hwndT = GetDlgItem(hwnd, IDC_ACCTNAME_EDIT); SetIntlFont(hwndT); SendMessage(hwndT, EM_LIMITTEXT, CCHMAX_USERNAME - 1, 0L);
SendDlgItemMessage(hwnd, IDC_ACCTPASS_EDIT, EM_LIMITTEXT, CCHMAX_PASSWORD - 1, 0L);
CheckDlgButton(hwnd, IDC_LOGON_CHECK, fLogon); Server_EnableLogonWindows(hwnd, fLogon);
if (SUCCEEDED(pAcct->GetPropDw(AP_SERVER_READ_ONLY, &flag)) && flag) EnableWindow(GetDlgItem(hwnd, IDC_NEWSNAME_EDIT), FALSE);
PropSheet_QuerySiblings(GetParent(hwnd), SM_INITIALIZED, PAGE_SERVER); PropSheet_UnChanged(GetParent(hwnd), hwnd); break;
case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapNewsSvr));
case WM_COMMAND: wNotifyCode = HIWORD(wParam); wID = LOWORD(wParam);
switch (wID) { case IDC_LOGON_CHECK: case IDC_LOGONSSPI_CHECK: Server_EnableLogonWindows(hwnd, IsDlgButtonChecked(hwnd, IDC_LOGON_CHECK));
MarkPageDirty(hwnd, PAGE_SERVER); break;
case IDC_REMEMBER_PASSWORD: flag = IsDlgButtonChecked(hwnd, IDC_REMEMBER_PASSWORD); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_EDIT), flag); MarkPageDirty(hwnd, PAGE_SERVER); break;
default: if (wNotifyCode == EN_CHANGE) MarkPageDirty(hwnd, PAGE_SERVER); break; } break;
case WM_NOTIFY: pnmhdr = (NMHDR *)lParam; switch (pnmhdr->code) { case PSN_APPLY: // BEGIN validation
hwndT = GetDlgItem(hwnd, IDC_NEWSNAME_EDIT); if (!ValidateServerName(hwnd, hwndT, pAcct, AP_NNTP_SERVER, &idsError, pnmhdr->code == PSN_APPLY)) return(InvalidAcctProp(hwnd, hwndT, idsError, iddServerProp_Server));
if (IsDlgButtonChecked(hwnd, IDC_LOGON_CHECK) && !ValidateLogonSettings(hwnd, pAcct->m_dwDlgFlags, &hwndT, &idsError)) return(InvalidAcctProp(hwnd, hwndT, idsError, iddServerProp_Server));
// END validation
hwndT = GetDlgItem(hwnd, IDC_NEWSNAME_EDIT); GetServerName(hwndT, pAcct, AP_NNTP_SERVER);
GetLogonSettings(hwnd, pAcct, IsDlgButtonChecked(hwnd, IDC_LOGON_CHECK), SRV_NNTP);
PropSheet_UnChanged(GetParent(hwnd), hwnd); flag = PAGE_SERVER; PropSheet_QuerySiblings(GetParent(hwnd), SM_SAVECHANGES, (LPARAM)&flag); if (flag == -1) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE); } break; } return(TRUE);
default: fRet = FALSE; break; }
return(fRet); }
BOOL ValidateAccountName(HWND hwnd, HWND hwndT, IImnAccount *pAcct, int *pidsError) { ULONG cbSize; TCHAR szAccount[CCHMAX_ACCOUNT_NAME], szAcctOld[CCHMAX_ACCOUNT_NAME]; IImnAccount *pAcctT;
Assert(IsWindow(hwndT)); Assert(pAcct != NULL); Assert(pidsError != NULL);
*pidsError = 0;
cbSize = GetWindowText(hwndT, szAccount, ARRAYSIZE(szAccount)); if (cbSize == 0) { *pidsError = idsInvalidAccountName; return(FALSE); }
if (0 == SendMessage(hwndT, EM_GETMODIFY, 0, 0)) return(TRUE);
if (FAILED(pAcct->ValidateProperty(AP_ACCOUNT_NAME, (LPBYTE)szAccount, 0))) { *pidsError = idsInvalidAccountName; return(FALSE); }
*szAcctOld = 0; pAcct->GetPropSz(AP_ACCOUNT_NAME, szAcctOld, ARRAYSIZE(szAcctOld));
if (*szAcctOld == 0 || 0 != lstrcmpi(szAccount, szAcctOld)) { // if we're changing the name, then we need to make sure it's unique
if (SUCCEEDED(g_pAcctMan->FindAccount(AP_ACCOUNT_NAME, szAccount, &pAcctT))) { pAcctT->Release(); *pidsError = idsNeedUniqueAccountName; return(FALSE); } }
return(TRUE); }
void GetAccountName(HWND hwndEdit, IImnAccount *pAcct) { UINT cbSize; TCHAR szAccount[CCHMAX_ACCOUNT_NAME];
Assert(IsWindow(hwndEdit));
if (0 != SendMessage(hwndEdit, EM_GETMODIFY, 0, 0)) { cbSize = GetWindowText(hwndEdit, szAccount, ARRAYSIZE(szAccount)); Assert(cbSize > 0);
pAcct->SetPropSz(AP_ACCOUNT_NAME, szAccount);
SendMessage(hwndEdit, EM_SETMODIFY, 0, 0); } }
// TODO: move these to somewhere appropriate
#define TIMEOUT_SEC_MIN 30
#define TIMEOUT_SEC_MAX 5 * 60
#define TIMEOUT_DSEC 30
#define CTIMEOUT (((TIMEOUT_SEC_MAX - TIMEOUT_SEC_MIN) / TIMEOUT_DSEC) + 1)
void InitTimeoutSlider(HWND hwndSlider, HWND hwndText, DWORD dwTimeout) { DWORD dw;
if (dwTimeout < TIMEOUT_SEC_MIN) dwTimeout = TIMEOUT_SEC_MIN; else if (dwTimeout > TIMEOUT_SEC_MAX) dwTimeout = TIMEOUT_SEC_MAX;
dw = (dwTimeout / TIMEOUT_DSEC) - 1;
SendMessage(hwndSlider, TBM_SETRANGE, 0, (LPARAM)MAKELONG(0, CTIMEOUT - 1)); SendMessage(hwndSlider, TBM_SETPOS, TRUE, (LPARAM)dw); SetTimeoutString(hwndText, dw); }
void SetTimeoutString(HWND hwnd, UINT pos) { UINT cch, csec, cmin; TCHAR szOut[128], sz[128];
csec = TIMEOUT_SEC_MIN + (pos * TIMEOUT_DSEC); Assert(csec >= TIMEOUT_SEC_MIN && csec <= TIMEOUT_SEC_MAX);
cmin = csec / 60; csec = csec % 60; if (cmin > 1) { LoadString(g_hInstRes, idsXMinutes, sz, ARRAYSIZE(sz)); wnsprintf(szOut, ARRAYSIZE(szOut), sz, cmin); cch = lstrlen(szOut); } else if (cmin == 1) { cch = LoadString(g_hInstRes, ids1Minute, szOut, ARRAYSIZE(szOut)); } else { cch = 0; }
if (csec != 0) { if (cmin > 0) { szOut[cch] = ' '; cch++; }
LoadString(g_hInstRes, idsXSeconds, sz, ARRAYSIZE(sz)); wnsprintf(&szOut[cch], (ARRAYSIZE(szOut) - cch), sz, csec); }
SetWindowText(hwnd, szOut); }
DWORD GetTimeoutFromSlider(HWND hwnd) { DWORD dw;
dw = (DWORD) SendMessage(hwnd, TBM_GETPOS, 0, 0); dw = TIMEOUT_SEC_MIN + (dw * TIMEOUT_DSEC);
return(dw); }
const static HELPMAP g_rgCtxMapNewsAdv[] = { {IDC_USEDEFAULTS_BUTTON, IDH_NEWS_SERV_ADV_USE_DEFAULTS}, {IDC_SECURECONNECT_BUTTON, IDH_MAIL_ADV_REQ_SSL}, {IDC_TIMEOUT_SLIDER, IDH_NEWS_SERV_ADV_TIMEOUT}, {IDC_TIMEOUT_STATIC, IDH_NEWS_SERV_ADV_TIMEOUT}, {IDC_USEDESC_CHECK, IDH_NEWS_SERV_ADV_DESC}, {IDC_SPLIT_CHECK, IDH_NEWSMAIL_SEND_ADVSET_BREAK_UP}, {IDC_SPLIT_EDIT, IDH_NEWSMAIL_SEND_ADVSET_BREAK_UP}, {IDC_SPLIT_SPIN, IDH_NEWSMAIL_SEND_ADVSET_BREAK_UP}, {IDC_SPLIT_STATIC, IDH_NEWSMAIL_SEND_ADVSET_BREAK_UP}, {IDC_NNTPPORT_EDIT, IDH_NEWS_PORT_NUMBER}, {IDC_FORMAT_CHECK, 691}, {IDC_HTML_RADIO, 692}, {IDC_TEXT_RADIO, 692}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC2, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC3, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC4, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC5, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC6, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC7, IDH_INETCOMM_GROUPBOX}, {0, 0}};
INT_PTR CALLBACK ServerProp_AdvancedDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND hwndT; NMHDR *pnmhdr; DWORD dw, flag, dwPort, dwSplit; WORD code; BOOL fTrans, fSecure; TCHAR szBuffer[CCHMAX_ACCOUNT_NAME]; CAccount *pAcct = (CAccount *)GetWindowLongPtr(hwnd, DWLP_USER);
switch (uMsg) { case WM_INITDIALOG: // Get the ServerParams and store them in our extra bytes
pAcct = (CAccount *) ((PROPSHEETPAGE*) lParam)->lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) pAcct);
// Load the controls with what information we have
if (SUCCEEDED(pAcct->GetPropDw(AP_NNTP_PORT, &dw))) SetDlgItemInt(hwnd, IDC_NNTPPORT_EDIT, dw, FALSE); SendDlgItemMessage(hwnd, IDC_NNTPPORT_EDIT, EM_LIMITTEXT, PORT_CCHMAX, 0); if (SUCCEEDED(pAcct->GetPropDw(AP_NNTP_SSL, (LPDWORD) &fSecure)) && fSecure) { EnableWindow(GetDlgItem(hwnd, IDC_USEDEFAULTS_BUTTON), dw != DEF_SNNTPPORT); CheckDlgButton(hwnd, IDC_SECURECONNECT_BUTTON, TRUE); } else { EnableWindow(GetDlgItem(hwnd, IDC_USEDEFAULTS_BUTTON), dw != DEF_NNTPPORT); }
dw = 0; pAcct->GetPropDw(AP_NNTP_TIMEOUT, &dw); InitTimeoutSlider(GetDlgItem(hwnd, IDC_TIMEOUT_SLIDER), GetDlgItem(hwnd, IDC_TIMEOUT_STATIC), dw);
if (SUCCEEDED(pAcct->GetPropDw(AP_NNTP_USE_DESCRIPTIONS, &dw))) CheckDlgButton(hwnd, IDC_USEDESC_CHECK, dw);
if (!!(pAcct->m_dwDlgFlags & ACCTDLG_NO_BREAKMESSAGES)) { ShowWindow(GetDlgItem(hwnd, IDC_SPLIT_CHECK), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SPLIT_EDIT), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SPLIT_SPIN), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SPLIT_STATIC), SW_HIDE); }
// Break Message Size
dw = OPTION_OFF; // default
if (SUCCEEDED(pAcct->GetPropDw(AP_NNTP_SPLIT_MESSAGES, (LPDWORD)&flag)) && flag) pAcct->GetPropDw(AP_NNTP_SPLIT_SIZE, (LPDWORD)&dw); InitCheckCounter(dw, hwnd, IDC_SPLIT_CHECK, IDC_SPLIT_EDIT, IDC_SPLIT_SPIN, BREAKSIZE_MIN, BREAKSIZE_MAX, DEF_BREAKSIZE);
pAcct->GetPropDw(AP_NNTP_POST_FORMAT, &flag); CheckDlgButton(hwnd, IDC_FORMAT_CHECK, flag != POST_USE_DEFAULT); CheckDlgButton(hwnd, flag == POST_USE_HTML ? IDC_HTML_RADIO : IDC_TEXT_RADIO, TRUE); if (flag == POST_USE_DEFAULT) { EnableWindow(GetDlgItem(hwnd, IDC_HTML_RADIO), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_TEXT_RADIO), FALSE); }
PropSheet_QuerySiblings(GetParent(hwnd), SM_INITIALIZED, PAGE_ADV); PropSheet_UnChanged(GetParent(hwnd), hwnd); return (TRUE);
case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapNewsAdv));
case WM_HSCROLL: // Update the text beside the slider
SetTimeoutString(GetDlgItem(hwnd, IDC_TIMEOUT_STATIC), (UINT) SendMessage((HWND) lParam, TBM_GETPOS, 0, 0));
MarkPageDirty(hwnd, PAGE_ADV); return (TRUE);
case WM_COMMAND: // Any change to the edit controls would cause the "Apply" button
// to enable.
fSecure = IsDlgButtonChecked(hwnd, IDC_SECURECONNECT_BUTTON); code = HIWORD(wParam);
switch (LOWORD(wParam)) { case IDC_NNTPPORT_EDIT: if (code == EN_CHANGE) { dw = GetDlgItemInt(hwnd, IDC_NNTPPORT_EDIT, &fTrans, FALSE); EnableWindow(GetDlgItem(hwnd, IDC_USEDEFAULTS_BUTTON), !fTrans || (fSecure ? (dw != DEF_SNNTPPORT) : (dw != DEF_NNTPPORT)));
MarkPageDirty(hwnd, PAGE_ADV); } break;
case IDC_USEDESC_CHECK: case IDC_TEXT_RADIO: case IDC_HTML_RADIO: MarkPageDirty(hwnd, PAGE_ADV); break;
case IDC_SPLIT_EDIT: if (code == EN_CHANGE) MarkPageDirty(hwnd, PAGE_ADV); break;
case IDC_FORMAT_CHECK: fTrans = IsDlgButtonChecked(hwnd, IDC_FORMAT_CHECK); EnableWindow(GetDlgItem(hwnd, IDC_HTML_RADIO), fTrans); EnableWindow(GetDlgItem(hwnd, IDC_TEXT_RADIO), fTrans);
MarkPageDirty(hwnd, PAGE_ADV); break;
case IDC_SPLIT_CHECK: fTrans = IsDlgButtonChecked(hwnd, IDC_SPLIT_CHECK); EnableWindow(GetDlgItem(hwnd, IDC_SPLIT_EDIT), fTrans); EnableWindow(GetDlgItem(hwnd, IDC_SPLIT_SPIN), fTrans);
MarkPageDirty(hwnd, PAGE_ADV); break;
case IDC_SECURECONNECT_BUTTON: case IDC_USEDEFAULTS_BUTTON: // Reset the settings on this page to the default values.
SetDlgItemInt(hwnd, IDC_NNTPPORT_EDIT, fSecure ? DEF_SNNTPPORT : DEF_NNTPPORT, FALSE); EnableWindow(GetDlgItem(hwnd, IDC_USEDEFAULTS_BUTTON), FALSE);
MarkPageDirty(hwnd, PAGE_ADV);
SetFocus(GetDlgItem(hwnd, IDC_NNTPPORT_EDIT)); break; } return (TRUE);
case WM_NOTIFY: pnmhdr = (NMHDR *)lParam; switch (pnmhdr->code) { case PSN_APPLY: // BEGIN validation
dwPort = GetDlgItemInt(hwnd, IDC_NNTPPORT_EDIT, &fTrans, FALSE); if (!fTrans || dwPort == 0) { hwndT = GetDlgItem(hwnd, IDC_NNTPPORT_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsErrPortNum, iddServerProp_Advanced)); }
dwSplit = 0; dw = IsDlgButtonChecked(hwnd, IDC_SPLIT_CHECK); if (dw != 0) { dwSplit = GetDlgItemInt(hwnd, IDC_SPLIT_EDIT, &fTrans, FALSE); if (!fTrans || dwSplit < BREAKSIZE_MIN || dwSplit > BREAKSIZE_MAX) { hwndT = GetDlgItem(hwnd, IDC_SPLIT_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsEnterBreakSize, iddServerProp_Advanced)); } }
// END validation
pAcct->SetPropDw(AP_NNTP_PORT, dwPort);
dw = IsDlgButtonChecked(hwnd, IDC_SPLIT_CHECK); pAcct->SetPropDw(AP_NNTP_SPLIT_MESSAGES, dw); if (dw != 0) { Assert(dwSplit != 0); pAcct->SetPropDw(AP_NNTP_SPLIT_SIZE, dwSplit); }
dw = GetTimeoutFromSlider(GetDlgItem(hwnd, IDC_TIMEOUT_SLIDER)); pAcct->SetPropDw(AP_NNTP_TIMEOUT, dw);
dw = IsDlgButtonChecked(hwnd, IDC_USEDESC_CHECK); pAcct->SetPropDw(AP_NNTP_USE_DESCRIPTIONS, dw);
dw = IsDlgButtonChecked(hwnd, IDC_SECURECONNECT_BUTTON); pAcct->SetPropDw(AP_NNTP_SSL, dw);
dw = POST_USE_DEFAULT; if (IsDlgButtonChecked(hwnd, IDC_FORMAT_CHECK)) { if (IsDlgButtonChecked(hwnd, IDC_HTML_RADIO)) dw = POST_USE_HTML; else dw = POST_USE_PLAIN_TEXT; } pAcct->SetPropDw(AP_NNTP_POST_FORMAT, dw);
PropSheet_UnChanged(GetParent(hwnd), hwnd); dw = PAGE_ADV; PropSheet_QuerySiblings(GetParent(hwnd), SM_SAVECHANGES, (LPARAM)&dw); if (dw == -1) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE); } break; } return (TRUE); }
return (FALSE); }
void InitUserInformation(HWND hwnd, IImnAccount *pAcct, BOOL fNews) { TCHAR sz[CCHMAX_ACCT_PROP_SZ]; IImnAccount *pAccount; DWORD dwProp; HWND hwndT;
Assert(pAcct != NULL);
pAccount = NULL;
Assert(g_pAcctMan); g_pAcctMan->GetDefaultAccount(fNews ? ACCT_NEWS : ACCT_MAIL, &pAccount);
// Get Display Name
hwndT = GetDlgItem(hwnd, IDE_DISPLAY_NAME); SetIntlFont(hwndT); dwProp = fNews ? AP_NNTP_DISPLAY_NAME : AP_SMTP_DISPLAY_NAME; if (SUCCEEDED(pAcct->GetPropSz(dwProp, sz, ARRAYSIZE(sz))) || (pAccount != NULL && SUCCEEDED(pAccount->GetPropSz(dwProp, sz, ARRAYSIZE(sz))))) { SetWindowText(hwndT, sz); } SendMessage(hwndT, EM_LIMITTEXT, CCHMAX_DISPLAY_NAME - 1, 0L);
// Org Name
InitAcctPropEdit(GetDlgItem(hwnd, IDE_ORG_NAME), pAcct, fNews ? AP_NNTP_ORG_NAME : AP_SMTP_ORG_NAME, CCHMAX_ORG_NAME - 1);
// Sender Email
hwndT = GetDlgItem(hwnd, IDE_EMAIL_ADDRESS); SetIntlFont(hwndT); dwProp = fNews ? AP_NNTP_EMAIL_ADDRESS : AP_SMTP_EMAIL_ADDRESS; if (SUCCEEDED(pAcct->GetPropSz(dwProp, sz, ARRAYSIZE(sz))) || (pAccount != NULL && SUCCEEDED(pAccount->GetPropSz(dwProp, sz, ARRAYSIZE(sz))))) { SetWindowText(hwndT, sz); } SendMessage(hwndT, EM_LIMITTEXT, CCHMAX_EMAIL_ADDRESS - 1, 0L);
// Sender Reply Address
InitAcctPropEdit(GetDlgItem(hwnd, IDE_REPLYTO_EMAIL_ADDRESS), pAcct, fNews ? AP_NNTP_REPLY_EMAIL_ADDRESS : AP_SMTP_REPLY_EMAIL_ADDRESS, CCHMAX_EMAIL_ADDRESS - 1);
if (pAccount != NULL) pAccount->Release(); }
BOOL ValidateUserInformation(HWND hwnd, IImnAccount *pAcct, BOOL fNews, HWND *phwndErr, int *puIdsErr, BOOL fApply) { HRESULT hr; TCHAR sz[CCHMAX_ACCT_PROP_SZ]; DWORD cbSize; HWND hwndT;
*phwndErr = NULL; *puIdsErr = 0;
// Display Name
hwndT = GetDlgItem(hwnd, IDE_DISPLAY_NAME); cbSize = GetWindowText(hwndT, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, FALSE, TRUE, &cbSize); if (cbSize == 0) { *phwndErr = hwndT; *puIdsErr = idsEnterDisplayName; return(FALSE); }
// Email Address
hwndT = GetDlgItem(hwnd, IDE_EMAIL_ADDRESS); cbSize = GetWindowText(hwndT, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, TRUE, TRUE, &cbSize); if (cbSize == 0) { *phwndErr = hwndT; *puIdsErr = idsEnterEmailAddress; return(FALSE); } if (0 != SendMessage(hwndT, EM_GETMODIFY, 0, 0)) { hr = pAcct->ValidateProperty(fNews ? AP_NNTP_EMAIL_ADDRESS : AP_SMTP_EMAIL_ADDRESS, (LPBYTE)sz, 0); if (hr != S_OK && fApply) { if (IDNO == AcctMessageBox(hwnd, MAKEINTRESOURCE(idsAccountManager), MAKEINTRESOURCE(idsInvalidEmailAddress), NULL, MB_YESNO|MB_ICONEXCLAMATION |MB_DEFBUTTON2)) { *phwndErr = hwndT; return(FALSE); } } }
// Reply Toaddress
hwndT = GetDlgItem(hwnd, IDE_REPLYTO_EMAIL_ADDRESS); if (0 != SendMessage(hwndT, EM_GETMODIFY, 0, 0)) { cbSize = GetWindowText(hwndT, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, TRUE, TRUE, &cbSize); if (cbSize > 0) { hr = pAcct->ValidateProperty(fNews ? AP_NNTP_REPLY_EMAIL_ADDRESS : AP_SMTP_REPLY_EMAIL_ADDRESS, (LPBYTE)sz, 0); if (hr != S_OK && fApply) { if (IDNO == AcctMessageBox(hwnd, MAKEINTRESOURCE(idsAccountManager), MAKEINTRESOURCE(idsInvalidReplyToAddress), NULL, MB_YESNO|MB_ICONEXCLAMATION |MB_DEFBUTTON2)) { *phwndErr = hwndT; return(FALSE); } } } }
return(TRUE); }
void GetUserInformation(HWND hwnd, IImnAccount *pAcct, BOOL fNews) { DWORD cbSize; HWND hwndT; TCHAR sz[CCHMAX_ACCT_PROP_SZ];
// Display Name
hwndT = GetDlgItem(hwnd, IDE_DISPLAY_NAME); if (0 != SendMessage(hwndT, EM_GETMODIFY, 0, 0)) { cbSize = GetWindowText(hwndT, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, FALSE, TRUE, &cbSize); Assert(cbSize > 0); Assert(!FIsEmpty(sz)); pAcct->SetPropSz(fNews ? AP_NNTP_DISPLAY_NAME : AP_SMTP_DISPLAY_NAME, sz);
SendMessage(hwndT, EM_SETMODIFY, 0, 0); }
// Organization
hwndT = GetDlgItem(hwnd, IDE_ORG_NAME); if (0 != SendMessage(hwndT, EM_GETMODIFY, 0, 0)) { cbSize = GetWindowText(hwndT, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, FALSE, TRUE, &cbSize); if (cbSize == 0) pAcct->SetProp(fNews ? AP_NNTP_ORG_NAME : AP_SMTP_ORG_NAME, NULL, 0); else pAcct->SetPropSz(fNews ? AP_NNTP_ORG_NAME : AP_SMTP_ORG_NAME, sz);
SendMessage(hwndT, EM_SETMODIFY, 0, 0); }
// Email Address
hwndT = GetDlgItem(hwnd, IDE_EMAIL_ADDRESS); if (0 != SendMessage(hwndT, EM_GETMODIFY, 0, 0)) { cbSize = GetWindowText(hwndT, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, TRUE, TRUE, &cbSize); Assert(cbSize > 0); pAcct->SetPropSz(fNews ? AP_NNTP_EMAIL_ADDRESS : AP_SMTP_EMAIL_ADDRESS, sz);
SendMessage(hwndT, EM_SETMODIFY, 0, 0); }
// Reply Toaddress
hwndT = GetDlgItem(hwnd, IDE_REPLYTO_EMAIL_ADDRESS); if (0 != SendMessage(hwndT, EM_GETMODIFY, 0, 0)) { cbSize = GetWindowText(hwndT, sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, TRUE, TRUE, &cbSize); if (cbSize == 0) pAcct->SetProp(fNews ? AP_NNTP_REPLY_EMAIL_ADDRESS : AP_SMTP_REPLY_EMAIL_ADDRESS, NULL, 0); else pAcct->SetPropSz(fNews ? AP_NNTP_REPLY_EMAIL_ADDRESS : AP_SMTP_REPLY_EMAIL_ADDRESS, sz);
SendMessage(hwndT, EM_SETMODIFY, 0, 0); } }
void EnableCertControls(HWND hwnd) { EnableWindow(GetDlgItem(hwnd, idcCertButton), TRUE); EnableWindow(GetDlgItem(hwnd, idcCertEdit), TRUE); EnableWindow(GetDlgItem(hwnd, idcCryptEdit), TRUE); EnableWindow(GetDlgItem(hwnd, idcCryptButton), TRUE); }
BOOL ValidateCertificate(HWND hwnd, IImnAccount *pAcct, SECPAGEINFO *psdi, HWND *phwndErr, int *puIdsErr) { UINT cbSize; BOOL fRet = TRUE; TCHAR sz[CCHMAX_ACCT_PROP_SZ]; LPSTR szCertEmail = NULL; *puIdsErr = 0; *phwndErr = NULL; cbSize = GetWindowTextLength(GetDlgItem(hwnd, idcCertEdit)); if (cbSize) { GetDlgItemText(hwnd, idcCertAddress, sz, ARRAYSIZE(sz)); Assert(psdi->pCert); szCertEmail = SzGetCertificateEmailAddress(psdi->pCert); if (!szCertEmail || lstrcmpi(szCertEmail, sz)) goto ErrExit; } // More checkings for 2 keys
if(!(psdi->pCert)) { *puIdsErr = 0; return FALSE; } // Check that signing certificate is really signing certificate
if(CheckKeyUsage(psdi->pCert, CERT_DIGITAL_SIGNATURE_KEY_USAGE) < 0) goto ErrExit; // Check email name in encryption certificate
if(szCertEmail) { MemFree(szCertEmail); szCertEmail = NULL; } if(psdi->pEncryptCert) { szCertEmail = SzGetCertificateEmailAddress(psdi->pEncryptCert); if (!szCertEmail || lstrcmpi(szCertEmail, sz)) goto ErrExit; // Check that encryption certificate is really encryption certificate
if(CheckKeyUsage(psdi->pEncryptCert, CERT_KEY_ENCIPHERMENT_KEY_USAGE) < 0) { if(CheckKeyUsage(psdi->pEncryptCert, CERT_KEY_AGREEMENT_KEY_USAGE) < 1) goto ErrExit; } } if(szCertEmail) MemFree(szCertEmail); return fRet; ErrExit: // the certificate's email address does not match the
// current choice for the account
*puIdsErr = idsBadCertChoice; *phwndErr = GetDlgItem(hwnd, idcCertButton); if(szCertEmail) MemFree(szCertEmail); return FALSE; }
void GetCertificate(HWND hwnd, IImnAccount *pAcct, SECPAGEINFO *psdi) { THUMBBLOB tb = {0,0}; if(psdi->pCert) { tb.pBlobData =(BYTE *)PVGetCertificateParam(psdi->pCert, CERT_HASH_PROP_ID, &tb.cbSize); } pAcct->SetProp(AP_SMTP_CERTIFICATE, tb.pBlobData, tb.cbSize); THUMBBLOB tbEncrypt = {0,0}; if(psdi->pEncryptCert) { tbEncrypt.pBlobData =(BYTE *)PVGetCertificateParam(psdi->pEncryptCert, CERT_HASH_PROP_ID, &tbEncrypt.cbSize); AdvSec_GetEncryptAlgCombo(hwnd, pAcct); } pAcct->SetProp(AP_SMTP_ENCRYPT_CERT, tbEncrypt.pBlobData, tbEncrypt.cbSize); return; }
/* InitCertificateData:
** ** Purpose: ** determine if the account has a cert set on it and also initialize ** the SVRDLGINFO. ** Takes: ** [in/out] psdi - the hCertStore and pCert fields will be updated ** [in] pAcct - account to check for currently selected cert ** Returns: ** DWORD(-1) - there was an error. don't ever enable any UI ** 0 - no cert on the account, but no error ** 1 - cert set on account and placed in psdi->pCert */ DWORD InitCertificateData(TCHAR * szEmail, SECPAGEINFO *psdi, IImnAccount *pAcct) { THUMBBLOB tb; DWORD dwRet = DWORD(-1); Assert(psdi && pAcct); if(!psdi->hCertStore) psdi->hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, X509_ASN_ENCODING, NULL, CERT_SYSTEM_STORE_CURRENT_USER, "My"); if (psdi->hCertStore) { dwRet = 0; if (SUCCEEDED(pAcct->GetProp(AP_SMTP_CERTIFICATE, NULL, &tb.cbSize))) { if (MemAlloc((void**)&tb.pBlobData, tb.cbSize)) { if (SUCCEEDED(pAcct->GetProp(AP_SMTP_CERTIFICATE, tb.pBlobData, &tb.cbSize))) { psdi->pCert = CertFindCertificateInStore( psdi->hCertStore, X509_ASN_ENCODING, 0, CERT_FIND_HASH, (void *)(CRYPT_DIGEST_BLOB *)&tb, NULL); if (psdi->pCert) { // Double check, we must be sure that certificate is OK
ACCTFILTERINFO FilterInfo;
FilterInfo.fEncryption = FALSE; FilterInfo.dwFlags = CRYPTDLG_REVOCATION_NONE; // No revocation checking
FilterInfo.szEmail = szEmail;
if(CertFilterFunction(psdi->pCert, (LPARAM)(&FilterInfo), 0, 0)) { dwRet = 1; } else { CertFreeCertificateContext(psdi->pCert); psdi->pCert = NULL; // remove wrong certificate from property
pAcct->SetProp(AP_SMTP_CERTIFICATE, NULL, 0); }
} } } MemFree(tb.pBlobData); } else if(psdi->pEncryptCert) { if(CheckKeyUsage(psdi->pEncryptCert, CERT_DIGITAL_SIGNATURE_KEY_USAGE) >= 0) { psdi->pCert = CertDuplicateCertificateContext(psdi->pEncryptCert); dwRet = 1; }
} } return dwRet; }
/* InitEncryptData
** ** Purpose: ** determine if the account has a encryption cert set on it and also initialize ** the SVRDLGINFO. ** Takes: ** [in/out] psdi - the hCertStore and pCert fields will be updated ** [in] pAcct - account to check for currently selected cert ** Returns: ** DWORD(-1) - there was an error. don't ever enable any UI ** 0 - no cert on the account, but no error ** 1 - cert set on account and placed in psdi->pCert */ DWORD InitEncryptData(TCHAR *szEmail, SECPAGEINFO *psdi, IImnAccount *pAcct) { THUMBBLOB tb; DWORD dwRet = DWORD(-1); DWORD dwUsage = 0; if(!psdi->hCertStore) psdi->hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, X509_ASN_ENCODING, NULL, CERT_SYSTEM_STORE_CURRENT_USER, "My"); if (psdi->hCertStore) { dwRet = 0; if (SUCCEEDED(pAcct->GetProp(AP_SMTP_ENCRYPT_CERT, NULL, &tb.cbSize))) { if (MemAlloc((void**)&tb.pBlobData, tb.cbSize)) { if (SUCCEEDED(pAcct->GetProp(AP_SMTP_ENCRYPT_CERT, tb.pBlobData, &tb.cbSize))) { psdi->pEncryptCert = CertFindCertificateInStore( psdi->hCertStore, X509_ASN_ENCODING, 0, CERT_FIND_HASH, (void *)(CRYPT_DIGEST_BLOB *)&tb, NULL); if (psdi->pEncryptCert) { // Double check, we must be sure that certificate is OK
ACCTFILTERINFO FilterInfo; FilterInfo.fEncryption = TRUE; FilterInfo.dwFlags = CRYPTDLG_REVOCATION_NONE; // no revocation checking
FilterInfo.szEmail = szEmail; if(CertFilterFunction(psdi->pEncryptCert, (LPARAM)(&FilterInfo), 0, 0)) { dwRet = 1; } else { CertFreeCertificateContext(psdi->pEncryptCert); psdi->pEncryptCert = NULL; // remove wrong certificate from property
pAcct->SetProp(AP_SMTP_ENCRYPT_CERT, NULL, 0); } } } } MemFree(tb.pBlobData); } // if encryption certificate was not set
// check that current signing certificate can be used for encryption
else if(psdi->pCert) { if((CheckKeyUsage(psdi->pCert, CERT_KEY_ENCIPHERMENT_KEY_USAGE) >= 0) || (CheckKeyUsage(psdi->pCert, CERT_KEY_AGREEMENT_KEY_USAGE) > 0))
{ psdi->pEncryptCert = CertDuplicateCertificateContext(psdi->pCert); dwRet = 1; }
} } return dwRet; }
// Check key usage field in certificate.
// Usage:
// CheckKeyUsage(PCCERT_CONTEXT pCert, DWORD dwFlag);
// where dwFlag is tested flaf of KeyUsage field
//
// Return
// 1 - flag is set
// 0 - key usage field not found in certificate
// -1 - flag is NOT set in key usage field.
int CheckKeyUsage(PCCERT_CONTEXT pCert, DWORD dwFlag) { DWORD dwUsage = 0; HRESULT hr = S_OK;
hr = HrGetCertKeyUsage(pCert, &dwUsage); if(SUCCEEDED(hr)) { if(dwUsage & dwFlag) return(1); else return(-1); } else // Certificate doesn't have KeyUsage field (like VeriSign),
return(0); } BOOL DoCertDialog(HWND hwndOwner, HWND hwndEmail, PCCERT_CONTEXT *ppCert, HCERTSTORE hCertStore, int *puIdsErr, DWORD dwFlags, BOOL fEncription) { TCHAR szEmail[CCHMAX_ACCT_PROP_SZ]; TCHAR sz[CCHMAX_ACCT_PROP_SZ]; DWORD cchEmail; CERT_SELECT_STRUCT css; PCCERT_CONTEXT pCurCert; BOOL fRet = FALSE; ACCTFILTERINFO FilterInfo;
*puIdsErr = 0;
cchEmail = GetWindowText(hwndEmail, szEmail, ARRAYSIZE(szEmail)); if (cchEmail) { memset(&css, 0, sizeof(css));
pCurCert = CertDuplicateCertificateContext(*ppCert);
LoadString(g_hInstRes, idsSelectCertTitle, sz, ARRAYSIZE(sz));
css.dwSize = sizeof(css); css.hwndParent = hwndOwner; css.hInstance = g_hInstRes; css.szTitle = sz; css.dwFlags = dwFlags; // hack
FilterInfo.fEncryption = fEncription; FilterInfo.dwFlags = dwFlags; FilterInfo.szEmail = szEmail; css.lCustData = (LPARAM)(&FilterInfo); css.arrayCertStore = &hCertStore; css.cCertStore = 1; css.szPurposeOid = szOID_PKIX_KP_EMAIL_PROTECTION; css.arrayCertContext = ppCert; css.cCertContext = 1; #ifdef DEBUG
if (GetAsyncKeyState(VK_SHIFT) & 0x8000) css.pfnFilter = NULL; else css.pfnFilter = CertFilterFunction; #else
css.pfnFilter = CertFilterFunction; #endif
if (CertSelectCertificate(&css) && (pCurCert != *ppCert)) { fRet = TRUE; } CertFreeCertificateContext(pCurCert); } else *puIdsErr = idsNeedEmailForCert;
return fRet; }
#define FILETIME_SECOND 10000000 // 100ns intervals per second
#define TIME_DELTA_SECONDS 600 // 10 minutes in seconds
BOOL CertFilterFunction(PCCERT_CONTEXT pCertContext, LPARAM lParam, DWORD dwFlags, DWORD) { // return TRUE to show, FALSE to hide
BOOL fRet = FALSE; FILETIME FileTime; SYSTEMTIME SysTime; ACCTFILTERINFO * pFilterInfo = (ACCTFILTERINFO *) lParam;
LONG lRet = 0;
PCCERT_CONTEXT *rgCertChain = NULL; DWORD cCertChain = 0; const DWORD dwIgnore = CERT_VALIDITY_NO_CRL_FOUND | CERT_VALIDITY_BEFORE_START | CERT_VALIDITY_AFTER_END | CERT_VALIDITY_NO_TRUST_DATA; LPSTR szCertEmail = SzGetCertificateEmailAddress(pCertContext); GetSystemTime(&SysTime); if(SystemTimeToFileTime(&SysTime, &FileTime)) { lRet = CertVerifyTimeValidity(&FileTime, pCertContext->pCertInfo); if(lRet < 0) { FILETIME ftNow; __int64 i64Offset;
union { FILETIME ftDelta; __int64 i64Delta; };
GetSystemTimeAsFileTime(&ftNow);
i64Delta = ftNow.dwHighDateTime; i64Delta = i64Delta << 32; i64Delta += ftNow.dwLowDateTime;
// Add the offset into the original time to get us a new time to check
i64Offset = FILETIME_SECOND; i64Offset *= TIME_DELTA_SECONDS; i64Delta += i64Offset;
lRet = CertVerifyTimeValidity(&ftDelta, pCertContext->pCertInfo); } if(lRet != 0) return FALSE; } if (szCertEmail) { fRet = !(BOOL(lstrcmpi(szCertEmail, pFilterInfo->szEmail))); MemFree(szCertEmail); if(!fRet) return(FALSE); } if(pFilterInfo->fEncryption) { if(CheckKeyUsage(pCertContext, CERT_KEY_ENCIPHERMENT_KEY_USAGE) < 0) { if(CheckKeyUsage(pCertContext, CERT_KEY_AGREEMENT_KEY_USAGE) < 1) return(FALSE); } } else { if(CheckKeyUsage(pCertContext, CERT_DIGITAL_SIGNATURE_KEY_USAGE) < 0) return(FALSE); } if(pFilterInfo->dwFlags) // if flags != 0 check certificate
{ DWORD dwErr = DwGenerateTrustedChain(NULL, pFilterInfo->dwFlags, pCertContext, dwIgnore, TRUE, &cCertChain, &rgCertChain); if (rgCertChain) { for (cCertChain--; int(cCertChain) >= 0; cCertChain--) CertFreeCertificateContext(rgCertChain[cCertChain]); MemFree(rgCertChain); } if(dwErr != 0) return(FALSE); } return(fRet); }
static const TCHAR c_szOpen[] = TEXT("open"); static const TCHAR c_szIexplore[] = TEXT("iexplore.exe");
const static HELPMAP g_rgCtxMapMailSec[] = { {idcCertCheck, IDH_GENERAL_USE_CERTIFICATE}, {idcCertButton, IDH_GENERAL_SELECT_CERTIFICATE}, {IDC_GETCERT, IDH_INETCOM_GET_DIGITAL_ID}, {IDC_MOREINFO, IDH_INETCOM_MORE_ON_CERTIFICATES}, {idcCertEdit, IDH_SECURITY_SIGNING_CERT}, {idcCryptEdit, IDH_SECURITY_ENCRYPTING_CERT}, {idcCryptButton, IDH_SECURITY_SELECT_ENCRYPTCERT}, {IDC_ALGCOMBO, IDH_SECURITY_ADV_ENCRYPTION}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC2, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC3, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC4, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC5, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC6, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC7, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC8, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC10, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC11, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC12, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC13, IDH_INETCOMM_GROUPBOX},
{0, 0} };
INT_PTR CALLBACK MailServer_SecurityDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { NMHDR *pnmhdr; CAccount *pAcct; TCHAR sz[CCHMAX_ACCT_PROP_SZ]; DWORD dw; BOOL fRet; int idsError; HWND hwndT; SECPAGEINFO *pcpi; pAcct = (CAccount *)GetWindowLongPtr(hwnd, DWLP_USER); pcpi = (SECPAGEINFO *)GetWindowLongPtr(hwnd, GWLP_USERDATA); switch (uMsg) { case WM_INITDIALOG: // Get the ServerParams and store them in our extra bytes
pAcct = (CAccount *)((PROPSHEETPAGE *)lParam)->lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) pAcct); Assert(pcpi == NULL); if (!MemAlloc((void **)&pcpi, sizeof(SECPAGEINFO))) return(-1); ZeroMemory(pcpi, sizeof(SECPAGEINFO)); hwndT = GetDlgItem(hwnd, idcCertEdit); SetIntlFont(hwndT); PropSheet_QuerySiblings(GetParent(hwnd), MSM_GETEMAILADDRESS, (LPARAM)sz); SetDlgItemText(hwnd, idcCertAddress, sz); dw = InitCertificateData(sz, pcpi, pAcct); if (1 == dw) { Assert(pcpi->pCert); if (GetFriendlyNameOfCert(pcpi->pCert, sz, ARRAYSIZE(sz))) SendMessage(hwndT, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)sz); } else if (-1 == dw) { EnableWindow(GetDlgItem(hwnd, idcCertCheck), FALSE); } GetDlgItemText(hwnd, idcCertAddress, sz, ARRAYSIZE(sz)); dw = InitEncryptData(sz, pcpi, pAcct); if(dw == 1) { Assert(pcpi->pEncryptCert); hwndT = GetDlgItem(hwnd, idcCryptEdit); SetIntlFont(hwndT); if (GetFriendlyNameOfCert(pcpi->pEncryptCert, sz, ARRAYSIZE(sz))) SendMessage(hwndT, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)sz); } // Always fill this combo
AdvSec_FillEncAlgCombo(hwnd, pAcct, (dw == 1) ? &pcpi->pEncryptCert : NULL ); SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pcpi); EnableCertControls(hwnd); PropSheet_QuerySiblings(GetParent(hwnd), SM_INITIALIZED, PAGE_SEC); PropSheet_UnChanged(GetParent(hwnd), hwnd); return (TRUE); case WM_DESTROY: if (pcpi != NULL) { if (pcpi->pCert) CertFreeCertificateContext(pcpi->pCert); if (pcpi->pEncryptCert) CertFreeCertificateContext(pcpi->pEncryptCert); if (pcpi->hCertStore) CertCloseStore(pcpi->hCertStore, 0); MemFree(pcpi); } break; case PSM_QUERYSIBLINGS: if (wParam == MSM_GETCERTDATA) { if (IsDlgButtonChecked(hwnd, idcCertCheck)) { ((SECPAGEINFO *)lParam)->pCert = pcpi->pCert; ((SECPAGEINFO *)lParam)->hCertStore = pcpi->hCertStore; } return(TRUE); } break; case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapMailSec)); case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_ALGCOMBO: if(GET_WM_COMMAND_CMD(wParam, lParam) == CBN_SELENDOK) MarkPageDirty(hwnd, PAGE_SEC); break;
case idcCertCheck: EnableCertControls(hwnd); MarkPageDirty(hwnd, PAGE_SEC); break; case idcCertButton: hwndT = GetDlgItem(hwnd, idcCertAddress); if (DoCertDialog(hwnd, hwndT, &pcpi->pCert, pcpi->hCertStore, &idsError, ((pAcct->m_dwDlgFlags & ACCTDLG_REVOCATION) ? CRYPTDLG_REVOCATION_ONLINE : CRYPTDLG_REVOCATION_NONE), FALSE)) { if (GetFriendlyNameOfCert(pcpi->pCert, sz, ARRAYSIZE(sz))) SetDlgItemText(hwnd, idcCertEdit, sz); MarkPageDirty(hwnd, PAGE_SEC); } else if (idsError) InvalidAcctProp(hwnd, hwndT, idsError, iddMailSvrProp_Security); break; case idcCryptButton: hwndT = GetDlgItem(hwnd, idcCertAddress); if (DoCertDialog(hwnd, hwndT, &pcpi->pEncryptCert, pcpi->hCertStore, &idsError, ((pAcct->m_dwDlgFlags & ACCTDLG_REVOCATION) ? CRYPTDLG_REVOCATION_ONLINE : CRYPTDLG_REVOCATION_NONE), TRUE)) { if (GetFriendlyNameOfCert(pcpi->pEncryptCert, sz, ARRAYSIZE(sz))) SetDlgItemText(hwnd, idcCryptEdit, sz); MarkPageDirty(hwnd, PAGE_SEC); } else if (idsError) InvalidAcctProp(hwnd, hwndT, idsError, iddMailSvrProp_Security); EnableCertControls(hwnd); break; case IDC_GETCERT: GetDigitalID(hwnd); break; case IDC_MOREINFO: OEHtmlHelp(hwnd, "%SYSTEMROOT%\\help\\msoe.chm>large_context", HH_DISPLAY_TOPIC, (ULONG_PTR) (LPCSTR) "mail_overview_send_secure_messages.htm"); break; } break; case WM_NOTIFY: pnmhdr = (NMHDR *)lParam; switch (pnmhdr->code) { case PSN_SETACTIVE: PropSheet_QuerySiblings(GetParent(hwnd), MSM_GETEMAILADDRESS, (LPARAM)sz); SetDlgItemText(hwnd, idcCertAddress, sz); break; case PSN_APPLY: // BEGIN validation
#ifdef DEBUG
if (!(GetAsyncKeyState(VK_SHIFT) & 0x8000)) { #endif
fRet = ValidateCertificate(hwnd, pAcct, pcpi, &hwndT, &idsError); if (!fRet) { if(idsError != 0) return(InvalidAcctProp(hwnd, hwndT, idsError, iddMailSvrProp_Security)); else return FALSE; } #ifdef DEBUG
} #endif
// END validation
GetCertificate(hwnd, pAcct, pcpi); PropSheet_UnChanged(GetParent(hwnd), hwnd); dw = PAGE_SEC; PropSheet_QuerySiblings(GetParent(hwnd), SM_SAVECHANGES, (LPARAM)&dw); if (dw == -1) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE); } break; } return(TRUE); } return (FALSE); }
INT_PTR CALLBACK CertAddressErrorDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { HICON hicon; BOOL fRet = TRUE;
switch (msg) { case WM_INITDIALOG: hicon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_EXCLAMATION)); if (hicon != NULL) SendDlgItemMessage(hwnd, IDC_ERR_STATIC, STM_SETICON, (WPARAM)hicon, 0); MessageBeep(MB_ICONEXCLAMATION); break;
case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) EndDialog(hwnd, LOWORD(wParam)); break;
default: fRet = FALSE; break; }
return(fRet); }
const static HELPMAP g_rgCtxMapMailGen[] = { {IDC_SERVERNAME_EDIT, IDH_MAIL_ACCOUNT}, {IDE_DISPLAY_NAME, IDH_NEWS_SERV_NAME}, {IDE_ORG_NAME, IDH_NEWS_SERV_ORG}, {IDE_EMAIL_ADDRESS, IDH_NEWS_SERV_EMAIL_ADD}, {IDE_REPLYTO_EMAIL_ADDRESS, IDH_MAIL_SERV_ADV_REPLY_TO}, {IDC_RECVFULL_INCLUDE, IDH_INCLUDEACCT_IN_SENDREC}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC2, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC3, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC4, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC5, IDH_INETCOMM_GROUPBOX}, {0, 0}};
INT_PTR CALLBACK MailServer_GeneralDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { NMHDR *pnmhdr; CAccount *pAcct; TCHAR *pszEmail, sz[CCHMAX_ACCT_PROP_SZ]; DWORD dw; BOOL fRet, fFree, fError; SVRDLGINFO *psdi; SECPAGEINFO cpi; INT idsError; HWND hwndT;
pAcct = (CAccount *)GetWindowLongPtr(hwnd, DWLP_USER); psdi = (SVRDLGINFO *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: // Get the ServerParams and store them in our extra bytes
pAcct = (CAccount *)((PROPSHEETPAGE *)lParam)->lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) pAcct);
Assert(psdi == NULL); if (!MemAlloc((void **)&psdi, sizeof(SVRDLGINFO))) return(-1); ZeroMemory(psdi, sizeof(SVRDLGINFO));
// figure out if we're a mail or imap account
psdi->sfType = SERVER_MAIL; // mail will be default for now...
if (SUCCEEDED(pAcct->GetServerTypes(&dw))) { if (!!(dw & SRV_IMAP)) psdi->sfType = SERVER_IMAP; else if (!!(dw & SRV_HTTPMAIL)) psdi->sfType = SERVER_HTTPMAIL; }
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)psdi);
InitUserInformation(hwnd, pAcct, FALSE);
// Set Account Name
InitAcctPropEdit(GetDlgItem(hwnd, IDC_SERVERNAME_EDIT), pAcct, AP_ACCOUNT_NAME, CCHMAX_ACCOUNT_NAME - 1); // if the account is an msn-related http account, swap in the msn icon
if (SERVER_HTTPMAIL == psdi->sfType) { DWORD dwMsnDomain = 0; if (SUCCEEDED(pAcct->GetPropDw(AP_HTTPMAIL_DOMAIN_MSN, &dwMsnDomain)) && dwMsnDomain) { HICON hicon = LoadIcon(g_hInstRes, MAKEINTRESOURCE(idiMsnServer)); if (NULL != hicon) SendDlgItemMessage(hwnd, IDC_MAILSERVER_ICON, STM_SETICON, (WPARAM)hicon, 0); } }
// POP3 Skip Account/IMAP Poll Unread
if (SERVER_IMAP == psdi->sfType) { int iIMAPStringRes;
if (pAcct->m_dwDlgFlags & ACCTDLG_NO_IMAPPOLL) iIMAPStringRes = idsIMAPPollInbox; else iIMAPStringRes = idsIMAPPollForUnread;
/*
// Replace default POP3 text with text that better suits IMAP
LoadString(g_hInstRes, iIMAPStringRes, sz, sizeof(sz)); SetWindowText(GetDlgItem(hwnd, IDC_RECVFULL_INCLUDE), sz); */ // Load current setting and set checkbox to indicate it
if (FAILED(pAcct->GetPropDw(AP_IMAP_POLL, &dw))) dw = FALSE; // By default, we don't poll for IMAP
CheckDlgButton(hwnd, IDC_RECVFULL_INCLUDE, dw ? BST_CHECKED : BST_UNCHECKED); } // if
else if (SERVER_HTTPMAIL == psdi->sfType) { dw = FALSE; pAcct->GetPropDw(AP_HTTPMAIL_POLL, &dw); CheckDlgButton(hwnd, IDC_RECVFULL_INCLUDE, dw ? BST_CHECKED : BST_UNCHECKED); } else { if (!!(pAcct->m_dwDlgFlags & ACCTDLG_NO_SENDRECEIVE)) ShowWindow(GetDlgItem(hwnd, IDC_RECVFULL_INCLUDE), SW_HIDE); else { if (SUCCEEDED(pAcct->GetPropDw(AP_POP3_SKIP, &dw))) CheckDlgButton(hwnd, IDC_RECVFULL_INCLUDE, dw ? BST_UNCHECKED : BST_CHECKED); else CheckDlgButton(hwnd, IDC_RECVFULL_INCLUDE, BST_CHECKED); } // else
} // else
psdi->dwInit = (psdi->dwInit | PAGE_GEN); PropSheet_UnChanged(GetParent(hwnd), hwnd); return (TRUE);
case WM_DESTROY: if (psdi != NULL) MemFree(psdi); break;
case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapMailGen));
case PSM_QUERYSIBLINGS: Assert(psdi != NULL); Assert(pAcct != NULL); return(HandleQuerySiblings(hwnd, psdi, pAcct, wParam, lParam));
case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_RECVFULL_INCLUDE: MarkPageDirty(hwnd, PAGE_GEN); break;
default: if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE) { if (LOWORD(wParam) == IDC_SERVERNAME_EDIT) UpdateAcctTitle(hwnd, IDC_SERVERNAME_EDIT, ACCT_MAIL); MarkPageDirty(hwnd, PAGE_GEN); } break; } break;
case WM_NOTIFY: pnmhdr = (NMHDR *)lParam; switch (pnmhdr->code) { case PSN_APPLY: // BEGIN validation
if (psdi->fNoValidate) { Assert(pnmhdr->code == PSN_KILLACTIVE); break; }
#ifdef DEBUG
if (!(GetAsyncKeyState(VK_SHIFT) & 0x8000)) { #endif
hwndT = GetDlgItem(hwnd, IDC_SERVERNAME_EDIT); if (!ValidateAccountName(hwnd, hwndT, pAcct, &idsError)) return(InvalidAcctProp(hwnd, hwndT, idsError, iddMailSvrProp_General));
fRet = ValidateUserInformation(hwnd, pAcct, FALSE, &hwndT, &idsError, pnmhdr->code == PSN_APPLY); if (!fRet) return(InvalidAcctProp(hwnd, hwndT, idsError, iddMailSvrProp_General));
if (0 == (pAcct->m_dwDlgFlags & ACCTDLG_NO_SECURITY)) { fError = FALSE; ZeroMemory(&cpi, sizeof(SECPAGEINFO)); hwndT = GetDlgItem(hwnd, IDE_EMAIL_ADDRESS); GetWindowText(hwndT, sz, ARRAYSIZE(sz)); if (!!(psdi->dwInit & PAGE_SEC)) { // the security page exists, so ask it for the cert info
PropSheet_QuerySiblings(GetParent(hwnd), MSM_GETCERTDATA, (LPARAM)&cpi); fFree = FALSE; } else { // the security page hasn't been initialized yet,
// so we need to get this info from the acct
dw = InitCertificateData(sz, &cpi, pAcct); Assert((dw != 1) ^ (cpi.pCert != NULL)); fFree = TRUE; InitEncryptData(sz, &cpi, pAcct); }
if (cpi.pCert != NULL) { pszEmail = SzGetCertificateEmailAddress(cpi.pCert); if (lstrcmpi(pszEmail, sz) != 0) { idsError = (INT) DialogBox(g_hInstRes, MAKEINTRESOURCE(iddCertAddressError), hwnd, CertAddressErrorDlgProc); switch (idsError) { case IDCANCEL: SendMessage(hwndT, EM_SETSEL, 0, -1); SetFocus(hwndT); SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); fError = TRUE; break;
case IDC_CHANGE_ADDR: SetWindowText(hwndT, pszEmail); SendMessage(hwndT, EM_SETMODIFY, TRUE, 0); break;
case IDC_NEW_CERT: psdi->fNoValidate = TRUE; SendMessage(GetParent(hwnd), PSM_SETCURSELID, 0, (LPARAM)iddMailSvrProp_Security); psdi->fNoValidate = FALSE;
SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); fError = TRUE; break; } } if(pszEmail) MemFree(pszEmail); }
if (cpi.pCert != NULL && fFree) CertFreeCertificateContext(cpi.pCert); if (cpi.pEncryptCert != NULL && fFree) CertFreeCertificateContext(cpi.pEncryptCert); if (cpi.hCertStore != NULL && fFree) CertCloseStore(cpi.hCertStore, 0);
if (fError) return(TRUE); } #ifdef DEBUG
} #endif
// END validation
hwndT = GetDlgItem(hwnd, IDC_SERVERNAME_EDIT); GetAccountName(hwndT, pAcct);
GetUserInformation(hwnd, pAcct, FALSE);
// Skip During Send and Receive (POP) --OR--
// Poll for Unread Count (IMAP)
if (SERVER_IMAP == psdi->sfType) pAcct->SetPropDw(AP_IMAP_POLL, (DWORD) IsDlgButtonChecked (hwnd, IDC_RECVFULL_INCLUDE)); else if (SERVER_HTTPMAIL == psdi->sfType) pAcct->SetPropDw(AP_HTTPMAIL_POLL, (DWORD) IsDlgButtonChecked (hwnd, IDC_RECVFULL_INCLUDE)); else pAcct->SetPropDw(AP_POP3_SKIP, (DWORD)!IsDlgButtonChecked(hwnd, IDC_RECVFULL_INCLUDE));
PropSheet_UnChanged(GetParent(hwnd), hwnd); dw = PAGE_GEN; PropSheet_QuerySiblings(GetParent(hwnd), SM_SAVECHANGES, (LPARAM)&dw); if (dw == -1) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE); } break; } return(TRUE); }
return (FALSE); }
const static HELPMAP g_rgCtxMapMailSvr[] = { {IDC_SMTP_EDIT, IDH_MAIL_SERV_OUTGOING}, {IDC_POP3_EDIT, IDH_MAIL_SERV_INCOMING}, {IDC_IN_MAIL_STATIC, IDH_MAIL_SERV_INCOMING}, {idcPOP_OR_IMAP, IDH_INETCOMM_MY_INCOMING_SERVER_IS}, {IDC_SERVER_STATIC, IDH_INETCOMM_MY_INCOMING_SERVER_IS}, {IDC_SERVER1_STATIC, IDH_INETCOMM_MY_INCOMING_SERVER_IS}, {IDC_LOGON_CHECK, IDH_INETCOMM_SERVER_REQ_LOGON}, {IDC_ACCTNAME_EDIT, IDH_MAIL_SERV_POP3_ACCT}, {IDC_ACCTNAME_STATIC, IDH_MAIL_SERV_POP3_ACCT}, {IDC_ACCTPASS_EDIT, IDH_MAIL_SERV_PWORD}, {IDC_ACCTPASS_STATIC, IDH_MAIL_SERV_PWORD}, {IDC_LOGONSSPI_CHECK, IDH_MAIL_LOGON_USING_SICILY}, {IDC_SMTP_SASL, IDH_MAIL_OUT_AUTH}, {IDC_SMTPLOGON, IDH_MAIL_OUT_SETTINGS}, {IDC_REMEMBER_PASSWORD, 503}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC2, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC3, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC4, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC5, IDH_INETCOMM_GROUPBOX}, {0, 0}};
INT_PTR CALLBACK MailServer_ServersDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static SMTPAUTHINFO s_rAuth; int idsError; HWND hwndT; ULONG cbSize; NMHDR *pnmhdr; TCHAR sz[CCHMAX_ACCT_PROP_SZ]; DWORD dw, dwPromptForPassword; BOOL fEnable, fIMAP, fHTTPMail; SERVER_TYPE sfType, sfTypeT; LPMAILSERVERPROPSINFO pProps = NULL; CAccount *pAcct = (CAccount *)GetWindowLongPtr(hwnd, DWLP_USER); TCHAR szPreviousLoginName[CCHMAX_ACCT_PROP_SZ];
switch (uMsg) { case WM_INITDIALOG: // Get the ServerParams and store them in our extra bytes
pAcct = (CAccount *)((PROPSHEETPAGE *)lParam)->lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) pAcct);
// figure out what kind of server we are
PropSheet_QuerySiblings(GetParent(hwnd), MSM_GETSERVERTYPE, (LPARAM)&sfType);
GetServerProps(sfType, &pProps); Assert(pProps);
fIMAP = (sfType == SERVER_IMAP); fHTTPMail = (SERVER_HTTPMAIL == sfType); // Init
ZeroMemory(&s_rAuth, sizeof(SMTPAUTHINFO));
if (!fHTTPMail) { // Smtp Auth Type
Assert(sizeof(s_rAuth.authtype) == sizeof(DWORD)); if (FAILED(pAcct->GetPropDw(AP_SMTP_USE_SICILY, (LPDWORD)&s_rAuth.authtype))) s_rAuth.authtype = SMTP_AUTH_NONE;
// If smtp auth...
if (SMTP_AUTH_NONE != s_rAuth.authtype) { // Check the button
CheckDlgButton(hwnd, IDC_SMTP_SASL, BST_CHECKED);
if (SUCCEEDED(pAcct->GetPropSz(AP_SMTP_USERNAME, sz, ARRAYSIZE(sz)))) StrCpyN(s_rAuth.szUserName, sz, ARRAYSIZE(s_rAuth.szUserName));
if (SUCCEEDED(pAcct->GetPropDw(AP_SMTP_PROMPT_PASSWORD, &dw))) s_rAuth.fPromptPassword = dw;
if (SUCCEEDED(pAcct->GetPropSz(AP_SMTP_PASSWORD, sz, ARRAYSIZE(sz)))) StrCpyN(s_rAuth.szPassword, sz, ARRAYSIZE(s_rAuth.szPassword)); } else EnableWindow(GetDlgItem(hwnd, IDC_SMTPLOGON), FALSE); }
if (!!(pAcct->m_dwDlgFlags & ACCTDLG_NO_IMAP) && !fIMAP) { ShowWindow(GetDlgItem(hwnd, idcPOP_OR_IMAP), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SERVER_STATIC), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SERVER1_STATIC), SW_HIDE); }
if (!fHTTPMail) { LoadString(g_hInstRes, fIMAP ? idsIMAP : idsPOP, sz, ARRAYSIZE(sz)); SetDlgItemText(hwnd, idcPOP_OR_IMAP, sz); }
// Set incoming Server
InitAcctPropEdit(GetDlgItem(hwnd, IDC_POP3_EDIT), pAcct, pProps->server, CCHMAX_SERVER_NAME - 1); if (!fHTTPMail) { if (fIMAP) LoadString(g_hInstRes, idsIncomingMailIMAP, sz, ARRAYSIZE(sz)); else LoadString(g_hInstRes, idsIncomingMailPOP, sz, ARRAYSIZE(sz)); SetWindowText(GetDlgItem(hwnd, IDC_IN_MAIL_STATIC), sz); }
if (!fHTTPMail) { // Set Smtp Server
InitAcctPropEdit(GetDlgItem(hwnd, IDC_SMTP_EDIT), pAcct, AP_SMTP_SERVER, CCHMAX_SERVER_NAME - 1); }
if (!fHTTPMail) { // If Saving password
if (SUCCEEDED(pAcct->GetPropDw(pProps->useSicily, &dw)) && dw) CheckDlgButton(hwnd, IDC_LOGONSSPI_CHECK, BST_CHECKED); }
if (SUCCEEDED(pAcct->GetPropSz(pProps->userName, sz, ARRAYSIZE(sz)))) SetDlgItemText(hwnd, IDC_ACCTNAME_EDIT, sz); if (SUCCEEDED(pAcct->GetPropSz(pProps->password, sz, ARRAYSIZE(sz)))) SetDlgItemText(hwnd, IDC_ACCTPASS_EDIT, sz);
if (FAILED(pAcct->GetPropDw(pProps->promptPassword, &dwPromptForPassword))) dwPromptForPassword = 0; CheckDlgButton(hwnd, IDC_REMEMBER_PASSWORD, dwPromptForPassword ? BST_UNCHECKED : BST_CHECKED);
// Enable/Disable account windows
Server_EnableLogonWindows(hwnd, TRUE);
hwndT = GetDlgItem(hwnd, IDC_ACCTNAME_EDIT); SetIntlFont(hwndT); SendMessage(hwndT, EM_LIMITTEXT, CCHMAX_USERNAME - 1, 0L);
if (fHTTPMail) { GetWindowText(hwndT, szPreviousLoginName, CCHMAX_ACCT_PROP_SZ); }
SendDlgItemMessage(hwnd, IDC_ACCTPASS_EDIT, EM_LIMITTEXT, CCHMAX_PASSWORD - 1, 0L);
if (SUCCEEDED(pAcct->GetPropDw(AP_SERVER_READ_ONLY, &dw)) && dw) { EnableWindow(GetDlgItem(hwnd, IDC_POP3_EDIT), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_SMTP_EDIT), FALSE); }
PropSheet_QuerySiblings(GetParent(hwnd), SM_INITIALIZED, PAGE_SERVER); PropSheet_UnChanged(GetParent(hwnd), hwnd); return (TRUE);
case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapMailSvr));
case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_LOGONSSPI_CHECK: Server_EnableLogonWindows(hwnd, TRUE); MarkPageDirty(hwnd, PAGE_SERVER); break;
case IDC_REMEMBER_PASSWORD: fEnable = IsDlgButtonChecked(hwnd, IDC_REMEMBER_PASSWORD); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_EDIT), fEnable); MarkPageDirty(hwnd, PAGE_SERVER); break;
case IDC_SMTP_SASL: MarkPageDirty(hwnd, PAGE_SERVER); EnableWindow(GetDlgItem(hwnd, IDC_SMTPLOGON), IsDlgButtonChecked(hwnd, IDC_SMTP_SASL)); if (!IsDlgButtonChecked(hwnd, IDC_SMTP_SASL) && SMTP_AUTH_NONE != s_rAuth.authtype) { s_rAuth.authtype = SMTP_AUTH_NONE; s_rAuth.fDirty = TRUE; } else if (IsDlgButtonChecked(hwnd, IDC_SMTP_SASL) && SMTP_AUTH_NONE == s_rAuth.authtype) { s_rAuth.authtype = SMTP_AUTH_USE_POP3ORIMAP_SETTINGS; s_rAuth.fDirty = TRUE; } break;
case IDC_SMTPLOGON: if (IDOK == DialogBoxParam(g_hInstRes, MAKEINTRESOURCE(iddSmtpServerLogon), hwnd, SmtpLogonSettingsDlgProc, (LPARAM)&s_rAuth)) MarkPageDirty(hwnd, PAGE_SERVER); break;
default: if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE) MarkPageDirty(hwnd, PAGE_SERVER); break; } break;
case WM_NOTIFY: pnmhdr = (NMHDR *)lParam; switch (pnmhdr->code) { case PSN_APPLY: // BEGIN validation
PropSheet_QuerySiblings(GetParent(hwnd), MSM_GETSERVERTYPE, (LPARAM)&sfType); GetServerProps(sfType, &pProps); Assert(pProps); fHTTPMail = (SERVER_HTTPMAIL == sfType);
if (!fHTTPMail) { hwndT = GetDlgItem(hwnd, IDC_SMTP_EDIT); if (!ValidateServerName(hwnd, hwndT, pAcct, AP_SMTP_SERVER, &idsError, pnmhdr->code == PSN_APPLY)) return(InvalidAcctProp(hwnd, hwndT, idsError, iddMailSvrProp_Servers)); }
// gregfrie review (handle httpmail)
hwndT = GetDlgItem(hwnd, IDC_POP3_EDIT); if (!ValidateServerName(hwnd, hwndT, pAcct, pProps->server, &idsError, pnmhdr->code == PSN_APPLY)) return(InvalidAcctProp(hwnd, hwndT, idsError, iddMailSvrProp_Servers));
if (!ValidateLogonSettings(hwnd, pAcct->m_dwDlgFlags, &hwndT, &idsError)) return(InvalidAcctProp(hwnd, hwndT, idsError, iddMailSvrProp_Servers)); if (fHTTPMail && !fWarnDomainName(hwnd, pAcct->m_dwDlgFlags, szPreviousLoginName)) { //return (PSNRET_INVALID_NOCHANGEPAGE);
SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE);
}
// END validation
if (!fHTTPMail) { // Save SMTP Auth Info
if (s_rAuth.fDirty) { // Save Authentication Type
pAcct->SetPropDw(AP_SMTP_USE_SICILY, s_rAuth.authtype);
// Clear user name and password
pAcct->SetProp(AP_SMTP_PROMPT_PASSWORD, NULL, 0); pAcct->SetProp(AP_SMTP_PASSWORD, NULL, 0);
Assert(SMTP_AUTH_USE_SMTP_SETTINGS == s_rAuth.authtype ? !FIsEmptyA(s_rAuth.szUserName) : TRUE); pAcct->SetPropSz(AP_SMTP_USERNAME, s_rAuth.szUserName);
pAcct->SetPropDw(AP_SMTP_PROMPT_PASSWORD, s_rAuth.fPromptPassword); if (FALSE == s_rAuth.fPromptPassword) pAcct->SetPropSz(AP_SMTP_PASSWORD, s_rAuth.szPassword); } }
if (!fHTTPMail) { hwndT = GetDlgItem(hwnd, IDC_SMTP_EDIT); GetServerName(hwndT, pAcct, AP_SMTP_SERVER); } hwndT = GetDlgItem(hwnd, IDC_POP3_EDIT); GetServerName(hwndT, pAcct, pProps->server); // gregfrie review (httpmail)
GetLogonSettings(hwnd, pAcct, TRUE, (sfType == SERVER_IMAP) ? SRV_IMAP : (sfType == SERVER_HTTPMAIL) ? SRV_HTTPMAIL : SRV_POP3);
PropSheet_UnChanged(GetParent(hwnd), hwnd); dw = PAGE_SERVER; PropSheet_QuerySiblings(GetParent(hwnd), SM_SAVECHANGES, (LPARAM)&dw); if (dw == -1) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE); } break; } return(TRUE); }
return (FALSE); }
void UpdateIncomingMailControls(HWND hwnd, SERVER_TYPE sfType, DWORD dwDlgFlags) { TCHAR sz[CCHMAX_STRINGRES]; int sw; BOOL fIMAP;
Assert(sfType == SERVER_MAIL || sfType == SERVER_IMAP); fIMAP = sfType == SERVER_IMAP;
LoadString(g_hInstRes, fIMAP ? idsIncomingMailIMAP : idsIncomingMailPOP, sz, ARRAYSIZE(sz)); SetWindowText(GetDlgItem(hwnd, IDC_IN_MAIL_STATIC), sz);
if (fIMAP) { ShowWindow(GetDlgItem(hwnd, IDC_STATIC6), SW_HIDE); // "Delivery" text
ShowWindow(GetDlgItem(hwnd, IDC_STATIC7), SW_HIDE); // Horizontal line
} else { LoadString(g_hInstRes, idsDelivery, sz, ARRAYSIZE(sz)); SetWindowText(GetDlgItem(hwnd, IDC_STATIC6), sz); }
ShowWindow(GetDlgItem(hwnd, IDC_LEAVE_CHECK), fIMAP ? SW_HIDE : SW_SHOW);
sw = (fIMAP || !!(dwDlgFlags & ACCTDLG_NO_REMOVEAFTER)) ? SW_HIDE : SW_SHOW; ShowWindow(GetDlgItem(hwnd, IDC_REMOVE_CHECK), sw); ShowWindow(GetDlgItem(hwnd, IDC_REMOVE_EDIT), sw); ShowWindow(GetDlgItem(hwnd, IDC_REMOVE_SPIN), sw); ShowWindow(GetDlgItem(hwnd, IDC_OPIE), sw);
ShowWindow(GetDlgItem(hwnd, IDC_REMOVEDELETE_CHECK), (fIMAP || !!(dwDlgFlags & ACCTDLG_NO_REMOVEDELETE)) ? SW_HIDE : SW_SHOW); }
void EnableDeliveryControls(HWND hwnd) { BOOL fEnable;
fEnable = IsDlgButtonChecked(hwnd, IDC_LEAVE_CHECK);
EnableWindow(GetDlgItem(hwnd, IDC_OPIE), fEnable); EnableWindow(GetDlgItem(hwnd, IDC_REMOVEDELETE_CHECK), fEnable); EnableWindow(GetDlgItem(hwnd, IDC_REMOVE_CHECK), fEnable);
if (fEnable) fEnable = IsDlgButtonChecked(hwnd, IDC_REMOVE_CHECK); EnableWindow(GetDlgItem(hwnd, IDC_REMOVE_EDIT), fEnable); EnableWindow(GetDlgItem(hwnd, IDC_REMOVE_SPIN), fEnable); }
void EnableUseDefaultButton(HWND hwnd, SERVER_TYPE sfType) { BOOL fSecure, fTrans, fEnable; DWORD dw;
Assert(sfType == SERVER_MAIL || sfType == SERVER_IMAP);
fSecure = IsDlgButtonChecked(hwnd, IDC_SECURECONNECT_SMTP_BUTTON); dw = GetDlgItemInt(hwnd, IDC_SMTP_PORT_EDIT, &fTrans, FALSE); fEnable = (!fTrans || (fSecure ? (dw != DEF_SSMTPPORT) : (dw != DEF_SMTPPORT)));
if (!fEnable) { fSecure = IsDlgButtonChecked(hwnd, IDC_SECURECONNECT_POP3_BUTTON); dw = GetDlgItemInt(hwnd, IDC_POP3_PORT_EDIT, &fTrans, FALSE); if (sfType == SERVER_IMAP) fEnable = (!fTrans || (fSecure ? (dw != DEF_SIMAPPORT) : (dw != DEF_IMAPPORT))); else fEnable = (!fTrans || (fSecure ? (dw != DEF_SPOP3PORT) : (dw != DEF_POP3PORT))); }
EnableWindow(GetDlgItem(hwnd, IDC_USEDEFAULTS_BUTTON), fEnable); }
const static HELPMAP g_rgCtxMapMailAdv[] = { {IDC_SMTP_PORT_EDIT, IDH_MAIL_SERV_ADV_OUT_PORT}, {IDC_POP3_PORT_EDIT, IDH_MAIL_SERV_ADV_INC_PORT}, {IDC_IN_MAIL_STATIC, IDH_MAIL_SERV_ADV_INC_PORT}, {IDC_USEDEFAULTS_BUTTON, IDH_NEWS_SERV_ADV_USE_DEFAULTS}, {IDC_SECURECONNECT_SMTP_BUTTON, IDH_MAIL_ADV_REQ_SSL}, {IDC_SECURECONNECT_POP3_BUTTON, IDH_MAIL_ADV_REQ_SSL}, {IDC_TIMEOUT_SLIDER, IDH_MAIL_SERV_ADV_TIMEOUT}, {IDC_TIMEOUT_STATIC, IDH_MAIL_SERV_ADV_TIMEOUT}, {IDC_LEAVE_CHECK, IDH_MAIL_SERV_ADV_LEAVE_SERVER_COPY}, {IDC_REMOVE_CHECK, IDH_MAIL_SERV_ADV_REMOVE_AFTER5}, {IDC_REMOVE_EDIT, IDH_MAIL_SERV_ADV_REMOVE_AFTER5}, {IDC_REMOVE_SPIN, IDH_MAIL_SERV_ADV_REMOVE_AFTER5}, {IDC_OPIE, IDH_MAIL_SERV_ADV_REMOVE_AFTER5}, {IDC_REMOVEDELETE_CHECK, IDH_MAIL_SERV_ADV_REMOVE_WHEN_DELETED}, {IDC_SPLIT_CHECK, IDH_NEWSMAIL_SEND_ADVSET_BREAK_UP}, {IDC_SPLIT_EDIT, IDH_NEWSMAIL_SEND_ADVSET_BREAK_UP}, {IDC_SPLIT_SPIN, IDH_NEWSMAIL_SEND_ADVSET_BREAK_UP}, {IDC_SPLIT_STATIC, IDH_NEWSMAIL_SEND_ADVSET_BREAK_UP}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC2, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC3, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC4, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC5, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC6, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC7, IDH_INETCOMM_GROUPBOX}, {0, 0}};
INT_PTR CALLBACK MailServer_AdvancedDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { NMHDR *pnmhdr; TCHAR sz[MAX_PATH]; DWORD dw, dwPortSmtp, dwPortIn, dwRemove, dwSplit; WORD code, id; SERVER_TYPE sfType; HWND hwndT; BOOL fTrans, fSecure, fEnable, flag, fIMAP; CAccount *pAcct = (CAccount *)GetWindowLongPtr(hwnd, DWLP_USER);
switch (uMsg) { case WM_INITDIALOG: // Get the ServerParams and store them in our extra bytes
pAcct = (CAccount *)((PROPSHEETPAGE *) lParam)->lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) pAcct);
SendDlgItemMessage(hwnd, IDC_POP3_PORT_EDIT, EM_LIMITTEXT, PORT_CCHMAX, 0); SendDlgItemMessage(hwnd, IDC_SMTP_PORT_EDIT, EM_LIMITTEXT, PORT_CCHMAX, 0);
// figure out what kind of server we are
PropSheet_QuerySiblings(GetParent(hwnd), MSM_GETSERVERTYPE, (LPARAM)&sfType);
Assert(sfType == SERVER_MAIL || sfType == SERVER_IMAP); fIMAP = sfType == SERVER_IMAP;
UpdateIncomingMailControls(hwnd, sfType, pAcct->m_dwDlgFlags);
// incoming server Secure connect
if (FAILED(pAcct->GetPropDw(fIMAP ? AP_IMAP_SSL : AP_POP3_SSL, (LPDWORD)&fSecure))) fSecure = FALSE; // default
CheckDlgButton(hwnd, IDC_SECURECONNECT_POP3_BUTTON, fSecure);
// incoming server Port
if (FAILED(pAcct->GetPropDw(fIMAP ? AP_IMAP_PORT : AP_POP3_PORT, &dw))) { // default
if (fSecure) dw = fIMAP ? DEF_SIMAPPORT : DEF_SPOP3PORT; else dw = fIMAP ? DEF_IMAPPORT : DEF_POP3PORT; } SetDlgItemInt(hwnd, IDC_POP3_PORT_EDIT, dw, FALSE);
// SMTP Secure connect
if (FAILED(pAcct->GetPropDw(AP_SMTP_SSL, (LPDWORD) &fSecure))) fSecure = FALSE; // default
CheckDlgButton(hwnd, IDC_SECURECONNECT_SMTP_BUTTON, fSecure);
// SMTP Port
if (FAILED(pAcct->GetPropDw(AP_SMTP_PORT, &dw))) dw = fSecure ? DEF_SSMTPPORT : DEF_SMTPPORT; // default
SetDlgItemInt(hwnd, IDC_SMTP_PORT_EDIT, dw, FALSE);
EnableUseDefaultButton(hwnd, sfType);
// Server Timeout
dw = 0; pAcct->GetPropDw(AP_SMTP_TIMEOUT, &dw); InitTimeoutSlider(GetDlgItem(hwnd, IDC_TIMEOUT_SLIDER), GetDlgItem(hwnd, IDC_TIMEOUT_STATIC), dw);
// Leave on Server
if (FAILED(pAcct->GetPropDw(AP_POP3_LEAVE_ON_SERVER, &dw))) dw = FALSE; // default
CheckDlgButton(hwnd, IDC_LEAVE_CHECK, dw);
if (!!(pAcct->m_dwDlgFlags & ACCTDLG_NO_REMOVEAFTER)) { ShowWindow(GetDlgItem(hwnd, IDC_REMOVE_CHECK), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_REMOVE_EDIT), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_REMOVE_SPIN), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_OPIE), SW_HIDE); }
// Remove from Server after xxx days
dw = OPTION_OFF; // default
if (SUCCEEDED(pAcct->GetPropDw(AP_POP3_REMOVE_EXPIRED, (LPDWORD)&flag)) && flag) pAcct->GetPropDw(AP_POP3_EXPIRE_DAYS, &dw); InitCheckCounter(dw, hwnd, IDC_REMOVE_CHECK, IDC_REMOVE_EDIT, IDC_REMOVE_SPIN, EXPIRE_MIN, EXPIRE_MAX, EXPIRE_DEFAULT);
if (!!(pAcct->m_dwDlgFlags & ACCTDLG_NO_REMOVEDELETE)) ShowWindow(GetDlgItem(hwnd, IDC_REMOVEDELETE_CHECK), SW_HIDE);
// Remove when deleted locally
if (FAILED(pAcct->GetPropDw(AP_POP3_REMOVE_DELETED, &dw))) dw = FALSE; // default
CheckDlgButton(hwnd, IDC_REMOVEDELETE_CHECK, dw);
EnableDeliveryControls(hwnd);
if (!!(pAcct->m_dwDlgFlags & ACCTDLG_NO_BREAKMESSAGES)) { ShowWindow(GetDlgItem(hwnd, IDC_SPLIT_GROUPBOX), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SPLIT_CHECK), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SPLIT_EDIT), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SPLIT_SPIN), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SPLIT_STATIC), SW_HIDE); }
// Break Message Size
dw = OPTION_OFF; // default
if (SUCCEEDED(pAcct->GetPropDw(AP_SMTP_SPLIT_MESSAGES, (LPDWORD)&flag)) && flag) pAcct->GetPropDw(AP_SMTP_SPLIT_SIZE, (LPDWORD)&dw); InitCheckCounter(dw, hwnd, IDC_SPLIT_CHECK, IDC_SPLIT_EDIT, IDC_SPLIT_SPIN, BREAKSIZE_MIN, BREAKSIZE_MAX, DEF_BREAKSIZE);
PropSheet_QuerySiblings(GetParent(hwnd), SM_INITIALIZED, PAGE_ADV); PropSheet_UnChanged(GetParent(hwnd), hwnd); return (TRUE);
case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapMailAdv));
case WM_HSCROLL: // Update the text beside the slider
SetTimeoutString(GetDlgItem(hwnd, IDC_TIMEOUT_STATIC), (UINT) (SendMessage((HWND) lParam, TBM_GETPOS, 0, 0)));
MarkPageDirty(hwnd, PAGE_ADV); return (TRUE);
case WM_COMMAND: // Any change to the edit controls would cause the "Apply" button
// to enable.
PropSheet_QuerySiblings(GetParent(hwnd), MSM_GETSERVERTYPE, (LPARAM)&sfType);
code = GET_WM_COMMAND_CMD(wParam, lParam); id = GET_WM_COMMAND_ID(wParam, lParam);
switch (id) { case IDC_SMTP_PORT_EDIT: case IDC_POP3_PORT_EDIT: if (code == EN_CHANGE) { EnableUseDefaultButton(hwnd, sfType);
MarkPageDirty(hwnd, PAGE_ADV); } break;
case IDC_SECURECONNECT_POP3_BUTTON: case IDC_SECURECONNECT_SMTP_BUTTON: case IDC_USEDEFAULTS_BUTTON: if (id != IDC_SECURECONNECT_POP3_BUTTON) { fSecure = IsDlgButtonChecked(hwnd, IDC_SECURECONNECT_SMTP_BUTTON); SetDlgItemInt(hwnd, IDC_SMTP_PORT_EDIT, fSecure ? DEF_SSMTPPORT : DEF_SMTPPORT, FALSE); }
if (id != IDC_SECURECONNECT_SMTP_BUTTON) { fSecure = IsDlgButtonChecked(hwnd, IDC_SECURECONNECT_POP3_BUTTON); if (sfType == SERVER_MAIL) dw = fSecure ? DEF_SPOP3PORT : DEF_POP3PORT; else dw = fSecure ? DEF_SIMAPPORT : DEF_IMAPPORT; SetDlgItemInt(hwnd, IDC_POP3_PORT_EDIT, dw, FALSE); }
EnableUseDefaultButton(hwnd, sfType);
MarkPageDirty(hwnd, PAGE_ADV); break;
case IDC_LEAVE_CHECK: case IDC_REMOVE_CHECK: EnableDeliveryControls(hwnd); // fall through...
case IDC_REMOVEDELETE_CHECK: MarkPageDirty(hwnd, PAGE_ADV); break;
case IDC_SPLIT_CHECK: fEnable = IsDlgButtonChecked(hwnd, IDC_SPLIT_CHECK); EnableWindow(GetDlgItem(hwnd, IDC_SPLIT_EDIT), fEnable); EnableWindow(GetDlgItem(hwnd, IDC_SPLIT_SPIN), fEnable);
MarkPageDirty(hwnd, PAGE_ADV); break;
case IDC_SPLIT_EDIT: case IDC_REMOVE_EDIT: if (code == EN_CHANGE) MarkPageDirty(hwnd, PAGE_ADV); break; } return (TRUE);
case WM_NOTIFY: pnmhdr = (NMHDR *)lParam; switch (pnmhdr->code) { case PSN_APPLY: // BEGIN validation
// figure out what kind of server we are
PropSheet_QuerySiblings(GetParent(hwnd), MSM_GETSERVERTYPE, (LPARAM)&sfType);
Assert(sfType == SERVER_MAIL || sfType == SERVER_IMAP); fIMAP = sfType == SERVER_IMAP;
dwPortSmtp = GetDlgItemInt(hwnd, IDC_SMTP_PORT_EDIT, &fTrans, FALSE); if (!fTrans || dwPortSmtp == 0) { hwndT = GetDlgItem(hwnd, IDC_SMTP_PORT_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsErrPortNum, iddMailSvrProp_Advanced)); }
dwPortIn = GetDlgItemInt(hwnd, IDC_POP3_PORT_EDIT, &fTrans, FALSE); if (!fTrans || dwPortIn == 0) { hwndT = GetDlgItem(hwnd, IDC_POP3_PORT_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsErrPortNum, iddMailSvrProp_Advanced)); }
dwRemove = 0; if (!fIMAP) { if (IsDlgButtonChecked(hwnd, IDC_LEAVE_CHECK) && IsDlgButtonChecked(hwnd, IDC_REMOVE_CHECK)) { dwRemove = GetDlgItemInt(hwnd, IDC_REMOVE_EDIT, &fTrans, FALSE); if (!fTrans || dwRemove < EXPIRE_MIN || dwRemove > EXPIRE_MAX) { hwndT = GetDlgItem(hwnd, IDC_REMOVE_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsEnterRemoveFromServerDays, iddMailSvrProp_Advanced)); } } }
dwSplit = 0; if (IsDlgButtonChecked(hwnd, IDC_SPLIT_CHECK)) { dwSplit = GetDlgItemInt(hwnd, IDC_SPLIT_EDIT, &fTrans, FALSE); if (!fTrans || dwSplit < BREAKSIZE_MIN || dwSplit > BREAKSIZE_MAX) { hwndT = GetDlgItem(hwnd, IDC_SPLIT_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsEnterBreakSize, iddMailSvrProp_Advanced)); } }
// END validation
pAcct->SetPropDw(AP_SMTP_PORT, dwPortSmtp);
if (fIMAP) { HRESULT hrTemp;
hrTemp = pAcct->GetPropDw(AP_IMAP_PORT, &dw); if (FAILED(hrTemp) || dw != dwPortIn) { pAcct-> SetPropDw(AP_IMAP_PORT, dwPortIn); if (FAILED(pAcct->GetPropDw(AP_IMAP_DIRTY, &dw))) dw = 0;
dw |= IMAP_FLDRLIST_DIRTY; pAcct->SetPropDw(AP_IMAP_DIRTY, dw); } } else { pAcct->SetPropDw(AP_POP3_PORT, dwPortIn); dw = IsDlgButtonChecked(hwnd, IDC_LEAVE_CHECK); pAcct->SetPropDw(AP_POP3_LEAVE_ON_SERVER, dw);
if (dw != 0) { dw = IsDlgButtonChecked(hwnd, IDC_REMOVE_CHECK); pAcct->SetPropDw(AP_POP3_REMOVE_EXPIRED, dw);
if (dw != 0) { Assert(dwRemove != 0); pAcct->SetPropDw(AP_POP3_EXPIRE_DAYS, dwRemove); }
dw = IsDlgButtonChecked(hwnd, IDC_REMOVEDELETE_CHECK); pAcct->SetPropDw(AP_POP3_REMOVE_DELETED, dw); } }
dw = IsDlgButtonChecked(hwnd, IDC_SECURECONNECT_POP3_BUTTON); pAcct->SetPropDw(fIMAP ? AP_IMAP_SSL : AP_POP3_SSL, dw);
dw = GetTimeoutFromSlider(GetDlgItem(hwnd, IDC_TIMEOUT_SLIDER)); pAcct->SetPropDw(AP_SMTP_TIMEOUT, dw); pAcct->SetPropDw(fIMAP ? AP_IMAP_TIMEOUT : AP_POP3_TIMEOUT, dw);
dw = IsDlgButtonChecked(hwnd, IDC_SECURECONNECT_SMTP_BUTTON); pAcct->SetPropDw(AP_SMTP_SSL, dw);
dw = IsDlgButtonChecked(hwnd, IDC_SPLIT_CHECK); pAcct->SetPropDw(AP_SMTP_SPLIT_MESSAGES, dw); if (dw != 0) { Assert(dwSplit != 0); pAcct->SetPropDw(AP_SMTP_SPLIT_SIZE, dwSplit); }
PropSheet_UnChanged(GetParent(hwnd), hwnd); dw = PAGE_ADV; PropSheet_QuerySiblings(GetParent(hwnd), SM_SAVECHANGES, (LPARAM)&dw); if (dw == -1) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE); } break; } return (TRUE); }
return (FALSE); }
BOOL FIsDuplicateIMAPSpecialFldrs(LPSTR pszSentItems, LPSTR pszDrafts, HWND hwnd, HWND *phwndOffender, int *piErrorStr) { Assert(NULL != phwndOffender); Assert(NULL != piErrorStr);
// First compare both special folders to INBOX
if (0 == lstrcmpi(c_szInbox, pszSentItems)) { *phwndOffender = GetDlgItem(hwnd, IDC_IMAPSENT_EDIT); *piErrorStr = idsIMAPSpecialFldr_InboxDup; return TRUE; }
if (0 == lstrcmpi(c_szInbox, pszDrafts)) { *phwndOffender = GetDlgItem(hwnd, IDC_IMAPDRAFT_EDIT); *piErrorStr = idsIMAPSpecialFldr_InboxDup; return TRUE; }
// Now compare special folders to each other
if (0 == lstrcmpi(pszSentItems, pszDrafts)) { *phwndOffender = GetDlgItem(hwnd, IDC_IMAPSENT_EDIT); *piErrorStr = idsIMAPSpecialFldr_Duplicate; return TRUE; }
// If we reached this point, no problems found
*phwndOffender = NULL; *piErrorStr = 0; return FALSE; }
BOOL FContainsHierarchyChars(LPSTR pszFldrName) { BOOL fSkipByte = FALSE;
while ('\0' != *pszFldrName) { if (fSkipByte) fSkipByte = FALSE; else if (IsDBCSLeadByte(*pszFldrName)) fSkipByte = TRUE; // Skip next byte (trail byte)
else { if ('/' == *pszFldrName || '\\' == *pszFldrName || '.' == *pszFldrName) return TRUE; }
// Advance char ptr
pszFldrName += 1; }
// If we reached this point, no hierarchy chars found
return FALSE; }
const static HELPMAP g_rgCtxMapIMAP[] = { {IDC_ROOT_FOLDER_EDIT, IDH_IMAP_BASE_ROOT}, {IDC_IMAP_SVRSPECIALFLDRS, 760}, {IDC_IMAPSENT_EDIT, 765}, {IDC_IMAPSENT_STATIC, 765}, {IDC_IMAPDRAFT_EDIT, 770}, {IDC_IMAPDRAFT_STATIC, 770}, {IDC_IMAP_POLL_ALL_FOLDERS, 775}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC2, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC3, IDH_INETCOMM_GROUPBOX}, {0, 0}};
INT_PTR CALLBACK MailServer_IMAPDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { NMHDR *pnmhdr; TCHAR sz[MAX_PATH]; DWORD dw, dw2; HWND hwndT; WORD code, id; UINT uiLen; CAccount *pAcct = (CAccount *)GetWindowLongPtr(hwnd, DWLP_USER); HRESULT hrTemp;
switch (uMsg) { case WM_INITDIALOG: // Get the ServerParams and store them in our extra bytes
pAcct = (CAccount *)((PROPSHEETPAGE *) lParam)->lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) pAcct);
// Initialize edit controls
InitAcctPropEdit(GetDlgItem(hwnd, IDC_ROOT_FOLDER_EDIT), pAcct, AP_IMAP_ROOT_FOLDER, CCHMAX_ROOT_FOLDER - 1);
if (FAILED(pAcct->GetPropDw(AP_IMAP_POLL_ALL_FOLDERS, &dw))) dw = TRUE; CheckDlgButton(hwnd, IDC_IMAP_POLL_ALL_FOLDERS, dw != 0);
// Initialize IMAP Special Folder Options IF we have the flag to do so
if (pAcct->m_dwDlgFlags & ACCTDLG_SHOWIMAPSPECIAL) { // Init special folder edit controls
InitAcctPropEdit(GetDlgItem(hwnd, IDC_IMAPSENT_EDIT), pAcct, AP_IMAP_SENTITEMSFLDR, CCHMAX_ROOT_FOLDER - 1); InitAcctPropEdit(GetDlgItem(hwnd, IDC_IMAPDRAFT_EDIT), pAcct, AP_IMAP_DRAFTSFLDR, CCHMAX_ROOT_FOLDER - 1);
// IMAP server-side special folders
if (FAILED(pAcct->GetPropDw(AP_IMAP_SVRSPECIALFLDRS, &dw))) dw = TRUE; // default
CheckDlgButton(hwnd, IDC_IMAP_SVRSPECIALFLDRS, dw); EnableWindow(GetDlgItem(hwnd, IDC_IMAPSENT_EDIT), dw); EnableWindow(GetDlgItem(hwnd, IDC_IMAPDRAFT_EDIT), dw); } else { // Hide all IMAP special folder options
ShowWindow(GetDlgItem(hwnd, IDC_IMAPSENT_EDIT), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_IMAPDRAFT_EDIT), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_IMAP_SVRSPECIALFLDRS), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_STATIC2), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_STATIC3), SW_HIDE);
ShowWindow(GetDlgItem(hwnd, IDC_IMAPSENT_STATIC), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_IMAPDRAFT_STATIC), SW_HIDE); }
PropSheet_QuerySiblings(GetParent(hwnd), SM_INITIALIZED, PAGE_IMAP); PropSheet_UnChanged(GetParent(hwnd), hwnd); return (TRUE);
case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapIMAP));
case WM_COMMAND: // Any change to the edit controls would cause the "Apply" button
// to enable.
code = GET_WM_COMMAND_CMD(wParam, lParam); id = GET_WM_COMMAND_ID(wParam, lParam);
switch (id) { //case IDC_IMAP_LISTLSUB:
case IDC_IMAP_POLL_ALL_FOLDERS: MarkPageDirty(hwnd, PAGE_IMAP); break;
case IDC_IMAP_SVRSPECIALFLDRS: dw = IsDlgButtonChecked(hwnd, IDC_IMAP_SVRSPECIALFLDRS); EnableWindow(GetDlgItem(hwnd, IDC_IMAPSENT_EDIT), dw); EnableWindow(GetDlgItem(hwnd, IDC_IMAPDRAFT_EDIT), dw); MarkPageDirty(hwnd, PAGE_IMAP); break;
case IDC_ROOT_FOLDER_EDIT: case IDC_IMAPSENT_EDIT: case IDC_IMAPDRAFT_EDIT: if (code == EN_CHANGE) MarkPageDirty(hwnd, PAGE_IMAP); break; } return (TRUE);
case WM_NOTIFY: pnmhdr = (NMHDR *)lParam; switch (pnmhdr->code) { case PSN_APPLY: // BEGIN validation
// Check IMAP special folder paths
if (BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_IMAP_SVRSPECIALFLDRS)) { TCHAR sz2[MAX_PATH]; int iErrorStr;
// Check for 0-length special folder paths
if (0 == GetDlgItemText(hwnd, IDC_IMAPSENT_EDIT, sz, ARRAYSIZE(sz)) || FIsEmpty(sz)) { hwndT = GetDlgItem(hwnd, IDC_IMAPSENT_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsIMAPBlankSpecialFldrs, iddMailSvrProp_IMAP)); }
if (0 == GetDlgItemText(hwnd, IDC_IMAPDRAFT_EDIT, sz2, ARRAYSIZE(sz2)) || FIsEmpty(sz)) { hwndT = GetDlgItem(hwnd, IDC_IMAPDRAFT_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsIMAPBlankSpecialFldrs, iddMailSvrProp_IMAP)); }
// Check for duplicate special folder paths: these are not allowed
// If we got to this point, sz and sz2 are filled with sent items path
if (FIsDuplicateIMAPSpecialFldrs(sz, sz2, hwnd, &hwndT, &iErrorStr)) return(InvalidAcctProp(hwnd, hwndT, iErrorStr, iddMailSvrProp_IMAP));
// Check for hierarchy characters in special folder names
if (FContainsHierarchyChars(sz)) { hwndT = GetDlgItem(hwnd, IDC_IMAPSENT_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsIMAPNoHierarchyChars, iddMailSvrProp_IMAP)); }
if (FContainsHierarchyChars(sz2)) { hwndT = GetDlgItem(hwnd, IDC_IMAPDRAFT_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsIMAPNoHierarchyChars, iddMailSvrProp_IMAP)); } }
// END validation
// Save IMAP root folder path, if it changed
if (0 != SendMessage(GetDlgItem(hwnd, IDC_ROOT_FOLDER_EDIT), EM_GETMODIFY, 0, 0)) { dw = GetDlgItemText(hwnd, IDC_ROOT_FOLDER_EDIT, sz, ARRAYSIZE(sz)); // TODO: figure out if it is a valid folder
UlStripWhitespace(sz, TRUE, TRUE, &dw); pAcct->SetPropSz(AP_IMAP_ROOT_FOLDER, sz); SendMessage(GetDlgItem(hwnd, IDC_ROOT_FOLDER_EDIT), EM_SETMODIFY, 0, 0);
if (FAILED(pAcct->GetPropDw(AP_IMAP_DIRTY, &dw))) dw = 0;
dw |= IMAP_FLDRLIST_DIRTY; pAcct->SetPropDw(AP_IMAP_DIRTY, dw); }
dw = IsDlgButtonChecked(hwnd, IDC_IMAP_POLL_ALL_FOLDERS); pAcct->SetPropDw(AP_IMAP_POLL_ALL_FOLDERS, dw);
// Save special folders checkbox
dw = IsDlgButtonChecked(hwnd, IDC_IMAP_SVRSPECIALFLDRS); hrTemp = pAcct->GetPropDw(AP_IMAP_SVRSPECIALFLDRS, &dw2); if (FAILED(hrTemp) || dw2 != dw) { pAcct->SetPropDw(AP_IMAP_SVRSPECIALFLDRS, dw); if (FAILED(pAcct->GetPropDw(AP_IMAP_DIRTY, &dw2))) dw2 = 0;
dw2 |= (IMAP_SENTITEMS_DIRTY | IMAP_DRAFTS_DIRTY); pAcct->SetPropDw(AP_IMAP_DIRTY, dw2); }
if (dw != 0) { // Save IMAP Sent Items folder path, if it changed
if (0 != SendMessage(GetDlgItem(hwnd, IDC_IMAPSENT_EDIT), EM_GETMODIFY, 0, 0)) { uiLen = GetDlgItemText(hwnd, IDC_IMAPSENT_EDIT, sz, ARRAYSIZE(sz)); ImapRemoveTrailingHC(sz, uiLen); // TODO: figure out if it is a valid folder
pAcct->SetPropSz(AP_IMAP_SENTITEMSFLDR, sz); SendMessage(GetDlgItem(hwnd, IDC_IMAPSENT_EDIT), EM_SETMODIFY, 0, 0);
if (FAILED(pAcct->GetPropDw(AP_IMAP_DIRTY, &dw))) dw = 0;
dw |= IMAP_SENTITEMS_DIRTY; pAcct->SetPropDw(AP_IMAP_DIRTY, dw); }
// Save IMAP Drafts folder path, if it changed
if (0 != SendMessage(GetDlgItem(hwnd, IDC_IMAPDRAFT_EDIT), EM_GETMODIFY, 0, 0)) { uiLen = GetDlgItemText(hwnd, IDC_IMAPDRAFT_EDIT, sz, ARRAYSIZE(sz)); ImapRemoveTrailingHC(sz, uiLen); // TODO: figure out if it is a valid folder
pAcct->SetPropSz(AP_IMAP_DRAFTSFLDR, sz); SendMessage(GetDlgItem(hwnd, IDC_IMAPDRAFT_EDIT), EM_SETMODIFY, 0, 0);
if (FAILED(pAcct->GetPropDw(AP_IMAP_DIRTY, &dw))) dw = 0;
dw |= IMAP_DRAFTS_DIRTY; pAcct->SetPropDw(AP_IMAP_DIRTY, dw); } }
PropSheet_UnChanged(GetParent(hwnd), hwnd); dw = PAGE_IMAP; PropSheet_QuerySiblings(GetParent(hwnd), SM_SAVECHANGES, (LPARAM)&dw); if (dw == -1) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE); } break; } return (TRUE); }
return (FALSE); } // MailServer_IMAPDlgProc
void ImapRemoveTrailingHC(LPSTR pszPath, UINT uiLen) { LPSTR pLastChar;
if (0 == uiLen) return;
pLastChar = pszPath + uiLen - 1; while (pLastChar >= pszPath && ('/' == *pLastChar || '\\' == *pLastChar || '.' == *pLastChar)) { *pLastChar = '\0'; // Bye-bye, potential hierarchy char
pLastChar -= 1; } // while
} // ImapRemoveTrailingHC
#ifdef DEAD
BOOL IsValidServerName(TCHAR *sz) { Assert(sz != NULL);
// bug 34513
if (FIsEmpty(sz)) return(FALSE);
// Bug #32532 - If the server name is the IP address, ie 157.54.44.183, then
// don't use this grammar to parse it.
if (-1 != inet_addr(sz)) return (TRUE);
while (*sz != 0) { if (!IsDBCSLeadByte(*sz)) { if (*sz == _T(' ')) return(FALSE); } else { return(FALSE); }
sz = CharNext(sz); }
return(TRUE); } #endif // DEAD
/*
RFC 1034 <domain> ::= <subdomain> | " "
<subdomain> ::= <label> | <subdomain> "." <label>
<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
<let-dig-hyp> ::= <let-dig> | "-"
<let-dig> ::= <letter> | <digit>
<letter> ::= any one of the 52 alphabetic characters A through Z in upper case and a through z in lower case
<digit> ::= any one of the ten digits 0 through 9 */
#define ST_BOGUS -1
#define ST_LABEL 0
#define ST_DASH 1
#define ST_LD 2
#define ALPHABET 0
#define NUMERIC 1
#define DOT 2
#define DASH 3
static const int s_rgSvrState[4][3] = { // ST_LABEL ST_DASH ST_LD
// ALPHABET
{ST_LD, ST_LD, ST_LD}, // NUMERIC
{ST_LD, ST_LD, ST_LD}, // DOT
{ST_BOGUS, ST_BOGUS, ST_LABEL}, // DASH
{ST_BOGUS, ST_DASH, ST_DASH} };
BOOL IsValidServerName(LPSTR sz) { int state, curr;
Assert(sz != NULL);
// bug 34513
if (FIsEmpty(sz)) return(FALSE);
// Bug #32532 - If the server name is the IP address, ie 157.54.44.183, then
// don't use this grammar to parse it.
if (-1 != inet_addr(sz)) return (TRUE);
state = ST_LABEL; while (*sz != 0) { if (!IsDBCSLeadByte(*sz)) { if (*sz == _T('.')) curr = DOT; else if (*sz == _T('-')) curr = DASH; else if ((*sz >= 'A' && *sz <= 'Z') || (*sz >= 'a' && *sz <= 'z')) curr = ALPHABET; else if (*sz >= '0' && *sz <= '9') curr = NUMERIC; else return(FALSE);
state = s_rgSvrState[curr][state]; if (state == ST_BOGUS) break; } else { state = ST_BOGUS; break; }
sz = CharNext(sz); }
return(state == ST_LD); }
HRESULT ValidServerName(LPSTR szServer) { HRESULT hr; int cbT;
cbT = lstrlen(szServer); if (cbT == 0 || cbT >= CCHMAX_SERVER_NAME) return(E_InvalidValue);
if (!IsValidServerName(szServer)) hr = S_NonStandardValue; else hr = S_OK;
return(hr); }
IMNACCTAPI ValidEmailAddressParts(LPSTR lpAddress, LPSTR lpszAcct, DWORD cchSizeAcct, LPSTR lpszDomain, DWORD cchSizeDomain) { int cbT; LPSTR szAddr = lpAddress; // Step through the address looking for '@'. If there's an at sign in the middle
// of a string, this is close enough to being an internet address for me.
Assert(lpAddress != NULL);
cbT = lstrlen(lpAddress); if (cbT == 0 || cbT >= CCHMAX_EMAIL_ADDRESS) return(E_InvalidValue);
// Can't start with '@'
if (*lpAddress != '@') { while (*lpAddress) { // Internet addresses only allow pure ASCII. No high bits!
if (IsDBCSLeadByte(*lpAddress) || (*lpAddress & 0x80)) break;
if (*lpAddress == '@') { if (lpszAcct) { StrCpyN(lpszAcct, szAddr, cchSizeAcct); lpszAcct[(lpAddress - szAddr)] = 0; } if (lpszDomain) { StrCpyN(lpszDomain, lpAddress +1, cchSizeDomain); }
// Found the at sign. Is there anything following?
lpAddress++; if (!IsValidServerName(lpAddress)) break; else return(S_OK); }
lpAddress++; } }
return(S_NonStandardValue); }
IMNACCTAPI ValidEmailAddress(LPSTR lpAddress) { int cbT;
// Step through the address looking for '@'. If there's an at sign in the middle
// of a string, this is close enough to being an internet address for me.
Assert(lpAddress != NULL);
cbT = lstrlen(lpAddress); if (cbT == 0 || cbT >= CCHMAX_EMAIL_ADDRESS) return(E_InvalidValue);
// Can't start with '@'
if (*lpAddress != '@') { while (*lpAddress) { // Internet addresses only allow pure ASCII. No high bits!
if (IsDBCSLeadByte(*lpAddress) || (*lpAddress & 0x80)) break;
if (*lpAddress == '@') { // Found the at sign. Is there anything following?
lpAddress++; if (!IsValidServerName(lpAddress)) break; else return(S_OK); }
lpAddress++; } }
return(S_NonStandardValue); }
const static HELPMAP g_rgCtxMapLdapGen[] = { {IDC_ACCOUNT_EDIT, IDH_WABLDAP_DIRSSERV_FRIENDLY_NAME}, {IDC_SERVER_EDIT, IDH_WABLDAP_DIRSSERV_NAME}, {IDC_LOGON_CHECK, IDH_INETCOMM_SERVER_REQ_LOGON}, {IDC_LOGONSSPI_CHECK, IDH_WABLDAP_DIRSSERV_AUTH_SICILY}, {IDC_ACCTNAME_EDIT, IDH_WABLDAP_DIRSSERV_AUTH_PASS_UNAME}, {IDC_ACCTNAME_STATIC, IDH_WABLDAP_DIRSSERV_AUTH_PASS_UNAME}, {IDC_ACCTPASS_EDIT, IDH_WABLDAP_DIRSSERV_AUTH_PASS_PASS}, {IDC_ACCTPASS_STATIC, IDH_WABLDAP_DIRSSERV_AUTH_PASS_PASS}, {IDC_RESOLVE_CHECK, IDH_WABLDAP_DIRSSERV_CHECK_AGAINST}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC2, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC3, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC4, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC5, IDH_INETCOMM_GROUPBOX}, {0, 0}};
INT_PTR CALLBACK DirServer_GeneralDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL fLogon; int idsError; ULONG cbSize; HWND hwndT; NMHDR *pnmhdr; CAccount *pAcct; TCHAR sz[CCHMAX_ACCT_PROP_SZ]; DWORD dw; SVRDLGINFO *psdi;
pAcct = (CAccount *)GetWindowLongPtr(hwnd, DWLP_USER); psdi = (SVRDLGINFO *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: // Get the ServerParams and store them in our extra bytes
pAcct = (CAccount *) ((PROPSHEETPAGE*) lParam)->lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) pAcct);
Assert(psdi == NULL); if (!MemAlloc((void **)&psdi, sizeof(SVRDLGINFO))) return(-1); ZeroMemory(psdi, sizeof(SVRDLGINFO)); psdi->sfType = SERVER_LDAP; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)psdi);
// Set Account Name
InitAcctPropEdit(GetDlgItem(hwnd, IDC_ACCOUNT_EDIT), pAcct, AP_ACCOUNT_NAME, CCHMAX_ACCOUNT_NAME - 1);
// set server name
InitAcctPropEdit(GetDlgItem(hwnd, IDC_SERVER_EDIT), pAcct, AP_LDAP_SERVER, CCHMAX_SERVER_NAME - 1);
if (FAILED(pAcct->GetPropDw(AP_LDAP_AUTHENTICATION, &dw))) dw = LDAP_AUTH_ANONYMOUS; if (dw != LDAP_AUTH_ANONYMOUS) { CheckDlgButton(hwnd, IDC_LOGON_CHECK, BST_CHECKED); if (SUCCEEDED(pAcct->GetPropSz(AP_LDAP_USERNAME, sz, ARRAYSIZE(sz)))) SetDlgItemText(hwnd, IDC_ACCTNAME_EDIT, sz);
if (SUCCEEDED(pAcct->GetPropSz(AP_LDAP_PASSWORD, sz, ARRAYSIZE(sz)))) SetDlgItemText(hwnd, IDC_ACCTPASS_EDIT, sz);
if (dw != LDAP_AUTH_PASSWORD) { CheckDlgButton(hwnd, IDC_LOGONSSPI_CHECK, BST_CHECKED); }
fLogon = TRUE; } else fLogon = FALSE;
Server_EnableLogonWindows(hwnd, fLogon);
hwndT = GetDlgItem(hwnd, IDC_ACCTNAME_EDIT); SetIntlFont(hwndT); SendMessage(hwndT, EM_LIMITTEXT, CCHMAX_USERNAME - 1, 0L);
SendDlgItemMessage(hwnd, IDC_ACCTPASS_EDIT, EM_LIMITTEXT, CCHMAX_PASSWORD - 1, 0L);
if (SUCCEEDED(pAcct->GetPropDw(AP_LDAP_RESOLVE_FLAG, &dw))) CheckDlgButton(hwnd, IDC_RESOLVE_CHECK, dw ? BST_CHECKED : BST_UNCHECKED);
if (SUCCEEDED(pAcct->GetPropDw(AP_SERVER_READ_ONLY, &dw)) && dw) EnableWindow(GetDlgItem(hwnd, IDC_SERVER_EDIT), FALSE);
psdi->dwInit = (psdi->dwInit | PAGE_GEN); PropSheet_UnChanged(GetParent(hwnd), hwnd); return (TRUE);
case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapLdapGen));
case WM_DESTROY: if (psdi != NULL) MemFree(psdi); break;
case PSM_QUERYSIBLINGS: Assert(psdi != NULL); Assert(pAcct != NULL); return(HandleQuerySiblings(hwnd, psdi, pAcct, wParam, lParam));
case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_LOGONSSPI_CHECK: case IDC_LOGON_CHECK: Server_EnableLogonWindows(hwnd, IsDlgButtonChecked(hwnd, IDC_LOGON_CHECK));
// fall through...
case IDC_RESOLVE_CHECK: MarkPageDirty(hwnd, PAGE_GEN); break;
default: if (HIWORD(wParam) == EN_CHANGE) { if (LOWORD(wParam) == IDC_ACCOUNT_EDIT) UpdateAcctTitle(hwnd, IDC_ACCOUNT_EDIT, ACCT_DIR_SERV); MarkPageDirty(hwnd, PAGE_GEN); } break; } break;
case WM_NOTIFY: pnmhdr = (NMHDR *)lParam; switch (pnmhdr->code) { case PSN_APPLY: // BEGIN validation
hwndT = GetDlgItem(hwnd, IDC_ACCOUNT_EDIT); if (!ValidateAccountName(hwnd, hwndT, pAcct, &idsError)) return(InvalidAcctProp(hwnd, hwndT, idsError, iddDirServProp_General));
hwndT = GetDlgItem(hwnd, IDC_SERVER_EDIT); if (!ValidateServerName(hwnd, hwndT, pAcct, AP_LDAP_SERVER, &idsError, pnmhdr->code == PSN_APPLY)) return(InvalidAcctProp(hwnd, hwndT, idsError, iddDirServProp_General));
if (IsDlgButtonChecked(hwnd, IDC_LOGON_CHECK) && !ValidateLogonSettings(hwnd, pAcct->m_dwDlgFlags, &hwndT, &idsError)) return(InvalidAcctProp(hwnd, hwndT, idsError, iddDirServProp_General));
// END validation
hwndT = GetDlgItem(hwnd, IDC_ACCOUNT_EDIT); GetAccountName(hwndT, pAcct);
hwndT = GetDlgItem(hwnd, IDC_SERVER_EDIT); GetServerName(hwndT, pAcct, AP_LDAP_SERVER);
GetLogonSettings(hwnd, pAcct, IsDlgButtonChecked(hwnd, IDC_LOGON_CHECK), SRV_LDAP);
pAcct->SetPropDw(AP_LDAP_RESOLVE_FLAG, (DWORD)!!IsDlgButtonChecked(hwnd, IDC_RESOLVE_CHECK));
PropSheet_UnChanged(GetParent(hwnd), hwnd); dw = PAGE_GEN; PropSheet_QuerySiblings(GetParent(hwnd), SM_SAVECHANGES, (LPARAM)&dw); if (dw == -1) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE); } break; } return(TRUE); }
return (FALSE); }
const static HELPMAP g_rgCtxMapLdapAdv[] = { {IDC_LDAP_PORT_EDIT, IDH_LDAP_PORT_NUMBER}, {IDC_USEDEFAULTS_BUTTON, IDH_NEWS_SERV_ADV_USE_DEFAULTS}, {IDC_TIMEOUT_SLIDER, IDH_WABLDAP_SEARCH_TIMEOUT}, {IDC_MATCHES_EDIT, IDH_WABLDAP_SEARCH_LIMIT}, {IDC_SEARCHBASE_EDIT, IDH_LDAP_SEARCH_BASE}, {IDC_SECURECONNECT_BUTTON, IDH_MAIL_ADV_REQ_SSL}, {IDC_SIMPLESEARCH_BUTTON, IDH_WABLDAP_USE_SIMPLE_SEARCH}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC2, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC3, IDH_INETCOMM_GROUPBOX}, {0, 0}};
INT_PTR CALLBACK DirServer_AdvancedDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { NMHDR *pnmhdr; TCHAR sz[CCHMAX_ACCT_PROP_SZ]; DWORD dw, dwPort, dwMatches; WORD code, id; SERVER_TYPE sfType; HWND hwndT; BOOL fTrans, fSecure, fEnable, flag, fIMAP, fSimple; IImnAccount *pAcct = (IImnAccount *)GetWindowLongPtr(hwnd, DWLP_USER);
switch (uMsg) { case WM_INITDIALOG: // Get the ServerParams and store them in our extra bytes
pAcct = (IImnAccount*) ((PROPSHEETPAGE*) lParam)->lParam; SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) pAcct);
// Load the controls with what information we have
if (SUCCEEDED(pAcct->GetPropDw(AP_LDAP_PORT, &dw))) SetDlgItemInt(hwnd, IDC_LDAP_PORT_EDIT, dw, FALSE); SendDlgItemMessage(hwnd, IDC_LDAP_PORT_EDIT, EM_LIMITTEXT, PORT_CCHMAX, 0); if (SUCCEEDED(pAcct->GetPropDw(AP_LDAP_SIMPLE_SEARCH, (LPDWORD)&fSimple)) && fSimple) CheckDlgButton(hwnd, IDC_SIMPLESEARCH_BUTTON, TRUE); if (SUCCEEDED(pAcct->GetPropDw(AP_LDAP_SSL, (LPDWORD)&fSecure)) && fSecure) { EnableWindow(GetDlgItem(hwnd, IDC_USEDEFAULTS_BUTTON), dw != DEF_SLDAPPORT); CheckDlgButton(hwnd, IDC_SECURECONNECT_BUTTON, TRUE); } else { EnableWindow(GetDlgItem(hwnd, IDC_USEDEFAULTS_BUTTON), dw != DEF_LDAPPORT); }
if (FAILED(pAcct->GetPropDw(AP_LDAP_SEARCH_RETURN, (LPDWORD)&dw))) dw = MATCHES_DEFAULT; if (dw < MATCHES_MIN) dw = MATCHES_MIN; else if (dw > MATCHES_MAX) dw = MATCHES_MAX; InitCheckCounter(dw, hwnd, NULL, IDC_MATCHES_EDIT, IDC_MATCHES_SPIN, MATCHES_MIN, MATCHES_MAX, MATCHES_DEFAULT);
// Server Timeout
dw = 0; pAcct->GetPropDw(AP_LDAP_TIMEOUT, &dw); InitTimeoutSlider(GetDlgItem(hwnd, IDC_TIMEOUT_SLIDER), GetDlgItem(hwnd, IDC_TIMEOUT_STATIC), dw);
InitAcctPropEdit(GetDlgItem(hwnd, IDC_SEARCHBASE_EDIT), pAcct, AP_LDAP_SEARCH_BASE, CCHMAX_SEARCH_BASE - 1);
PropSheet_QuerySiblings(GetParent(hwnd), SM_INITIALIZED, PAGE_ADV); PropSheet_UnChanged(GetParent(hwnd), hwnd); return (TRUE);
case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapLdapAdv));
case WM_HSCROLL: // Update the text beside the slider
SetTimeoutString(GetDlgItem(hwnd, IDC_TIMEOUT_STATIC), (UINT) SendMessage((HWND) lParam, TBM_GETPOS, 0, 0));
MarkPageDirty(hwnd, PAGE_ADV); return (TRUE);
case WM_COMMAND: code = HIWORD(wParam); id = LOWORD(wParam); fSecure = IsDlgButtonChecked(hwnd, IDC_SECURECONNECT_BUTTON); fSimple = IsDlgButtonChecked(hwnd, IDC_SIMPLESEARCH_BUTTON);
switch (id) { case IDC_MATCHES_EDIT: case IDC_SEARCHBASE_EDIT: if (code == EN_CHANGE) MarkPageDirty(hwnd, PAGE_ADV); break;
case IDC_LDAP_PORT_EDIT: if (code == EN_CHANGE) { dw = GetDlgItemInt(hwnd, IDC_LDAP_PORT_EDIT, &fTrans, FALSE); EnableWindow(GetDlgItem(hwnd, IDC_USEDEFAULTS_BUTTON), !fTrans || (fSecure ? (dw != DEF_SLDAPPORT) : (dw != DEF_LDAPPORT)));
MarkPageDirty(hwnd, PAGE_ADV); } break;
case IDC_SIMPLESEARCH_BUTTON: case IDC_SECURECONNECT_BUTTON: case IDC_USEDEFAULTS_BUTTON: // Reset the settings on this page to the default values.
SetDlgItemInt(hwnd, IDC_LDAP_PORT_EDIT, fSecure ? DEF_SLDAPPORT : DEF_LDAPPORT, FALSE); EnableWindow(GetDlgItem(hwnd, IDC_USEDEFAULTS_BUTTON), FALSE);
MarkPageDirty(hwnd, PAGE_ADV);
SetFocus(GetDlgItem(hwnd, IDC_LDAP_PORT_EDIT)); break; } return (TRUE);
case WM_NOTIFY: pnmhdr = (NMHDR *)lParam; switch (pnmhdr->code) { case PSN_APPLY: // BEGIN validation
dwPort = GetDlgItemInt(hwnd, IDC_LDAP_PORT_EDIT, &fTrans, FALSE); if (!fTrans || dwPort == 0) { hwndT = GetDlgItem(hwnd, IDC_LDAP_PORT_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsErrPortNum, iddDirServProp_Advanced)); }
dwMatches = GetDlgItemInt(hwnd, IDC_MATCHES_EDIT, &fTrans, FALSE); if (!fTrans || dwMatches < MATCHES_MIN || dwMatches > MATCHES_MAX) { hwndT = GetDlgItem(hwnd, IDC_MATCHES_EDIT); return(InvalidAcctProp(hwnd, hwndT, idsErrMatches, iddDirServProp_Advanced)); }
// END validation
pAcct->SetPropDw(AP_LDAP_PORT, dwPort); pAcct->SetPropDw(AP_LDAP_SEARCH_RETURN, dwMatches);
dw = IsDlgButtonChecked(hwnd, IDC_SECURECONNECT_BUTTON); pAcct->SetPropDw(AP_LDAP_SSL, dw);
dw = IsDlgButtonChecked(hwnd, IDC_SIMPLESEARCH_BUTTON); pAcct->SetPropDw(AP_LDAP_SIMPLE_SEARCH, dw);
dw = GetTimeoutFromSlider(GetDlgItem(hwnd, IDC_TIMEOUT_SLIDER)); pAcct->SetPropDw(AP_LDAP_TIMEOUT, dw);
dw = GetWindowText(GetDlgItem(hwnd, IDC_SEARCHBASE_EDIT), sz, ARRAYSIZE(sz)); UlStripWhitespace(sz, TRUE, TRUE, &dw); if (dw == 0) pAcct->SetProp(AP_LDAP_SEARCH_BASE, NULL, 0); else pAcct->SetPropSz(AP_LDAP_SEARCH_BASE, sz);
PropSheet_UnChanged(GetParent(hwnd), hwnd); dw = PAGE_ADV; PropSheet_QuerySiblings(GetParent(hwnd), SM_SAVECHANGES, (LPARAM)&dw); if (dw == -1) { SetWindowLongPtr(hwnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE); return(TRUE); } break; } return (TRUE); }
return (FALSE); }
// BEGIN bug 21535
// Used for modifying propsheet template
const TCHAR c_szComctl[] = TEXT("comctl32.dll"); #define DLG_PROPSHEET 1006 // Bad hack...assumes comctl's res id
typedef struct { int inumLang; WORD wLang; } ENUMLANGDATA;
//
// EnumResLangProc
//
// purpose: a callback function for EnumResourceLanguages().
// look into the type passed in and if it is RT_DIALOG
// copy the lang of the first resource to our buffer
// this also counts # of lang if more than one of them
// are passed in
//
// IN: lparam: ENUMLANGDATA - defined at the top of this file
//
BOOL CALLBACK EnumResLangProc(HINSTANCE hinst, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIdLang, LPARAM lparam) { ENUMLANGDATA *pel = (ENUMLANGDATA *)lparam;
Assert(pel);
if (lpszType == RT_DIALOG) { if (pel->inumLang == 0) pel->wLang = wIdLang;
pel->inumLang++; } return TRUE; // continue until we get all langs...
}
//
// GetDialogLang
//
// purpose: fill out the ENUMLANGDATA (see top of this file) with the
// # of available langs in the module passed in, and the langid
// of what system enumerates first. i.e, the langid eq. to what
// the module localized if the module is localized in single
// language
//
// IN: hinstCpl - this is supposed to be a instance handle of inetcpl.
// pel - a pointer to the buffer we fill out
//
// RESULT: TRUE - everything cool, continue with adjusting property sheet
// FALSE - somethings wrong, abort adjusting property sheet.
//
BOOL GetDialogLang(HMODULE hinstCpl, ENUMLANGDATA *pel) { Assert(pel);
// Get the possible languages the template localized in.
EnumResourceLanguages(hinstCpl, RT_DIALOG, MAKEINTRESOURCE(iddMailSvrProp_General), (ENUMRESLANGPROC)EnumResLangProc, (LPARAM)pel);
return TRUE; } //
// PropSheetProc
//
// purpose: the callback function to modify resource template
// in order to make DLG_PROPSHEET's lang mathed with ours.
// there could be a general way but for now this is
// an ugly hack from inetcpl.
//
//
int CALLBACK PropSheetProc (HWND hwndDlg, UINT uMsg, LPARAM lParam) { LPVOID pTemplate = (LPVOID)lParam; LPVOID pTmpInLang; ENUMLANGDATA el = {0,0}; HINSTANCE hComctl; HRSRC hrsrc; HGLOBAL hgmem; DWORD cbNewTmp;
// Comm ctrl gives us a chance to recreate resource by this msg.
if (uMsg==PSCB_PRECREATE && pTemplate) { // enumrate any possible language used in this cpl for dialogs
if (!GetDialogLang(g_hInstRes, &el)) return 0; // failed to get resouce name
if (el.inumLang > 1) { // we've got multi-language templates
// let comctl load the one that matches our thread langid.
return 0; } if (GetSystemDefaultLangID() != el.wLang) { // Get comctl32's module handle
hComctl = GetModuleHandle(c_szComctl); if (hComctl) { // this is a horrible hack because we assume DLG_PROPSHEET
hrsrc = FindResourceEx(hComctl, RT_DIALOG, MAKEINTRESOURCE(DLG_PROPSHEET), el.wLang); if (hrsrc) { if (hgmem = LoadResource(hComctl, hrsrc)) { pTmpInLang = LockResource(hgmem); } if (pTmpInLang) { cbNewTmp = SizeofResource(hComctl, hrsrc); CopyMemory(pTemplate, pTmpInLang, cbNewTmp); } if (hgmem && pTmpInLang) { UnlockResource(hgmem); return 1; // everything went ok.
} } } } } return 0; }
// END bug 21535
const static HELPMAP g_rgCtxMapSmtpAuth[] = { {IDC_USEMAILSETTINGS, IDH_MAIL_OUT_SERV_SAME}, {IDC_ACCTNAME_STATIC, IDH_MAIL_SERV_POP3_ACCT}, {IDC_ACCTNAME_EDIT, IDH_MAIL_SERV_POP3_ACCT}, {IDC_ACCTPASS_STATIC, IDH_MAIL_SERV_PWORD}, {IDC_ACCTPASS_EDIT, IDH_MAIL_SERV_PWORD}, {IDC_LOGONSSPI_CHECK, IDH_MAIL_LOGON_USING_SICILY}, {IDC_REMEMBER_PASSWORD, 503}, {IDC_STATIC0, IDH_INETCOMM_GROUPBOX}, {IDC_STATIC1, IDH_INETCOMM_GROUPBOX}, {0, 0}};
INT_PTR CALLBACK SmtpLogonSettingsDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LPSMTPAUTHINFO pInfo=(LPSMTPAUTHINFO)GetWndThisPtr(hwnd); CHAR szUserName[CCHMAX_USERNAME]; CHAR szPassword[CCHMAX_PASSWORD]; BOOL fPromptPassword, fEnable; DWORD cbSize; SMTPAUTHTYPE authtype;
switch(uMsg) { case WM_INITDIALOG: // Get pInfo
pInfo = (LPSMTPAUTHINFO)lParam; Assert(pInfo && pInfo->authtype != SMTP_AUTH_NONE);
// SMTP_AUTH_SICILY
if (SMTP_AUTH_SICILY == pInfo->authtype) { CheckDlgButton(hwnd, IDC_SPECIFYSETTINGS, BST_CHECKED); CheckDlgButton(hwnd, IDC_LOGONSSPI_CHECK, BST_CHECKED); SetDlgItemText(hwnd, IDC_ACCTNAME_EDIT, pInfo->szUserName); SetDlgItemText(hwnd, IDC_ACCTPASS_EDIT, pInfo->szPassword); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_EDIT), !pInfo->fPromptPassword); }
// SMTP_AUTH_USE_POP3ORIMAP_SETTINGS
else if (SMTP_AUTH_USE_POP3ORIMAP_SETTINGS == pInfo->authtype) { // Check Logon Using Radio
CheckDlgButton(hwnd, IDC_USEMAILSETTINGS, BST_CHECKED); EnableWindow(GetDlgItem(hwnd, IDC_LOGONSSPI_CHECK), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTNAME_EDIT), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_EDIT), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_REMEMBER_PASSWORD), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTNAME_STATIC), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_STATIC), FALSE); }
// SMTP_AUTH_USE_SMTP_SETTINGS
else if (SMTP_AUTH_USE_SMTP_SETTINGS == pInfo->authtype) { CheckDlgButton(hwnd, IDC_SPECIFYSETTINGS, BST_CHECKED); SetDlgItemText(hwnd, IDC_ACCTNAME_EDIT, pInfo->szUserName); SetDlgItemText(hwnd, IDC_ACCTPASS_EDIT, pInfo->szPassword); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_EDIT), !pInfo->fPromptPassword); } else Assert(FALSE);
CheckDlgButton(hwnd, IDC_REMEMBER_PASSWORD, FALSE == pInfo->fPromptPassword);
SetWndThisPtr(hwnd, pInfo); break;
case WM_HELP: case WM_CONTEXTMENU: return(OnContextHelp(hwnd, uMsg, wParam, lParam, g_rgCtxMapSmtpAuth));
case WM_COMMAND: switch(GET_WM_COMMAND_ID(wParam,lParam)) { case IDC_LOGONSSPI_CHECK: case IDC_SPECIFYSETTINGS: case IDC_USEMAILSETTINGS: if (IsDlgButtonChecked(hwnd, IDC_SPECIFYSETTINGS)) { fPromptPassword = (FALSE == IsDlgButtonChecked(hwnd, IDC_REMEMBER_PASSWORD)); EnableWindow(GetDlgItem(hwnd, IDC_LOGONSSPI_CHECK), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTNAME_EDIT), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_EDIT), (FALSE == fPromptPassword)); EnableWindow(GetDlgItem(hwnd, IDC_REMEMBER_PASSWORD), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTNAME_STATIC), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_STATIC), TRUE); } else if (IsDlgButtonChecked(hwnd, IDC_USEMAILSETTINGS)) { EnableWindow(GetDlgItem(hwnd, IDC_LOGONSSPI_CHECK), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTNAME_EDIT), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_EDIT), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_REMEMBER_PASSWORD), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTNAME_STATIC), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_STATIC), FALSE); } break;
case IDC_REMEMBER_PASSWORD: EnableWindow(GetDlgItem(hwnd, IDC_ACCTPASS_EDIT), IsDlgButtonChecked(hwnd, IDC_REMEMBER_PASSWORD)); break;
case IDCANCEL: EndDialog(hwnd, IDCANCEL); return 1;
case IDOK: // SMTP_AUTH_USE_POP3ORIMAP_SETTINGS
if (IsDlgButtonChecked(hwnd, IDC_USEMAILSETTINGS)) { // No Change
if (SMTP_AUTH_USE_POP3ORIMAP_SETTINGS != pInfo->authtype) { pInfo->authtype = SMTP_AUTH_USE_POP3ORIMAP_SETTINGS; pInfo->fDirty = TRUE; EndDialog(hwnd, IDOK); return 1; } }
// Otherwise, use specified settings
else { // Get User Name and Password
GetDlgItemText(hwnd, IDC_ACCTNAME_EDIT, szUserName, ARRAYSIZE(szUserName));
// Cleanup szUserName
cbSize = lstrlen(szUserName); UlStripWhitespace(szUserName, TRUE, TRUE, &cbSize); if (cbSize == 0) { // Error
AcctMessageBox(hwnd, MAKEINTRESOURCE(idsAccountManager), MAKEINTRESOURCE(idsEnterAcctName), 0, MB_ICONEXCLAMATION | MB_OK); SetFocus(GetDlgItem(hwnd, IDC_ACCTNAME_EDIT)); return 1; }
// SMTP_AUTH_SICILY
if (IsDlgButtonChecked(hwnd, IDC_LOGONSSPI_CHECK)) authtype = SMTP_AUTH_SICILY; else authtype = SMTP_AUTH_USE_SMTP_SETTINGS;
// Get the Password
GetDlgItemText(hwnd, IDC_ACCTPASS_EDIT, szPassword, ARRAYSIZE(szPassword)); fPromptPassword = (FALSE == IsDlgButtonChecked(hwnd, IDC_REMEMBER_PASSWORD));
// No Change ?
if (authtype != pInfo->authtype || lstrcmpi(pInfo->szUserName, szUserName) != 0 || fPromptPassword != pInfo->fPromptPassword || lstrcmpi(pInfo->szPassword, szPassword) != 0) { pInfo->authtype = authtype; StrCpyN(pInfo->szUserName, szUserName, ARRAYSIZE(pInfo->szUserName)); StrCpyN(pInfo->szPassword, szPassword, ARRAYSIZE(pInfo->szPassword)); pInfo->fPromptPassword = fPromptPassword; pInfo->fDirty = TRUE; } }
EndDialog(hwnd, IDOK); return 1; } break; } return 0; }
HRESULT EscapeSpaces(LPCSTR psz, LPSTR pszOut, DWORD *pcch) { LPCSTR pch; LPSTR pchOut; DWORD cch, cchOut;
pchOut = pszOut; cch = *pcch; cchOut = 0;
for (pch = psz; *pch; pch++) { if (*pch == ' ') { cchOut += 3; if (cchOut > cch) return(E_FAIL); *pchOut++ = '%'; *pchOut++ = '2'; *pchOut++ = '0'; } else { cchOut++; if (cchOut > cch) return(E_FAIL); *pchOut++ = *pch; } }
cchOut++; if (cchOut > cch) return(E_FAIL);
*pchOut = 0; *pcch = cchOut;
return(S_OK); }
void GetDigitalID(HWND hwnd) { HRESULT hr; TCHAR szName[CCHMAX_DISPLAY_NAME]; TCHAR szEmail[CCHMAX_EMAIL_ADDRESS]; TCHAR szTemp[INTERNET_MAX_URL_LENGTH]; TCHAR szURL[INTERNET_MAX_URL_LENGTH]; DWORD cchOut = ARRAYSIZE(szURL);
PropSheet_QuerySiblings(GetParent(hwnd), MSM_GETDISPLAYNAME, (LPARAM)szName); PropSheet_QuerySiblings(GetParent(hwnd), MSM_GETEMAILADDRESS, (LPARAM)szEmail);
LoadString(g_hInstRes, idsGetCertURL, szURL, ARRAYSIZE(szURL)); wnsprintf(szTemp, ARRAYSIZE(szTemp), szURL, szName, szEmail);
// NOTE: we shellexec iexplore.exe here NOT the default handler for http://
// links. We have to make sure we launch this link with IE even if
// netscape is the browser. see georgeh for explanation of why.
if (SUCCEEDED(EscapeSpaces(szTemp, szURL, &cchOut))) ShellExecuteA(NULL, c_szOpen, c_szIexplore, szURL, NULL, SW_SHOWNORMAL); }
DWORD DwGenerateTrustedChain( HWND hwnd, DWORD dwFlags, PCCERT_CONTEXT pcCertToTest, DWORD dwToIgnore, BOOL fFullSearch, DWORD * pcChain, PCCERT_CONTEXT ** prgChain) { DWORD dwErr = 0; GUID guidAction = CERT_CERTIFICATE_ACTION_VERIFY; CERT_VERIFY_CERTIFICATE_TRUST trust = {0}; WINTRUST_BLOB_INFO blob = {0}; WINTRUST_DATA data = {0}; IMimeBody * pBody; PROPVARIANT var; HCERTSTORE rgCAs[3] = {0}; HCERTSTORE *pCAs = NULL; HCERTSTORE hMsg = NULL;
Assert(pcCertToTest);
data.cbStruct = sizeof(WINTRUST_DATA); data.pPolicyCallbackData = NULL; data.pSIPClientData = NULL; data.dwUIChoice = WTD_UI_NONE; data.fdwRevocationChecks = WTD_REVOKE_NONE; data.dwUnionChoice = WTD_CHOICE_BLOB; data.pBlob = &blob;
blob.cbStruct = sizeof(WINTRUST_BLOB_INFO); blob.pcwszDisplayName = NULL; blob.cbMemObject = sizeof(trust); blob.pbMemObject = (LPBYTE)&trust;
trust.cbSize = sizeof(trust); trust.pccert = pcCertToTest; trust.dwFlags = (fFullSearch ? CERT_TRUST_DO_FULL_SEARCH : 0); trust.pdwErrors = &dwErr; trust.pszUsageOid = szOID_PKIX_KP_EMAIL_PROTECTION; trust.pcChain = pcChain; trust.prgChain = prgChain;
trust.dwFlags |= dwFlags; //cvct.prgdwErrors
trust.dwIgnoreErr = dwToIgnore; if (pCAs) { trust.dwFlags |= CERT_TRUST_ADD_CERT_STORES; trust.rghstoreCAs = pCAs; trust.cStores = 3; }
LONG lr = WinVerifyTrust(hwnd, &guidAction, (void*)&data);
if(((LRESULT) lr) == CERT_E_REVOKED) dwErr = CERT_VALIDITY_CERTIFICATE_REVOKED;
else if(((LRESULT) lr) == CERT_E_REVOCATION_FAILURE) { Assert(FALSE); dwErr = CERT_VALIDITY_NO_CRL_FOUND; } else if (0 > lr) // WinVerifyTrust(hwnd, &guidAction, (void*)&data))
dwErr = CERT_VALIDITY_NO_TRUST_DATA;
if (dwErr) DOUTL(DOUTL_CRYPT, "Trust provider returned 0x%.8lx", dwErr);
// Filter these out since the trust provider isn't.
dwErr &= ~dwToIgnore;
CertCloseStore(rgCAs[0], 0); CertCloseStore(rgCAs[1], 0); CertCloseStore(rgCAs[2], 0);
return dwErr; }
|