From 044ab19d99a6bac7c3b66679788c4ed37b20b26a Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 6 Aug 2005 01:14:09 +0000 Subject: [PATCH] handle the WM_SIZE message and resize/move the controls appropriately svn path=/trunk/; revision=17092 --- reactos/lib/aclui/aclui.c | 445 ++++++++++++++++++++++++---------- reactos/lib/aclui/aclui_De.rc | 6 +- reactos/lib/aclui/aclui_En.rc | 6 +- reactos/lib/aclui/aclui_Nl.rc | 6 +- reactos/lib/aclui/aclui_Sv.rc | 6 +- reactos/lib/aclui/checklist.c | 1 + reactos/lib/aclui/misc.c | 74 ++++++ reactos/lib/aclui/precomp.h | 23 +- reactos/lib/aclui/resource.h | 6 +- 9 files changed, 422 insertions(+), 151 deletions(-) diff --git a/reactos/lib/aclui/aclui.c b/reactos/lib/aclui/aclui.c index 7a160851413..4d42f0d6023 100644 --- a/reactos/lib/aclui/aclui.c +++ b/reactos/lib/aclui/aclui.c @@ -30,12 +30,17 @@ HINSTANCE hDllInstance; +static PCWSTR ObjectPickerAttributes[] = +{ + L"ObjectSid", +}; + static VOID DestroySecurityPage(IN PSECURITY_PAGE sp) { - if(sp->hiUsrs != NULL) + if(sp->hiPrincipals != NULL) { - ImageList_Destroy(sp->hiUsrs); + ImageList_Destroy(sp->hiPrincipals); } HeapFree(GetProcessHeap(), @@ -46,11 +51,11 @@ DestroySecurityPage(IN PSECURITY_PAGE sp) } static VOID -FreeAceList(IN PACE_LISTITEM *AceListHead) +FreePrincipalsList(IN PPRINCIPAL_LISTITEM *PrincipalsListHead) { - PACE_LISTITEM CurItem, NextItem; + PPRINCIPAL_LISTITEM CurItem, NextItem; - CurItem = *AceListHead; + CurItem = *PrincipalsListHead; while (CurItem != NULL) { /* free the SID string if present */ @@ -67,16 +72,16 @@ FreeAceList(IN PACE_LISTITEM *AceListHead) CurItem = NextItem; } - *AceListHead = NULL; + *PrincipalsListHead = NULL; } -static PACE_LISTITEM -FindSidInAceList(IN PACE_LISTITEM AceListHead, - IN PSID Sid) +static PPRINCIPAL_LISTITEM +FindSidInPrincipalsList(IN PPRINCIPAL_LISTITEM PrincipalsListHead, + IN PSID Sid) { - PACE_LISTITEM CurItem; + PPRINCIPAL_LISTITEM CurItem; - for (CurItem = AceListHead; + for (CurItem = PrincipalsListHead; CurItem != NULL; CurItem = CurItem->Next) { @@ -91,7 +96,7 @@ FindSidInAceList(IN PACE_LISTITEM AceListHead, } static VOID -ReloadUsersGroupsList(IN PSECURITY_PAGE sp) +ReloadPrincipalsList(IN PSECURITY_PAGE sp) { PSECURITY_DESCRIPTOR SecurityDescriptor; BOOL DaclPresent, DaclDefaulted; @@ -99,7 +104,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) HRESULT hRet; /* delete the cached ACL */ - FreeAceList(&sp->AceListHead); + FreePrincipalsList(&sp->PrincipalsListHead); /* query the ACL */ hRet = sp->psi->lpVtbl->GetSecurity(sp->psi, @@ -113,7 +118,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) &Dacl, &DaclDefaulted)) { - PACE_LISTITEM AceListItem, *NextAcePtr; + PPRINCIPAL_LISTITEM AceListItem, *NextAcePtr; PSID Sid; PVOID Ace; ULONG AceIndex; @@ -121,7 +126,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) SID_NAME_USE SidNameUse; DWORD LookupResult; - NextAcePtr = &sp->AceListHead; + NextAcePtr = &sp->PrincipalsListHead; for (AceIndex = 0; AceIndex < Dacl->AceCount; @@ -133,11 +138,11 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) Sid = (PSID)&((PACCESS_ALLOWED_ACE)Ace)->SidStart; - if (!FindSidInAceList(sp->AceListHead, - Sid)) + if (!FindSidInPrincipalsList(sp->PrincipalsListHead, + Sid)) { SidLength = GetLengthSid(Sid); - + AccountNameSize = 0; DomainNameSize = 0; @@ -153,7 +158,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) /* allocate the ace */ AceListItem = HeapAlloc(GetProcessHeap(), 0, - sizeof(ACE_LISTITEM) + + sizeof(PRINCIPAL_LISTITEM) + SidLength + ((AccountNameSize + DomainNameSize) * sizeof(WCHAR))); if (AceListItem != NULL) @@ -183,7 +188,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) continue; } } - + if (AccountNameSize == 0) { AceListItem->AccountName = NULL; @@ -206,9 +211,9 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) { LSA_HANDLE LsaHandle; NTSTATUS Status; - + AceListItem->DisplayString = NULL; - + /* read the domain of the SID */ if (OpenLSAPolicyHandle(sp->ServerName, POLICY_LOOKUP_NAMES | POLICY_VIEW_LOCAL_INFORMATION, @@ -238,7 +243,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) Domain = NULL; DomainName = NULL; } - + AceListItem->SidNameUse = Names->Use; switch (Names->Use) @@ -272,7 +277,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) if (AceListItem->DisplayString != NULL) { WCHAR *s; - + /* NOTE: LSA_UNICODE_STRINGs are not always NULL-terminated! */ wcscpy(AceListItem->DisplayString, @@ -292,7 +297,7 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) *(s++) = L')'; *s = L'\0'; } - + /* mark the ace as a user unless it's a BUILTIN account */ if (PolicyAccountDomainInfo == NULL) @@ -302,26 +307,26 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) } break; } - + case SidTypeWellKnownGroup: { /* make the user believe this is a group */ AceListItem->SidNameUse = SidTypeGroup; break; } - + default: { DPRINT("Unhandled SID type: 0x%x\n", Names->Use); break; } } - + if (PolicyAccountDomainInfo != NULL) { LsaFreeMemory(PolicyAccountDomainInfo); } - + LsaFreeMemory(ReferencedDomain); LsaFreeMemory(Names); } @@ -341,10 +346,10 @@ ReloadUsersGroupsList(IN PSECURITY_PAGE sp) } static INT -AddAceListEntry(IN PSECURITY_PAGE sp, - IN PACE_LISTITEM AceListItem, - IN INT Index, - IN BOOL Selected) +AddPrincipalListEntry(IN PSECURITY_PAGE sp, + IN PPRINCIPAL_LISTITEM PrincipalListItem, + IN INT Index, + IN BOOL Selected) { LVITEM li; @@ -353,8 +358,8 @@ AddAceListEntry(IN PSECURITY_PAGE sp, li.iSubItem = 0; li.state = (Selected ? LVIS_SELECTED : 0); li.stateMask = LVIS_SELECTED; - li.pszText = (AceListItem->DisplayString != NULL ? AceListItem->DisplayString : AceListItem->AccountName); - switch (AceListItem->SidNameUse) + li.pszText = (PrincipalListItem->DisplayString != NULL ? PrincipalListItem->DisplayString : PrincipalListItem->AccountName); + switch (PrincipalListItem->SidNameUse) { case SidTypeUser: li.iImage = 0; @@ -366,42 +371,42 @@ AddAceListEntry(IN PSECURITY_PAGE sp, li.iImage = -1; break; } - li.lParam = (LPARAM)AceListItem; + li.lParam = (LPARAM)PrincipalListItem; - return ListView_InsertItem(sp->hWndAceList, + return ListView_InsertItem(sp->hWndPrincipalsList, &li); } static VOID -FillUsersGroupsList(IN PSECURITY_PAGE sp) +FillPrincipalsList(IN PSECURITY_PAGE sp) { LPARAM SelLParam; - PACE_LISTITEM CurItem; + PPRINCIPAL_LISTITEM CurItem; RECT rcLvClient; - SelLParam = ListViewGetSelectedItemData(sp->hWndAceList); + SelLParam = ListViewGetSelectedItemData(sp->hWndPrincipalsList); - DisableRedrawWindow(sp->hWndAceList); + DisableRedrawWindow(sp->hWndPrincipalsList); - ListView_DeleteAllItems(sp->hWndAceList); + ListView_DeleteAllItems(sp->hWndPrincipalsList); - ReloadUsersGroupsList(sp); + ReloadPrincipalsList(sp); - for (CurItem = sp->AceListHead; + for (CurItem = sp->PrincipalsListHead; CurItem != NULL; CurItem = CurItem->Next) { - AddAceListEntry(sp, - CurItem, - -1, - (SelLParam == (LPARAM)CurItem)); + AddPrincipalListEntry(sp, + CurItem, + -1, + (SelLParam == (LPARAM)CurItem)); } - EnableRedrawWindow(sp->hWndAceList); + EnableRedrawWindow(sp->hWndPrincipalsList); - GetClientRect(sp->hWndAceList, &rcLvClient); + GetClientRect(sp->hWndPrincipalsList, &rcLvClient); - ListView_SetColumnWidth(sp->hWndAceList, + ListView_SetColumnWidth(sp->hWndPrincipalsList, 0, rcLvClient.right); } @@ -409,7 +414,7 @@ FillUsersGroupsList(IN PSECURITY_PAGE sp) static VOID UpdateControlStates(IN PSECURITY_PAGE sp) { - PACE_LISTITEM Selected = (PACE_LISTITEM)ListViewGetSelectedItemData(sp->hWndAceList); + PPRINCIPAL_LISTITEM Selected = (PPRINCIPAL_LISTITEM)ListViewGetSelectedItemData(sp->hWndPrincipalsList); EnableWindow(sp->hBtnRemove, Selected != NULL); EnableWindow(sp->hAceCheckList, Selected != NULL); @@ -570,80 +575,246 @@ LoadPermissionsList(IN PSECURITY_PAGE sp, } } -static HRESULT -InitializeObjectPicker(IN PSECURITY_PAGE sp, - OUT IDsObjectPicker **pDsObjectPicker) +static VOID +ResizeControls(IN PSECURITY_PAGE sp, + IN INT Width, + IN INT Height) { - HRESULT hRet; + HWND hWndAllow, hWndDeny; + RECT rcControl, rcControl2, rcControl3, rcWnd; + INT cxWidth, cxEdge, btnSpacing; + POINT pt, pt2; + HDWP dwp; + INT nControls = 7; + LVCOLUMN lvc; - *pDsObjectPicker = NULL; + hWndAllow = GetDlgItem(sp->hWnd, + IDC_LABEL_ALLOW); + hWndDeny = GetDlgItem(sp->hWnd, + IDC_LABEL_DENY); + + GetWindowRect(sp->hWnd, + &rcWnd); - hRet = CoCreateInstance(&CLSID_DsObjectPicker, - NULL, - CLSCTX_INPROC_SERVER, - &IID_IDsObjectPicker, - (LPVOID*)pDsObjectPicker); - if (SUCCEEDED(hRet)) + cxEdge = GetSystemMetrics(SM_CXEDGE); + + /* use the left margin of the principal list view control for all control + margins */ + pt.x = 0; + pt.y = 0; + MapWindowPoints(sp->hWndPrincipalsList, + sp->hWnd, + &pt, + 1); + cxWidth = Width - (2 * pt.x); + + if (sp->ObjectInfo.dwFlags & SI_ADVANCED) { - DSOP_INIT_INFO InitInfo; - UINT i; - PCWSTR Attributes[] = + nControls += 2; + } + + if (!(dwp = BeginDeferWindowPos(nControls))) + { + return; + } + + /* resize the Principal list view */ + GetWindowRect(sp->hWndPrincipalsList, + &rcControl); + if (!(dwp = DeferWindowPos(dwp, + sp->hWndPrincipalsList, + NULL, + 0, + 0, + cxWidth, + rcControl.bottom - rcControl.top, + SWP_NOMOVE | SWP_NOZORDER))) + { + return; + } + + /* move the Add Principal button */ + GetWindowRect(sp->hBtnAdd, + &rcControl); + GetWindowRect(sp->hBtnRemove, + &rcControl2); + btnSpacing = rcControl2.left - rcControl.right; + pt2.x = 0; + pt2.y = 0; + MapWindowPoints(sp->hBtnAdd, + sp->hWnd, + &pt2, + 1); + if (!(dwp = DeferWindowPos(dwp, + sp->hBtnAdd, + NULL, + pt.x + cxWidth - (rcControl2.right - rcControl2.left) - + (rcControl.right - rcControl.left) - + btnSpacing - cxEdge, + pt2.y, + 0, + 0, + SWP_NOSIZE | SWP_NOZORDER))) + { + return; + } + + /* move the Delete Principal button */ + pt2.x = 0; + pt2.y = 0; + MapWindowPoints(sp->hBtnRemove, + sp->hWnd, + &pt2, + 1); + if (!(dwp = DeferWindowPos(dwp, + sp->hBtnRemove, + NULL, + pt.x + cxWidth - (rcControl2.right - rcControl2.left) - cxEdge, + pt2.y, + 0, + 0, + SWP_NOSIZE | SWP_NOZORDER))) + { + return; + } + + /* move the Permissions For label */ + GetWindowRect(hWndAllow, + &rcControl); + GetWindowRect(hWndDeny, + &rcControl2); + GetWindowRect(sp->hPermissionsForLabel, + &rcControl3); + pt2.x = 0; + pt2.y = 0; + MapWindowPoints(sp->hPermissionsForLabel, + sp->hWnd, + &pt2, + 1); + if (!(dwp = DeferWindowPos(dwp, + sp->hPermissionsForLabel, + NULL, + 0, + 0, + cxWidth - (rcControl2.right - rcControl2.left) - + (rcControl.right - rcControl.left) - + (2 * btnSpacing) - cxEdge, + rcControl3.bottom - rcControl3.top, + SWP_NOMOVE | SWP_NOZORDER))) + { + return; + } + + /* move the Allow label */ + pt2.x = 0; + pt2.y = 0; + MapWindowPoints(hWndAllow, + sp->hWnd, + &pt2, + 1); + if (!(dwp = DeferWindowPos(dwp, + hWndAllow, + NULL, + cxWidth - (rcControl2.right - rcControl2.left) - + (rcControl.right - rcControl.left) - + btnSpacing - cxEdge, + pt2.y, + 0, + 0, + SWP_NOSIZE | SWP_NOZORDER))) + { + return; + } + + /* move the Deny label */ + pt2.x = 0; + pt2.y = 0; + MapWindowPoints(hWndDeny, + sp->hWnd, + &pt2, + 1); + if (!(dwp = DeferWindowPos(dwp, + hWndDeny, + NULL, + cxWidth - (rcControl2.right - rcControl2.left) - cxEdge, + pt2.y, + 0, + 0, + SWP_NOSIZE | SWP_NOZORDER))) + { + return; + } + + /* resize the Permissions check list box */ + GetWindowRect(sp->hAceCheckList, + &rcControl); + GetWindowRect(sp->hBtnAdvanced, + &rcControl2); + GetWindowRect(GetDlgItem(sp->hWnd, + IDC_LABEL_ADVANCED), + &rcControl3); + if (!(dwp = DeferWindowPos(dwp, + sp->hAceCheckList, + NULL, + 0, + 0, + cxWidth, + ((sp->ObjectInfo.dwFlags & SI_ADVANCED) ? + Height - (rcControl.top - rcWnd.top) - (rcControl3.bottom - rcControl3.top) - pt.x - btnSpacing : + Height - (rcControl.top - rcWnd.top) - pt.x), + SWP_NOMOVE | SWP_NOZORDER))) + { + return; + } + + if (sp->ObjectInfo.dwFlags & SI_ADVANCED) + { + /* move and resize the Advanced label */ + if (!(dwp = DeferWindowPos(dwp, + GetDlgItem(sp->hWnd, + IDC_LABEL_ADVANCED), + NULL, + pt.x, + Height - (rcControl3.bottom - rcControl3.top) - pt.x, + cxWidth - (rcControl2.right - rcControl2.left) - cxEdge, + rcControl3.bottom - rcControl3.top, + SWP_NOZORDER))) { - L"ObjectSid", - }; - DSOP_SCOPE_INIT_INFO Scopes[] = - { - { - sizeof(DSOP_SCOPE_INIT_INFO), - DSOP_SCOPE_TYPE_TARGET_COMPUTER, - DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS | DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS | - DSOP_SCOPE_FLAG_STARTING_SCOPE, - { - { - 0, - 0, - 0 - }, - DSOP_DOWNLEVEL_FILTER_USERS | DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS | - DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS | DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS - }, - NULL, - NULL, - S_OK - }, - }; - - InitInfo.cbSize = sizeof(InitInfo); - InitInfo.pwzTargetComputer = (PCWSTR)sp->ServerName; - InitInfo.cDsScopeInfos = sizeof(Scopes) / sizeof(Scopes[0]); - InitInfo.aDsScopeInfos = Scopes; - InitInfo.flOptions = DSOP_FLAG_MULTISELECT | DSOP_SCOPE_TYPE_TARGET_COMPUTER; - InitInfo.cAttributesToFetch = sizeof(Attributes) / sizeof(Attributes[0]); - InitInfo.apwzAttributeNames = Attributes; - - for (i = 0; i < InitInfo.cDsScopeInfos; i++) - { - if ((sp->ObjectInfo.dwFlags & SI_SERVER_IS_DC) && - (InitInfo.aDsScopeInfos[i].flType & DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN)) - { - /* only set the domain controller string if we know the target - computer is a domain controller and the scope type is an - up-level domain to which the target computer is joined */ - InitInfo.aDsScopeInfos[i].pwzDcName = InitInfo.pwzTargetComputer; - } + return; } - - hRet = (*pDsObjectPicker)->lpVtbl->Initialize(*pDsObjectPicker, - &InitInfo); - - if (FAILED(hRet)) + + /* move and resize the Advanced button */ + if (!(dwp = DeferWindowPos(dwp, + sp->hBtnAdvanced, + NULL, + cxWidth - (rcControl2.right - rcControl2.left) + pt.x, + Height - (rcControl2.bottom - rcControl2.top) - pt.x, + 0, + 0, + SWP_NOSIZE | SWP_NOZORDER))) { - /* delete the object picker in case initialization failed! */ - (*pDsObjectPicker)->lpVtbl->Release(*pDsObjectPicker); + return; } } - return hRet; + EndDeferWindowPos(dwp); + + /* update the width of the principal list view column */ + GetClientRect(sp->hWndPrincipalsList, + &rcControl); + lvc.mask = LVCF_WIDTH; + lvc.cx = rcControl.right; + ListView_SetColumn(sp->hWndPrincipalsList, + 0, + &lvc); + + /* calculate the columns of the allow/deny checkboxes */ + SetAceCheckListColumns(sp->hAceCheckList, + CLB_ALLOW, + hWndAllow); + SetAceCheckListColumns(sp->hAceCheckList, + CLB_DENY, + hWndDeny); } static INT_PTR CALLBACK @@ -663,7 +834,7 @@ SecurityPageProc(IN HWND hwndDlg, DWL_USER); if (sp != NULL) { - if (pnmh->hwndFrom == sp->hWndAceList) + if (pnmh->hwndFrom == sp->hWndPrincipalsList) { switch (pnmh->code) { @@ -707,7 +878,7 @@ SecurityPageProc(IN HWND hwndDlg, { switch (LOWORD(wParam)) { - case IDC_ACELIST_ADD: + case IDC_ADD_PRINCIPAL: { HRESULT hRet; IDsObjectPicker *pDsObjectPicker = NULL; @@ -716,7 +887,9 @@ SecurityPageProc(IN HWND hwndDlg, sp = (PSECURITY_PAGE)GetWindowLongPtr(hwndDlg, DWL_USER); - hRet = InitializeObjectPicker(sp, + hRet = InitializeObjectPicker(sp->ServerName, + &sp->ObjectInfo, + ObjectPickerAttributes, &pDsObjectPicker); if (SUCCEEDED(hRet)) { @@ -737,6 +910,17 @@ SecurityPageProc(IN HWND hwndDlg, break; } + case WM_SIZE: + { + sp = (PSECURITY_PAGE)GetWindowLongPtr(hwndDlg, + DWL_USER); + + ResizeControls(sp, + (INT)LOWORD(lParam), + (INT)HIWORD(lParam)); + break; + } + case WM_INITDIALOG: { sp = (PSECURITY_PAGE)((LPPROPSHEETPAGE)lParam)->lParam; @@ -746,8 +930,9 @@ SecurityPageProc(IN HWND hwndDlg, RECT rcLvClient; sp->hWnd = hwndDlg; - sp->hWndAceList = GetDlgItem(hwndDlg, IDC_ACELIST); - sp->hBtnRemove = GetDlgItem(hwndDlg, IDC_ACELIST_REMOVE); + sp->hWndPrincipalsList = GetDlgItem(hwndDlg, IDC_PRINCIPALS); + sp->hBtnAdd = GetDlgItem(hwndDlg, IDC_ADD_PRINCIPAL); + sp->hBtnRemove = GetDlgItem(hwndDlg, IDC_REMOVE_PRINCIPAL); sp->hBtnAdvanced = GetDlgItem(hwndDlg, IDC_ADVANCED); sp->hAceCheckList = GetDlgItem(hwndDlg, IDC_ACE_CHECKLIST); sp->hPermissionsForLabel = GetDlgItem(hwndDlg, IDC_LABEL_PERMISSIONS_FOR); @@ -766,31 +951,31 @@ SecurityPageProc(IN HWND hwndDlg, DWL_USER, (DWORD_PTR)sp); - sp->hiUsrs = ImageList_LoadBitmap(hDllInstance, + sp->hiPrincipals = ImageList_LoadBitmap(hDllInstance, MAKEINTRESOURCE(IDB_USRGRPIMAGES), 16, 3, 0); /* setup the listview control */ - ListView_SetExtendedListViewStyleEx(sp->hWndAceList, + ListView_SetExtendedListViewStyleEx(sp->hWndPrincipalsList, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); - ListView_SetImageList(sp->hWndAceList, - sp->hiUsrs, + ListView_SetImageList(sp->hWndPrincipalsList, + sp->hiPrincipals, LVSIL_SMALL); - GetClientRect(sp->hWndAceList, &rcLvClient); + GetClientRect(sp->hWndPrincipalsList, &rcLvClient); /* add a column to the list view */ lvc.mask = LVCF_FMT | LVCF_WIDTH; lvc.fmt = LVCFMT_LEFT; lvc.cx = rcLvClient.right; - ListView_InsertColumn(sp->hWndAceList, 0, &lvc); + ListView_InsertColumn(sp->hWndPrincipalsList, 0, &lvc); - FillUsersGroupsList(sp); + FillPrincipalsList(sp); - ListViewSelectItem(sp->hWndAceList, + ListViewSelectItem(sp->hWndPrincipalsList, 0); /* calculate the columns of the allow/deny checkboxes */ @@ -841,6 +1026,8 @@ SecurityPageProc(IN HWND hwndDlg, CLM_ENABLEQUICKSEARCH, TRUE, 0); + + UpdateControlStates(sp); } break; } diff --git a/reactos/lib/aclui/aclui_De.rc b/reactos/lib/aclui/aclui_De.rc index a1071a0b300..c409a4071b9 100644 --- a/reactos/lib/aclui/aclui_De.rc +++ b/reactos/lib/aclui/aclui_De.rc @@ -6,9 +6,9 @@ CAPTION "Sicherheit" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "&Gruppen oder Benutzernamen:", -1, 7, 7, 105, 8 - CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE - PUSHBUTTON "&Hinzufügen...", IDC_ACELIST_ADD, 116, 87, 50, 14 - PUSHBUTTON "&Entfernen", IDC_ACELIST_REMOVE, 170, 87, 50, 14 + CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE + PUSHBUTTON "&Hinzufügen...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14 + PUSHBUTTON "&Entfernen", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14 LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX LTEXT "Erlauben", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER LTEXT "Verbieten", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER diff --git a/reactos/lib/aclui/aclui_En.rc b/reactos/lib/aclui/aclui_En.rc index 63f2728533b..1d7e5085e7a 100644 --- a/reactos/lib/aclui/aclui_En.rc +++ b/reactos/lib/aclui/aclui_En.rc @@ -6,9 +6,9 @@ CAPTION "Security" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "&Group or user names:", -1, 7, 7, 105, 8 - CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE - PUSHBUTTON "A&dd...", IDC_ACELIST_ADD, 116, 87, 50, 14 - PUSHBUTTON "&Remove", IDC_ACELIST_REMOVE, 170, 87, 50, 14 + CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE + PUSHBUTTON "A&dd...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14 + PUSHBUTTON "&Remove", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14 LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX LTEXT "Allow", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER LTEXT "Deny", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER diff --git a/reactos/lib/aclui/aclui_Nl.rc b/reactos/lib/aclui/aclui_Nl.rc index d1ed0a06336..4a7578814ec 100644 --- a/reactos/lib/aclui/aclui_Nl.rc +++ b/reactos/lib/aclui/aclui_Nl.rc @@ -6,9 +6,9 @@ CAPTION "Beveiling" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "&Groep of gebruikersnamen:", -1, 7, 7, 105, 8 - CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE - PUSHBUTTON "&Toevoegen...", IDC_ACELIST_ADD, 116, 87, 50, 14 - PUSHBUTTON "&Verwijderen", IDC_ACELIST_REMOVE, 170, 87, 50, 14 + CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE + PUSHBUTTON "&Toevoegen...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14 + PUSHBUTTON "&Verwijderen", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14 LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX LTEXT "Toestaan", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER LTEXT "Weigeren", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER diff --git a/reactos/lib/aclui/aclui_Sv.rc b/reactos/lib/aclui/aclui_Sv.rc index b1f738f3c3d..b6511a9f2f3 100644 --- a/reactos/lib/aclui/aclui_Sv.rc +++ b/reactos/lib/aclui/aclui_Sv.rc @@ -24,9 +24,9 @@ CAPTION "S FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "&Grupp eller användarnamn:", -1, 7, 7, 105, 8 - CONTROL "", IDC_ACELIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE - PUSHBUTTON "&Lägg till...", IDC_ACELIST_ADD, 116, 87, 50, 14 - PUSHBUTTON "&Ta bort", IDC_ACELIST_REMOVE, 170, 87, 50, 14 + CONTROL "", IDC_PRINCIPALS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, 7, 17, 213, 66, WS_EX_NOPARENTNOTIFY | WS_EX_CLIENTEDGE + PUSHBUTTON "&Lägg till...", IDC_ADD_PRINCIPAL, 116, 87, 50, 14 + PUSHBUTTON "&Ta bort", IDC_REMOVE_PRINCIPAL, 170, 87, 50, 14 LTEXT "", IDC_LABEL_PERMISSIONS_FOR, 7, 107, 105, 8, SS_LEFT | SS_NOPREFIX LTEXT "Tillåt", IDC_LABEL_ALLOW, 135, 107, 32, 8, SS_CENTER LTEXT "Neka", IDC_LABEL_DENY, 176, 107, 32, 8, SS_CENTER diff --git a/reactos/lib/aclui/checklist.c b/reactos/lib/aclui/checklist.c index cf239e924c3..b6a2cc51745 100644 --- a/reactos/lib/aclui/checklist.c +++ b/reactos/lib/aclui/checklist.c @@ -1776,6 +1776,7 @@ CheckListWndProc(IN HWND hwnd, case CLM_SETCHECKBOXCOLUMN: { infoPtr->CheckBoxLeft[wParam != CLB_DENY] = (INT)lParam; + UpdateControl(infoPtr); Ret = 1; break; } diff --git a/reactos/lib/aclui/misc.c b/reactos/lib/aclui/misc.c index fa0e94ce0a4..cebbfe4dbb9 100644 --- a/reactos/lib/aclui/misc.c +++ b/reactos/lib/aclui/misc.c @@ -204,3 +204,77 @@ ListViewSelectItem(IN HWND hwnd, &li); } +HRESULT +InitializeObjectPicker(IN PCWSTR ServerName, + IN PSI_OBJECT_INFO ObjectInfo, + IN PCWSTR Attributes[], + OUT IDsObjectPicker **pDsObjectPicker) +{ + HRESULT hRet; + + *pDsObjectPicker = NULL; + + hRet = CoCreateInstance(&CLSID_DsObjectPicker, + NULL, + CLSCTX_INPROC_SERVER, + &IID_IDsObjectPicker, + (LPVOID*)pDsObjectPicker); + if (SUCCEEDED(hRet)) + { + DSOP_INIT_INFO InitInfo; + UINT i; + DSOP_SCOPE_INIT_INFO Scopes[] = + { + { + sizeof(DSOP_SCOPE_INIT_INFO), + DSOP_SCOPE_TYPE_TARGET_COMPUTER, + DSOP_SCOPE_FLAG_DEFAULT_FILTER_USERS | DSOP_SCOPE_FLAG_DEFAULT_FILTER_GROUPS | + DSOP_SCOPE_FLAG_STARTING_SCOPE, + { + { + 0, + 0, + 0 + }, + DSOP_DOWNLEVEL_FILTER_USERS | DSOP_DOWNLEVEL_FILTER_LOCAL_GROUPS | + DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS | DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS + }, + NULL, + NULL, + S_OK + }, + }; + + InitInfo.cbSize = sizeof(InitInfo); + InitInfo.pwzTargetComputer = ServerName; + InitInfo.cDsScopeInfos = sizeof(Scopes) / sizeof(Scopes[0]); + InitInfo.aDsScopeInfos = Scopes; + InitInfo.flOptions = DSOP_FLAG_MULTISELECT | DSOP_SCOPE_TYPE_TARGET_COMPUTER; + InitInfo.cAttributesToFetch = sizeof(Attributes) / sizeof(Attributes[0]); + InitInfo.apwzAttributeNames = Attributes; + + for (i = 0; i < InitInfo.cDsScopeInfos; i++) + { + if ((ObjectInfo->dwFlags & SI_SERVER_IS_DC) && + (InitInfo.aDsScopeInfos[i].flType & DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN)) + { + /* only set the domain controller string if we know the target + computer is a domain controller and the scope type is an + up-level domain to which the target computer is joined */ + InitInfo.aDsScopeInfos[i].pwzDcName = InitInfo.pwzTargetComputer; + } + } + + hRet = (*pDsObjectPicker)->lpVtbl->Initialize(*pDsObjectPicker, + &InitInfo); + + if (FAILED(hRet)) + { + /* delete the object picker in case initialization failed! */ + (*pDsObjectPicker)->lpVtbl->Release(*pDsObjectPicker); + } + } + + return hRet; +} + diff --git a/reactos/lib/aclui/precomp.h b/reactos/lib/aclui/precomp.h index 22b632f357c..2581fdbbf29 100644 --- a/reactos/lib/aclui/precomp.h +++ b/reactos/lib/aclui/precomp.h @@ -26,30 +26,33 @@ ULONG DbgPrint(PCH Format,...); extern HINSTANCE hDllInstance; -typedef struct _ACE_LISTITEM +typedef struct _PRINCIPAL_LISTITEM { - struct _ACE_LISTITEM *Next; + struct _PRINCIPAL_LISTITEM *Next; SID_NAME_USE SidNameUse; WCHAR *DisplayString; WCHAR *AccountName; WCHAR *DomainName; -} ACE_LISTITEM, *PACE_LISTITEM; +} PRINCIPAL_LISTITEM, *PPRINCIPAL_LISTITEM; typedef struct _SECURITY_PAGE { HWND hWnd; + HWND hBtnAdd; HWND hBtnRemove; HWND hBtnAdvanced; HWND hAceCheckList; HWND hPermissionsForLabel; - /* Main ACE List */ - HWND hWndAceList; - PACE_LISTITEM AceListHead; + /* Main Principals List */ + HWND hWndPrincipalsList; + PPRINCIPAL_LISTITEM PrincipalsListHead; + + INT ControlsMargin; INT SpecialPermCheckIndex; - HIMAGELIST hiUsrs; + HIMAGELIST hiPrincipals; LPSECURITYINFO psi; SI_OBJECT_INFO ObjectInfo; @@ -79,6 +82,12 @@ BOOL ListViewSelectItem(IN HWND hwnd, IN INT Index); +HRESULT +InitializeObjectPicker(IN PCWSTR ServerName, + IN PSI_OBJECT_INFO ObjectInfo, + IN PCWSTR Attributes[], + OUT IDsObjectPicker **pDsObjectPicker); + /* CHECKLIST CONTROL **********************************************************/ #define CIS_DENYDISABLED (0x8) diff --git a/reactos/lib/aclui/resource.h b/reactos/lib/aclui/resource.h index bd5b99ad1d4..92657278d70 100644 --- a/reactos/lib/aclui/resource.h +++ b/reactos/lib/aclui/resource.h @@ -3,9 +3,9 @@ #define IDD_SECPAGE 101 -#define IDC_ACELIST 1001 -#define IDC_ACELIST_ADD 1002 -#define IDC_ACELIST_REMOVE 1003 +#define IDC_PRINCIPALS 1001 +#define IDC_ADD_PRINCIPAL 1002 +#define IDC_REMOVE_PRINCIPAL 1003 #define IDC_ACE_CHECKLIST 1004 #define IDC_LABEL_ALLOW 1005 #define IDC_LABEL_DENY 1006