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.

339 lines
8.9 KiB

  1. /*++
  2. Copyright (c) 1998 Microsoft Corporation
  3. Module Name:
  4. FixUp.c
  5. Abstract:
  6. This module contains common security routines for
  7. NT Clusters rolling upgrade and backward compatibility.
  8. Author:
  9. Galen Barbee (galenb) 31-Mar-1998
  10. --*/
  11. #include "clusrtlp.h"
  12. PSECURITY_DESCRIPTOR
  13. ClRtlConvertClusterSDToNT4Format(
  14. IN PSECURITY_DESCRIPTOR psd
  15. )
  16. /*++
  17. Routine Description:
  18. Convert the SD from nt 5 to nt 4 format. This means enforcing the
  19. following rules:
  20. 1. Convert denied ACE to allowed ACE. Convert "Full Control" access
  21. mask to CLUAPI_NO_ACCESS.
  22. Arguments:
  23. psd [IN] Security descriptor.
  24. Return Value:
  25. The new SD in self-Relative format
  26. --*/
  27. {
  28. PACL pacl;
  29. BOOL bHasDACL;
  30. BOOL bDACLDefaulted;
  31. PSECURITY_DESCRIPTOR psec = NULL;
  32. if (NULL == psd) {
  33. return NULL;
  34. }
  35. psec = ClRtlCopySecurityDescriptor(psd);
  36. if ( psec == NULL ) {
  37. return NULL;
  38. }
  39. if ( (GetSecurityDescriptorDacl(psec, (LPBOOL) &bHasDACL, (PACL *) &pacl, (LPBOOL) &bDACLDefaulted)) &&
  40. ( bHasDACL != FALSE ) ) {
  41. ACL_SIZE_INFORMATION asiAclSize;
  42. DWORD dwBufLength;
  43. dwBufLength = sizeof(asiAclSize);
  44. if (GetAclInformation(pacl, &asiAclSize, dwBufLength, AclSizeInformation)) {
  45. ACCESS_DENIED_ACE * pAce;
  46. DWORD dwIndex;
  47. for (dwIndex = 0; dwIndex < asiAclSize.AceCount; dwIndex++) {
  48. if (GetAce(pacl, dwIndex, (LPVOID *) &pAce)) {
  49. if (pAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) {
  50. if (pAce->Mask & SPECIFIC_RIGHTS_ALL) {
  51. pAce->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
  52. pAce->Mask = CLUSAPI_NO_ACCESS;
  53. }
  54. } // end if (pAce->Header.AceType == ACCESS_DENIED_ACE_TYPE)
  55. } // end if (GetAce())
  56. } // end for
  57. } // end if (GetAclInformation())
  58. } // end if (HrGetSecurityDescriptorDacl()) and DACL is present
  59. ASSERT(IsValidSecurityDescriptor(psec));
  60. return psec;
  61. } //*** ClRtlConvertClusterSDToNT4Format()
  62. PSECURITY_DESCRIPTOR
  63. ClRtlConvertClusterSDToNT5Format(
  64. IN PSECURITY_DESCRIPTOR psd
  65. )
  66. /*++
  67. Routine Description:
  68. Convert the SD from nt 5 to nt 4 format. This means enforcing the
  69. following rules:
  70. 1. Convert allowed ACE with mask CLUAPI_NO_ACCESS to denied ACE mask full control.
  71. Arguments:
  72. psd [IN] Security descriptor.
  73. Return Value:
  74. The new SD in self-Relative format
  75. --*/
  76. {
  77. PACL pacl;
  78. BOOL bHasDACL;
  79. BOOL bDACLDefaulted;
  80. PSECURITY_DESCRIPTOR psec = NULL;
  81. if (NULL == psd) {
  82. return NULL;
  83. }
  84. psec = ClRtlCopySecurityDescriptor(psd);
  85. if ( psec == NULL ) {
  86. return NULL;
  87. }
  88. if ( (GetSecurityDescriptorDacl(psec, (LPBOOL) &bHasDACL, (PACL *) &pacl, (LPBOOL) &bDACLDefaulted)) &&
  89. ( bHasDACL != FALSE ) ) {
  90. ACL_SIZE_INFORMATION asiAclSize;
  91. DWORD dwBufLength;
  92. dwBufLength = sizeof(asiAclSize);
  93. if (GetAclInformation(pacl, &asiAclSize, dwBufLength, AclSizeInformation)) {
  94. ACCESS_DENIED_ACE * pAce;
  95. DWORD dwIndex;
  96. for (dwIndex = 0; dwIndex < asiAclSize.AceCount; dwIndex++) {
  97. if (GetAce(pacl, dwIndex, (LPVOID *) &pAce)) {
  98. if (pAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) {
  99. if (pAce->Mask & CLUSAPI_NO_ACCESS) {
  100. pAce->Header.AceType = ACCESS_DENIED_ACE_TYPE;
  101. pAce->Mask = SPECIFIC_RIGHTS_ALL;
  102. }
  103. } // end if (pAce->Header.AceType == ACCESS_DENIED_ACE_TYPE)
  104. } // end if (GetAce())
  105. } // end for
  106. } // end if (GetAclInformation())
  107. } // end if (HrGetSecurityDescriptorDacl()) and DACL is present
  108. ASSERT(IsValidSecurityDescriptor(psec));
  109. return psec;
  110. } //*** ClRtlConvertClusterSDToNT5Format()
  111. static GENERIC_MAPPING gmFileShareMap =
  112. {
  113. FILE_GENERIC_READ,
  114. FILE_GENERIC_WRITE,
  115. FILE_GENERIC_EXECUTE,
  116. FILE_ALL_ACCESS
  117. };
  118. #define SPECIFIC_CHANGE (DELETE | FILE_GENERIC_WRITE)
  119. #define SPECIFIC_READ (FILE_GENERIC_READ | FILE_LIST_DIRECTORY | FILE_EXECUTE)
  120. #define GENERIC_CHANGE (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | DELETE)
  121. PSECURITY_DESCRIPTOR
  122. ClRtlConvertFileShareSDToNT4Format(
  123. IN PSECURITY_DESCRIPTOR psd
  124. )
  125. /*++
  126. Routine Description:
  127. Convert the SD from nt 5 to nt 4 format. This means enforcing the
  128. following rules:
  129. Arguments:
  130. psd [IN] Security descriptor.
  131. Return Value:
  132. The new SD in self-Relative format
  133. --*/
  134. {
  135. PACL pacl;
  136. BOOL bHasDACL;
  137. BOOL bDACLDefaulted;
  138. PSECURITY_DESCRIPTOR psec = NULL;
  139. if (NULL == psd) {
  140. return NULL;
  141. }
  142. psec = ClRtlCopySecurityDescriptor(psd);
  143. if ( psec == NULL ) {
  144. return NULL;
  145. }
  146. if ( (GetSecurityDescriptorDacl(psec, (LPBOOL) &bHasDACL, (PACL *) &pacl, (LPBOOL) &bDACLDefaulted)) &&
  147. ( bHasDACL != FALSE ) ) {
  148. ACL_SIZE_INFORMATION asiAclSize;
  149. DWORD dwBufLength;
  150. ACCESS_MASK amTemp1;
  151. ACCESS_MASK amTemp2;
  152. dwBufLength = sizeof(asiAclSize);
  153. if (GetAclInformation(pacl, &asiAclSize, dwBufLength, AclSizeInformation)) {
  154. ACCESS_DENIED_ACE * pAce;
  155. DWORD dwSid;
  156. DWORD dwIndex;
  157. for (dwIndex = 0; dwIndex < asiAclSize.AceCount; dwIndex++) {
  158. amTemp1 = 0;
  159. amTemp2 = 0;
  160. if (GetAce(pacl, dwIndex, (LPVOID *) &pAce)) {
  161. // delete deny read ACEs since they don't mean anything to AclEdit
  162. if ((pAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) &&
  163. (pAce->Mask == SPECIFIC_READ)) {
  164. dwSid = pAce->SidStart;
  165. if (DeleteAce(pacl, dwIndex)) {
  166. asiAclSize.AceCount -= 1;
  167. dwIndex -= 1;
  168. }
  169. else {
  170. ClRtlDbgPrint(LOG_UNUSUAL,
  171. "[ClRtl] DeteteAce failed removing ACE #%1!d! due to error %2!d!\n",
  172. dwIndex,
  173. GetLastError());
  174. }
  175. continue;
  176. }
  177. // convert deny change deny read ACEs to deny all ACEs
  178. if ((pAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) &&
  179. (pAce->Mask == (SPECIFIC_CHANGE | SPECIFIC_READ))) {
  180. pAce->Mask = GENERIC_ALL;
  181. continue;
  182. }
  183. // convert deny change ACEs to allow read (read only) ACEs
  184. if ((pAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) &&
  185. (pAce->Mask == SPECIFIC_CHANGE)) {
  186. pAce->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
  187. pAce->Mask = GENERIC_READ | GENERIC_EXECUTE;
  188. continue;
  189. }
  190. // convert specific allow change to generic allow change
  191. if ((pAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) &&
  192. (pAce->Mask == SPECIFIC_CHANGE)) {
  193. pAce->Mask = GENERIC_CHANGE;
  194. continue;
  195. }
  196. // convert specific all to generic all
  197. if ((pAce->Mask & gmFileShareMap.GenericAll) == gmFileShareMap.GenericAll) {
  198. amTemp1 |= GENERIC_ALL;
  199. amTemp2 |= gmFileShareMap.GenericAll;
  200. }
  201. else {
  202. // convert specific read to generic read
  203. if ((pAce->Mask & gmFileShareMap.GenericRead) == gmFileShareMap.GenericRead) {
  204. amTemp1 |= GENERIC_READ;
  205. amTemp2 |= gmFileShareMap.GenericRead;
  206. }
  207. // convert specific write to generic write which includes delete
  208. if ((pAce->Mask & gmFileShareMap.GenericWrite) == gmFileShareMap.GenericWrite) {
  209. amTemp1 |= (GENERIC_WRITE | DELETE);
  210. amTemp2 |= gmFileShareMap.GenericWrite;
  211. }
  212. // convert specific execute to generic execute
  213. if ((pAce->Mask & gmFileShareMap.GenericExecute) == gmFileShareMap.GenericExecute) {
  214. amTemp1 |= GENERIC_EXECUTE;
  215. amTemp2 |= gmFileShareMap.GenericExecute;
  216. }
  217. }
  218. pAce->Mask &= ~amTemp2; // turn off specific bits
  219. pAce->Mask |= amTemp1; // turn on generic bits
  220. } // end if (GetAce())
  221. } // end for
  222. } // end if (GetAclInformation())
  223. } // end if (HrGetSecurityDescriptorDacl()) and DACL is present
  224. ASSERT(IsValidSecurityDescriptor(psec));
  225. return psec;
  226. } //*** ClRtlConvertFileShareSDToNT4Format()