add all ACEs to their principals Modified: trunk/reactos/lib/aclui/aclui.c Modified: trunk/reactos/lib/aclui/checklist.c Modified: trunk/reactos/lib/aclui/precomp.h _____
Modified: trunk/reactos/lib/aclui/aclui.c --- trunk/reactos/lib/aclui/aclui.c 2005-11-03 02:36:09 UTC (rev 18971) +++ trunk/reactos/lib/aclui/aclui.c 2005-11-03 11:28:56 UTC (rev 18972) @@ -30,6 +30,45 @@
HINSTANCE hDllInstance;
+static PSID +AceHeaderToSID(IN PACE_HEADER AceHeader) +{ + PSID Sid = NULL; + switch (AceHeader->AceType) + { + case ACCESS_ALLOWED_ACE_TYPE: + Sid = (PSID)&((PACCESS_ALLOWED_ACE)AceHeader)->SidStart; + break; +#if 0 + case ACCESS_ALLOWED_CALLBACK_ACE_TYPE: + Sid = (PSID)&((PACCESS_ALLOWED_CALLBACK_ACE)AceHeader)->SidStart; + break; + case ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE: + Sid = (PSID)&((PACCESS_ALLOWED_CALLBACK_OBJECT_ACE)AceHeader)->SidStart; + break; +#endif + case ACCESS_ALLOWED_OBJECT_ACE_TYPE: + Sid = (PSID)&((PACCESS_ALLOWED_OBJECT_ACE)AceHeader)->SidStart; + break; + case ACCESS_DENIED_ACE_TYPE: + Sid = (PSID)&((PACCESS_DENIED_ACE)AceHeader)->SidStart; + break; +#if 0 + case ACCESS_DENIED_CALLBACK_ACE_TYPE: + Sid = (PSID)&((PACCESS_DENIED_CALLBACK_ACE)AceHeader)->SidStart; + break; + case ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE: + Sid = (PSID)&((PACCESS_DENIED_CALLBACK_OBJECT_ACE)AceHeader)->SidStart; + break; +#endif + case SYSTEM_AUDIT_OBJECT_ACE_TYPE: + Sid = (PSID)&((PACCESS_DENIED_OBJECT_ACE)AceHeader)->SidStart; + break; + } + + return Sid; +} + static VOID DestroySecurityPage(IN PSECURITY_PAGE sp) { @@ -49,10 +88,22 @@ FreePrincipalsList(IN PPRINCIPAL_LISTITEM *PrincipalsListHead) { PPRINCIPAL_LISTITEM CurItem, NextItem; + PACE_ENTRY AceEntry, NextAceEntry;
CurItem = *PrincipalsListHead; while (CurItem != NULL) { + /* Free all ACEs */ + AceEntry = CurItem->ACEs; + while (AceEntry != NULL) + { + NextAceEntry = AceEntry->Next; + HeapFree(GetProcessHeap(), + 0, + AceEntry); + AceEntry = NextAceEntry; + } + /* free the SID string if present */ if (CurItem->DisplayString != NULL) { @@ -70,9 +121,40 @@ *PrincipalsListHead = NULL; }
+static PACE_ENTRY +AddAceToPrincipal(IN PPRINCIPAL_LISTITEM Principal, + IN PACE_HEADER AceHeader) +{ + PACE_ENTRY AceEntry, *AceLink; + + AceEntry = HeapAlloc(GetProcessHeap(), + 0, + sizeof(ACE_ENTRY) + AceHeader->AceSize); + if (AceEntry != NULL) + { + AceEntry->Next = NULL; + + /* copy the ACE */ + CopyMemory(AceEntry + 1, + AceHeader, + AceHeader->AceSize); + + /* append it to the list */ + AceLink = &Principal->ACEs; + while (*AceLink != NULL) + { + AceLink = &(*AceLink)->Next; + } + *AceLink = AceEntry; + } + + return AceEntry; +} + static PPRINCIPAL_LISTITEM -FindSidInPrincipalsList(IN PPRINCIPAL_LISTITEM PrincipalsListHead, - IN PSID Sid) +FindSidInPrincipalsListAddAce(IN PPRINCIPAL_LISTITEM PrincipalsListHead, + IN PSID Sid, + IN PACE_HEADER AceHeader) { PPRINCIPAL_LISTITEM CurItem;
@@ -83,7 +165,14 @@ if (EqualSid((PSID)(CurItem + 1), Sid)) { - return CurItem; + if (AddAceToPrincipal(CurItem, + AceHeader) != NULL) + { + return CurItem; + } + + /* unable to add the ACE to the principal */ + break; } }
@@ -92,15 +181,21 @@
static BOOL AddPrincipalToList(IN PSECURITY_PAGE sp, - IN PSID Sid) + IN PSID Sid, + IN PACE_HEADER AceHeader) { - if (!FindSidInPrincipalsList(sp->PrincipalsListHead, - Sid)) + PPRINCIPAL_LISTITEM PrincipalListItem = NULL; + PACE_ENTRY AceEntry = NULL; + BOOL Ret = FALSE; + + if (!FindSidInPrincipalsListAddAce(sp->PrincipalsListHead, + Sid, + AceHeader)) { DWORD SidLength, AccountNameSize, DomainNameSize; SID_NAME_USE SidNameUse; DWORD LookupResult; - PPRINCIPAL_LISTITEM AceListItem, *NextAcePtr; + PPRINCIPAL_LISTITEM PrincipalListItem, *PrincipalLink;
AccountNameSize = 0; DomainNameSize = 0; @@ -118,69 +213,82 @@ if (LookupResult != ERROR_NONE_MAPPED && LookupResult != ERROR_INSUFFICIENT_BUFFER) { - return FALSE; + goto Cleanup; } }
- NextAcePtr = &sp->PrincipalsListHead; - for (AceListItem = sp->PrincipalsListHead; - AceListItem != NULL; - AceListItem = AceListItem->Next) + PrincipalLink = &sp->PrincipalsListHead; + while (*PrincipalLink != NULL) { - NextAcePtr = &AceListItem->Next; + PrincipalLink = &(*PrincipalLink)->Next; }
SidLength = GetLengthSid(Sid);
- /* allocate the ace */ - AceListItem = HeapAlloc(GetProcessHeap(), - 0, - sizeof(PRINCIPAL_LISTITEM) + SidLength + - ((AccountNameSize + DomainNameSize) * sizeof(WCHAR))); - if (AceListItem != NULL) + /* allocate the principal */ + PrincipalListItem = HeapAlloc(GetProcessHeap(), + 0, + sizeof(PRINCIPAL_LISTITEM) + SidLength + + ((AccountNameSize + DomainNameSize) * sizeof(WCHAR))); + if (PrincipalListItem != NULL) { - AceListItem->AccountName = (LPWSTR)((ULONG_PTR)(AceListItem + 1) + SidLength); - AceListItem->DomainName = AceListItem->AccountName + AccountNameSize; + PrincipalListItem->AccountName = (LPWSTR)((ULONG_PTR)(PrincipalListItem + 1) + SidLength); + PrincipalListItem->DomainName = PrincipalListItem->AccountName + AccountNameSize;
CopySid(SidLength, - (PSID)(AceListItem + 1), + (PSID)(PrincipalListItem + 1), Sid);
LookupResult = ERROR_SUCCESS; if (!LookupAccountSid(sp->ServerName, Sid, - AceListItem->AccountName, + PrincipalListItem->AccountName, &AccountNameSize, - AceListItem->DomainName, + PrincipalListItem->DomainName, &DomainNameSize, &SidNameUse)) { LookupResult = GetLastError(); if (LookupResult != ERROR_NONE_MAPPED) { - HeapFree(GetProcessHeap(), - 0, - AceListItem); - return FALSE; + goto Cleanup; } }
if (AccountNameSize == 0) { - AceListItem->AccountName = NULL; + PrincipalListItem->AccountName = NULL; } if (DomainNameSize == 0) { - AceListItem->DomainName = NULL; + PrincipalListItem->DomainName = NULL; }
- AceListItem->Next = NULL; + /* allocate some memory for the ACE and copy it */ + AceEntry = HeapAlloc(GetProcessHeap(), + 0, + sizeof(ACE_ENTRY) + AceHeader->AceSize); + if (AceEntry == NULL) + { + goto Cleanup; + } + AceEntry->Next = NULL; + CopyMemory(AceEntry + 1, + AceHeader, + AceHeader->AceSize); + + /* add the ACE to the list */ + PrincipalListItem->ACEs = AceEntry; + + PrincipalListItem->Next = NULL; + Ret = TRUE; + if (LookupResult == ERROR_NONE_MAPPED) { if (!ConvertSidToStringSid(Sid, - &AceListItem->DisplayString)) + &PrincipalListItem->DisplayString)) { - AceListItem->DisplayString = NULL; + PrincipalListItem->DisplayString = NULL; } } else @@ -188,7 +296,7 @@ LSA_HANDLE LsaHandle; NTSTATUS Status;
- AceListItem->DisplayString = NULL; + PrincipalListItem->DisplayString = NULL;
/* read the domain of the SID */ if (OpenLSAPolicyHandle(sp->ServerName, @@ -220,7 +328,7 @@ DomainName = NULL; }
- AceListItem->SidNameUse = Names->Use; + PrincipalListItem->SidNameUse = Names->Use;
switch (Names->Use) { @@ -236,7 +344,7 @@ DomainName = &PolicyAccountDomainInfo->DomainName;
/* make the user believe this is a group */ - AceListItem->SidNameUse = SidTypeGroup; + PrincipalListItem->SidNameUse = SidTypeGroup; } } /* fall through */ @@ -247,19 +355,19 @@ { SIZE_T Size = (AccountNameSize + DomainName->Length + Names->Name.Length + 6) * sizeof(WCHAR); - AceListItem->DisplayString = (LPWSTR)LocalAlloc(LMEM_FIXED, + PrincipalListItem->DisplayString = (LPWSTR)LocalAlloc(LMEM_FIXED,
Size); - if (AceListItem->DisplayString != NULL) + if (PrincipalListItem->DisplayString != NULL) { WCHAR *s;
/* NOTE: LSA_UNICODE_STRINGs are not always NULL-terminated! */
- wcscpy(AceListItem->DisplayString, - AceListItem->AccountName); - wcscat(AceListItem->DisplayString, + wcscpy(PrincipalListItem->DisplayString, + PrincipalListItem->AccountName); + wcscat(PrincipalListItem->DisplayString, L" ("); - s = AceListItem->DisplayString + wcslen(AceListItem->DisplayString); + s = PrincipalListItem->DisplayString + wcslen(PrincipalListItem->DisplayString); CopyMemory(s, DomainName->Buffer, DomainName->Length); @@ -272,12 +380,17 @@ *(s++) = L')'; *s = L'\0'; } + else + { + Ret = FALSE; + break; + }
/* mark the ace as a user unless it's a BUILTIN account */ if (PolicyAccountDomainInfo == NULL) { - AceListItem->SidNameUse = SidTypeUser; + PrincipalListItem->SidNameUse = SidTypeUser; } } break; @@ -286,7 +399,7 @@ case SidTypeWellKnownGroup: { /* make the user believe this is a group */ - AceListItem->SidNameUse = SidTypeGroup; + PrincipalListItem->SidNameUse = SidTypeGroup; break; }
@@ -309,12 +422,38 @@ } }
- /* append item to the cached ACL */ - *NextAcePtr = AceListItem; + if (Ret) + { + /* append item to the principals list */ + *PrincipalLink = PrincipalListItem; + } } }
- return TRUE; + if (!Ret) + { +Cleanup: + if (PrincipalListItem != NULL) + { + if (PrincipalListItem->DisplayString != NULL) + { + LocalFree((HLOCAL)PrincipalListItem->DisplayString); + } + + HeapFree(GetProcessHeap(), + 0, + PrincipalListItem); + } + + if (AceEntry != NULL) + { + HeapFree(GetProcessHeap(), + 0, + AceEntry); + } + } + + return Ret; }
static VOID @@ -342,21 +481,24 @@ DaclPresent && Dacl != NULL) { PSID Sid; - PVOID Ace; + PACE_HEADER AceHeader; ULONG AceIndex;
for (AceIndex = 0; AceIndex < Dacl->AceCount; AceIndex++) { - GetAce(Dacl, - AceIndex, - &Ace); + if (GetAce(Dacl, + AceIndex, + (LPVOID*)&AceHeader) && + AceHeader != NULL) + { + Sid = AceHeaderToSID(AceHeader);
- Sid = (PSID)&((PACCESS_ALLOWED_ACE)Ace)->SidStart; - - AddPrincipalToList(sp, - Sid); + AddPrincipalToList(sp, + Sid, + AceHeader); + } } } LocalFree((HLOCAL)SecurityDescriptor); @@ -534,18 +676,21 @@ HRESULT hRet; PSI_ACCESS AccessList; ULONG nAccessList, DefaultAccessIndex; - + WCHAR szSpecialPermissions[255]; + BOOLEAN SpecialPermissionsPresent = FALSE; + ACCESS_MASK SpecialPermissionsMask = 0; + /* clear the permissions list */ - + SendMessage(sp->hAceCheckList, CLM_CLEAR, 0, 0); - + /* query the access rights from the server */ hRet = sp->psi->lpVtbl->GetAccessRights(sp->psi, GuidObjectType, - dwFlags, + dwFlags, /* FIXME */ &AccessList, &nAccessList, &DefaultAccessIndex); @@ -554,13 +699,13 @@ LPCWSTR NameStr; PSI_ACCESS CurAccess, LastAccess; WCHAR NameBuffer[MAX_PATH]; - + /* save the default access rights to be used when adding ACEs later */ if (DefaultAccess != NULL) { *DefaultAccess = AccessList[DefaultAccessIndex]; } - + LastAccess = AccessList + nAccessList; for (CurAccess = &AccessList[0]; CurAccess != LastAccess; @@ -590,11 +735,38 @@
SendMessage(sp->hAceCheckList, CLM_ADDITEM, - CIS_NONE, + (WPARAM)CurAccess->mask, (LPARAM)NameStr); } + else if (CurAccess->dwFlags & SI_ACCESS_SPECIFIC) + { + SpecialPermissionsPresent = TRUE; + SpecialPermissionsMask |= CurAccess->mask; + } } } + + /* add the special permissions check item in case the specific access rights + aren't displayed */ + if (SpecialPermissionsPresent && + LoadString(hDllInstance, + IDS_SPECIAL_PERMISSIONS, + szSpecialPermissions, + sizeof(szSpecialPermissions) / sizeof(szSpecialPermissions[0]))) + { + /* add the special permissions check item */ + sp->SpecialPermCheckIndex = (INT)SendMessage(sp->hAceCheckList, + CLM_ADDITEM, + (WPARAM)SpecialPermissionsMask, + (LPARAM)szSpecialPermissions); + if (sp->SpecialPermCheckIndex != -1) + { + SendMessage(sp->hAceCheckList, + CLM_SETITEMSTATE, + (WPARAM)sp->SpecialPermCheckIndex, + CIS_ALLOWDISABLED | CIS_DENYDISABLED | CIS_NONE); + } + } }
static VOID @@ -839,17 +1011,63 @@ hWndDeny); }
+static PACE_HEADER +BuildDefaultPrincipalAce(IN PSECURITY_PAGE sp, + IN PSID pSid) +{ + PACCESS_ALLOWED_ACE Ace; + DWORD SidLen; + WORD AceSize; + + SidLen = GetLengthSid(pSid); + AceSize = sizeof(ACCESS_ALLOWED_ACE) + (WORD)SidLen - sizeof(DWORD); + Ace = HeapAlloc(GetProcessHeap(), + 0, + AceSize); + if (Ace != NULL) + { + Ace->Header.AceType = ACCESS_ALLOWED_ACE_TYPE; + Ace->Header.AceFlags = 0; /* FIXME */ + Ace->Header.AceSize = AceSize; + Ace->Mask = sp->DefaultAccess.mask; + + if (CopySid(SidLen, + (PSID)&Ace->SidStart, + pSid)) + { + return &Ace->Header; + } + + HeapFree(GetProcessHeap(), + 0, + Ace); + } + + return NULL; +} + static BOOL AddSelectedPrincipal(IN IDsObjectPicker *pDsObjectPicker, IN HWND hwndParent OPTIONAL, IN PSID pSid, IN PVOID Context OPTIONAL) { + PACE_HEADER AceHeader; PSECURITY_PAGE sp = (PSECURITY_PAGE)Context;
- AddPrincipalToList(sp, - pSid); + AceHeader = BuildDefaultPrincipalAce(sp, + pSid); + if (AceHeader != NULL) + { + AddPrincipalToList(sp, + pSid, + AceHeader);
+ HeapFree(GetProcessHeap(), + 0, + AceHeader); + } + return TRUE; }
@@ -1041,23 +1259,9 @@ /* hide controls in case the flags aren't present */ if (sp->ObjectInfo.dwFlags & SI_ADVANCED) { - WCHAR szSpecialPermissions[255]; - /* editing the permissions is least the user can do when the advanced button is showed */ sp->ObjectInfo.dwFlags |= SI_EDIT_PERMS; - - if (LoadString(hDllInstance, - IDS_SPECIAL_PERMISSIONS, - szSpecialPermissions, - sizeof(szSpecialPermissions) / sizeof(szSpecialPermissions[0]))) - { - /* add the special permissions check item */ - sp->SpecialPermCheckIndex = (INT)SendMessage(sp->hAceCheckList, - CLM_ADDITEM, - CIS_ALLOWDISABLED | CIS_DENYDISABLED | CIS_NONE, - (LPARAM)szSpecialPermissions); - } } else { @@ -1254,7 +1458,8 @@ return Ret; }
-BOOL STDCALL +BOOL +WINAPI DllMain(IN HINSTANCE hinstDLL, IN DWORD dwReason, IN LPVOID lpvReserved) _____
Modified: trunk/reactos/lib/aclui/checklist.c --- trunk/reactos/lib/aclui/checklist.c 2005-11-03 02:36:09 UTC (rev 18971) +++ trunk/reactos/lib/aclui/checklist.c 2005-11-03 11:28:56 UTC (rev 18972) @@ -41,6 +41,7 @@
typedef struct _CHECKITEM { struct _CHECKITEM *Next; + ACCESS_MASK AccessMask; DWORD State; WCHAR Name[1]; } CHECKITEM, *PCHECKITEM; @@ -145,6 +146,29 @@ return Found; }
+static UINT +FindCheckItemIndexByAccessMask(IN PCHECKLISTWND infoPtr, + IN ACCESS_MASK AccessMask) +{ + PCHECKITEM Item; + UINT Index = 0, Found = -1; + + for (Item = infoPtr->CheckItemListHead; + Item != NULL; + Item = Item->Next) + { + if (Item->AccessMask == AccessMask) + { + Found = Index; + break; + } + + Index++; + } + + return Found; +} + static INT CheckItemToIndex(IN PCHECKLISTWND infoPtr, IN PCHECKITEM Item) @@ -469,6 +493,7 @@ AddCheckItem(IN PCHECKLISTWND infoPtr, IN LPWSTR Name, IN DWORD State, + IN ACCESS_MASK AccessMask, OUT INT *Index) { PCHECKITEM CurItem; @@ -488,6 +513,7 @@ }
Item->Next = NULL; + Item->AccessMask = AccessMask; Item->State = State & CIS_MASK; wcscpy(Item->Name, Name); @@ -1692,7 +1718,8 @@ INT Index = -1; PCHECKITEM Item = AddCheckItem(infoPtr, (LPWSTR)lParam, - (DWORD)wParam, + CIS_NONE, + (ACCESS_MASK)wParam, &Index); if (Item != NULL) { @@ -1824,6 +1851,13 @@ break; }
+ case CLM_FINDITEMBYACCESSMASK: + { + Ret = (LRESULT)FindCheckItemIndexByAccessMask(infoPtr, + (ACCESS_MASK)wParam); + break; + } + case WM_SETFONT: { Ret = (LRESULT)RetChangeControlFont(infoPtr, @@ -2129,7 +2163,7 @@ MakeCheckItemVisible(infoPtr,
infoPtr->FocusedCheckItem);
- OtherBox = ((infoPtr->FocusedCheckItemBox == CLB_ALLOW) ? CLB_DENY : CLB_ALLOW); + OtherBox = ((infoPtr->FocusedCheckItemBox == CLB_ALLOW) ? CLB_DENY : CLB_ALLOW); OtherStateMask = ((OtherBox == CLB_ALLOW) ? (CIS_ALLOW | CIS_ALLOWDISABLED) : (CIS_DENY | CIS_DENYDISABLED)); _____
Modified: trunk/reactos/lib/aclui/precomp.h --- trunk/reactos/lib/aclui/precomp.h 2005-11-03 02:36:09 UTC (rev 18971) +++ trunk/reactos/lib/aclui/precomp.h 2005-11-03 11:28:56 UTC (rev 18972) @@ -27,9 +27,15 @@
extern HINSTANCE hDllInstance;
+typedef struct _ACE_ENTRY +{ + struct _ACE_ENTRY *Next; +} ACE_ENTRY, *PACE_ENTRY; + typedef struct _PRINCIPAL_LISTITEM { struct _PRINCIPAL_LISTITEM *Next; + PACE_ENTRY ACEs; SID_NAME_USE SidNameUse; WCHAR *DisplayString; WCHAR *AccountName; @@ -130,6 +136,7 @@ #define CLM_ENABLEQUICKSEARCH (WM_USER + 9) #define CLM_SETQUICKSEARCH_TIMEOUT_RESET (WM_USER + 10) #define CLM_SETQUICKSEARCH_TIMEOUT_SETFOCUS (WM_USER + 11) +#define CLM_FINDITEMBYACCESSMASK (WM_USER + 12)
#define CLN_CHANGINGITEMCHECKBOX (101)
@@ -148,4 +155,12 @@ VOID UnregisterCheckListControl(VOID);
+/* DLLMAIN ********************************************************************/ + +BOOL +WINAPI +DllMain(IN HINSTANCE hinstDLL, + IN DWORD dwReason, + IN LPVOID lpvReserved); + /* EOF */