windows-nt/Source/XPSP1/NT/ds/security/gina/policy/poledit/grouppri.c
2020-09-26 16:20:57 +08:00

340 lines
8 KiB
C

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1994 **
//*********************************************************************
#include "admincfg.h"
#include "grouppri.h"
#ifdef INCL_GROUP_SUPPORT
GROUPPRIENTRY * pGroupPriEntryFirst = NULL; // head of linked list
INT_PTR CALLBACK GroupPriorityDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
LPARAM lParam);
extern HIMAGELIST hImageListSmall;
VOID EnableDlgButtons(HWND hDlg);
GROUPPRIENTRY * FindGroupPriEntry(TCHAR * pszGroupName)
{
GROUPPRIENTRY * pGroupPriEntry = pGroupPriEntryFirst;
while (pGroupPriEntry) {
if (!lstrcmpi(pszGroupName,pGroupPriEntry->pszGroupName))
return pGroupPriEntry;
pGroupPriEntry = pGroupPriEntry->pNext;
}
return NULL;
}
BOOL AddGroupPriEntry(TCHAR * pszGroupName)
{
GROUPPRIENTRY * pGroupPriEntryNew;
if (FindGroupPriEntry(pszGroupName))
return TRUE; // already in list
pGroupPriEntryNew = (GROUPPRIENTRY * ) GlobalAlloc(GPTR,sizeof(GROUPPRIENTRY)
+ ((lstrlen(pszGroupName) + 1) * sizeof(TCHAR)));
if (!pGroupPriEntryNew)
return FALSE; // out of memory
pGroupPriEntryNew->pNext = NULL;
pGroupPriEntryNew->pszGroupName = ((LPBYTE) pGroupPriEntryNew)
+ sizeof(GROUPPRIENTRY);
lstrcpy(pGroupPriEntryNew->pszGroupName,pszGroupName);
if (!pGroupPriEntryFirst) {
pGroupPriEntryFirst = pGroupPriEntryNew;
pGroupPriEntryNew->pPrev = NULL;
} else {
// attach to end of linked list
GROUPPRIENTRY * pGroupPriEntryLast = pGroupPriEntryFirst;
while (pGroupPriEntryLast->pNext)
pGroupPriEntryLast=pGroupPriEntryLast->pNext;
pGroupPriEntryLast->pNext = pGroupPriEntryNew;
pGroupPriEntryNew->pPrev = pGroupPriEntryLast;
}
return TRUE;
}
BOOL RemoveGroupPriEntry(TCHAR * pszGroupName)
{
GROUPPRIENTRY * pGroupPriEntry;
if (!(pGroupPriEntry=FindGroupPriEntry(pszGroupName)))
return FALSE;
// fix up linked list
if (pGroupPriEntry == pGroupPriEntryFirst)
pGroupPriEntryFirst = pGroupPriEntry->pNext;
if (pGroupPriEntry->pPrev)
(pGroupPriEntry->pPrev)->pNext = pGroupPriEntry->pNext;
if (pGroupPriEntry->pNext)
(pGroupPriEntry->pNext)->pPrev = pGroupPriEntry->pPrev;
GlobalFree(pGroupPriEntry);
return TRUE;
}
VOID FreeGroupPriorityList( VOID )
{
GROUPPRIENTRY * pGroupPriEntry=pGroupPriEntryFirst,* pGroupPriEntryNext;
while (pGroupPriEntry) {
pGroupPriEntryNext = pGroupPriEntry->pNext;
GlobalFree(pGroupPriEntry);
pGroupPriEntry = pGroupPriEntryNext;
}
pGroupPriEntryFirst = NULL;
}
UINT LoadGroupPriorityList(HKEY hkeyPriority,HKEY hkeyGroup)
{
TCHAR szValueName[10],szGroupName[USERNAMELEN+1];
UINT uGroupIndex=1,uErr = ERROR_SUCCESS;
DWORD dwSize;
FreeGroupPriorityList();
while (uErr == ERROR_SUCCESS) {
wsprintf(szValueName,TEXT("%lu"),uGroupIndex);
dwSize = ARRAYSIZE(szGroupName) * sizeof(TCHAR);
uErr = RegQueryValueEx(hkeyPriority,szValueName,NULL,NULL,szGroupName,
&dwSize);
if (uErr == ERROR_SUCCESS) {
HKEY hkeyTmp;
// as sanity check: only add group priority entry if we find an
// entry for group in policy file
if (RegOpenKey(hkeyGroup,szGroupName,&hkeyTmp) == ERROR_SUCCESS) {
RegCloseKey(hkeyTmp);
if (!AddGroupPriEntry(szGroupName))
return ERROR_NOT_ENOUGH_MEMORY;
}
}
uGroupIndex++;
}
return ERROR_SUCCESS;
}
UINT SaveGroupPriorityList(HKEY hKey)
{
GROUPPRIENTRY * pGroupPriEntry = pGroupPriEntryFirst;
UINT uRet;
DWORD cbValueName;
TCHAR szValueName[MAX_PATH+1];
UINT uGroupIndex=1;
// erase all values for this key, first off
while (TRUE) {
cbValueName=ARRAYSIZE(szValueName);
uRet=RegEnumValue(hKey,0,szValueName,&cbValueName,NULL,
NULL,NULL,NULL);
// stop if we're out of items
if (uRet != ERROR_SUCCESS && uRet != ERROR_MORE_DATA)
break;
RegDeleteValue(hKey,szValueName);
}
uRet = ERROR_SUCCESS;
while (pGroupPriEntry) {
wsprintf(szValueName,TEXT("%lu"),uGroupIndex);
uRet = RegSetValueEx(hKey,szValueName,0,REG_SZ,pGroupPriEntry->pszGroupName,
((lstrlen(pGroupPriEntry->pszGroupName)+1) * sizeof(TCHAR)));
if (uRet != ERROR_SUCCESS) {
return uRet;
}
uGroupIndex++;
pGroupPriEntry = pGroupPriEntry->pNext;
}
return uRet;
}
BOOL OnGroupPriority(HWND hWnd)
{
return (BOOL)DialogBox(ghInst,MAKEINTRESOURCE(DLG_GROUPPRIORITY),hWnd,
GroupPriorityDlgProc);
}
BOOL InitGroupPriorityDlg(HWND hDlg)
{
GROUPPRIENTRY * pGroupPriEntry = pGroupPriEntryFirst;
LV_ITEM lvi;
HWND hwndList = GetDlgItem(hDlg,IDD_GROUPORDER);
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = 150;
lvc.pszText = (LPTSTR) szNull;
lvc.cchTextMax = 1;
lvc.iSubItem = 0;
ListView_InsertColumn(hwndList,0,&lvc);
SetWindowLong(hwndList,GWL_EXSTYLE,WS_EX_CLIENTEDGE);
SetScrollRange(hwndList,SB_VERT,0,100,TRUE);
SetScrollRange(hwndList,SB_VERT,0,0,TRUE);
ListView_SetImageList(hwndList,hImageListSmall,LVSIL_SMALL);
lvi.iItem =lvi.iSubItem=0;
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvi.iImage = IMG_USERS;
// insert members of group list into listbox in current priority order
while (pGroupPriEntry) {
lvi.pszText = pGroupPriEntry->pszGroupName;
lvi.cchTextMax = lstrlen(lvi.pszText) + 1;
lvi.lParam = (LPARAM) pGroupPriEntry; // save pointer to node in lparam
ListView_InsertItem(hwndList,&lvi);
lvi.iItem ++;
pGroupPriEntry = pGroupPriEntry->pNext;
}
EnableDlgButtons(hDlg);
return TRUE;
}
VOID EnableDlgButtons(HWND hDlg)
{
HWND hwndList = GetDlgItem(hDlg,IDD_GROUPORDER);
int nItem;
BOOL fMoveUpOK=FALSE,fMoveDownOK=FALSE;
// if item is selected, enable up/down buttons appropriately
nItem=ListView_GetNextItem(hwndList,-1,LVNI_SELECTED);
if (nItem >=0) {
if (nItem > 0)
fMoveUpOK = TRUE;
if (nItem < ListView_GetItemCount(hwndList) -1)
fMoveDownOK = TRUE;
}
EnableDlgItem(hDlg,IDD_MOVEUP,fMoveUpOK);
EnableDlgItem(hDlg,IDD_MOVEDOWN,fMoveDownOK);
}
VOID MoveGroupItem(HWND hDlg,int iDelta)
{
HWND hwndList = GetDlgItem(hDlg,IDD_GROUPORDER);
LV_ITEM lvi;
TCHAR szText[MAX_PATH+1];
lvi.iItem=ListView_GetNextItem(hwndList,-1,LVNI_SELECTED);
if (lvi.iItem <0)
return;
lvi.iSubItem = 0;
lvi.mask = LVIF_ALL;
lvi.pszText = szText;
lvi.cchTextMax = ARRAYSIZE(szText)+1;
if (ListView_GetItem(hwndList,&lvi)) {
ListView_DeleteItem(hwndList,lvi.iItem);
lvi.iItem += iDelta;
lvi.state = LVIS_SELECTED;
lvi.stateMask = LVIS_SELECTED;
ListView_InsertItem(hwndList,&lvi);
}
SetFocus(hwndList);
}
BOOL ProcessGroupPriorityDlg(HWND hDlg)
{
HWND hwndList = GetDlgItem(hDlg,IDD_GROUPORDER);
int iMax = ListView_GetItemCount(hwndList),iItem;
GROUPPRIENTRY * pGroupPriEntry;
GROUPPRIENTRY * pGroupPriEntryLast;
// relink the list in the order the entries now appear in the listbox
for (iItem = 0;iItem < iMax;iItem ++) {
pGroupPriEntry = (GROUPPRIENTRY *)
IntToPtr(ListView_GetItemParm(hwndList,iItem));
if (iItem == 0) {
pGroupPriEntryFirst=pGroupPriEntryLast = pGroupPriEntry;
pGroupPriEntry->pPrev = pGroupPriEntry->pNext = NULL;
} else {
pGroupPriEntryLast->pNext = pGroupPriEntry;
pGroupPriEntry->pPrev = pGroupPriEntryLast;
pGroupPriEntry->pNext = NULL;
pGroupPriEntryLast = pGroupPriEntry;
}
}
dwAppState |= AS_FILEDIRTY;
return TRUE;
}
INT_PTR CALLBACK GroupPriorityDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
LPARAM lParam)
{
switch (uMsg) {
case WM_INITDIALOG:
InitGroupPriorityDlg(hDlg);
break;
case WM_COMMAND:
switch (wParam) {
case IDOK:
if (ProcessGroupPriorityDlg(hDlg))
EndDialog(hDlg,TRUE);
return TRUE;
break;
case IDCANCEL:
EndDialog(hDlg,FALSE);
return TRUE;
break;
case IDD_MOVEUP:
MoveGroupItem(hDlg,-1);
break;
case IDD_MOVEDOWN:
MoveGroupItem(hDlg,1);
break;
}
break;
case WM_NOTIFY:
if ( ((LPNMHDR) lParam)->hwndFrom == GetDlgItem(hDlg,IDD_GROUPORDER))
EnableDlgButtons(hDlg);
break;
default:
return FALSE;
}
return FALSE;
}
#endif // INCL_GROUP_SUPPORT