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.
511 lines
12 KiB
511 lines
12 KiB
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 2000, Microsoft Corp. All rights reserved.
|
|
//
|
|
// FILE
|
|
//
|
|
// groupwiz.cpp
|
|
//
|
|
// SYNOPSIS
|
|
//
|
|
// Defines the classes that implement the new RADIUS server group wizard.
|
|
//
|
|
// MODIFICATION HISTORY
|
|
//
|
|
// 03/07/2000 Original version.
|
|
// 04/19/2000 Marshall SDOs across apartments.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <proxypch.h>
|
|
#include <groupwiz.h>
|
|
#include <resolver.h>
|
|
#include <iaslimits.h>
|
|
|
|
NewGroupStartPage::NewGroupStartPage(NewGroupWizard& wizard)
|
|
: SnapInPropertyPage(IDD_NEWGROUP_WELCOME, 0, 0, false),
|
|
parent(wizard)
|
|
{
|
|
}
|
|
|
|
BOOL NewGroupStartPage::OnInitDialog()
|
|
{
|
|
SnapInPropertyPage::OnInitDialog();
|
|
setLargeFont(IDC_STATIC_LARGE);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL NewGroupStartPage::OnSetActive()
|
|
{
|
|
SnapInPropertyPage::OnSetActive();
|
|
parent.SetWizardButtons(PSWIZB_NEXT);
|
|
return TRUE;
|
|
}
|
|
|
|
NewGroupNamePage::NewGroupNamePage(NewGroupWizard& wizard)
|
|
: SnapInPropertyPage(
|
|
IDD_NEWGROUP_NAME,
|
|
IDS_NEWGROUP_NAME_TITLE,
|
|
IDS_NEWGROUP_NAME_SUBTITLE,
|
|
false
|
|
),
|
|
parent(wizard)
|
|
{
|
|
}
|
|
|
|
LRESULT NewGroupNamePage::OnWizardBack()
|
|
{
|
|
// Save the state of the radio button.
|
|
getRadio(IDC_RADIO_TYPICAL, IDC_RADIO_CUSTOM, parent.advanced);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT NewGroupNamePage::OnWizardNext()
|
|
{
|
|
if (!parent.group.setName(name))
|
|
{
|
|
failNoThrow(IDC_EDIT_NAME, IDS_GROUP_E_NOT_UNIQUE);
|
|
return -1;
|
|
}
|
|
|
|
getRadio(IDC_RADIO_TYPICAL, IDC_RADIO_CUSTOM, parent.advanced);
|
|
return parent.advanced ? IDD_NEWGROUP_SERVERS : IDD_NEWGROUP_NOVICE;
|
|
}
|
|
|
|
void NewGroupNamePage::onChangeName()
|
|
{
|
|
getValue(IDC_EDIT_NAME, name);
|
|
setButtons();
|
|
}
|
|
|
|
void NewGroupNamePage::setData()
|
|
{
|
|
setValue(IDC_EDIT_NAME, name);
|
|
setRadio(IDC_RADIO_TYPICAL, IDC_RADIO_CUSTOM, parent.advanced);
|
|
setButtons();
|
|
}
|
|
|
|
void NewGroupNamePage::setButtons()
|
|
{
|
|
parent.SetWizardButtons(
|
|
name.Length() ? (PSWIZB_BACK | PSWIZB_NEXT) : PSWIZB_BACK
|
|
);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(NewGroupNamePage, SnapInPropertyPage)
|
|
ON_EN_CHANGE(IDC_EDIT_NAME, onChangeName)
|
|
END_MESSAGE_MAP()
|
|
|
|
NewGroupNovicePage::NewGroupNovicePage(NewGroupWizard& wizard)
|
|
: SnapInPropertyPage(
|
|
IDD_NEWGROUP_NOVICE,
|
|
IDS_NEWGROUP_NOVICE_TITLE,
|
|
IDS_NEWGROUP_NOVICE_SUBTITLE,
|
|
false
|
|
),
|
|
parent(wizard),
|
|
hasBackup(true)
|
|
{
|
|
}
|
|
|
|
LRESULT NewGroupNovicePage::OnWizardBack()
|
|
{
|
|
// Save the secrets.
|
|
getValue(IDC_EDIT_AUTH_SECRET1, secret);
|
|
getValue(IDC_EDIT_AUTH_SECRET2, confirm);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT NewGroupNovicePage::OnWizardNext()
|
|
{
|
|
// Get the secret.
|
|
getValue(IDC_EDIT_AUTH_SECRET1, secret);
|
|
|
|
// Make sure the confirmation matches the secret.
|
|
getValue(IDC_EDIT_AUTH_SECRET2, confirm);
|
|
if (wcscmp(secret, confirm))
|
|
{
|
|
failNoThrow(IDC_EDIT_AUTH_SECRET1, IDS_SERVER_E_SECRET_MATCH);
|
|
return -1;
|
|
}
|
|
|
|
// Get the servers collection.
|
|
SdoCollection servers;
|
|
parent.group.getValue(
|
|
PROPERTY_RADIUSSERVERGROUP_SERVERS_COLLECTION,
|
|
servers
|
|
);
|
|
|
|
// Remove any exisiting servers.
|
|
servers.removeAll();
|
|
|
|
// Create the primary server.
|
|
Sdo primarySdo = servers.create();
|
|
primarySdo.setValue(PROPERTY_RADIUSSERVER_ADDRESS, primary);
|
|
primarySdo.setValue(PROPERTY_RADIUSSERVER_AUTH_SECRET, secret);
|
|
|
|
if (hasBackup)
|
|
{
|
|
// Create the backup server.
|
|
Sdo backupSdo = servers.create();
|
|
backupSdo.setValue(PROPERTY_RADIUSSERVER_ADDRESS, backup);
|
|
backupSdo.setValue(PROPERTY_RADIUSSERVER_AUTH_SECRET, secret);
|
|
backupSdo.setValue(PROPERTY_RADIUSSERVER_PRIORITY, 2L);
|
|
}
|
|
|
|
return IDD_NEWGROUP_COMPLETION;
|
|
}
|
|
|
|
void NewGroupNovicePage::onChangePrimary()
|
|
{
|
|
getValue(IDC_EDIT_PRIMARY, primary);
|
|
setControlState();
|
|
}
|
|
|
|
void NewGroupNovicePage::onChangeHasBackup()
|
|
{
|
|
getValue(IDC_CHECK_BACKUP, hasBackup);
|
|
setControlState();
|
|
}
|
|
|
|
void NewGroupNovicePage::onChangeBackup()
|
|
{
|
|
getValue(IDC_EDIT_BACKUP, backup);
|
|
setControlState();
|
|
}
|
|
|
|
void NewGroupNovicePage::onVerifyPrimary()
|
|
{
|
|
ServerResolver resolver(primary);
|
|
if (resolver.DoModal() == IDOK)
|
|
{
|
|
primary = resolver.getChoice();
|
|
setValue(IDC_EDIT_PRIMARY, primary);
|
|
setControlState();
|
|
}
|
|
}
|
|
|
|
void NewGroupNovicePage::onVerifyBackup()
|
|
{
|
|
ServerResolver resolver(backup);
|
|
if (resolver.DoModal() == IDOK)
|
|
{
|
|
backup = resolver.getChoice();
|
|
setValue(IDC_EDIT_BACKUP, backup);
|
|
setControlState();
|
|
}
|
|
}
|
|
|
|
void NewGroupNovicePage::setData()
|
|
{
|
|
setValue(IDC_EDIT_PRIMARY, primary);
|
|
setValue(IDC_CHECK_BACKUP, hasBackup);
|
|
setValue(IDC_EDIT_BACKUP, backup);
|
|
setValue(IDC_EDIT_AUTH_SECRET1, secret);
|
|
setValue(IDC_EDIT_AUTH_SECRET2, confirm);
|
|
setControlState();
|
|
}
|
|
|
|
void NewGroupNovicePage::setControlState()
|
|
{
|
|
enableControl(IDC_EDIT_BACKUP, hasBackup);
|
|
enableControl(IDC_BUTTON_VERIFY_BACKUP, hasBackup);
|
|
|
|
DWORD buttons = PSWIZB_BACK;
|
|
|
|
// We always require a primary. We also require a backup if the box is
|
|
// checked.
|
|
if (primary.Length() && (!hasBackup || backup.Length()))
|
|
{
|
|
buttons |= PSWIZB_NEXT;
|
|
}
|
|
|
|
parent.SetWizardButtons(buttons);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(NewGroupNovicePage, SnapInPropertyPage)
|
|
ON_EN_CHANGE(IDC_EDIT_PRIMARY, onChangePrimary)
|
|
ON_EN_CHANGE(IDC_EDIT_BACKUP, onChangeBackup)
|
|
ON_BN_CLICKED(IDC_CHECK_BACKUP, onChangeHasBackup)
|
|
ON_BN_CLICKED(IDC_BUTTON_VERIFY_PRIMARY, onVerifyPrimary)
|
|
ON_BN_CLICKED(IDC_BUTTON_VERIFY_BACKUP, onVerifyBackup)
|
|
END_MESSAGE_MAP()
|
|
|
|
NewGroupServersPage::NewGroupServersPage(NewGroupWizard& wizard)
|
|
: SnapInPropertyPage(
|
|
IDD_NEWGROUP_SERVERS,
|
|
IDS_NEWGROUP_SERVERS_TITLE,
|
|
IDS_NEWGROUP_SERVERS_SUBTITLE,
|
|
false
|
|
),
|
|
parent(wizard)
|
|
{
|
|
}
|
|
|
|
BOOL NewGroupServersPage::OnInitDialog()
|
|
{
|
|
servers.onInitDialog(m_hWnd, parent.group);
|
|
return SnapInPropertyPage::OnInitDialog();
|
|
}
|
|
|
|
void NewGroupServersPage::OnSysColorChange()
|
|
{
|
|
servers.onSysColorChange();
|
|
}
|
|
|
|
LRESULT NewGroupServersPage::OnWizardBack()
|
|
{
|
|
return IDD_NEWGROUP_NAME;
|
|
}
|
|
|
|
void NewGroupServersPage::onAdd()
|
|
{
|
|
if (servers.onAdd())
|
|
{
|
|
// If the user makes any changes to the server list, we put him in
|
|
// advanced mode.
|
|
parent.advanced = 1;
|
|
setButtons();
|
|
}
|
|
}
|
|
|
|
void NewGroupServersPage::onEdit()
|
|
{
|
|
if (servers.onEdit())
|
|
{
|
|
// If the user makes any changes to the server list, we put him in
|
|
// advanced mode.
|
|
parent.advanced = 1;
|
|
}
|
|
}
|
|
|
|
void NewGroupServersPage::onRemove()
|
|
{
|
|
if (servers.onRemove())
|
|
{
|
|
// If the user makes any changes to the server list, we put him in
|
|
// advanced mode.
|
|
parent.advanced = 1;
|
|
setButtons();
|
|
}
|
|
}
|
|
|
|
void NewGroupServersPage::onColumnClick(NMLISTVIEW* listView, LRESULT* result)
|
|
{
|
|
servers.onColumnClick(listView->iSubItem);
|
|
}
|
|
|
|
void NewGroupServersPage::onItemActivate(
|
|
NMITEMACTIVATE* itemActivate,
|
|
LRESULT* result
|
|
)
|
|
{
|
|
onEdit();
|
|
}
|
|
|
|
void NewGroupServersPage::onServerChanged(
|
|
NMLISTVIEW* listView,
|
|
LRESULT* result
|
|
)
|
|
{
|
|
servers.onServerChanged();
|
|
}
|
|
|
|
void NewGroupServersPage::getData()
|
|
{
|
|
servers.saveChanges(false);
|
|
}
|
|
|
|
void NewGroupServersPage::setData()
|
|
{
|
|
servers.setData();
|
|
setButtons();
|
|
}
|
|
|
|
void NewGroupServersPage::setButtons()
|
|
{
|
|
parent.SetWizardButtons(
|
|
servers.isEmpty() ? PSWIZB_BACK : (PSWIZB_BACK | PSWIZB_NEXT)
|
|
);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(NewGroupServersPage, SnapInPropertyPage)
|
|
ON_BN_CLICKED(IDC_BUTTON_ADD, onAdd)
|
|
ON_BN_CLICKED(IDC_BUTTON_EDIT, onEdit)
|
|
ON_BN_CLICKED(IDC_BUTTON_REMOVE, onRemove)
|
|
ON_EN_CHANGE(IDC_EDIT_NAME, onChange)
|
|
ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_SERVERS, onColumnClick)
|
|
ON_NOTIFY(LVN_ITEMACTIVATE, IDC_LIST_SERVERS, onItemActivate)
|
|
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_SERVERS, onServerChanged)
|
|
END_MESSAGE_MAP()
|
|
|
|
NewGroupFinishPage::NewGroupFinishPage(
|
|
NewGroupWizard& wizard,
|
|
bool promptForNewPolicy
|
|
)
|
|
: SnapInPropertyPage(IDD_NEWGROUP_COMPLETION, 0, 0, false),
|
|
parent(wizard),
|
|
allowCreate(promptForNewPolicy),
|
|
createPolicy(true)
|
|
{
|
|
}
|
|
|
|
BOOL NewGroupFinishPage::OnInitDialog()
|
|
{
|
|
setLargeFont(IDC_STATIC_LARGE);
|
|
initControl(IDC_STATIC_FINISH, text);
|
|
|
|
showControl(IDC_STATIC_CREATE_POLICY, allowCreate);
|
|
showControl(IDC_CHECK_CREATE_POLICY, allowCreate);
|
|
|
|
return SnapInPropertyPage::OnInitDialog();
|
|
}
|
|
|
|
LRESULT NewGroupFinishPage::OnWizardBack()
|
|
{
|
|
return parent.advanced ? IDD_NEWGROUP_SERVERS : IDD_NEWGROUP_NOVICE;
|
|
}
|
|
void NewGroupFinishPage::setData()
|
|
{
|
|
setValue(IDC_CHECK_CREATE_POLICY, createPolicy);
|
|
parent.SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
|
|
text.SetWindowText(parent.getFinishText());
|
|
}
|
|
|
|
void NewGroupFinishPage::saveChanges()
|
|
{
|
|
// This is a good time to get the status of the check box.
|
|
getValue(IDC_CHECK_CREATE_POLICY, createPolicy);
|
|
|
|
// We have to persist the group first. The SDOs won't let you persist a
|
|
// child if the parent doesn't exist.
|
|
parent.group.apply();
|
|
|
|
// Get the servers collection.
|
|
SdoCollection servers;
|
|
parent.group.getValue(
|
|
PROPERTY_RADIUSSERVERGROUP_SERVERS_COLLECTION,
|
|
servers
|
|
);
|
|
|
|
// Persist each server.
|
|
Sdo server;
|
|
SdoEnum sdoEnum = servers.getNewEnum();
|
|
while (sdoEnum.next(server))
|
|
{
|
|
server.apply();
|
|
}
|
|
}
|
|
|
|
NewGroupWizard::NewGroupWizard(
|
|
SdoConnection& connection,
|
|
SnapInView* snapInView,
|
|
bool promptForNewPolicy
|
|
)
|
|
: CPropertySheetEx(
|
|
(UINT)0,
|
|
NULL,
|
|
0,
|
|
LoadBitmapW(
|
|
AfxGetResourceHandle(),
|
|
MAKEINTRESOURCEW(IDB_PROXY_SERVER_WATERMARK)
|
|
),
|
|
NULL,
|
|
LoadBitmapW(
|
|
AfxGetResourceHandle(),
|
|
MAKEINTRESOURCEW(IDB_PROXY_SERVER_HEADER)
|
|
)
|
|
),
|
|
advanced(0),
|
|
cxn(connection),
|
|
view(snapInView),
|
|
start(*this),
|
|
name(*this),
|
|
novice(*this),
|
|
servers(*this),
|
|
finish(*this, promptForNewPolicy)
|
|
{
|
|
m_psh.dwFlags |= PSH_WIZARD97;
|
|
|
|
AddPage(&start);
|
|
AddPage(&name);
|
|
AddPage(&novice);
|
|
AddPage(&servers);
|
|
AddPage(&finish);
|
|
}
|
|
|
|
INT_PTR NewGroupWizard::DoModal()
|
|
{
|
|
// Create a new group.
|
|
Sdo newGroup = cxn.getServerGroups().tryCreate();
|
|
if (!newGroup)
|
|
{
|
|
return IAS_E_LICENSE_VIOLATION;
|
|
}
|
|
|
|
// Save it in a stream, so we can access it from OnInitDialog.
|
|
groupStream.marshal(newGroup);
|
|
|
|
// Invoke the wizard.
|
|
int retval = CPropertySheetEx::DoModal();
|
|
|
|
if (retval == IDCANCEL)
|
|
{
|
|
// User cancelled, so remove the group.
|
|
cxn.getServerGroups().remove(newGroup);
|
|
}
|
|
else if (view)
|
|
{
|
|
// User created a group, so send a propertyChanged notification.
|
|
cxn.propertyChanged(
|
|
*view,
|
|
PROPERTY_IAS_RADIUSSERVERGROUPS_COLLECTION
|
|
);
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
CString NewGroupWizard::getFinishText()
|
|
{
|
|
CString text;
|
|
|
|
if (!advanced)
|
|
{
|
|
if (novice.getBackupServer())
|
|
{
|
|
text.FormatMessage(
|
|
IDS_NEWGROUP_FINISH_TYPICAL,
|
|
name.getName(),
|
|
novice.getPrimaryServer(),
|
|
novice.getBackupServer()
|
|
);
|
|
}
|
|
else
|
|
{
|
|
text.FormatMessage(
|
|
IDS_NEWGROUP_FINISH_TYPICAL,
|
|
name.getName(),
|
|
novice.getPrimaryServer(),
|
|
ResourceString(IDS_NEWGROUP_NO_BACKUP)
|
|
);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
text.FormatMessage(
|
|
IDS_NEWGROUP_FINISH_CUSTOM,
|
|
name.getName()
|
|
);
|
|
}
|
|
|
|
return text;
|
|
}
|
|
|
|
BOOL NewGroupWizard::OnInitDialog()
|
|
{
|
|
// Retrieve the group from the stream.
|
|
groupStream.get(group);
|
|
|
|
return CPropertySheetEx::OnInitDialog();
|
|
}
|