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.
245 lines
7.5 KiB
245 lines
7.5 KiB
// EditAlias.cpp : Implementation of CEditAlias
|
|
#include "stdafx.h"
|
|
#include "W3PropPage.h"
|
|
#include "w3ext.h"
|
|
#include "PropShellExt.h"
|
|
#include "EditAlias.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEditAlias
|
|
|
|
#define TOOLTIP_READ_PERMISSIONS 1000
|
|
|
|
LRESULT
|
|
CEditAlias::OnInitDialog(HWND hDlg, LPARAM lParam)
|
|
{
|
|
CMetabasePath path(TRUE, SZ_MBN_WEB, m_instance, SZ_MBN_ROOT, m_new ? NULL : m_alias);
|
|
CMetaKey mk(LOCAL_KEY, path);
|
|
DWORD flags;
|
|
m_prev_alias = m_alias;
|
|
if (SUCCEEDED(mk.QueryValue(MD_ACCESS_PERM, flags)))
|
|
{
|
|
m_read = ((flags & MD_ACCESS_READ) != 0);
|
|
m_write = ((flags & MD_ACCESS_WRITE) != 0);
|
|
m_source = ((flags & MD_ACCESS_SOURCE) != 0);
|
|
|
|
if (!m_new)
|
|
{
|
|
if ((flags & MD_ACCESS_EXECUTE) != 0)
|
|
m_appcontrol = APP_PERM_EXECUTE;
|
|
else if ((flags & MD_ACCESS_SCRIPT) != 0)
|
|
m_appcontrol = APP_PERM_SCRIPTS;
|
|
}
|
|
else
|
|
m_appcontrol = APP_PERM_SCRIPTS;
|
|
}
|
|
else
|
|
{
|
|
EndDialog(0);
|
|
}
|
|
if (SUCCEEDED(mk.QueryValue(MD_DIRECTORY_BROWSING, flags)))
|
|
{
|
|
m_browse = ((flags & MD_DIRBROW_ENABLED) != 0);
|
|
}
|
|
else
|
|
{
|
|
EndDialog(0);
|
|
}
|
|
::EnableWindow(GetDlgItem(IDOK), m_alias[0] != 0);
|
|
m_in_init = TRUE;
|
|
DoDataExchange();
|
|
m_in_init = FALSE;
|
|
|
|
// if (NULL != m_tool_tip.Create(hDlg))
|
|
// {
|
|
// RECT rc;
|
|
// ::GetWindowRect(GetDlgItem(IDC_READ), &rc);
|
|
// ScreenToClient(&rc);
|
|
// m_tool_tip.AddTool(hDlg,
|
|
// _T("Users could read this directory"),
|
|
// &rc, TOOLTIP_READ_PERMISSIONS
|
|
// );
|
|
// }
|
|
return 1;
|
|
}
|
|
|
|
void
|
|
CEditAlias::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl)
|
|
{
|
|
CError err;
|
|
DWORD app_state = 0;
|
|
BOOL bRenamed = FALSE;
|
|
DoDataExchange(TRUE);
|
|
CMetabasePath alias(FALSE, m_alias);
|
|
CMetabasePath::CleanMetaPath(alias);
|
|
if (alias.QueryMetaPath()[0] == 0)
|
|
{
|
|
CString cap, msg;
|
|
cap.LoadString(_Module.GetResourceInstance(), IDS_PAGE_TITLE);
|
|
msg.Format(_Module.GetResourceInstance(), IDS_BAD_ALIAS, m_alias);
|
|
MessageBox(msg, cap);
|
|
::SetFocus(GetDlgItem(IDC_ALIAS));
|
|
SendDlgItemMessage(IDC_ALIAS, EM_SETSEL, 0, -1);
|
|
return;
|
|
}
|
|
CMetabasePath path(TRUE, SZ_MBN_WEB, m_instance,
|
|
SZ_MBN_ROOT, alias.QueryMetaPath());
|
|
CMetabasePath::CleanMetaPath(path);
|
|
CMetabasePath parent(path);
|
|
CString sub_alias;
|
|
CMetabasePath::GetLastNodeName(path, sub_alias);
|
|
CMetabasePath::ConvertToParentPath(parent);
|
|
CWaitCursor wait;
|
|
do
|
|
{
|
|
if (!m_new)
|
|
{
|
|
if (m_prev_alias.Compare(m_alias) != 0)
|
|
{
|
|
CMetabasePath prev_path(TRUE, SZ_MBN_WEB, m_instance, SZ_MBN_ROOT, m_prev_alias);
|
|
CIISApplication app(NULL, prev_path);
|
|
err = app.QueryResult();
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
app_state = app.QueryAppState();
|
|
err = app.Delete();
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
CString str;
|
|
CMetabasePath::GetLastNodeName(prev_path, str);
|
|
CMetabasePath::ConvertToParentPath(prev_path);
|
|
CMetaKey mk_prev(LOCAL_KEY, prev_path, METADATA_PERMISSION_WRITE);
|
|
err = mk_prev.DeleteKey(str);
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
bRenamed = TRUE;
|
|
}
|
|
}
|
|
//make sure the parent is there
|
|
CMetaKey mk(LOCAL_KEY, parent, METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE);
|
|
err = mk.QueryResult();
|
|
if (err.Failed())
|
|
{
|
|
if (err.Win32Error() == ERROR_PATH_NOT_FOUND)
|
|
{
|
|
CString caption, msg;
|
|
caption.LoadString(_Module.GetResourceInstance(), IDS_PAGE_TITLE);
|
|
msg.LoadString(_Module.GetResourceInstance(), IDS_NO_PARENT);
|
|
MessageBox (msg, caption, MB_OK);
|
|
::SetFocus(GetDlgItem(IDC_ALIAS));
|
|
SendDlgItemMessage(IDC_ALIAS, EM_SETSEL, 0, -1);
|
|
break;
|
|
}
|
|
err.MessageBox();
|
|
break;
|
|
}
|
|
// if we are editing, delete previous vdir and application
|
|
if (m_new)
|
|
{
|
|
// check if this alias is already available
|
|
err = mk.DoesPathExist(sub_alias);
|
|
if (err.Succeeded())
|
|
{
|
|
CString caption, fmt, msg;
|
|
caption.LoadString(_Module.GetResourceInstance(), IDS_PAGE_TITLE);
|
|
fmt.LoadString(_Module.GetResourceInstance(), IDS_ALIAS_IS_TAKEN);
|
|
msg.Format(fmt, path.QueryMetaPath());
|
|
MessageBox (msg, caption, MB_OK);
|
|
::SetFocus(GetDlgItem(IDC_ALIAS));
|
|
SendDlgItemMessage(IDC_ALIAS, EM_SETSEL, 0, -1);
|
|
err = E_FAIL;
|
|
break;
|
|
}
|
|
err = S_OK;
|
|
}
|
|
if (err.Succeeded())
|
|
{
|
|
if (m_new || bRenamed)
|
|
{
|
|
err = mk.AddKey(sub_alias);
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
err = mk.SetValue(MD_KEY_TYPE, CString(_T("IIsWebVirtualDir")), NULL, sub_alias);
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
err = mk.SetValue(MD_VR_PATH, CString(m_path), NULL, sub_alias);
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
}
|
|
}
|
|
// apply permissions
|
|
DWORD flags;
|
|
mk.QueryValue(MD_ACCESS_PERM, flags, NULL, sub_alias);
|
|
flags &= ~(MD_ACCESS_READ|MD_ACCESS_WRITE|MD_ACCESS_SOURCE|MD_ACCESS_SCRIPT|MD_ACCESS_EXECUTE);
|
|
flags |= m_read ? MD_ACCESS_READ : 0;
|
|
flags |= m_write ? MD_ACCESS_WRITE : 0;
|
|
flags |= m_source ? MD_ACCESS_SOURCE : 0;
|
|
if (m_appcontrol == APP_PERM_SCRIPTS)
|
|
flags |= MD_ACCESS_SCRIPT;
|
|
else if (m_appcontrol == APP_PERM_EXECUTE)
|
|
flags |= MD_ACCESS_SCRIPT|MD_ACCESS_EXECUTE;
|
|
mk.SetValue(MD_ACCESS_PERM, flags, NULL, sub_alias);
|
|
|
|
mk.QueryValue(MD_DIRECTORY_BROWSING, flags, NULL, sub_alias);
|
|
flags &= ~MD_DIRBROW_ENABLED;
|
|
flags |= m_browse ? MD_DIRBROW_ENABLED : 0;
|
|
err = mk.SetValue(MD_DIRECTORY_BROWSING, flags, NULL, sub_alias);
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
if (m_new)
|
|
{
|
|
DWORD dwAuthFlags;
|
|
err = mk.QueryValue(MD_AUTHORIZATION, dwAuthFlags, NULL, sub_alias);
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
dwAuthFlags &= ~(MD_AUTH_BASIC|MD_AUTH_ANONYMOUS|MD_AUTH_MD5);
|
|
dwAuthFlags |= MD_AUTH_NT;
|
|
err = mk.SetValue(MD_AUTHORIZATION, dwAuthFlags, NULL, sub_alias);
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
}
|
|
} while (FALSE);
|
|
if (err.Succeeded())
|
|
{
|
|
do
|
|
{
|
|
CIISApplication app(NULL, path);
|
|
err = app.QueryResult();
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
err = app.Create(NULL,
|
|
app_state ? app_state : CWamInterface::APP_POOLEDPROC);
|
|
BREAK_ON_ERR_FAILURE(err)
|
|
EndDialog(wID);
|
|
} while (FALSE);
|
|
}
|
|
}
|
|
|
|
void
|
|
CEditAlias::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl)
|
|
{
|
|
EndDialog(wID);
|
|
}
|
|
|
|
void
|
|
CEditAlias::OnPermissions(WORD wNotifyCode, WORD wID, HWND hWndCtl)
|
|
{
|
|
if (!m_in_init)
|
|
{
|
|
DoDataExchange(TRUE);
|
|
if (m_write && m_appcontrol > 0)
|
|
{
|
|
CString caption, msg;
|
|
VERIFY(caption.LoadString(_Module.GetResourceInstance(), IDS_PAGE_TITLE));
|
|
VERIFY(msg.LoadString(_Module.GetResourceInstance(), IDS_WRITEEXECUTE_DANGER));
|
|
if (IDNO == MessageBox(msg, caption, MB_YESNO | MB_ICONEXCLAMATION))
|
|
{
|
|
CheckDlgButton(wID, 0);
|
|
if (wID != IDC_WRITE)
|
|
{
|
|
CheckDlgButton(IDC_NONE_PERMS, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
CEditAlias::OnAliasChange(WORD wNotifyCode, WORD wID, HWND hWndCtl)
|
|
{
|
|
if (!m_in_init)
|
|
{
|
|
DoDataExchange(TRUE);
|
|
::EnableWindow(GetDlgItem(IDOK), m_alias[0] != 0);
|
|
}
|
|
}
|