mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
363 lines
9.2 KiB
363 lines
9.2 KiB
// user.cpp : Implementation of CSmtpadmApp and UserL registration.
|
|
|
|
#include "stdafx.h"
|
|
#include "smtpadm.h"
|
|
#include "user.h"
|
|
#include "oleutil.h"
|
|
|
|
#include <lmapibuf.h>
|
|
|
|
#include "smtpcmn.h"
|
|
|
|
// Must define THIS_FILE_* macros to use SmtpCreateException()
|
|
|
|
#define THIS_FILE_HELP_CONTEXT 0
|
|
#define THIS_FILE_PROG_ID _T("Smtpadm.User.1")
|
|
#define THIS_FILE_IID IID_ISmtpAdminUser
|
|
|
|
#define DEFAULT_NEWSGROUP_NAME _T("")
|
|
#define DEFAULT_NEWSGROUP_DESCRIPTION _T("")
|
|
#define DEFAULT_NEWSGROUP_MODERATOR _T("")
|
|
#define DEFAULT_NEWSGROUP_READONLY FALSE
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
//
|
|
// Use a macro to define all the default methods
|
|
//
|
|
DECLARE_METHOD_IMPLEMENTATION_FOR_STANDARD_EXTENSION_INTERFACES(SmtpAdminUser, CSmtpAdminUser, IID_ISmtpAdminUser)
|
|
|
|
STDMETHODIMP CSmtpAdminUser::InterfaceSupportsErrorInfo(REFIID riid)
|
|
{
|
|
static const IID* arr[] =
|
|
{
|
|
&IID_ISmtpAdminUser,
|
|
};
|
|
|
|
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
|
|
{
|
|
if (InlineIsEqualGUID(*arr[i],riid))
|
|
return S_OK;
|
|
}
|
|
return S_FALSE;
|
|
}
|
|
|
|
CSmtpAdminUser::CSmtpAdminUser ()
|
|
// CComBSTR's are initialized to NULL by default.
|
|
{
|
|
m_lInboxSizeInMemory = 0;
|
|
m_lInboxSizeInMsgNumber = 0;
|
|
m_fAutoForward = FALSE;
|
|
m_fLocal = TRUE;
|
|
|
|
|
|
m_iadsImpl.SetService ( MD_SERVICE_NAME );
|
|
m_iadsImpl.SetName ( _T("User") );
|
|
m_iadsImpl.SetClass ( _T("IIsSmtpUser") );
|
|
}
|
|
|
|
CSmtpAdminUser::~CSmtpAdminUser ()
|
|
{
|
|
// All CComBSTR's are freed automatically.
|
|
}
|
|
|
|
//
|
|
// IADs methods:
|
|
//
|
|
|
|
DECLARE_SIMPLE_IADS_IMPLEMENTATION(CSmtpAdminUser,m_iadsImpl)
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Properties:
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// user property
|
|
|
|
STDMETHODIMP CSmtpAdminUser::get_EmailId ( BSTR * pstrEmailId )
|
|
{
|
|
return StdPropertyGet ( m_strEmailId, pstrEmailId );
|
|
}
|
|
|
|
STDMETHODIMP CSmtpAdminUser::put_EmailId ( BSTR strEmailId )
|
|
{
|
|
return StdPropertyPut ( &m_strEmailId, strEmailId );
|
|
}
|
|
|
|
STDMETHODIMP CSmtpAdminUser::get_Domain ( BSTR * pstrDomain )
|
|
{
|
|
return StdPropertyGet ( m_strDomain, pstrDomain );
|
|
}
|
|
|
|
STDMETHODIMP CSmtpAdminUser::put_Domain ( BSTR strDomain )
|
|
{
|
|
return StdPropertyPut ( &m_strDomain, strDomain );
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSmtpAdminUser::get_MailRoot ( BSTR * pstrMailRoot )
|
|
{
|
|
return StdPropertyGet ( m_strMailRoot, pstrMailRoot );
|
|
}
|
|
STDMETHODIMP CSmtpAdminUser::put_MailRoot ( BSTR strMailRoot )
|
|
{
|
|
return StdPropertyPut ( &m_strMailRoot, strMailRoot );
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSmtpAdminUser::get_InboxSizeInMemory ( long * plInboxSizeInMemory )
|
|
{
|
|
return StdPropertyGet ( m_lInboxSizeInMemory, plInboxSizeInMemory );
|
|
}
|
|
STDMETHODIMP CSmtpAdminUser::put_InboxSizeInMemory ( long lInboxSizeInMemory )
|
|
{
|
|
return StdPropertyPut ( &m_lInboxSizeInMemory, lInboxSizeInMemory );
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSmtpAdminUser::get_InboxSizeInMsgNumber ( long * plInboxSizeInMsgNumber )
|
|
{
|
|
return StdPropertyGet ( m_lInboxSizeInMsgNumber, plInboxSizeInMsgNumber );
|
|
}
|
|
STDMETHODIMP CSmtpAdminUser::put_InboxSizeInMsgNumber ( long lInboxSizeInMsgNumber )
|
|
{
|
|
return StdPropertyPut ( &m_lInboxSizeInMsgNumber, lInboxSizeInMsgNumber );
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSmtpAdminUser::get_AutoForward ( BOOL * pfAutoForward )
|
|
{
|
|
return StdPropertyGet ( m_fAutoForward, pfAutoForward );
|
|
}
|
|
|
|
STDMETHODIMP CSmtpAdminUser::put_AutoForward ( BOOL fAutoForward )
|
|
{
|
|
return StdPropertyPut ( &m_fAutoForward, fAutoForward );
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSmtpAdminUser::get_ForwardEmail ( BSTR * pstrForwardEmail )
|
|
{
|
|
return StdPropertyGet ( m_strForwardEmail, pstrForwardEmail );
|
|
}
|
|
|
|
STDMETHODIMP CSmtpAdminUser::put_ForwardEmail ( BSTR strForwardEmail )
|
|
{
|
|
return StdPropertyPut ( &m_strForwardEmail, strForwardEmail );
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Methods:
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
STDMETHODIMP CSmtpAdminUser::Default ( )
|
|
{
|
|
TraceFunctEnter ( "CSmtpAdminUser::Default" );
|
|
|
|
/*
|
|
m_strNewsgroup = DEFAULT_NEWSGROUP_NAME;
|
|
m_strDescription = DEFAULT_NEWSGROUP_DESCRIPTION;
|
|
m_strModerator = DEFAULT_NEWSGROUP_MODERATOR;
|
|
m_fReadOnly = DEFAULT_NEWSGROUP_READONLY;
|
|
|
|
if (
|
|
!m_strNewsgroup ||
|
|
!m_strDescription ||
|
|
!m_strModerator
|
|
) {
|
|
|
|
FatalTrace ( (LPARAM) this, "Out of memory" );
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
*/
|
|
TraceFunctLeave ();
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHODIMP CSmtpAdminUser::Create ( )
|
|
{
|
|
TraceFunctEnter ( "CSmtpAdminUser::Create" );
|
|
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwErr = NOERROR;
|
|
|
|
if( !m_strEmailId || !m_strDomain )
|
|
{
|
|
hr = SmtpCreateException ( IDS_SMTPEXCEPTION_INVALID_ADDRESS );
|
|
goto Exit;
|
|
}
|
|
|
|
WCHAR szUserName[512];
|
|
WCHAR* lpForward;
|
|
wsprintfW( szUserName, L"%s@%s", (LPWSTR) m_strEmailId, (LPWSTR) m_strDomain );
|
|
|
|
if( m_strForwardEmail && m_strForwardEmail[0] )
|
|
{
|
|
lpForward = m_strForwardEmail;
|
|
}
|
|
else
|
|
{
|
|
lpForward = NULL;
|
|
}
|
|
|
|
dwErr = SmtpCreateUser(
|
|
m_iadsImpl.QueryComputer(),
|
|
szUserName,
|
|
lpForward,
|
|
m_fLocal,
|
|
m_lInboxSizeInMemory,
|
|
m_lInboxSizeInMsgNumber,
|
|
m_strMailRoot,
|
|
m_iadsImpl.QueryInstance() );
|
|
|
|
if ( dwErr != NOERROR ) {
|
|
ErrorTrace ( (LPARAM) this, "Failed to add user: %x", dwErr );
|
|
hr = SmtpCreateExceptionFromWin32Error ( dwErr );
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave ();
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CSmtpAdminUser::Delete ( )
|
|
{
|
|
TraceFunctEnter ( "CSmtpAdminUser::Delete" );
|
|
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwErr = NOERROR;
|
|
|
|
if( !m_strEmailId || !m_strDomain )
|
|
{
|
|
hr = SmtpCreateException ( IDS_SMTPEXCEPTION_INVALID_ADDRESS );
|
|
goto Exit;
|
|
}
|
|
|
|
WCHAR szUserName[512];
|
|
wsprintfW( szUserName, L"%s@%s", (LPWSTR) m_strEmailId, (LPWSTR) m_strDomain );
|
|
|
|
dwErr = SmtpDeleteUser(
|
|
m_iadsImpl.QueryComputer(),
|
|
szUserName,
|
|
m_iadsImpl.QueryInstance() );
|
|
|
|
if ( dwErr != NOERROR ) {
|
|
ErrorTrace ( (LPARAM) this, "Failed to delete user: %x", dwErr );
|
|
hr = SmtpCreateExceptionFromWin32Error ( dwErr );
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave ();
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CSmtpAdminUser::Get ( )
|
|
{
|
|
TraceFunctEnter ( "CSmtpAdminUser::Get" );
|
|
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwErr = NOERROR;
|
|
LPSMTP_USER_PROPS pUserProps = NULL;
|
|
|
|
if( !m_strEmailId || !m_strDomain )
|
|
{
|
|
hr = SmtpCreateException ( IDS_SMTPEXCEPTION_INVALID_ADDRESS );
|
|
goto Exit;
|
|
}
|
|
|
|
WCHAR szUserName[512];
|
|
wsprintfW( szUserName, L"%s@%s", (LPWSTR) m_strEmailId, (LPWSTR) m_strDomain );
|
|
|
|
|
|
dwErr = SmtpGetUserProps(
|
|
m_iadsImpl.QueryComputer(),
|
|
szUserName,
|
|
&pUserProps,
|
|
m_iadsImpl.QueryInstance() );
|
|
|
|
if ( dwErr != NOERROR ) {
|
|
ErrorTrace ( (LPARAM) this, "Failed to get user prop: %x", dwErr );
|
|
hr = SmtpCreateExceptionFromWin32Error ( dwErr );
|
|
goto Exit;
|
|
}
|
|
|
|
// free old entry
|
|
m_strMailRoot.Empty();
|
|
m_strForwardEmail.Empty();
|
|
|
|
m_strMailRoot = pUserProps->wszVRoot;
|
|
|
|
m_strForwardEmail = pUserProps->wszForward;
|
|
m_fAutoForward = (!m_strForwardEmail || !m_strForwardEmail.Length()) ? FALSE : TRUE;
|
|
|
|
m_lInboxSizeInMemory = pUserProps->dwMailboxMax;
|
|
m_lInboxSizeInMsgNumber = pUserProps->dwMailboxMessageMax;
|
|
m_fLocal = !!pUserProps->dwLocal;
|
|
|
|
// free pUserProps
|
|
if ( pUserProps )
|
|
{
|
|
::NetApiBufferFree ( pUserProps );
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave ();
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CSmtpAdminUser::Set ( )
|
|
{
|
|
TraceFunctEnter ( "CSmtpAdminUser::Set" );
|
|
|
|
HRESULT hr = NOERROR;
|
|
DWORD dwErr = NOERROR;
|
|
SMTP_USER_PROPS UserProps;
|
|
|
|
if( !m_strEmailId || !m_strDomain )
|
|
{
|
|
hr = SmtpCreateException ( IDS_SMTPEXCEPTION_INVALID_ADDRESS );
|
|
goto Exit;
|
|
}
|
|
|
|
WCHAR szUserName[512];
|
|
wsprintfW( szUserName, L"%s@%s", (LPWSTR) m_strEmailId, (LPWSTR) m_strDomain );
|
|
|
|
UserProps.fc = FC_SMTP_USER_PROPS_ALL;
|
|
|
|
if( !m_strForwardEmail || !m_strForwardEmail.Length() )
|
|
{
|
|
UserProps.wszForward = NULL;
|
|
UserProps.fc -= FC_SMTP_USER_PROPS_FORWARD;
|
|
}
|
|
else
|
|
{
|
|
UserProps.wszForward = (LPWSTR)m_strForwardEmail;
|
|
}
|
|
|
|
UserProps.wszVRoot = (LPWSTR)m_strMailRoot;
|
|
|
|
UserProps.dwMailboxMax = m_lInboxSizeInMemory;
|
|
UserProps.dwMailboxMessageMax = m_lInboxSizeInMsgNumber;
|
|
UserProps.dwLocal = m_fLocal;
|
|
|
|
|
|
dwErr = SmtpSetUserProps(
|
|
m_iadsImpl.QueryComputer(),
|
|
szUserName,
|
|
&UserProps,
|
|
m_iadsImpl.QueryInstance() );
|
|
|
|
if ( dwErr != NOERROR ) {
|
|
ErrorTrace ( (LPARAM) this, "Failed to set user prop: %x", dwErr );
|
|
hr = SmtpCreateExceptionFromWin32Error ( dwErr );
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
TraceFunctLeave ();
|
|
return hr;
|
|
}
|