Leaked source code of windows server 2003
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.

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