Source code of Windows XP (NT5)
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.

228 lines
6.9 KiB

  1. // EditAlias.cpp : Implementation of CEditAlias
  2. #include "stdafx.h"
  3. #include "W3PropPage.h"
  4. #include "w3ext.h"
  5. #include "PropShellExt.h"
  6. #include "EditAlias.h"
  7. /////////////////////////////////////////////////////////////////////////////
  8. // CEditAlias
  9. #define TOOLTIP_READ_PERMISSIONS 1000
  10. LRESULT
  11. CEditAlias::OnInitDialog(HWND hDlg, LPARAM lParam)
  12. {
  13. CMetabasePath path(TRUE, SZ_MBN_WEB, m_instance, SZ_MBN_ROOT, m_new ? NULL : m_alias);
  14. CMetaKey mk(LOCAL_KEY, path);
  15. DWORD flags;
  16. m_prev_alias = m_alias;
  17. if (SUCCEEDED(mk.QueryValue(MD_ACCESS_PERM, flags)))
  18. {
  19. m_read = ((flags & MD_ACCESS_READ) != 0);
  20. m_write = ((flags & MD_ACCESS_WRITE) != 0);
  21. m_source = ((flags & MD_ACCESS_SOURCE) != 0);
  22. if (!m_new)
  23. {
  24. if ((flags & MD_ACCESS_EXECUTE) != 0)
  25. m_appcontrol = APP_PERM_EXECUTE;
  26. else if ((flags & MD_ACCESS_SOURCE) != 0)
  27. m_appcontrol = APP_PERM_SCRIPTS;
  28. }
  29. else
  30. m_appcontrol = APP_PERM_SCRIPTS;
  31. }
  32. else
  33. {
  34. EndDialog(0);
  35. }
  36. if (SUCCEEDED(mk.QueryValue(MD_DIRECTORY_BROWSING, flags)))
  37. {
  38. m_browse = ((flags & MD_DIRBROW_ENABLED) != 0);
  39. }
  40. else
  41. {
  42. EndDialog(0);
  43. }
  44. ::EnableWindow(GetDlgItem(IDOK), m_alias[0] != 0);
  45. m_in_init = TRUE;
  46. DoDataExchange();
  47. m_in_init = FALSE;
  48. // if (NULL != m_tool_tip.Create(hDlg))
  49. // {
  50. // RECT rc;
  51. // ::GetWindowRect(GetDlgItem(IDC_READ), &rc);
  52. // ScreenToClient(&rc);
  53. // m_tool_tip.AddTool(hDlg,
  54. // _T("Users could read this directory"),
  55. // &rc, TOOLTIP_READ_PERMISSIONS
  56. // );
  57. // }
  58. return 1;
  59. }
  60. void
  61. CEditAlias::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl)
  62. {
  63. CError err;
  64. DWORD app_state = 0;
  65. DoDataExchange(TRUE);
  66. CMetabasePath alias(FALSE, m_alias);
  67. CMetabasePath::CleanMetaPath(alias);
  68. if (alias.QueryMetaPath()[0] == 0)
  69. {
  70. CString cap, msg;
  71. cap.LoadString(_Module.GetResourceInstance(), IDS_PAGE_TITLE);
  72. msg.Format(_Module.GetResourceInstance(), IDS_BAD_ALIAS, m_alias);
  73. MessageBox(msg, cap);
  74. ::SetFocus(GetDlgItem(IDC_ALIAS));
  75. SendDlgItemMessage(IDC_ALIAS, EM_SETSEL, 0, -1);
  76. return;
  77. }
  78. CMetabasePath path(TRUE, SZ_MBN_WEB, m_instance,
  79. SZ_MBN_ROOT, alias.QueryMetaPath());
  80. CMetabasePath::CleanMetaPath(path);
  81. CMetabasePath parent(path);
  82. CString sub_alias;
  83. CMetabasePath::GetLastNodeName(path, sub_alias);
  84. CMetabasePath::ConvertToParentPath(parent);
  85. CWaitCursor wait;
  86. do
  87. {
  88. if (!m_new)
  89. {
  90. if (m_prev_alias.Compare(m_alias) != 0)
  91. {
  92. CMetabasePath prev_path(TRUE, SZ_MBN_WEB, m_instance, SZ_MBN_ROOT, m_prev_alias);
  93. CIISApplication app(NULL, prev_path);
  94. err = app.QueryResult();
  95. BREAK_ON_ERR_FAILURE(err)
  96. app_state = app.QueryAppState();
  97. err = app.Delete();
  98. BREAK_ON_ERR_FAILURE(err)
  99. CString str;
  100. CMetabasePath::GetLastNodeName(prev_path, str);
  101. CMetabasePath::ConvertToParentPath(prev_path);
  102. CMetaKey mk_prev(LOCAL_KEY, prev_path, METADATA_PERMISSION_WRITE);
  103. err = mk_prev.DeleteKey(str);
  104. BREAK_ON_ERR_FAILURE(err)
  105. }
  106. }
  107. //make sure the parent is there
  108. CMetaKey mk(LOCAL_KEY, parent, METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE);
  109. err = mk.QueryResult();
  110. if (err.Failed())
  111. {
  112. if (err.Win32Error() == ERROR_PATH_NOT_FOUND)
  113. {
  114. CString caption, msg;
  115. caption.LoadString(_Module.GetResourceInstance(), IDS_PAGE_TITLE);
  116. msg.LoadString(_Module.GetResourceInstance(), IDS_NO_PARENT);
  117. MessageBox (msg, caption, MB_OK);
  118. ::SetFocus(GetDlgItem(IDC_ALIAS));
  119. SendDlgItemMessage(IDC_ALIAS, EM_SETSEL, 0, -1);
  120. break;
  121. }
  122. err.MessageBox();
  123. break;
  124. }
  125. // if we are editing, delete previous vdir and application
  126. if (m_new)
  127. {
  128. // check if this alias is already available
  129. err = mk.DoesPathExist(sub_alias);
  130. if (err.Succeeded())
  131. {
  132. CString caption, fmt, msg;
  133. caption.LoadString(_Module.GetResourceInstance(), IDS_PAGE_TITLE);
  134. fmt.LoadString(_Module.GetResourceInstance(), IDS_ALIAS_IS_TAKEN);
  135. msg.Format(fmt, path.QueryMetaPath());
  136. MessageBox (msg, caption, MB_OK);
  137. ::SetFocus(GetDlgItem(IDC_ALIAS));
  138. SendDlgItemMessage(IDC_ALIAS, EM_SETSEL, 0, -1);
  139. err = E_FAIL;
  140. break;
  141. }
  142. err = S_OK;
  143. }
  144. if (err.Succeeded())
  145. {
  146. err = mk.AddKey(sub_alias);
  147. BREAK_ON_ERR_FAILURE(err)
  148. err = mk.SetValue(MD_KEY_TYPE, CString(_T("IIsWebVirtualDir")), NULL, sub_alias);
  149. BREAK_ON_ERR_FAILURE(err)
  150. err = mk.SetValue(MD_VR_PATH, CString(m_path), NULL, sub_alias);
  151. BREAK_ON_ERR_FAILURE(err)
  152. }
  153. // apply permissions
  154. DWORD flags;
  155. mk.QueryValue(MD_ACCESS_PERM, flags, NULL, sub_alias);
  156. flags &= ~(MD_ACCESS_READ|MD_ACCESS_WRITE|MD_ACCESS_SOURCE|MD_ACCESS_SCRIPT|MD_ACCESS_EXECUTE);
  157. flags |= m_read ? MD_ACCESS_READ : 0;
  158. flags |= m_write ? MD_ACCESS_WRITE : 0;
  159. flags |= m_source ? MD_ACCESS_SOURCE : 0;
  160. if (m_appcontrol == APP_PERM_SCRIPTS)
  161. flags |= MD_ACCESS_SCRIPT;
  162. else if (m_appcontrol == APP_PERM_EXECUTE)
  163. flags |= MD_ACCESS_SCRIPT|MD_ACCESS_EXECUTE;
  164. mk.SetValue(MD_ACCESS_PERM, flags, NULL, sub_alias);
  165. mk.QueryValue(MD_DIRECTORY_BROWSING, flags, NULL, sub_alias);
  166. flags &= ~MD_DIRBROW_ENABLED;
  167. flags |= m_browse ? MD_DIRBROW_ENABLED : 0;
  168. err = mk.SetValue(MD_DIRECTORY_BROWSING, flags, NULL, sub_alias);
  169. } while (FALSE);
  170. if (err.Succeeded())
  171. {
  172. CIISApplication app(NULL, path);
  173. err = app.QueryResult();
  174. if (err.Succeeded())
  175. {
  176. err = app.Create(NULL,
  177. app_state ? app_state : CWamInterface::APP_POOLEDPROC);
  178. }
  179. if (err.Succeeded())
  180. EndDialog(wID);
  181. }
  182. }
  183. void
  184. CEditAlias::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl)
  185. {
  186. EndDialog(wID);
  187. }
  188. void
  189. CEditAlias::OnPermissions(WORD wNotifyCode, WORD wID, HWND hWndCtl)
  190. {
  191. if (!m_in_init)
  192. {
  193. DoDataExchange(TRUE);
  194. if (m_write && m_appcontrol > 0)
  195. {
  196. CString caption, msg;
  197. VERIFY(caption.LoadString(_Module.GetResourceInstance(), IDS_PAGE_TITLE));
  198. VERIFY(msg.LoadString(_Module.GetResourceInstance(), IDS_WRITEEXECUTE_DANGER));
  199. if (IDNO == MessageBox(msg, caption, MB_YESNO | MB_ICONEXCLAMATION))
  200. {
  201. CheckDlgButton(wID, 0);
  202. if (wID != IDC_WRITE)
  203. {
  204. CheckDlgButton(IDC_NONE_PERMS, 1);
  205. }
  206. }
  207. }
  208. }
  209. }
  210. void
  211. CEditAlias::OnAliasChange(WORD wNotifyCode, WORD wID, HWND hWndCtl)
  212. {
  213. if (!m_in_init)
  214. {
  215. DoDataExchange(TRUE);
  216. ::EnableWindow(GetDlgItem(IDOK), m_alias[0] != 0);
  217. }
  218. }