// server.cpp : Implementation of CSmtpAdminService #include "stdafx.h" #include "IADM.h" #include "imd.h" #include "smtpadm.h" #include "ipaccess.h" #include "oleutil.h" #include "metautil.h" #include "smtpcmn.h" #include "service.h" #include "virsvr.h" #include "smtpprop.h" // Must define THIS_FILE_* macros to use SmtpCreateException() #define THIS_FILE_HELP_CONTEXT 0 #define THIS_FILE_PROG_ID _T("Smtpadm.Service.1") #define THIS_FILE_IID IID_ISmtpAdminService ///////////////////////////////////////////////////////////////////////////// // STDMETHODIMP CSmtpAdminService::InterfaceSupportsErrorInfo(REFIID riid) { static const IID* arr[] = { &IID_ISmtpAdminService, }; for (int i=0;i pmetabase; // Validate Server & Service Instance: // Talk to the metabase: hr = m_mbFactory.GetMetabaseObject ( m_strServer, &pmetabase ); if ( FAILED(hr) ) { goto Exit; } hr = GetPropertiesFromMetabase ( pmetabase ); if ( FAILED(hr) ) { goto Exit; } StateTrace ( 0, "Successfully got server properties" ); m_fGotProperties = TRUE; m_bvChangedFields = 0; Exit: TraceFunctLeave (); return hr; // CComPtr automatically releases the metabase handle. } //$------------------------------------------------------------------- // // CSmtpAdminService::Set // // Description: // // Sends server properties to the metabase. // // Parameters: // // (property) m_strServer // fFailIfChanged - return an error if the metabase has changed? // // Returns: // // E_POINTER, DISP_E_EXCEPTION, E_OUTOFMEMORY or NOERROR. // //-------------------------------------------------------------------- STDMETHODIMP CSmtpAdminService::Set ( BOOL fFailIfChanged ) { TraceFunctEnter ( "CSmtpAdminService::Set" ); HRESULT hr = NOERROR; CComPtr pmetabase; // Make sure the client call Get first: if ( !m_fGotProperties ) { ErrorTrace ( 0, "Didn't call get first" ); hr = SmtpCreateException ( IDS_SMTPEXCEPTION_DIDNT_CALL_GET ); goto Exit; } // nothing has been changed if( m_bvChangedFields == 0 ) { hr = NOERROR; goto Exit; } // Validate data members: if ( !ValidateStrings () ) { // !!!magnush - what about the case when any strings are NULL? hr = E_FAIL; goto Exit; } if ( !ValidateProperties ( ) ) { hr = SmtpCreateExceptionFromWin32Error ( ERROR_INVALID_PARAMETER );; goto Exit; } hr = m_mbFactory.GetMetabaseObject ( m_strServer, &pmetabase ); if ( FAILED(hr) ) { goto Exit; } hr = SendPropertiesToMetabase ( fFailIfChanged, pmetabase ); if ( FAILED(hr) ) { goto Exit; } StateTrace ( 0, "Successfully set server properties" ); // successfully saved, reset change field bitmap m_bvChangedFields = 0; Exit: TraceFunctLeave (); return hr; } //$------------------------------------------------------------------- // // CSmtpAdminService::GetPropertiesFromMetabase // // Description: // // Asks the metabase for each property in this class. // This class's properties come from /LM/SmtpSvc/ // // Parameters: // // pMetabase - The metabase object // // Returns: // // E_OUTOFMEMORY and others. // //-------------------------------------------------------------------- HRESULT CSmtpAdminService::GetPropertiesFromMetabase ( IMSAdminBase * pMetabase ) { TraceFunctEnter ( "CSmtpAdminService::GetPropertiesFromMetabase" ); HRESULT hr = NOERROR; CMetabaseKey metabase ( pMetabase ); BOOL fRet = TRUE; PSECURITY_DESCRIPTOR pSD = NULL; DWORD cbSD = 0; hr = metabase.Open ( SMTP_MD_ROOT_PATH ); if ( FAILED(hr) ) { ErrorTraceX ( (LPARAM) this, "Failed to open SmtpSvc key, %x", GetLastError() ); // Return some kind of error code here: hr = SmtpCreateExceptionFromWin32Error ( GetLastError () ); goto Exit; } fRet = TRUE; #if 0 fRet = StdGetMetabaseProp ( &metabase, MD_SECURE_PORT, DEFAULT_SSLPORT, &m_lSSLPort ) && fRet; #endif fRet = StdGetMetabaseProp ( &metabase, MD_REMOTE_SMTP_PORT, DEFAULT_OUTBOND_PORT, &m_lOutboundPort ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_SMARTHOST_NAME, DEFAULT_SMART_HOST, &m_strSmartHost ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_HOP_COUNT, DEFAULT_HOP_COUNT, &m_lHopCount ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_REVERSE_NAME_LOOKUP,DEFAULT_ENABLE_DNS_LOOKUP, &m_fEnableDNSLookup ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_POSTMASTER_EMAIL, DEFAULT_POSTMASTER_EMAIL, &m_strPostmasterEmail ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_POSTMASTER_NAME, DEFAULT_POSTMASTER_NAME, &m_strPostmasterName ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_FQDN_VALUE, DEFAULT_FQDN, &m_strFQDN ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_DEFAULT_DOMAIN_VALUE, DEFAULT_DEFAULT_DOMAIN, &m_strDefaultDomain ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_MAIL_DROP_DIR, DEFAULT_DROP_DIR, &m_strDropDir ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_BAD_MAIL_DIR, DEFAULT_BADMAIL_DIR, &m_strBadMailDir ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_MAIL_PICKUP_DIR, DEFAULT_PICKUP_DIR, &m_strPickupDir ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_MAIL_QUEUE_DIR, DEFAULT_QUEUE_DIR, &m_strQueueDir ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_MAX_OUTBOUND_CONNECTION, DEFAULT_MAX_OUT_CONNECTION, &m_lMaxOutConnection ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_REMOTE_TIMEOUT, DEFAULT_OUT_CONNECTION_TIMEOUT, &m_lOutConnectionTimeout ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_MAX_MSG_SIZE, DEFAULT_MAX_MESSAGE_SIZE, &m_lMaxMessageSize ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_MAX_MSG_SIZE_B4_CLOSE, DEFAULT_MAX_SESSION_SIZE, &m_lMaxSessionSize ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_MAX_RECIPIENTS, DEFAULT_MAX_MESSAGE_RECIPIENTS, &m_lMaxMessageRecipients ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_LOCAL_RETRY_ATTEMPTS, DEFAULT_LOCAL_RETRIES, &m_lLocalRetries) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_LOCAL_RETRY_MINUTES, DEFAULT_LOCAL_RETRY_TIME, &m_lLocalRetryTime) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_REMOTE_RETRY_ATTEMPTS, DEFAULT_REMOTE_RETRIES, &m_lRemoteRetries) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_REMOTE_RETRY_MINUTES, DEFAULT_REMOTE_RETRY_TIME, &m_lRemoteRetryTime) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_ETRN_DAYS, DEFAULT_ETRN_DAYS, &m_lETRNDays) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_ROUTING_DLL, DEFAULT_ROUTING_DLL, &m_strRoutingDLL) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_ROUTING_SOURCES, DEFAULT_ROUTING_SOURCES, &m_mszRoutingSources) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_LOCAL_DOMAINS, DEFAULT_LOCAL_DOMAINS, &m_mszLocalDomains) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_DOMAIN_ROUTING, DEFAULT_DOMAIN_ROUTING, &m_mszDomainRouting) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_MASQUERADE_NAME, DEFAULT_MASQUERADE_DOMAIN, &m_strMasqueradeDomain) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_SEND_NDR_TO, DEFAULT_SENDNDRTO, &m_strNdrAddr) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_SEND_BAD_TO, DEFAULT_SENDBADTO, &m_strBadAddr) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_REMOTE_SECURE_PORT, DEFAULT_REMOTE_SECURE_PORT, &m_lRemoteSecurePort) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_SHOULD_DELIVER, DEFAULT_SHOULD_DELIVER, &m_fShouldDeliver ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_ALWAYS_USE_SSL, DEFAULT_ALWAYS_USE_SSL, &m_fAlwaysUseSsl ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_LIMIT_REMOTE_CONNECTIONS, DEFAULT_LIMIT_REMOTE_CONNECTIONS, &m_fLimitRemoteConnections ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_MAX_OUT_CONN_PER_DOMAIN, DEFAULT_MAX_OUT_CONN_PER_DOMAIN, &m_lMaxOutConnPerDomain ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_SMARTHOST_TYPE, DEFAULT_SMART_HOST_TYPE, &m_lSmartHostType ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_BATCH_MSG_LIMIT, DEFAULT_BATCH_MSG_LIMIT, &m_lBatchMsgLimit ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_DO_MASQUERADE, DEFAULT_DO_MASQUERADE, &m_fDoMasquerade ) && fRet; // the following properties are set on smtpsvc/ level for virtual server fRet = StdGetMetabaseProp ( &metabase, MD_SERVER_BINDINGS, DEFAULT_SERVER_BINDINGS, &m_mszServerBindings ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_SECURE_BINDINGS, DEFAULT_SECURE_BINDINGS, &m_mszSecureBindings ) && fRet; // fRet = StdGetMetabaseProp ( &metabase, MD_PORT, DEFAULT_PORT, &m_lPort ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_MAX_CONNECTIONS, DEFAULT_MAX_IN_CONNECTION, &m_lMaxInConnection ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_CONNECTION_TIMEOUT, DEFAULT_IN_CONNECTION_TIMEOUT, &m_lInConnectionTimeout ) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_LOGFILE_DIRECTORY, DEFAULT_LOGFILE_DIRECTORY, &m_strLogFileDirectory) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_LOGFILE_PERIOD, DEFAULT_LOGFILE_PERIOD, &m_lLogFilePeriod) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_LOGFILE_TRUNCATE_SIZE,DEFAULT_LOGFILE_TRUNCATE_SIZE, &m_lLogFileTruncateSize) && fRet; // fRet = StdGetMetabaseProp ( &metabase, MD_LOG_METHOD, DEFAULT_LOG_METHOD, &m_lLogMethod) && fRet; fRet = StdGetMetabaseProp ( &metabase, MD_LOG_TYPE, DEFAULT_LOG_TYPE, &m_lLogType) && fRet; // Get the admin ACL DWORD dwDummy; pSD = NULL; cbSD = 0; metabase.GetData ( _T(""), MD_ADMIN_ACL, IIS_MD_UT_SERVER, BINARY_METADATA, &dwDummy, &cbSD, METADATA_INHERIT); if ( cbSD != 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER ) { pSD = (PSECURITY_DESCRIPTOR) new char [ cbSD ]; if( NULL == pSD ) { hr = E_OUTOFMEMORY; goto Exit; } fRet = metabase.GetData ( _T(""), MD_ADMIN_ACL, IIS_MD_UT_SERVER, BINARY_METADATA, pSD, &cbSD,METADATA_INHERIT ); } // Check all property strings: // If any string is NULL, it is because we failed to allocate memory: if ( !ValidateStrings () ) { hr = E_OUTOFMEMORY; goto Exit; } // We can only fail from memory allocations: _ASSERT ( fRet ); // Save the last changed time for this key: m_ftLastChanged.dwHighDateTime = 0; m_ftLastChanged.dwLowDateTime = 0; hr = pMetabase->GetLastChangeTime ( metabase.QueryHandle(), _T(""), &m_ftLastChanged, FALSE ); if ( FAILED (hr) ) { ErrorTraceX ( (LPARAM) this, "Failed to get last change time: %x", hr ); // Ignore this error. hr = NOERROR; } // Validate the data received from the metabase: _ASSERT ( ValidateStrings () ); _ASSERT ( ValidateProperties( ) ); // Extract the Administrator list: if ( m_psaAdmins ) { SafeArrayDestroy ( m_psaAdmins ); m_psaAdmins = NULL; } if ( pSD ) { hr = AclToAdministrators ( m_strServer, pSD, &m_psaAdmins ); BAIL_ON_FAILURE(hr); } if ( !ValidateProperties( ) ) { CorrectProperties (); } Exit: delete (char*) pSD; TraceFunctLeave (); return hr; // CMetabaseKey automatically closes its handle } //$------------------------------------------------------------------- // // CSmtpAdminService::SendPropertiesToMetabase // // Description: // // Saves each property to the metabase. // This class's properties go into /LM/SmtpSvc/ // // Parameters: // // fFailIfChanged - Return a failure code if the metabase // has changed since last get. // pMetabase - the metabase object. // // Returns: // // E_OUTOFMEMORY and others. // //-------------------------------------------------------------------- HRESULT CSmtpAdminService::SendPropertiesToMetabase ( BOOL fFailIfChanged, IMSAdminBase * pMetabase ) { TraceFunctEnter ( "CSmtpAdminService::SendPropertiesToMetabase" ); HRESULT hr = NOERROR; CMetabaseKey metabase ( pMetabase ); BOOL fRet = TRUE; // // Set the admin acl: // PSECURITY_DESCRIPTOR pSD = NULL; DWORD cbSD = 0; // if ( m_bvChangedFields & CHNG_ADMINACL ) { if ( m_psaAdmins ) { hr = AdministratorsToAcl ( m_strServer, m_psaAdmins, &pSD, &cbSD ); BAIL_ON_FAILURE(hr); } // } hr = metabase.Open ( SMTP_MD_ROOT_PATH, METADATA_PERMISSION_WRITE ); if ( FAILED(hr) ) { ErrorTraceX ( (LPARAM) this, "Failed to open SmtpSvc key, %x", GetLastError() ); // !!!magnush - Should we return a simple Service doesn't exist error code? hr = SmtpCreateExceptionFromWin32Error ( GetLastError () ); goto Exit; } // Does the client care if the key has changed? if ( fFailIfChanged ) { // Did the key change? if ( HasKeyChanged ( pMetabase, metabase.QueryHandle(), &m_ftLastChanged ) ) { StateTrace ( (LPARAM) this, "Metabase has changed, not setting properties" ); // !!!magnush - Return the appropriate error code: hr = E_FAIL; goto Exit; } } // // The general procedure here is to keep setting metabase properties // as long as nothing has gone wrong. This is done by short-circuiting // the statement by ANDing it with the status code. This makes the code // much more concise. // fRet = TRUE; #if 0 if ( m_bvChangedFields & BitMask(ID_SSLPORT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SECURE_PORT, m_lSSLPort ) && fRet; } #endif if ( m_bvChangedFields & BitMask(ID_OUTBOUNDPORT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_REMOTE_SMTP_PORT, m_lOutboundPort ) && fRet; } if ( m_bvChangedFields & BitMask(ID_HOP_COUNT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_HOP_COUNT, m_lHopCount ) && fRet; } if ( m_bvChangedFields & BitMask(ID_SMARTHOST) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SMARTHOST_NAME, m_strSmartHost ) && fRet; } if ( m_bvChangedFields & BitMask(ID_ENABLEDNSLOOKUP) ) { fRet = StdPutMetabaseProp ( &metabase, MD_REVERSE_NAME_LOOKUP,m_fEnableDNSLookup ) && fRet; } if ( m_bvChangedFields & BitMask(ID_POSTMASTEREMAIL) ) { fRet = StdPutMetabaseProp ( &metabase, MD_POSTMASTER_EMAIL, m_strPostmasterEmail ) && fRet; } if ( m_bvChangedFields & BitMask(ID_POSTMASTERNAME) ) { fRet = StdPutMetabaseProp ( &metabase, MD_POSTMASTER_NAME, m_strPostmasterName ) && fRet; } if ( m_bvChangedFields & BitMask(ID_FQDN) ) { // need to set the UPDATED flag if( m_strFQDN.m_str && m_strFQDN.m_str[0] ) { fRet = StdPutMetabaseProp ( &metabase, MD_UPDATED_FQDN, 1 ) && fRet; fRet = StdPutMetabaseProp ( &metabase, MD_FQDN_VALUE, m_strFQDN ) && fRet; } else { // empty string indicating using TCP/IP setting fRet = StdPutMetabaseProp ( &metabase, MD_UPDATED_FQDN, 0 ) && fRet; } } if ( m_bvChangedFields & BitMask(ID_DEFAULTDOMAIN) ) { // need to set the UPDATE flag fRet = StdPutMetabaseProp ( &metabase, MD_UPDATED_DEFAULT_DOMAIN, 1 ) && fRet; fRet = StdPutMetabaseProp ( &metabase, MD_DEFAULT_DOMAIN_VALUE, m_strDefaultDomain ) && fRet; } if ( m_bvChangedFields & BitMask(ID_DROPDIR) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAIL_DROP_DIR, m_strDropDir ) && fRet; } if ( m_bvChangedFields & BitMask(ID_BADMAILDIR) ) { fRet = StdPutMetabaseProp ( &metabase, MD_BAD_MAIL_DIR, m_strBadMailDir ) && fRet; } if ( m_bvChangedFields & BitMask(ID_PICKUPDIR) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAIL_PICKUP_DIR, m_strPickupDir ) && fRet; } if ( m_bvChangedFields & BitMask(ID_QUEUEDIR) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAIL_QUEUE_DIR, m_strQueueDir ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXOUTCONNECTION) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_OUTBOUND_CONNECTION, m_lMaxOutConnection ) && fRet; } if ( m_bvChangedFields & BitMask(ID_OUTCONNECTIONTIMEOUT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_REMOTE_TIMEOUT, m_lOutConnectionTimeout ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXMESSAGESIZE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_MSG_SIZE, m_lMaxMessageSize ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXSESSIONSIZE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_MSG_SIZE_B4_CLOSE, m_lMaxSessionSize ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXMESSAGERECIPIENTS) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_RECIPIENTS, m_lMaxMessageRecipients ) && fRet; } if ( m_bvChangedFields & BitMask(ID_LOCALRETRYTIME) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOCAL_RETRY_MINUTES, m_lLocalRetryTime) && fRet; } if ( m_bvChangedFields & BitMask(ID_REMOTERETRYTIME) ) { fRet = StdPutMetabaseProp ( &metabase, MD_REMOTE_RETRY_MINUTES, m_lRemoteRetryTime) && fRet; } if ( m_bvChangedFields & BitMask(ID_ETRNDAYS) ) { fRet = StdPutMetabaseProp ( &metabase, MD_ETRN_DAYS, m_lETRNDays) && fRet; } if ( m_bvChangedFields & BitMask(ID_ROUTINGDLL) ) { fRet = StdPutMetabaseProp ( &metabase, MD_ROUTING_DLL, m_strRoutingDLL) && fRet; } if ( m_bvChangedFields & BitMask(ID_ROUTINGSOURCES) ) { fRet = StdPutMetabaseProp ( &metabase, MD_ROUTING_SOURCES, &m_mszRoutingSources) && fRet; } if ( m_bvChangedFields & BitMask(ID_LOCALDOMAINS) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOCAL_DOMAINS, &m_mszLocalDomains) && fRet; } if ( m_bvChangedFields & BitMask(ID_DOMAINROUTING) ) { fRet = StdPutMetabaseProp ( &metabase, MD_DOMAIN_ROUTING, &m_mszDomainRouting) && fRet; } if ( m_bvChangedFields & BitMask(ID_LOCALRETRIES) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOCAL_RETRY_ATTEMPTS, m_lLocalRetries) && fRet; } if ( m_bvChangedFields & BitMask(ID_REMOTERETRIES) ) { fRet = StdPutMetabaseProp ( &metabase, MD_REMOTE_RETRY_ATTEMPTS, m_lRemoteRetries) && fRet; } if ( m_bvChangedFields & BitMask(ID_MASQUERADE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MASQUERADE_NAME, m_strMasqueradeDomain) && fRet; } if ( m_bvChangedFields & BitMask(ID_SENDNDRTO) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SEND_NDR_TO, m_strNdrAddr) && fRet; } if ( m_bvChangedFields & BitMask(ID_SENDBADTO) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SEND_BAD_TO, m_strBadAddr) && fRet; } if ( m_bvChangedFields & BitMask(ID_REMOTE_SECURE_PORT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_REMOTE_SECURE_PORT, m_lRemoteSecurePort) && fRet; } if ( m_bvChangedFields & BitMask(ID_SHOULD_DELIVER) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SHOULD_DELIVER, m_fShouldDeliver) && fRet; } if ( m_bvChangedFields & BitMask(ID_ALWAYS_USE_SSL) ) { fRet = StdPutMetabaseProp ( &metabase, MD_ALWAYS_USE_SSL, m_fAlwaysUseSsl) && fRet; } if ( m_bvChangedFields & BitMask(ID_LIMIT_REMOTE_CONNECTIONS) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LIMIT_REMOTE_CONNECTIONS, m_fLimitRemoteConnections) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAX_OUT_CONN_PER_DOMAIN) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_OUT_CONN_PER_DOMAIN, m_lMaxOutConnPerDomain) && fRet; } if ( m_bvChangedFields & BitMask(ID_SMART_HOST_TYPE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SMARTHOST_TYPE, m_lSmartHostType) && fRet; } if ( m_bvChangedFields & BitMask(ID_BATCH_MSG_LIMIT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_BATCH_MSG_LIMIT, m_lBatchMsgLimit) && fRet; } if ( m_bvChangedFields & BitMask(ID_DO_MASQUERADE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_DO_MASQUERADE, m_fDoMasquerade) && fRet; } // the following properties are set on smtpsvc/ level for virtual server if ( m_bvChangedFields & BitMask(ID_SERVER_BINDINGS) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SERVER_BINDINGS, &m_mszServerBindings ) && fRet; } if ( m_bvChangedFields & BitMask(ID_SECURE_BINDINGS) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SECURE_BINDINGS, &m_mszSecureBindings ) && fRet; } if ( m_bvChangedFields & BitMask(ID_PORT) ) { // fRet = StdPutMetabaseProp ( &metabase, MD_PORT, m_lPort ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXINCONNECTION) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_CONNECTIONS, m_lMaxInConnection ) && fRet; } if ( m_bvChangedFields & BitMask(ID_INCONNECTIONTIMEOUT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_CONNECTION_TIMEOUT,m_lInConnectionTimeout ) && fRet; } if ( m_bvChangedFields & BitMask(ID_LOGFILEDIRECTORY) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOGFILE_DIRECTORY, m_strLogFileDirectory) && fRet; } if ( m_bvChangedFields & BitMask(ID_LOGFILEPERIOD) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOGFILE_PERIOD, m_lLogFilePeriod) && fRet; } if ( m_bvChangedFields & BitMask(ID_LOGFILETRUNCATESIZE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOGFILE_TRUNCATE_SIZE, m_lLogFileTruncateSize) && fRet; } // if ( m_bvChangedFields & BitMask(ID_LOGMETHOD) ) // { // fRet = StdPutMetabaseProp ( &metabase, MD_LOG_TYPE, m_lLogMethod) && fRet; // } if ( m_bvChangedFields & BitMask(ID_LOGTYPE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOG_TYPE, m_lLogType) && fRet; } // if ( m_bvChangedFields & CHNG_ADMINACL ) { if ( pSD ) { fRet = fRet && metabase.SetData ( _T(""), MD_ADMIN_ACL, IIS_MD_UT_SERVER, BINARY_METADATA, pSD, cbSD, METADATA_INHERIT | METADATA_REFERENCE); } else { pMetabase->DeleteData ( metabase.QueryHandle(), _T(""), MD_ADMIN_ACL, BINARY_METADATA ); } // } // Save the data to the metabase: // hr = metabase.Close(); // BAIL_ON_FAILURE(hr); metabase.Close(); hr = pMetabase->SaveData (); if ( FAILED (hr) ) { ErrorTraceX ( (LPARAM) this, "Failed SaveData call (%x)", hr ); goto Exit; } // Save the last changed time for this key: m_ftLastChanged.dwHighDateTime = 0; m_ftLastChanged.dwLowDateTime = 0; hr = pMetabase->GetLastChangeTime ( metabase.QueryHandle(), _T(""), &m_ftLastChanged, FALSE ); if ( FAILED (hr) ) { ErrorTraceX ( (LPARAM) this, "Failed to get last change time: %x", hr ); // Ignore this error. hr = NOERROR; } Exit: delete (char*) pSD; if( SUCCEEDED(hr) && !fRet ) { hr = SmtpCreateExceptionFromWin32Error ( GetLastError () ); } TraceFunctLeave (); return hr; // CMetabaseKey automatically closes its handle } //$------------------------------------------------------------------- // // CSmtpAdminService::ValidateStrings // // Description: // // Checks to make sure each string property is non-null. // // Returns: // // FALSE if any string property is NULL. // //-------------------------------------------------------------------- BOOL CSmtpAdminService::ValidateStrings ( ) const { TraceFunctEnter ( "CSmtpAdminService::ValidateStrings" ); // Check all property strings: // If any string is NULL, return FALSE: if ( !m_strSmartHost || !m_strPostmasterEmail || !m_strPostmasterName || !m_strDefaultDomain || !m_strBadMailDir || !m_strPickupDir || !m_strQueueDir || !m_strRoutingDLL || !m_strLogFileDirectory ) { ErrorTrace ( (LPARAM) this, "String validation failed" ); TraceFunctLeave (); return FALSE; } _ASSERT ( IS_VALID_STRING ( m_strSmartHost ) ); _ASSERT ( IS_VALID_STRING ( m_strPostmasterEmail ) ); _ASSERT ( IS_VALID_STRING ( m_strPostmasterName ) ); _ASSERT ( IS_VALID_STRING ( m_strDefaultDomain ) ); _ASSERT ( IS_VALID_STRING ( m_strBadMailDir ) ); _ASSERT ( IS_VALID_STRING ( m_strPickupDir ) ); _ASSERT ( IS_VALID_STRING ( m_strQueueDir ) ); _ASSERT ( IS_VALID_STRING ( m_strRoutingDLL ) ); _ASSERT ( IS_VALID_STRING ( m_strLogFileDirectory ) ); TraceFunctLeave (); return TRUE; } //$------------------------------------------------------------------- // // CSmtpAdminService::ValidateProperties // // Description: // // Checks to make sure all parameters are valid. // // Parameters: // // // Returns: // // FALSE if any property was not valid. // //-------------------------------------------------------------------- BOOL CSmtpAdminService::ValidateProperties ( ) const { BOOL fRet = TRUE; _ASSERT ( ValidateStrings () ); /* fRet = fRet && PV_MinMax ( m_lPort, MIN_PORT, MAX_PORT ); fRet = fRet && PV_MinMax ( m_lSSLPort, MIN_SSLPORT, MAX_SSLPORT ); fRet = fRet && PV_MinMax ( m_lOutboundPort, MIN_OUTBOND_PORT, MAX_OUTBOND_PORT ); fRet = fRet && PV_MinMax ( m_lMaxInConnection, MIN_MAX_IN_CONNECTION, MAX_MAX_IN_CONNECTION ); fRet = fRet && PV_MinMax ( m_lMaxOutConnection, MIN_MAX_OUT_CONNECTION, MAX_MAX_OUT_CONNECTION ); fRet = fRet && PV_MinMax ( m_lInConnectionTimeout, MIN_IN_CONNECTION_TIMEOUT, MAX_IN_CONNECTION_TIMEOUT ); fRet = fRet && PV_MinMax ( m_lOutConnectionTimeout, MIN_OUT_CONNECTION_TIMEOUT, MAX_OUT_CONNECTION_TIMEOUT ); fRet = fRet && PV_MinMax ( m_lMaxMessageSize, MIN_MAX_MESSAGE_SIZE, MAX_MAX_MESSAGE_SIZE ); fRet = fRet && PV_MinMax ( m_lMaxSessionSize, MIN_MAX_SESSION_SIZE, MAX_MAX_SESSION_SIZE ); fRet = fRet && PV_MinMax ( m_lMaxMessageRecipients, MIN_MAX_MESSAGE_RECIPIENTS, MAX_MAX_MESSAGE_RECIPIENTS ); fRet = fRet && PV_MinMax ( m_lLocalRetries, MIN_LOCAL_RETRIES, MAX_LOCAL_RETRIES ); fRet = fRet && PV_MinMax ( m_lLocalRetryTime, MIN_LOCAL_RETRY_TIME, MAX_LOCAL_RETRY_TIME ); fRet = fRet && PV_MinMax ( m_lRemoteRetries, MIN_REMOTE_RETRIES, MAX_REMOTE_RETRIES ); fRet = fRet && PV_MinMax ( m_lRemoteRetryTime, MIN_REMOTE_RETRY_TIME, MAX_REMOTE_RETRY_TIME ); fRet = fRet && PV_MinMax ( m_lETRNDays, MIN_ETRN_DAYS, MAX_ETRN_DAYS ); fRet = fRet && PV_MinMax ( m_lLogFilePeriod, MIN_LOGFILE_PERIOD, MAX_LOGFILE_PERIOD ); fRet = fRet && PV_MinMax ( m_lLogFileTruncateSize, MIN_LOGFILE_TRUNCATE_SIZE, MAX_LOGFILE_TRUNCATE_SIZE ); fRet = fRet && PV_MinMax ( m_lLogMethod, MIN_LOG_METHOD, MAX_LOG_METHOD ); fRet = fRet && PV_MinMax ( m_lLogType, MIN_LOG_TYPE, MAX_LOG_TYPE ); fRet = fRet && PV_Boolean ( m_fEnableDNSLookup ); fRet = fRet && PV_Boolean ( m_fSendDNRToPostmaster ); fRet = fRet && PV_Boolean ( m_fSendBadmailToPostmaster ); */ return fRet; } void CSmtpAdminService::CorrectProperties ( ) { /* if ( m_strServer && !PV_MaxChars ( m_strServer, MAXLEN_SERVER ) ) { m_strServer[ MAXLEN_SERVER - 1 ] = NULL; } if ( !PV_MinMax ( m_dwArticleTimeLimit, MIN_ARTICLETIMELIMIT, MAX_ARTICLETIMELIMIT ) ) { m_dwArticleTimeLimit = DEFAULT_ARTICLETIMELIMIT; } if ( !PV_MinMax ( m_dwHistoryExpiration, MIN_HISTORYEXPIRATION, MAX_HISTORYEXPIRATION ) ) { m_dwHistoryExpiration = DEFAULT_HISTORYEXPIRATION; } if ( !PV_Boolean ( m_fHonorClientMsgIDs ) ) { m_fHonorClientMsgIDs = !!m_fHonorClientMsgIDs; } if ( !PV_MaxChars ( m_strSmtpServer, MAXLEN_SMTPSERVER ) ) { m_strSmtpServer[ MAXLEN_SMTPSERVER - 1 ] = NULL; } if ( !PV_Boolean ( m_fAllowClientPosts ) ) { m_fAllowClientPosts = !!m_fAllowClientPosts; } if ( !PV_Boolean ( m_fAllowFeedPosts ) ) { m_fAllowFeedPosts = !!m_fAllowFeedPosts; } if ( !PV_Boolean ( m_fAllowControlMsgs ) ) { m_fAllowControlMsgs = !!m_fAllowControlMsgs; } if ( !PV_MaxChars ( m_strDefaultModeratorDomain, MAXLEN_DEFAULTMODERATORDOMAIN ) ) { m_strDefaultModeratorDomain[ MAXLEN_DEFAULTMODERATORDOMAIN - 1] = NULL; } if ( !PV_MinMax ( m_dwCommandLogMask, MIN_COMMANDLOGMASK, MAX_COMMANDLOGMASK ) ) { m_dwCommandLogMask = DEFAULT_COMMANDLOGMASK; } if ( !PV_Boolean ( m_fDisableNewnews ) ) { m_fDisableNewnews = !!m_fDisableNewnews; } if ( !PV_MinMax ( m_dwExpireRunFrequency, MIN_EXPIRERUNFREQUENCY, MAX_EXPIRERUNFREQUENCY ) ) { m_dwExpireRunFrequency = DEFAULT_EXPIRERUNFREQUENCY; } if ( !PV_MinMax ( m_dwShutdownLatency, MIN_SHUTDOWNLATENCY, MAX_SHUTDOWNLATENCY ) ) { m_dwShutdownLatency = DEFAULT_SHUTDOWNLATENCY; } --------- if ( m_bvChangedFields & BitMask(ID_PORT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_PORT, m_lPort ) && fRet; } #if 0 if ( m_bvChangedFields & BitMask(ID_SSLPORT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SECURE_PORT, m_lSSLPort ) && fRet; } #endif if ( m_bvChangedFields & BitMask(ID_OUTBOUNDPORT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_REMOTE_SMTP_PORT, m_lOutboundPort ) && fRet; } if ( m_strServer && !PV_MaxChars ( m_strServer, MAXLEN_SERVER ) ) { m_strServer[ MAXLEN_SERVER - 1 ] = NULL; } if ( m_bvChangedFields & BitMask(ID_SMARTHOST) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SMARTHOST_NAME, m_strSmartHost ) && fRet; } if ( m_bvChangedFields & BitMask(ID_ENABLEDNSLOOKUP) ) { fRet = StdPutMetabaseProp ( &metabase, MD_REVERSE_NAME_LOOKUP,m_fEnableDNSLookup ) && fRet; } if ( m_bvChangedFields & BitMask(ID_POSTMASTEREMAIL) ) { fRet = StdPutMetabaseProp ( &metabase, MD_POSTMASTER_EMAIL, m_strPostmasterEmail ) && fRet; } if ( m_bvChangedFields & BitMask(ID_POSTMASTERNAME) ) { fRet = StdPutMetabaseProp ( &metabase, MD_POSTMASTER_NAME, m_strPostmasterName ) && fRet; } if ( m_bvChangedFields & BitMask(ID_DEFAULTDOMAIN) ) { fRet = StdPutMetabaseProp ( &metabase, MD_DEFAULT_DOMAIN_VALUE, m_strDefaultDomain ) && fRet; } if ( m_bvChangedFields & BitMask(ID_BADMAILDIR) ) { fRet = StdPutMetabaseProp ( &metabase, MD_BAD_MAIL_DIR, m_strBadMailDir ) && fRet; } if ( m_bvChangedFields & BitMask(ID_PICKUPDIR) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAIL_PICKUP_DIR, m_strPickupDir ) && fRet; } if ( m_bvChangedFields & BitMask(ID_QUEUEDIR) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAIL_QUEUE_DIR, m_strQueueDir ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXINCONNECTION) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_CONNECTIONS, m_lMaxInConnection ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXOUTCONNECTION) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_OUTBOUND_CONNECTION, m_lMaxOutConnection ) && fRet; } if ( m_bvChangedFields & BitMask(ID_INCONNECTIONTIMEOUT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_CONNECTION_TIMEOUT,m_lInConnectionTimeout ) && fRet; } if ( m_bvChangedFields & BitMask(ID_OUTCONNECTIONTIMEOUT) ) { fRet = StdPutMetabaseProp ( &metabase, MD_REMOTE_TIMEOUT, m_lOutConnectionTimeout ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXMESSAGESIZE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_MSG_SIZE, m_lMaxMessageSize ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXSESSIONSIZE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_MSG_SIZE_B4_CLOSE, m_lMaxSessionSize ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXMESSAGERECIPIENTS) ) { fRet = StdPutMetabaseProp ( &metabase, MD_MAX_RECIPIENTS, m_lMaxMessageRecipients ) && fRet; } if ( m_bvChangedFields & BitMask(ID_MAXRETRIES) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOCAL_RETRY_ATTEMPTS, m_lMaxRetries ) && fRet; } if ( m_bvChangedFields & BitMask(ID_LOCALRETRYTIME) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOCAL_RETRY_MINUTES, m_lLocalRetryTime) && fRet; } if ( m_bvChangedFields & BitMask(ID_REMOTERETRYTIME) ) { fRet = StdPutMetabaseProp ( &metabase, MD_REMOTE_RETRY_MINUTES, m_lRemoteRetryTime) && fRet; } if ( m_bvChangedFields & BitMask(ID_ETRNDAYS) ) { fRet = StdPutMetabaseProp ( &metabase, MD_ETRN_DAYS, m_lETRNDays) && fRet; } if ( m_bvChangedFields & BitMask(ID_SENDDNRTOPOSTMASTER) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SEND_NDR_TO_ADMIN, m_fSendDNRToPostmaster) && fRet; } if ( m_bvChangedFields & BitMask(ID_SENDBADMAILTOPOSTMASTER) ) { fRet = StdPutMetabaseProp ( &metabase, MD_SEND_BAD_TO_ADMIN, m_fSendBadmailToPostmaster) && fRet; } // if ( m_bvChangedFields & BitMask(ID_RTTYPE) ) // { // fRet = StdPutMetabaseProp ( &metabase, MD_ROUTING_SOURCES, m_lRTType) && fRet; // } if ( m_bvChangedFields & BitMask(ID_ROUTINGSOURCES) ) { fRet = StdPutMetabaseProp ( &metabase, MD_ROUTING_SOURCES, m_strRoutingSources) && fRet; } if ( m_bvChangedFields & BitMask(ID_LOGFILEDIRECTORY) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOGFILE_DIRECTORY, m_strLogFileDirectory) && fRet; } if ( m_bvChangedFields & BitMask(ID_LOGFILEPERIOD) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOGFILE_PERIOD, m_lLogFilePeriod) && fRet; } if ( m_bvChangedFields & BitMask(ID_LOGFILETRUNCATESIZE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOGFILE_TRUNCATE_SIZE, m_lLogFileTruncateSize) && fRet; } // if ( m_bvChangedFields & BitMask(ID_LOGMETHOD) ) // { // fRet = StdPutMetabaseProp ( &metabase, MD_LOG_TYPE, m_lLogMethod) && fRet; // } if ( m_bvChangedFields & BitMask(ID_LOGTYPE) ) { fRet = StdPutMetabaseProp ( &metabase, MD_LOG_TYPE, m_lLogType) && fRet; } */ _ASSERT ( ValidateProperties ( ) ); }