Windows2003-3790/inetsrv/iis/svcs/smtp/adminsso/domain.cpp
2020-09-30 16:53:55 +02:00

996 lines
23 KiB
C++

// domain.cpp : Implementation of CsmtpadmApp and DLL registration.
#include "stdafx.h"
#include "iadm.h"
#include "iiscnfg.h"
#include "smtpadm.h"
#include "domain.h"
#include "oleutil.h"
#include "metautil.h"
#include "listmacr.h"
#include <lmapibuf.h>
#include "smtpcmn.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.Domain.1")
#define THIS_FILE_IID IID_ISmtpAdminDomain
#define UNASSIGNED_DOMAIN_ID ( DWORD( -1 ) )
/////////////////////////////////////////////////////////////////////////////
//
//
// Use a macro to define all the default methods
//
DECLARE_METHOD_IMPLEMENTATION_FOR_STANDARD_EXTENSION_INTERFACES(SmtpAdminDomain, CSmtpAdminDomain, IID_ISmtpAdminDomain)
STDMETHODIMP CSmtpAdminDomain::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_ISmtpAdminDomain,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
CSmtpAdminDomain::CSmtpAdminDomain ()
// CComBSTR's are initialized to NULL by default.
{
m_lCount = 0;
m_dwActionType = SMTP_DELIVER;
m_fAllowEtrn = FALSE;
m_dwDomainId = UNASSIGNED_DOMAIN_ID;
m_dwMaxDomainId = 0;
m_fEnumerated = FALSE;
m_pCurrentDomainEntry = NULL;
m_pDefaultDomainEntry = NULL;
InitializeListHead( &m_list );
m_iadsImpl.SetService ( MD_SERVICE_NAME );
m_iadsImpl.SetName ( _T("Domain") );
m_iadsImpl.SetClass ( _T("IIsSmtpDomain") );
}
CSmtpAdminDomain::~CSmtpAdminDomain ()
{
EmptyList();
// All CComBSTR's are freed automatically.
}
void CSmtpAdminDomain::EmptyList()
{
PLIST_ENTRY pHead;
PLIST_ENTRY pEntry;
DomainEntry* pDomainEntry;
for( pHead=&m_list, pEntry=pHead->Flink; pEntry!=pHead; pEntry=pHead->Flink )
{
pDomainEntry = CONTAINING_RECORD(pEntry, DomainEntry, list);
RemoveEntryList(pEntry);
delete pDomainEntry;
}
}
//
// IADs methods:
//
DECLARE_SIMPLE_IADS_IMPLEMENTATION(CSmtpAdminDomain,m_iadsImpl)
//////////////////////////////////////////////////////////////////////
// Properties:
//////////////////////////////////////////////////////////////////////
// enumeration
STDMETHODIMP CSmtpAdminDomain::get_Count ( long * plCount )
{
return StdPropertyGet ( m_lCount, plCount );
}
// current Domain Properties:
STDMETHODIMP CSmtpAdminDomain::get_DomainName ( BSTR * pstrDomainName )
{
return StdPropertyGet ( m_strDomainName, pstrDomainName );
}
STDMETHODIMP CSmtpAdminDomain::put_DomainName ( BSTR strDomainName )
{
return StdPropertyPut ( &m_strDomainName, strDomainName );
}
STDMETHODIMP CSmtpAdminDomain::get_ActionType( long * plActionType )
{
return StdPropertyGet ( m_dwActionType, plActionType );
}
STDMETHODIMP CSmtpAdminDomain::put_ActionType( long lActionType )
{
return StdPropertyPut ( &m_dwActionType, lActionType );
}
// drop IsDefault!!
STDMETHODIMP CSmtpAdminDomain::get_IsDefault ( BOOL * pfIsDefault )
{
*pfIsDefault = m_dwActionType == SMTP_DEFAULT;
return NOERROR;
}
STDMETHODIMP CSmtpAdminDomain::put_IsDefault ( BOOL fIsDefault )
{
return E_NOTIMPL;
}
STDMETHODIMP CSmtpAdminDomain::get_IsLocal ( BOOL * pfIsLocal )
{
return E_NOTIMPL;
}
STDMETHODIMP CSmtpAdminDomain::put_IsLocal ( BOOL fIsLocal )
{
return E_NOTIMPL;
}
// if local
STDMETHODIMP CSmtpAdminDomain::get_LDAPServer ( BSTR * pstrLDAPServer )
{
return E_NOTIMPL;
//return StdPropertyGet ( m_strLDAPServer, pstrLDAPServer );
}
STDMETHODIMP CSmtpAdminDomain::put_LDAPServer ( BSTR strLDAPServer )
{
return E_NOTIMPL;
//return StdPropertyPut ( &m_strLDAPServer, strLDAPServer );
}
STDMETHODIMP CSmtpAdminDomain::get_Account ( BSTR * pstrAccount )
{
return E_NOTIMPL;
//return StdPropertyGet ( m_strAccount, pstrAccount );
}
STDMETHODIMP CSmtpAdminDomain::put_Account ( BSTR strAccount )
{
return E_NOTIMPL;
//return StdPropertyPut ( &m_strAccount, strAccount );
}
STDMETHODIMP CSmtpAdminDomain::get_Password ( BSTR * pstrPassword )
{
return E_NOTIMPL;
//return StdPropertyGet ( m_strPassword, pstrPassword );
}
STDMETHODIMP CSmtpAdminDomain::put_Password ( BSTR strPassword )
{
return E_NOTIMPL;
//return StdPropertyPut ( &m_strPassword, strPassword );
}
STDMETHODIMP CSmtpAdminDomain::get_LDAPContainer ( BSTR * pstrLDAPContainer )
{
return E_NOTIMPL;
//return StdPropertyGet ( m_strLDAPContainer, pstrLDAPContainer );
}
STDMETHODIMP CSmtpAdminDomain::put_LDAPContainer ( BSTR strLDAPContainer )
{
return E_NOTIMPL;
//return StdPropertyPut ( &m_strLDAPContainer, strLDAPContainer );
}
// if remote
STDMETHODIMP CSmtpAdminDomain::get_UseSSL ( BOOL * pfUseSSL )
{
return E_NOTIMPL;
}
STDMETHODIMP CSmtpAdminDomain::put_UseSSL ( BOOL fUseSSL )
{
return E_NOTIMPL;
}
STDMETHODIMP CSmtpAdminDomain::get_EnableETRN ( BOOL * pfEnableETRN )
{
return E_NOTIMPL;
}
STDMETHODIMP CSmtpAdminDomain::put_EnableETRN ( BOOL fEnableETRN )
{
return E_NOTIMPL;
}
STDMETHODIMP CSmtpAdminDomain::get_DropDir ( BSTR * pstrDropDir )
{
return StdPropertyGet ( m_strActionString, pstrDropDir );
}
STDMETHODIMP CSmtpAdminDomain::put_DropDir ( BSTR strDropDir )
{
return StdPropertyPut ( &m_strActionString, strDropDir );
}
STDMETHODIMP CSmtpAdminDomain::get_RoutingDomain ( BSTR * pstrRoutingDomain )
{
return StdPropertyGet ( m_strActionString, pstrRoutingDomain );
}
STDMETHODIMP CSmtpAdminDomain::put_RoutingDomain ( BSTR strRoutingDomain )
{
return StdPropertyPut ( &m_strActionString, strRoutingDomain );
}
//////////////////////////////////////////////////////////////////////
// Methods:
//////////////////////////////////////////////////////////////////////
STDMETHODIMP CSmtpAdminDomain::Default ( )
{
TraceFunctEnter ( "CSmtpAdminDomain::Default" );
m_dwActionType = SMTP_DELIVER;
m_fAllowEtrn = FALSE;
m_dwDomainId = UNASSIGNED_DOMAIN_ID;
m_strDomainName.Empty();
m_strActionString.Empty();
m_pCurrentDomainEntry = NULL;
TraceFunctLeave ();
return NOERROR;
}
STDMETHODIMP CSmtpAdminDomain::Add ( )
{
TraceFunctEnter ( "CSmtpAdminDomain::Add" );
HRESULT hr = NOERROR;
DomainEntry* pOldDef = NULL;
DomainEntry* pNewDomain = new DomainEntry;
if( !pNewDomain )
{
ErrorTrace ( (LPARAM) this, "Out of memory" );
hr = E_OUTOFMEMORY;
goto Exit;
}
hr = GetFromMetabase();
if( FAILED(hr) )
{
goto Exit;
}
lstrcpyW( pNewDomain-> m_strDomainName, (LPCWSTR)m_strDomainName );
lstrcpyW( pNewDomain-> m_strActionString, (LPCWSTR)m_strActionString );
pNewDomain-> m_dwActionType = m_dwActionType;
pNewDomain-> m_fAllowEtrn = m_fAllowEtrn;
// deal with default domain
if( m_dwActionType == SMTP_DEFAULT )
{
pOldDef = m_pDefaultDomainEntry;
pOldDef-> m_dwActionType = pOldDef->m_strActionString[0] ? SMTP_DROP : SMTP_DELIVER;
InsertHeadList( &m_list, &pNewDomain->list );
m_pDefaultDomainEntry = pNewDomain;
}
else
{
InsertTailList( &m_list, &pNewDomain->list );
}
hr = SaveToMetabase();
if( FAILED(hr) )
{
RemoveEntryList( &pNewDomain->list );
ErrorTrace ( (LPARAM) this, "Failed to remove domain: %x", hr );
delete pNewDomain;
goto Exit;
}
m_pCurrentDomainEntry = pNewDomain;
m_lCount++;
Exit:
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CSmtpAdminDomain::Remove ( )
{
TraceFunctEnter ( "CSmtpAdminDomain::Remove" );
HRESULT hr = NOERROR;
// need to call get() first
_ASSERT( m_pCurrentDomainEntry );
_ASSERT( !lstrcmpiW( m_strDomainName, m_pCurrentDomainEntry->m_strDomainName ) );
if( !m_pCurrentDomainEntry ||
lstrcmpiW( m_strDomainName, m_pCurrentDomainEntry->m_strDomainName ) )
{
hr = SmtpCreateException (IDS_SMTPEXCEPTION_DIDNT_CALL_GET);
goto Exit;
}
//Can't remove default domain
if( m_pCurrentDomainEntry == m_pDefaultDomainEntry )
{
hr = SmtpCreateException (IDS_SMTPEXCEPTION_CANT_DEL_DEFAULT_DOMAIN);
goto Exit;
}
RemoveEntryList( &m_pCurrentDomainEntry->list );
hr = SaveToMetabase();
Exit:
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CSmtpAdminDomain::Get ( )
{
TraceFunctEnter ( "CSmtpAdminDomain::Get" );
HRESULT hr = NOERROR;
hr = GetFromMetabase();
if( FAILED(hr) )
{
goto Exit;
}
// given domain name, find the entry
m_pCurrentDomainEntry = FindDomainEntry( m_strDomainName );
if( !m_pCurrentDomainEntry )
{
hr = SmtpCreateException( IDS_SMTPEXCEPTION_INVALID_ADDRESS );
goto Exit;
}
LoadDomainProperty( m_pCurrentDomainEntry );
Exit:
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CSmtpAdminDomain::Set ( )
{
TraceFunctEnter ( "CSmtpAdminDomain::Set" );
HRESULT hr = NOERROR;
DomainEntry* pOldDef = NULL;
// need to call get() first
_ASSERT( m_pCurrentDomainEntry );
if( !m_pCurrentDomainEntry )
{
hr = SmtpCreateException (IDS_SMTPEXCEPTION_DIDNT_CALL_GET);
goto Exit;
}
lstrcpyW( m_pCurrentDomainEntry->m_strDomainName, m_strDomainName );
lstrcpyW( m_pCurrentDomainEntry->m_strActionString, m_strActionString );
m_pCurrentDomainEntry-> m_dwActionType = m_dwActionType;
m_pCurrentDomainEntry-> m_fAllowEtrn = m_fAllowEtrn;
// deal with default domain
if( m_dwActionType == SMTP_DEFAULT && m_pDefaultDomainEntry != m_pCurrentDomainEntry )
{
pOldDef = m_pDefaultDomainEntry;
pOldDef-> m_dwActionType = pOldDef->m_strActionString[0] ? SMTP_DROP : SMTP_DELIVER;
m_pDefaultDomainEntry = m_pCurrentDomainEntry;
RemoveEntryList( &m_pCurrentDomainEntry->list );
InsertHeadList( &m_list, &m_pCurrentDomainEntry->list );
}
hr = SaveToMetabase();
Exit:
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CSmtpAdminDomain::Enumerate ( )
{
TraceFunctEnter ( "CSmtpAdminDomain::EnumDomains" );
HRESULT hr = NOERROR;
hr = GetFromMetabase();
m_fEnumerated = TRUE;
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CSmtpAdminDomain::GetNth( long lIndex )
{
TraceFunctEnter ( "CSmtpAdminDomain::GetNth" );
HRESULT hr = NOERROR;
PLIST_ENTRY pEntry;
if( !m_fEnumerated )
{
hr = SmtpCreateException( IDS_SMTPEXCEPTION_DIDNT_ENUMERATE );
goto Exit;
}
if( lIndex < 0 || lIndex >= m_lCount )
{
hr = SmtpCreateException( IDS_SMTPEXCEPTION_INVALID_INDEX );
goto Exit;
}
pEntry = m_list.Flink;
while( lIndex -- )
{
pEntry = pEntry-> Flink;
_ASSERT( pEntry != &m_list );
}
m_pCurrentDomainEntry = CONTAINING_RECORD(pEntry, DomainEntry, list);
LoadDomainProperty( m_pCurrentDomainEntry );
Exit:
TraceFunctLeave ();
return hr;
}
STDMETHODIMP CSmtpAdminDomain::GetDefaultDomain ( )
{
TraceFunctEnter ( "CSmtpAdminDomain::GetDefaultDomain" );
HRESULT hr = NOERROR;
if( !m_pDefaultDomainEntry )
{
hr = GetFromMetabase();
if( FAILED(hr) )
{
goto Exit;
}
}
LoadDomainProperty( m_pDefaultDomainEntry );
Exit:
TraceFunctLeave ();
return hr;
}
DomainEntry* CSmtpAdminDomain::FindDomainEntry( LPCWSTR lpName )
{
TraceFunctEnter ( "CSmtpAdminDomain::FindDomainEntry" );
DomainEntry* pDomainEntry = NULL;
PLIST_ENTRY pHead;
PLIST_ENTRY pEntry;
for( pHead=&m_list, pEntry=pHead->Flink; pEntry!=pHead; pEntry=pEntry->Flink )
{
pDomainEntry = CONTAINING_RECORD(pEntry, DomainEntry, list);
if( !lstrcmpiW( pDomainEntry->m_strDomainName, lpName ) )
{
TraceFunctLeave ();
return pDomainEntry;
}
}
TraceFunctLeave ();
return NULL;
}
STDMETHODIMP CSmtpAdminDomain::SetAsDefaultDomain ( )
{
TraceFunctEnter ( "CSmtpAdminDomain::SetAsDefaultDomain" );
HRESULT hr = NOERROR;
if( !m_pDefaultDomainEntry )
{
hr = GetFromMetabase();
if( FAILED(hr) )
{
goto Exit;
}
}
// not in the list
if( m_dwDomainId == UNASSIGNED_DOMAIN_ID )
{
hr = Add();
if( FAILED(hr) )
{
goto Exit;
}
}
_ASSERT( m_dwDomainId == m_pCurrentDomainEntry->m_dwDomainId );
m_pDefaultDomainEntry = m_pCurrentDomainEntry;
hr = SaveToMetabase();
Exit:
TraceFunctLeave ();
return hr;
}
BOOL CSmtpAdminDomain::LoadDomainProperty(DomainEntry* pDomainEntry)
{
TraceFunctEnter ( "CSmtpAdminDomain::LoadDomainProperty" );
_ASSERT( pDomainEntry );
m_strDomainName = pDomainEntry-> m_strDomainName;
m_dwActionType = pDomainEntry-> m_dwActionType;
m_strActionString = pDomainEntry-> m_strActionString;
m_fAllowEtrn = pDomainEntry-> m_fAllowEtrn;
m_dwDomainId = pDomainEntry-> m_dwDomainId;
m_pCurrentDomainEntry = pDomainEntry;
TraceFunctLeave ();
return TRUE;
}
BOOL CSmtpAdminDomain::ConstructListFromMetabaseValues()
{
TraceFunctEnter ( "CSmtpAdminDomain::ConstructListFromMetabaseValues" );
DomainEntry* pDomainEntry;
TCHAR* pCh;
TCHAR* wszCurrent;
DWORD i;
DWORD cCount = m_mszDomainRouting.Count( );
EmptyList();
m_lCount = 0;
pCh = (TCHAR*)(LPCWSTR)m_mszDomainRouting;
for( wszCurrent = pCh, i = 0;
i < cCount;
i++, wszCurrent += lstrlen (wszCurrent) + 1 )
{
pDomainEntry = new DomainEntry;
if( NULL == pDomainEntry )
{
goto Exit;
}
pDomainEntry-> FromString( wszCurrent );
InsertHeadList( &m_list, &pDomainEntry->list );
}
m_lCount += cCount;
if( !m_strDefaultDomain.m_str || !m_strDefaultDomain.m_str[0] )
{
_ASSERT( FALSE );
goto Exit;
}
m_pDefaultDomainEntry = new DomainEntry;
if( NULL == m_pDefaultDomainEntry )
{
goto Exit;
}
lstrcpy( m_pDefaultDomainEntry-> m_strDomainName, m_strDefaultDomain.m_str );
if( !m_strDropDir )
{
m_pDefaultDomainEntry-> m_strActionString[0] = _T('\0');
}
else
{
lstrcpy( m_pDefaultDomainEntry-> m_strActionString, m_strDropDir.m_str );
}
m_pDefaultDomainEntry-> m_dwActionType = SMTP_DEFAULT;
InsertHeadList( &m_list, &m_pDefaultDomainEntry->list );
m_lCount ++;
Exit:
TraceFunctLeave ();
return TRUE;
}
BOOL CSmtpAdminDomain::ParseListToMetabaseValues() // called by SaveData()
{
TraceFunctEnter ( "CSmtpAdminDomain::ParseListToMetabaseValues" );
BOOL fRet = TRUE;
// change string list to multisz
DomainEntry* pDomainEntry = NULL;
PLIST_ENTRY pHead;
PLIST_ENTRY pEntry;
DWORD cb = 0;
WCHAR* pBuf;
WCHAR* p;
// the first one is default domain
_ASSERT( CONTAINING_RECORD( m_list.Flink, DomainEntry, list ) == m_pDefaultDomainEntry );
for( pHead=&m_list, pEntry=pHead->Flink->Flink; pEntry!=pHead; pEntry=pEntry->Flink )
{
pDomainEntry = CONTAINING_RECORD(pEntry, DomainEntry, list);
cb += lstrlenW( pDomainEntry-> m_strDomainName );
cb += lstrlenW( pDomainEntry-> m_strActionString );
cb += sizeof(DWORD)*2;
cb += 10; // 4 commas and NULL
}
// two more NULL's
cb += 4;
pBuf = new WCHAR[cb];
if( !pBuf )
{
ErrorTrace ( (LPARAM) this, "Out of memory" );
fRet = FALSE;
goto Exit;
}
p = pBuf;
// Note: the first entry is the default domain
for( pHead=&m_list, pEntry=pHead->Flink->Flink; pEntry!=pHead; pEntry=pEntry->Flink )
{
pDomainEntry = CONTAINING_RECORD(pEntry, DomainEntry, list);
pDomainEntry->ToString( p );
p += lstrlenW(p);
p ++;
}
// add two more NULL
*p = L'\0';
*(p+1) = L'\0';
m_mszDomainRouting.Empty();
m_mszDomainRouting.Attach( pBuf );
Exit:
TraceFunctLeave ();
return fRet;
}
HRESULT CSmtpAdminDomain::GetFromMetabase()
{
TraceFunctEnter ( "CSmtpAdminDomain::GetFromMetabase" );
HRESULT hr = NOERROR;
BOOL fRet = TRUE;
CComPtr<IMSAdminBase> pmetabase;
TCHAR szPath[METADATA_MAX_NAME_LEN+2] = {0};
TCHAR szDropDir[256] = {0};
TCHAR szBuf[256] = {0};
hr = m_mbFactory.GetMetabaseObject ( m_iadsImpl.QueryComputer(), &pmetabase );
if ( FAILED(hr) ) {
return hr;
}
CMetabaseKey hMB( pmetabase );
GetMDInstancePath( szPath, m_iadsImpl.QueryInstance() );
hr = hMB.Open( szPath, METADATA_PERMISSION_READ );
if( FAILED(hr) )
{
hr = SmtpCreateExceptionFromWin32Error( GetLastError() );
goto Exit;
}
m_strDefaultDomain.Empty();
m_strDropDir.Empty();
m_mszDomainRouting.Empty();
fRet = StdGetMetabaseProp ( &hMB, MD_DOMAIN_ROUTING, DEFAULT_DOMAIN_ROUTING, &m_mszDomainRouting);
fRet = StdGetMetabaseProp ( &hMB, MD_DEFAULT_DOMAIN_VALUE, DEFAULT_DEFAULT_DOMAIN, &m_strDefaultDomain ) && fRet;
fRet = StdGetMetabaseProp ( &hMB, MD_MAIL_DROP_DIR, DEFAULT_DROP_DIR, &m_strDropDir ) && fRet;
if( !fRet )
{
hr = SmtpCreateExceptionFromWin32Error( GetLastError() );
goto Exit;
}
ConstructListFromMetabaseValues();
Exit:
TraceFunctLeave ();
return hr;
}
HRESULT CSmtpAdminDomain::SaveToMetabase()
{
TraceFunctEnter ( "CSmtpAdminDomain::SaveToMetabase" );
ParseListToMetabaseValues();
// these two are for default domain,
// default domain needs special care,
// by default, it's computed by smtpsvc from TCP/IP configuration,
// don't set this key if not changed
BOOL fDefChanged = FALSE;
BOOL fDropChanged = FALSE;
_ASSERT( m_pDefaultDomainEntry && m_pDefaultDomainEntry-> m_dwActionType == SMTP_DEFAULT );
if( m_pDefaultDomainEntry )
{
fDefChanged = lstrcmpiW( m_strDefaultDomain, m_pDefaultDomainEntry-> m_strDomainName );
fDropChanged = lstrcmpiW( m_strActionString, m_pDefaultDomainEntry-> m_strActionString );
if( fDefChanged )
{
m_strDefaultDomain.Empty();
m_strDefaultDomain = m_pDefaultDomainEntry-> m_strDomainName;
}
if( fDropChanged )
{
m_strDropDir.Empty();
m_strDropDir = m_pDefaultDomainEntry-> m_strActionString;
}
}
HRESULT hr = NOERROR;
BOOL fRet = TRUE;
CComPtr<IMSAdminBase> pmetabase;
TCHAR szPath[METADATA_MAX_NAME_LEN+2] = {0};
TCHAR szDropDir[256] = {0};
TCHAR szBuf[256] = {0};
hr = m_mbFactory.GetMetabaseObject ( m_iadsImpl.QueryComputer(), &pmetabase );
if ( FAILED(hr) ) {
return hr;
}
CMetabaseKey hMB( pmetabase );
GetMDInstancePath( szPath, m_iadsImpl.QueryInstance() );
hr = hMB.Open( szPath, METADATA_PERMISSION_WRITE );
if( FAILED(hr) )
{
hr = SmtpCreateExceptionFromWin32Error( GetLastError() );
goto Exit;
}
if( fDefChanged )
{
fRet = StdPutMetabaseProp ( &hMB, MD_DEFAULT_DOMAIN_VALUE, m_pDefaultDomainEntry-> m_strDomainName ) && fRet;
}
if( fDropChanged )
{
fRet = StdPutMetabaseProp ( &hMB, MD_MAIL_DROP_DIR, m_pDefaultDomainEntry-> m_strActionString ) && fRet;
}
fRet = StdPutMetabaseProp ( &hMB, MD_DOMAIN_ROUTING, &m_mszDomainRouting) && fRet;
if( !fRet )
{
hr = SmtpCreateExceptionFromWin32Error( GetLastError() );
goto Exit;
}
// hr = hMB.Close();
// BAIL_ON_FAILURE(hr);
hMB.Close();
hr = pmetabase-> SaveData();
BAIL_ON_FAILURE(hr);
Exit:
TraceFunctLeave ();
return hr;
}
BOOL DomainEntry::FromString( LPCTSTR lpDomainString )
{
TraceFunctEnter ( "DomainEntry::FromString" );
TCHAR szT[256] = {0};
WCHAR* pCh = (WCHAR*)lpDomainString;
WCHAR* pT;
m_dwDomainId = UNASSIGNED_DOMAIN_ID;
m_fAllowEtrn = FALSE;
ZeroMemory( szT, sizeof(szT) );
pT = szT;
while( *pCh ) //
{
if( iswdigit( *pCh ) )
{
*pT++ = *pCh;
pCh ++;
continue;
}
if( *pCh == ',' )
{
pCh ++;
break;
}
return FALSE;
}
if( !*pCh )
return FALSE;
m_dwActionType = (DWORD) _wtoi( szT );
/*
if( m_dwActionType >= LAST_SMTP_ACTION )
{
_ASSERT( FALSE );
m_dwActionType = SMTP_DROP; // assume local drop domain
}
*/
ZeroMemory( m_strDomainName, sizeof(m_strDomainName) );
pT = m_strDomainName;
while( *pCh )
{
if( *pCh == ',' )
{
pCh ++;
break;
}
*pT++ = *pCh++;
}
if( !*pCh )
return FALSE;
ZeroMemory( m_strActionString, sizeof(m_strActionString) );
pT = m_strActionString;
while( *pCh )
{
if( *pCh == ',' )
{
pCh ++;
break;
}
*pT++ = *pCh++;
}
if( !*pCh )
return FALSE;
ZeroMemory( szT, sizeof(szT) );
pT = szT;
while( *pCh ) //
{
if( iswdigit( *pCh ) )
{
*pT++ = *pCh;
pCh ++;
continue;
}
if( *pCh == ',' )
{
pCh ++;
break;
}
return FALSE;
}
m_fAllowEtrn = !! ((DWORD) _wtoi( szT ));
if( !*pCh )
{
return FALSE;
}
ZeroMemory( szT, sizeof(szT) );
pT = szT;
while( *pCh ) //
{
if( iswdigit( *pCh ) )
{
*pT++ = *pCh;
pCh ++;
continue;
}
if( *pCh == ',' )
{
pCh ++;
break;
}
return FALSE;
}
m_dwDomainId = (DWORD) _wtoi( szT );
// ignore any other chars
TraceFunctLeave ();
return TRUE;
}
BOOL DomainEntry::ToString( LPTSTR lpDomainString )
{
TraceFunctEnter ( "DomainEntry::FromString" );
wsprintfW( lpDomainString, L"%d,%s,%s,%d",m_dwActionType, m_strDomainName,
m_strActionString, m_fAllowEtrn);
TraceFunctLeave ();
return TRUE;
}