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.
470 lines
6.6 KiB
470 lines
6.6 KiB
/*++
|
|
|
|
Copyright (c) 1994-1998 Microsoft Corporation
|
|
|
|
Module Name :
|
|
|
|
w3accts.cpp
|
|
|
|
Abstract:
|
|
|
|
WWW Accounts Property Page
|
|
|
|
Author:
|
|
|
|
Ronald Meijer (ronaldm)
|
|
|
|
Project:
|
|
|
|
Internet Services Manager
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
//
|
|
// Include Files
|
|
//
|
|
#include "stdafx.h"
|
|
#include "w3scfg.h"
|
|
#include "w3accts.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
|
|
IMPLEMENT_DYNCREATE(CW3AccountsPage, CInetPropertyPage)
|
|
|
|
|
|
|
|
CW3AccountsPage::CW3AccountsPage(
|
|
IN CInetPropertySheet * pSheet
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Accounts page constructor
|
|
|
|
Arguments:
|
|
|
|
CInetPropertySheet * pSheet : Sheet data
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
: CInetPropertyPage(CW3AccountsPage::IDD, pSheet),
|
|
m_ListBoxRes(
|
|
IDB_ACLUSERS,
|
|
CAccessEntryListBox::nBitmaps
|
|
),
|
|
m_oblSID()
|
|
{
|
|
|
|
#ifdef _DEBUG
|
|
|
|
afxMemDF |= checkAlwaysMemDF;
|
|
|
|
#endif // _DEBUG
|
|
|
|
m_list_Administrators.AttachResources(&m_ListBoxRes);
|
|
|
|
#if 0 // Keep class wizard happy
|
|
|
|
//{{AFX_DATA_INIT(CW3AccountsPage)
|
|
//}}AFX_DATA_INIT
|
|
|
|
#endif // 0
|
|
|
|
}
|
|
|
|
|
|
|
|
CW3AccountsPage::~CW3AccountsPage()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Destructor
|
|
|
|
Arguments:
|
|
|
|
N/A
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
{
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CW3AccountsPage::DoDataExchange(
|
|
IN CDataExchange * pDX
|
|
)
|
|
/*
|
|
|
|
Routine Description:
|
|
|
|
Initialise/Store control data
|
|
|
|
Arguments:
|
|
|
|
CDataExchange * pDX - DDX/DDV control structure
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
CInetPropertyPage::DoDataExchange(pDX);
|
|
|
|
//{{AFX_DATA_MAP(CW3AccountsPage)
|
|
DDX_Control(pDX, IDC_BUTTON_DELETE, m_button_RemoveAdministrator);
|
|
DDX_Control(pDX, IDC_BUTTON_ADD, m_button_Add);
|
|
//}}AFX_DATA_MAP
|
|
|
|
//
|
|
// Private DDX/DDV Routines
|
|
//
|
|
DDX_Control(pDX, IDC_LIST_ADMINISTRATORS, m_list_Administrators);
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Message Map
|
|
//
|
|
BEGIN_MESSAGE_MAP(CW3AccountsPage, CInetPropertyPage)
|
|
//{{AFX_MSG_MAP(CW3AccountsPage)
|
|
ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd)
|
|
ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
|
|
ON_CBN_SELCHANGE(IDC_LIST_ADMINISTRATORS, OnSelchangeListAdministrators)
|
|
//}}AFX_MSG_MAP
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
|
|
BOOL
|
|
CW3AccountsPage::SetAdminRemoveState()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set the state of the remove button depending on the selection in the
|
|
administrators listbox. Remove is only enabled if ALL selected
|
|
items are removable.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE if the remove button is enabled
|
|
|
|
--*/
|
|
{
|
|
int nSel = 0;
|
|
int cSelectedItems = 0;
|
|
BOOL fAllDeletable = TRUE;
|
|
CAccessEntry * pAccess;
|
|
while ((pAccess = m_list_Administrators.GetNextSelectedItem(&nSel)) != NULL)
|
|
{
|
|
++cSelectedItems;
|
|
|
|
if (!pAccess->IsDeletable())
|
|
{
|
|
fAllDeletable = FALSE;
|
|
break;
|
|
}
|
|
|
|
++nSel;
|
|
}
|
|
|
|
fAllDeletable = fAllDeletable && (cSelectedItems > 0);
|
|
|
|
m_button_RemoveAdministrator.EnableWindow(
|
|
fAllDeletable
|
|
&& HasOperatorList()
|
|
&& HasAdminAccess()
|
|
);
|
|
|
|
return fAllDeletable;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Message Handlers
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
BOOL
|
|
CW3AccountsPage::OnInitDialog()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
WM_INITDIALOG handler. Initialize the dialog.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
TRUE if no focus is to be set automatically, FALSE if the focus
|
|
is already set.
|
|
|
|
--*/
|
|
{
|
|
CInetPropertyPage::OnInitDialog();
|
|
|
|
m_list_Administrators.Initialize();
|
|
|
|
CWaitCursor wait;
|
|
|
|
|
|
//
|
|
// Build the ACL list
|
|
//
|
|
CError err(BuildAclOblistFromBlob(
|
|
((CW3Sheet *)GetSheet())->GetInstanceProperties().m_acl,
|
|
m_oblSID
|
|
));
|
|
|
|
err.MessageBoxOnFailure();
|
|
m_list_Administrators.FillAccessListBox(m_oblSID);
|
|
|
|
//
|
|
// check if the operators controls are accessible
|
|
//
|
|
m_button_Add.EnableWindow(HasOperatorList());
|
|
|
|
SetAdminRemoveState();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CW3AccountsPage::FetchLoadedValues()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Move configuration data from sheet to dialog controls
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
HRESULT
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Nothing to do..
|
|
//
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
/* virtual */
|
|
HRESULT
|
|
CW3AccountsPage::SaveInfo()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Save the information on this property page
|
|
|
|
Arguments:
|
|
|
|
BOOL fUpdateData : If TRUE, control data has not yet been stored. This
|
|
is the case when "apply" is pressed.
|
|
|
|
Return Value:
|
|
|
|
Error return code
|
|
|
|
--*/
|
|
{
|
|
ASSERT(IsDirty());
|
|
|
|
TRACEEOLID("Saving W3 accounts page now...");
|
|
|
|
//
|
|
// Message crackers require m_ notation
|
|
//
|
|
CBlob m_acl;
|
|
BOOL fAclDirty = BuildAclBlob(m_oblSID, m_acl);
|
|
|
|
CError err;
|
|
|
|
BeginWaitCursor();
|
|
|
|
BEGIN_META_INST_WRITE(CW3Sheet)
|
|
if (fAclDirty)
|
|
{
|
|
STORE_INST_DATA_ON_SHEET(m_acl)
|
|
}
|
|
END_META_INST_WRITE(err)
|
|
|
|
EndWaitCursor();
|
|
|
|
return err;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CW3AccountsPage::OnItemChanged()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
All EN_CHANGE and BN_CLICKED messages map to this function
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
|
|
void
|
|
CW3AccountsPage::OnButtonAdd()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
'Add' button has been pressed
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
if (m_list_Administrators.AddToAccessList(
|
|
this,
|
|
QueryServerName(),
|
|
m_oblSID
|
|
))
|
|
{
|
|
OnItemChanged();
|
|
}
|
|
|
|
SetAdminRemoveState();
|
|
}
|
|
|
|
|
|
void
|
|
CW3AccountsPage::OnSelchangeListAdministrators()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Selection Change in admin list box handler
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
SetAdminRemoveState();
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CW3AccountsPage::OnButtonDelete()
|
|
/*
|
|
|
|
Routine Description:
|
|
|
|
Delete all selected items in the list box
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
int nSel = 0;
|
|
int cChanges = 0;
|
|
CAccessEntry * pAccess;
|
|
while ((pAccess = m_list_Administrators.GetNextSelectedItem(&nSel)) != NULL)
|
|
{
|
|
//
|
|
// Remove button should be disabled unless all selected
|
|
// items are deletable
|
|
//
|
|
ASSERT(pAccess->IsDeletable());
|
|
if (pAccess->IsDeletable())
|
|
{
|
|
++cChanges;
|
|
pAccess->FlagForDeletion();
|
|
m_list_Administrators.DeleteString(nSel);
|
|
|
|
//
|
|
// Don't advance counter to account for shift
|
|
//
|
|
continue;
|
|
}
|
|
|
|
++nSel;
|
|
}
|
|
|
|
if (cChanges)
|
|
{
|
|
OnItemChanged();
|
|
}
|
|
|
|
if (!SetAdminRemoveState())
|
|
{
|
|
m_button_Add.SetFocus();
|
|
}
|
|
}
|