-/*\r
- * COPYRIGHT: See COPYING in the top level directory\r
- * PROJECT: ReactOS User Manager Control Panel\r
- * FILE: dll/cpl/usrmgr/users.c\r
- * PURPOSE: Users property page\r
- *\r
- * PROGRAMMERS: Eric Kohl\r
- */\r
-\r
-/*\r
- * TODO:\r
- * - Add new user to the users group.\r
- * - Remove a user from all groups.\r
- * - Implement user property pages.\r
- * - Use localized messages.\r
- */\r
-\r
-#include "usrmgr.h"\r
-\r
-\r
-typedef struct _USER_DATA\r
-{\r
- HMENU hPopupMenu;\r
-\r
- INT iCurrentItem;\r
-\r
-} USER_DATA, *PUSER_DATA;\r
-\r
-\r
-\r
-static BOOL\r
-CheckPasswords(HWND hwndDlg,\r
- INT nIdDlgItem1,\r
- INT nIdDlgItem2)\r
-{\r
- TCHAR szPassword1[256];\r
- TCHAR szPassword2[256];\r
- UINT uLen1;\r
- UINT uLen2;\r
-\r
- uLen1 = GetDlgItemText(hwndDlg, nIdDlgItem1, szPassword1, 256);\r
- uLen2 = GetDlgItemText(hwndDlg, nIdDlgItem2, szPassword2, 256);\r
-\r
- /* Check the passwords */\r
- if (uLen1 != uLen2 || _tcscmp(szPassword1, szPassword2) != 0)\r
- {\r
- MessageBox(hwndDlg,\r
- TEXT("The passwords you entered are not the same!"),\r
- TEXT("ERROR"),\r
- MB_OK | MB_ICONERROR);\r
- return FALSE;\r
- }\r
-\r
-\r
- return TRUE;\r
-}\r
-\r
-\r
-static BOOL\r
-CheckUserName(HWND hwndDlg,\r
- INT nIdDlgItem)\r
-{\r
- TCHAR szUserName[256];\r
- UINT uLen;\r
-\r
- uLen = GetDlgItemText(hwndDlg, nIdDlgItem, szUserName, 256);\r
-\r
- /* Check the user name */\r
- if (uLen > 0 && _tcspbrk(szUserName, TEXT("\"*+,/\\:;<=>?[]|")) != NULL)\r
- {\r
- MessageBox(hwndDlg,\r
- TEXT("The user name you entered is invalid! A user name must not contain the following charecters: *+,/:;<=>?[\\]|"),\r
- TEXT("ERROR"),\r
- MB_OK | MB_ICONERROR);\r
- return FALSE;\r
- }\r
-\r
-\r
- return TRUE;\r
-}\r
-\r
-\r
-\r
-INT_PTR CALLBACK\r
-ChangePasswordDlgProc(HWND hwndDlg,\r
- UINT uMsg,\r
- WPARAM wParam,\r
- LPARAM lParam)\r
-{\r
- UNREFERENCED_PARAMETER(wParam);\r
-\r
- switch (uMsg)\r
- {\r
- case WM_INITDIALOG:\r
- break;\r
-\r
- case WM_COMMAND:\r
- switch (LOWORD(wParam))\r
- {\r
- case IDOK:\r
- if (CheckPasswords(hwndDlg, IDC_EDIT_PASSWORD1, IDC_EDIT_PASSWORD2))\r
- EndDialog(hwndDlg, 0);\r
- break;\r
-\r
- case IDCANCEL:\r
- EndDialog(hwndDlg, 0);\r
- break;\r
- }\r
- break;\r
-\r
- default:\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
-}\r
-\r
-\r
-static VOID\r
-UpdateUserOptions(HWND hwndDlg,\r
- PUSER_INFO_3 userInfo,\r
- BOOL bInit)\r
-{\r
- EnableWindow(GetDlgItem(hwndDlg, IDC_USER_NEW_CANNOT_CHANGE),\r
- !userInfo->usri3_password_expired);\r
- EnableWindow(GetDlgItem(hwndDlg, IDC_USER_NEW_NEVER_EXPIRES),\r
- !userInfo->usri3_password_expired);\r
-\r
- EnableWindow(GetDlgItem(hwndDlg, IDC_USER_NEW_FORCE_CHANGE),\r
- (userInfo->usri3_flags & (UF_PASSWD_CANT_CHANGE | UF_DONT_EXPIRE_PASSWD)) == 0);\r
-\r
- if (bInit)\r
- {\r
- CheckDlgButton(hwndDlg, IDC_USER_NEW_FORCE_CHANGE,\r
- userInfo->usri3_password_expired ? BST_CHECKED : BST_UNCHECKED);\r
-\r
- CheckDlgButton(hwndDlg, IDC_USER_NEW_CANNOT_CHANGE,\r
- (userInfo->usri3_flags & UF_PASSWD_CANT_CHANGE) ? BST_CHECKED : BST_UNCHECKED);\r
-\r
- CheckDlgButton(hwndDlg, IDC_USER_NEW_NEVER_EXPIRES,\r
- (userInfo->usri3_flags & UF_DONT_EXPIRE_PASSWD) ? BST_CHECKED : BST_UNCHECKED);\r
-\r
- CheckDlgButton(hwndDlg, IDC_USER_NEW_DISABLED,\r
- (userInfo->usri3_flags & UF_ACCOUNTDISABLE) ? BST_CHECKED : BST_UNCHECKED);\r
- }\r
-}\r
-\r
-\r
-INT_PTR CALLBACK\r
-NewUserDlgProc(HWND hwndDlg,\r
- UINT uMsg,\r
- WPARAM wParam,\r
- LPARAM lParam)\r
-{\r
- PUSER_INFO_3 userInfo;\r
- INT nLength;\r
-\r
- UNREFERENCED_PARAMETER(wParam);\r
-\r
- userInfo = (PUSER_INFO_3)GetWindowLongPtr(hwndDlg, DWLP_USER);\r
-\r
- switch (uMsg)\r
- {\r
- case WM_INITDIALOG:\r
- userInfo = (PUSER_INFO_3)lParam;\r
- SetWindowLongPtr(hwndDlg, DWLP_USER, lParam);\r
- SendDlgItemMessage(hwndDlg, IDC_USER_NEW_NAME, EM_SETLIMITTEXT, 20, 0);\r
- UpdateUserOptions(hwndDlg, userInfo, TRUE);\r
- break;\r
-\r
- case WM_COMMAND:\r
- switch (LOWORD(wParam))\r
- {\r
- case IDC_USER_NEW_NAME:\r
- if (HIWORD(wParam) == EN_CHANGE)\r
- {\r
- nLength = SendDlgItemMessage(hwndDlg, IDC_USER_NEW_NAME, WM_GETTEXTLENGTH, 0, 0);\r
- EnableWindow(GetDlgItem(hwndDlg, IDOK), (nLength > 0));\r
- }\r
- break;\r
-\r
- case IDC_USER_NEW_FORCE_CHANGE:\r
- userInfo->usri3_password_expired = !userInfo->usri3_password_expired;\r
- UpdateUserOptions(hwndDlg, userInfo, FALSE);\r
- break;\r
-\r
- case IDC_USER_NEW_CANNOT_CHANGE:\r
- userInfo->usri3_flags ^= UF_PASSWD_CANT_CHANGE;\r
- UpdateUserOptions(hwndDlg, userInfo, FALSE);\r
- break;\r
-\r
- case IDC_USER_NEW_NEVER_EXPIRES:\r
- userInfo->usri3_flags ^= UF_DONT_EXPIRE_PASSWD;\r
- UpdateUserOptions(hwndDlg, userInfo, FALSE);\r
- break;\r
-\r
- case IDC_USER_NEW_DISABLED:\r
- userInfo->usri3_flags ^= UF_ACCOUNTDISABLE;\r
- break;\r
-\r
- case IDOK:\r
- if (!CheckUserName(hwndDlg, IDC_USER_NEW_NAME))\r
- {\r
- SetFocus(GetDlgItem(hwndDlg, IDC_USER_NEW_NAME));\r
- SendDlgItemMessage(hwndDlg, IDC_USER_NEW_NAME, EM_SETSEL, 0, -1);\r
- break;\r
- }\r
-\r
- if (!CheckPasswords(hwndDlg, IDC_USER_NEW_PASSWORD1, IDC_USER_NEW_PASSWORD2))\r
- {\r
- SetDlgItemText(hwndDlg, IDC_USER_NEW_PASSWORD1, TEXT(""));\r
- SetDlgItemText(hwndDlg, IDC_USER_NEW_PASSWORD2, TEXT(""));\r
- break;\r
- }\r
-\r
- /* Store the user name */\r
- nLength = SendDlgItemMessage(hwndDlg, IDC_USER_NEW_NAME, WM_GETTEXTLENGTH, 0, 0);\r
- if (nLength > 0)\r
- {\r
- userInfo->usri3_name = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));\r
- GetDlgItemText(hwndDlg, IDC_USER_NEW_NAME, userInfo->usri3_name, nLength + 1);\r
- }\r
-\r
- /* Store the full user name */\r
- nLength = SendDlgItemMessage(hwndDlg, IDC_USER_NEW_FULL_NAME, WM_GETTEXTLENGTH, 0, 0);\r
- if (nLength > 0)\r
- {\r
- userInfo->usri3_full_name = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));\r
- GetDlgItemText(hwndDlg, IDC_USER_NEW_FULL_NAME, userInfo->usri3_full_name, nLength + 1);\r
- }\r
-\r
- /* Store the description */\r
- nLength = SendDlgItemMessage(hwndDlg, IDC_USER_NEW_DESCRIPTION, WM_GETTEXTLENGTH, 0, 0);\r
- if (nLength > 0)\r
- {\r
- userInfo->usri3_comment = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));\r
- GetDlgItemText(hwndDlg, IDC_USER_NEW_DESCRIPTION, userInfo->usri3_comment, nLength + 1);\r
- }\r
-\r
- /* Store the password */\r
- nLength = SendDlgItemMessage(hwndDlg, IDC_USER_NEW_PASSWORD1, WM_GETTEXTLENGTH, 0, 0);\r
- if (nLength > 0)\r
- {\r
- userInfo->usri3_password = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));\r
- GetDlgItemText(hwndDlg, IDC_USER_NEW_PASSWORD1, userInfo->usri3_password, nLength + 1);\r
- }\r
-\r
- EndDialog(hwndDlg, IDOK);\r
- break;\r
-\r
- case IDCANCEL:\r
- EndDialog(hwndDlg, IDCANCEL);\r
- break;\r
- }\r
- break;\r
-\r
- default:\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
-}\r
-\r
-\r
-static VOID\r
-UserNew(HWND hwndDlg)\r
-{\r
- USER_INFO_3 user;\r
- NET_API_STATUS status;\r
- LV_ITEM lvi;\r
- INT iItem;\r
- HWND hwndLV;\r
-\r
- ZeroMemory(&user, sizeof(USER_INFO_3));\r
-\r
- user.usri3_priv = USER_PRIV_USER;\r
- user.usri3_flags = UF_SCRIPT;\r
- user.usri3_acct_expires = TIMEQ_FOREVER;\r
- user.usri3_max_storage = USER_MAXSTORAGE_UNLIMITED;\r
- user.usri3_primary_group_id = DOMAIN_GROUP_RID_USERS;\r
-\r
- user.usri3_password_expired = TRUE;\r
-\r
- if (DialogBoxParam(hApplet,\r
- MAKEINTRESOURCE(IDD_USER_NEW),\r
- hwndDlg,\r
- NewUserDlgProc,\r
- (LPARAM)&user) == IDOK)\r
- {\r
-#if 0\r
- status = NetUserAdd(NULL,\r
- 3,\r
- (LPBYTE)&user,\r
- NULL);\r
-#else\r
- status = NERR_Success;\r
-#endif\r
- if (status != NERR_Success)\r
- {\r
- TCHAR szText[256];\r
- wsprintf(szText, TEXT("Error: %u"), status);\r
- MessageBox(NULL, szText, TEXT("NetUserAdd"), MB_ICONERROR | MB_OK);\r
- return;\r
- }\r
-\r
- hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);\r
-\r
- ZeroMemory(&lvi, sizeof(lvi));\r
- lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;\r
- lvi.pszText = user.usri3_name;\r
- lvi.state = 0;\r
- lvi.iImage = (user.usri3_flags & UF_ACCOUNTDISABLE) ? 1 : 0;\r
- iItem = ListView_InsertItem(hwndLV, &lvi);\r
-\r
- ListView_SetItemText(hwndLV, iItem, 1,\r
- user.usri3_full_name);\r
-\r
- ListView_SetItemText(hwndLV, iItem, 2,\r
- user.usri3_comment);\r
- }\r
-\r
- if (user.usri3_name)\r
- HeapFree(GetProcessHeap, 0, user.usri3_name);\r
-\r
- if (user.usri3_full_name)\r
- HeapFree(GetProcessHeap, 0, user.usri3_full_name);\r
-\r
- if (user.usri3_comment)\r
- HeapFree(GetProcessHeap, 0, user.usri3_comment);\r
-\r
- if (user.usri3_password)\r
- HeapFree(GetProcessHeap, 0, user.usri3_password);\r
-}\r
-\r
-\r
-static BOOL\r
-UserDelete(HWND hwndDlg)\r
-{\r
- TCHAR szUserName[UNLEN];\r
- TCHAR szText[256];\r
- INT nItem;\r
- HWND hwndLV;\r
- NET_API_STATUS status;\r
-\r
- hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);\r
- nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);\r
- if (nItem == -1)\r
- return FALSE;\r
-\r
- /* Get the new user name */\r
- ListView_GetItemText(hwndLV,\r
- nItem, 0,\r
- szUserName,\r
- UNLEN);\r
-\r
- /* Display a warning message because the delete operation cannot be reverted */\r
- wsprintf(szText, TEXT("Dou you really want to delete the user \"%s\"?"), szUserName);\r
- if (MessageBox(NULL, szText, TEXT("User Accounts"), MB_ICONWARNING | MB_YESNO) == IDNO)\r
- return FALSE;\r
-\r
- /* Delete the user */\r
-#if 0\r
- status = NetUserDel(NULL, szUserName);\r
-#else\r
- status = NERR_Success;\r
-#endif\r
- if (status != NERR_Success)\r
- {\r
- TCHAR szText[256];\r
- wsprintf(szText, TEXT("Error: %u"), status);\r
- MessageBox(NULL, szText, TEXT("NetUserDel"), MB_ICONERROR | MB_OK);\r
- return FALSE;\r
- }\r
-\r
- /* Delete the user from the list */\r
- (void)ListView_DeleteItem(hwndLV, nItem);\r
-\r
- return TRUE;\r
-}\r
-\r
-\r
-static VOID\r
-SetUsersListColumns(HWND hwndListView)\r
-{\r
- LV_COLUMN column;\r
- RECT rect;\r
- TCHAR szStr[32];\r
-\r
- GetClientRect(hwndListView, &rect);\r
-\r
- memset(&column, 0x00, sizeof(column));\r
- column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT;\r
- column.fmt=LVCFMT_LEFT;\r
- column.cx = (INT)((rect.right - rect.left) * 0.25);\r
- column.iSubItem = 0;\r
- LoadString(hApplet, IDS_NAME, szStr, sizeof(szStr) / sizeof(szStr[0]));\r
- column.pszText = szStr;\r
- (void)ListView_InsertColumn(hwndListView, 0, &column);\r
-\r
- column.cx = (INT)((rect.right - rect.left) * 0.50);\r
- column.iSubItem = 1;\r
- LoadString(hApplet, IDS_FULLNAME, szStr, sizeof(szStr) / sizeof(szStr[0]));\r
- column.pszText = szStr;\r
- (void)ListView_InsertColumn(hwndListView, 1, &column);\r
-\r
- column.cx = (INT)((rect.right - rect.left) * 0.25);\r
- column.iSubItem = 2;\r
- LoadString(hApplet, IDS_DESCRIPTION, szStr, sizeof(szStr) / sizeof(szStr[0]));\r
- column.pszText = szStr;\r
- (void)ListView_InsertColumn(hwndListView, 2, &column);\r
-}\r
-\r
-\r
-static VOID\r
-UpdateUsersList(HWND hwndListView)\r
-{\r
- NET_API_STATUS netStatus;\r
- PUSER_INFO_20 pBuffer;\r
- DWORD entriesread;\r
- DWORD totalentries;\r
- DWORD resume_handle = 0;\r
- DWORD i;\r
- LV_ITEM lvi;\r
- INT iItem;\r
-\r
-\r
- for (;;)\r
- {\r
- netStatus = NetUserEnum(NULL, 20, FILTER_NORMAL_ACCOUNT,\r
- (LPBYTE*)&pBuffer,\r
- 1024, &entriesread,\r
- &totalentries, &resume_handle);\r
- if (netStatus != NERR_Success && netStatus != ERROR_MORE_DATA)\r
- break;\r
-\r
- for (i = 0; i < entriesread; i++)\r
- {\r
- memset(&lvi, 0x00, sizeof(lvi));\r
- lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;\r
- lvi.pszText = pBuffer[i].usri20_name;\r
- lvi.state = 0;\r
- lvi.iImage = (pBuffer[i].usri20_flags & UF_ACCOUNTDISABLE) ? 1 : 0;\r
- iItem = ListView_InsertItem(hwndListView, &lvi);\r
-\r
- ListView_SetItemText(hwndListView, iItem, 1,\r
- pBuffer[i].usri20_full_name);\r
-\r
- ListView_SetItemText(hwndListView, iItem, 2,\r
- pBuffer[i].usri20_comment);\r
- }\r
-\r
- NetApiBufferFree(&pBuffer);\r
-\r
- /* No more data left */\r
- if (netStatus != ERROR_MORE_DATA)\r
- break;\r
- }\r
-\r
-}\r
-\r
-\r
-static VOID\r
-OnInitDialog(HWND hwndDlg)\r
-{\r
- HWND hwndListView;\r
- HIMAGELIST hImgList;\r
- HICON hIcon;\r
-\r
- /* Create the image list */\r
- hImgList = ImageList_Create(16, 16, ILC_COLOR8 | ILC_MASK, 5, 5);\r
- hIcon = LoadImage(hApplet, MAKEINTRESOURCE(IDI_USER), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);\r
- ImageList_AddIcon(hImgList, hIcon);\r
- hIcon = LoadImage(hApplet, MAKEINTRESOURCE(IDI_LOCKED_USER), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);\r
- ImageList_AddIcon(hImgList, hIcon);\r
- DestroyIcon(hIcon);\r
-\r
- hwndListView = GetDlgItem(hwndDlg, IDC_USERS_LIST);\r
-\r
- (VOID)ListView_SetImageList(hwndListView, hImgList, LVSIL_SMALL);\r
-\r
- (void)ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_FULLROWSELECT);\r
-\r
- SetUsersListColumns(hwndListView);\r
-\r
- UpdateUsersList(hwndListView);\r
-}\r
-\r
-\r
-static BOOL\r
-OnBeginLabelEdit(LPNMLVDISPINFO pnmv)\r
-{\r
- HWND hwndEdit;\r
-\r
- hwndEdit = ListView_GetEditControl(pnmv->hdr.hwndFrom);\r
- if (hwndEdit == NULL)\r
- return TRUE;\r
-\r
- SendMessage(hwndEdit, EM_SETLIMITTEXT, 20, 0);\r
-\r
- return FALSE;\r
-}\r
-\r
-\r
-static BOOL\r
-OnEndLabelEdit(LPNMLVDISPINFO pnmv)\r
-{\r
- TCHAR szOldUserName[UNLEN];\r
- TCHAR szNewUserName[UNLEN];\r
- USER_INFO_0 useri0;\r
- NET_API_STATUS status;\r
-\r
- /* Leave, if there is no valid listview item */\r
- if (pnmv->item.iItem == -1)\r
- return FALSE;\r
-\r
- /* Get the new user name */\r
- ListView_GetItemText(pnmv->hdr.hwndFrom,\r
- pnmv->item.iItem, 0,\r
- szOldUserName,\r
- UNLEN);\r
-\r
- /* Leave, if the user canceled the edit action */\r
- if (pnmv->item.pszText == NULL)\r
- return FALSE;\r
-\r
- /* Get the new user name */\r
- lstrcpy(szNewUserName, pnmv->item.pszText);\r
-\r
- /* Leave, if the user name was not changed */\r
- if (lstrcmp(szOldUserName, szNewUserName) == 0)\r
- return FALSE;\r
-\r
-\r
- /* Change the user name */\r
- useri0.usri0_name = szNewUserName;\r
-\r
-#if 0\r
- status = NetUserSetInfo(NULL, szOldUserName, 0, (LPBYTE)&useri0, NULL);\r
-#else\r
- status = NERR_Success;\r
-#endif\r
- if (status != NERR_Success)\r
- {\r
- TCHAR szText[256];\r
- wsprintf(szText, TEXT("Error: %u"), status);\r
- MessageBox(NULL, szText, TEXT("NetUserSetInfo"), MB_ICONERROR | MB_OK);\r
- return FALSE;\r
- }\r
-\r
- /* Update the listview item */\r
- ListView_SetItemText(pnmv->hdr.hwndFrom,\r
- pnmv->item.iItem, 0,\r
- szNewUserName);\r
-\r
- return TRUE;\r
-}\r
-\r
-\r
-static BOOL\r
-OnNotify(HWND hwndDlg, PUSER_DATA pUserData, NMHDR *phdr)\r
-{\r
- LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr;\r
-\r
- switch (phdr->idFrom)\r
- {\r
- case IDC_USERS_LIST:\r
- switch(phdr->code)\r
- {\r
- case NM_CLICK:\r
- pUserData->iCurrentItem = lpnmlv->iItem;\r
- if (lpnmlv->iItem == -1)\r
- {\r
- }\r
- else\r
- {\r
- }\r
- break;\r
-\r
- case NM_DBLCLK:\r
- break;\r
-\r
- case NM_RCLICK:\r
- ClientToScreen(GetDlgItem(hwndDlg, IDC_USERS_LIST), &lpnmlv->ptAction);\r
- TrackPopupMenu(GetSubMenu(pUserData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1),\r
- TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, 0, hwndDlg, NULL);\r
- break;\r
-\r
- case LVN_BEGINLABELEDIT:\r
- return OnBeginLabelEdit((LPNMLVDISPINFO)phdr);\r
-\r
- case LVN_ENDLABELEDIT:\r
- return OnEndLabelEdit((LPNMLVDISPINFO)phdr);\r
- }\r
- break;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-\r
-INT_PTR CALLBACK\r
-UsersPageProc(HWND hwndDlg,\r
- UINT uMsg,\r
- WPARAM wParam,\r
- LPARAM lParam)\r
-{\r
- PUSER_DATA pUserData;\r
-\r
- UNREFERENCED_PARAMETER(wParam);\r
-\r
- pUserData = (PUSER_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);\r
-\r
- switch (uMsg)\r
- {\r
- case WM_INITDIALOG:\r
- pUserData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(USER_DATA));\r
- SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pUserData);\r
-\r
- pUserData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_USER));\r
-\r
- OnInitDialog(hwndDlg);\r
- break;\r
-\r
- case WM_COMMAND:\r
- switch (LOWORD(wParam))\r
- {\r
- case IDM_USER_CHANGE_PASSWORD:\r
- DialogBoxParam(hApplet,\r
- MAKEINTRESOURCE(IDD_CHANGE_PASSWORD),\r
- hwndDlg,\r
- ChangePasswordDlgProc,\r
- (LPARAM)NULL);\r
- break;\r
-\r
- case IDM_USER_RENAME:\r
- {\r
- INT nItem;\r
- HWND hwndLV;\r
-\r
- hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);\r
- nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);\r
- if (nItem != -1)\r
- {\r
- (void)ListView_EditLabel(hwndLV, nItem);\r
- }\r
- }\r
- break;\r
-\r
- case IDM_USER_NEW:\r
- UserNew(hwndDlg);\r
- break;\r
-\r
- case IDM_USER_DELETE:\r
- UserDelete(hwndDlg);\r
- break;\r
-\r
- case IDM_USER_PROPERTIES:\r
- MessageBeep(-1);\r
- break;\r
- }\r
- break;\r
-\r
- case WM_NOTIFY:\r
- return OnNotify(hwndDlg, pUserData, (NMHDR *)lParam);\r
-\r
- case WM_DESTROY:\r
- DestroyMenu(pUserData->hPopupMenu);\r
- HeapFree(GetProcessHeap(), 0, pUserData);\r
- break;\r
- }\r
-\r
- return FALSE;\r
-}\r
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS User Manager Control Panel
+ * FILE: dll/cpl/usrmgr/users.c
+ * PURPOSE: Users property page
+ *
+ * PROGRAMMERS: Eric Kohl
+ */
+
+/*
+ * TODO:
+ * - Add new user to the users group.
+ * - Remove a user from all groups.
+ * - Use localized messages.
+ */
+
+#include "usrmgr.h"
+
+
+typedef struct _USER_DATA
+{
+ HMENU hPopupMenu;
+
+ INT iCurrentItem;
+
+} USER_DATA, *PUSER_DATA;
+
+
+
+static BOOL
+CheckPasswords(HWND hwndDlg,
+ INT nIdDlgItem1,
+ INT nIdDlgItem2)
+{
+ TCHAR szPassword1[256];
+ TCHAR szPassword2[256];
+ UINT uLen1;
+ UINT uLen2;
+
+ uLen1 = GetDlgItemText(hwndDlg, nIdDlgItem1, szPassword1, 256);
+ uLen2 = GetDlgItemText(hwndDlg, nIdDlgItem2, szPassword2, 256);
+
+ /* Check the passwords */
+ if (uLen1 != uLen2 || _tcscmp(szPassword1, szPassword2) != 0)
+ {
+ MessageBox(hwndDlg,
+ TEXT("The passwords you entered are not the same!"),
+ TEXT("ERROR"),
+ MB_OK | MB_ICONERROR);
+ return FALSE;
+ }
+
+
+ return TRUE;
+}
+
+
+INT_PTR CALLBACK
+ChangePasswordDlgProc(HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ UNREFERENCED_PARAMETER(wParam);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ if (CheckPasswords(hwndDlg, IDC_EDIT_PASSWORD1, IDC_EDIT_PASSWORD2))
+ EndDialog(hwndDlg, 0);
+ break;
+
+ case IDCANCEL:
+ EndDialog(hwndDlg, 0);
+ break;
+ }
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+static VOID
+UpdateUserOptions(HWND hwndDlg,
+ PUSER_INFO_3 userInfo,
+ BOOL bInit)
+{
+ EnableWindow(GetDlgItem(hwndDlg, IDC_USER_NEW_CANNOT_CHANGE),
+ !userInfo->usri3_password_expired);
+ EnableWindow(GetDlgItem(hwndDlg, IDC_USER_NEW_NEVER_EXPIRES),
+ !userInfo->usri3_password_expired);
+
+ EnableWindow(GetDlgItem(hwndDlg, IDC_USER_NEW_FORCE_CHANGE),
+ (userInfo->usri3_flags & (UF_PASSWD_CANT_CHANGE | UF_DONT_EXPIRE_PASSWD)) == 0);
+
+ if (bInit)
+ {
+ CheckDlgButton(hwndDlg, IDC_USER_NEW_FORCE_CHANGE,
+ userInfo->usri3_password_expired ? BST_CHECKED : BST_UNCHECKED);
+
+ CheckDlgButton(hwndDlg, IDC_USER_NEW_CANNOT_CHANGE,
+ (userInfo->usri3_flags & UF_PASSWD_CANT_CHANGE) ? BST_CHECKED : BST_UNCHECKED);
+
+ CheckDlgButton(hwndDlg, IDC_USER_NEW_NEVER_EXPIRES,
+ (userInfo->usri3_flags & UF_DONT_EXPIRE_PASSWD) ? BST_CHECKED : BST_UNCHECKED);
+
+ CheckDlgButton(hwndDlg, IDC_USER_NEW_DISABLED,
+ (userInfo->usri3_flags & UF_ACCOUNTDISABLE) ? BST_CHECKED : BST_UNCHECKED);
+ }
+}
+
+
+INT_PTR CALLBACK
+NewUserDlgProc(HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ PUSER_INFO_3 userInfo;
+ INT nLength;
+
+ UNREFERENCED_PARAMETER(wParam);
+
+ userInfo = (PUSER_INFO_3)GetWindowLongPtr(hwndDlg, DWLP_USER);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ userInfo = (PUSER_INFO_3)lParam;
+ SetWindowLongPtr(hwndDlg, DWLP_USER, lParam);
+ SendDlgItemMessage(hwndDlg, IDC_USER_NEW_NAME, EM_SETLIMITTEXT, 20, 0);
+ UpdateUserOptions(hwndDlg, userInfo, TRUE);
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDC_USER_NEW_NAME:
+ if (HIWORD(wParam) == EN_CHANGE)
+ {
+ nLength = SendDlgItemMessage(hwndDlg, IDC_USER_NEW_NAME, WM_GETTEXTLENGTH, 0, 0);
+ EnableWindow(GetDlgItem(hwndDlg, IDOK), (nLength > 0));
+ }
+ break;
+
+ case IDC_USER_NEW_FORCE_CHANGE:
+ userInfo->usri3_password_expired = !userInfo->usri3_password_expired;
+ UpdateUserOptions(hwndDlg, userInfo, FALSE);
+ break;
+
+ case IDC_USER_NEW_CANNOT_CHANGE:
+ userInfo->usri3_flags ^= UF_PASSWD_CANT_CHANGE;
+ UpdateUserOptions(hwndDlg, userInfo, FALSE);
+ break;
+
+ case IDC_USER_NEW_NEVER_EXPIRES:
+ userInfo->usri3_flags ^= UF_DONT_EXPIRE_PASSWD;
+ UpdateUserOptions(hwndDlg, userInfo, FALSE);
+ break;
+
+ case IDC_USER_NEW_DISABLED:
+ userInfo->usri3_flags ^= UF_ACCOUNTDISABLE;
+ break;
+
+ case IDOK:
+ if (!CheckAccountName(hwndDlg, IDC_USER_NEW_NAME, NULL))
+ {
+ SetFocus(GetDlgItem(hwndDlg, IDC_USER_NEW_NAME));
+ SendDlgItemMessage(hwndDlg, IDC_USER_NEW_NAME, EM_SETSEL, 0, -1);
+ break;
+ }
+
+ if (!CheckPasswords(hwndDlg, IDC_USER_NEW_PASSWORD1, IDC_USER_NEW_PASSWORD2))
+ {
+ SetDlgItemText(hwndDlg, IDC_USER_NEW_PASSWORD1, TEXT(""));
+ SetDlgItemText(hwndDlg, IDC_USER_NEW_PASSWORD2, TEXT(""));
+ break;
+ }
+
+ /* Store the user name */
+ nLength = SendDlgItemMessage(hwndDlg, IDC_USER_NEW_NAME, WM_GETTEXTLENGTH, 0, 0);
+ if (nLength > 0)
+ {
+ userInfo->usri3_name = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));
+ GetDlgItemText(hwndDlg, IDC_USER_NEW_NAME, userInfo->usri3_name, nLength + 1);
+ }
+
+ /* Store the full user name */
+ nLength = SendDlgItemMessage(hwndDlg, IDC_USER_NEW_FULL_NAME, WM_GETTEXTLENGTH, 0, 0);
+ if (nLength > 0)
+ {
+ userInfo->usri3_full_name = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));
+ GetDlgItemText(hwndDlg, IDC_USER_NEW_FULL_NAME, userInfo->usri3_full_name, nLength + 1);
+ }
+
+ /* Store the description */
+ nLength = SendDlgItemMessage(hwndDlg, IDC_USER_NEW_DESCRIPTION, WM_GETTEXTLENGTH, 0, 0);
+ if (nLength > 0)
+ {
+ userInfo->usri3_comment = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));
+ GetDlgItemText(hwndDlg, IDC_USER_NEW_DESCRIPTION, userInfo->usri3_comment, nLength + 1);
+ }
+
+ /* Store the password */
+ nLength = SendDlgItemMessage(hwndDlg, IDC_USER_NEW_PASSWORD1, WM_GETTEXTLENGTH, 0, 0);
+ if (nLength > 0)
+ {
+ userInfo->usri3_password = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));
+ GetDlgItemText(hwndDlg, IDC_USER_NEW_PASSWORD1, userInfo->usri3_password, nLength + 1);
+ }
+
+ EndDialog(hwndDlg, IDOK);
+ break;
+
+ case IDCANCEL:
+ EndDialog(hwndDlg, IDCANCEL);
+ break;
+ }
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+static VOID
+UserNew(HWND hwndDlg)
+{
+ USER_INFO_3 user;
+ NET_API_STATUS status;
+ LV_ITEM lvi;
+ INT iItem;
+ HWND hwndLV;
+
+ ZeroMemory(&user, sizeof(USER_INFO_3));
+
+ user.usri3_priv = USER_PRIV_USER;
+ user.usri3_flags = UF_SCRIPT;
+ user.usri3_acct_expires = TIMEQ_FOREVER;
+ user.usri3_max_storage = USER_MAXSTORAGE_UNLIMITED;
+ user.usri3_primary_group_id = DOMAIN_GROUP_RID_USERS;
+
+ user.usri3_password_expired = TRUE;
+
+ if (DialogBoxParam(hApplet,
+ MAKEINTRESOURCE(IDD_USER_NEW),
+ hwndDlg,
+ NewUserDlgProc,
+ (LPARAM)&user) == IDOK)
+ {
+#if 0
+ status = NetUserAdd(NULL,
+ 3,
+ (LPBYTE)&user,
+ NULL);
+#else
+ status = NERR_Success;
+#endif
+ if (status != NERR_Success)
+ {
+ TCHAR szText[256];
+ wsprintf(szText, TEXT("Error: %u"), status);
+ MessageBox(NULL, szText, TEXT("NetUserAdd"), MB_ICONERROR | MB_OK);
+ return;
+ }
+
+ hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);
+
+ ZeroMemory(&lvi, sizeof(lvi));
+ lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;
+ lvi.pszText = user.usri3_name;
+ lvi.state = 0;
+ lvi.iImage = (user.usri3_flags & UF_ACCOUNTDISABLE) ? 1 : 0;
+ iItem = ListView_InsertItem(hwndLV, &lvi);
+
+ ListView_SetItemText(hwndLV, iItem, 1,
+ user.usri3_full_name);
+
+ ListView_SetItemText(hwndLV, iItem, 2,
+ user.usri3_comment);
+ }
+
+ if (user.usri3_name)
+ HeapFree(GetProcessHeap(), 0, user.usri3_name);
+
+ if (user.usri3_full_name)
+ HeapFree(GetProcessHeap(), 0, user.usri3_full_name);
+
+ if (user.usri3_comment)
+ HeapFree(GetProcessHeap(), 0, user.usri3_comment);
+
+ if (user.usri3_password)
+ HeapFree(GetProcessHeap(), 0, user.usri3_password);
+}
+
+
+static VOID
+UserRename(HWND hwndDlg)
+{
+ HWND hwndLV;
+ INT nItem;
+
+ hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);
+ if (hwndLV == NULL)
+ return;
+
+ nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
+ if (nItem != -1)
+ {
+ (void)ListView_EditLabel(hwndLV, nItem);
+ }
+}
+
+
+static BOOL
+UserDelete(HWND hwndDlg)
+{
+ TCHAR szUserName[UNLEN];
+ TCHAR szText[256];
+ INT nItem;
+ HWND hwndLV;
+ NET_API_STATUS status;
+
+ hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);
+ nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
+ if (nItem == -1)
+ return FALSE;
+
+ /* Get the new user name */
+ ListView_GetItemText(hwndLV,
+ nItem, 0,
+ szUserName,
+ UNLEN);
+
+ /* Display a warning message because the delete operation cannot be reverted */
+ wsprintf(szText, TEXT("Do you really want to delete the user \"%s\"?"), szUserName);
+ if (MessageBox(NULL, szText, TEXT("User Accounts"), MB_ICONWARNING | MB_YESNO) == IDNO)
+ return FALSE;
+
+ /* Delete the user */
+#if 0
+ status = NetUserDel(NULL, szUserName);
+#else
+ status = NERR_Success;
+#endif
+ if (status != NERR_Success)
+ {
+ TCHAR szText[256];
+ wsprintf(szText, TEXT("Error: %u"), status);
+ MessageBox(NULL, szText, TEXT("NetUserDel"), MB_ICONERROR | MB_OK);
+ return FALSE;
+ }
+
+ /* Delete the user from the list */
+ (void)ListView_DeleteItem(hwndLV, nItem);
+
+ return TRUE;
+}
+
+
+static VOID
+SetUsersListColumns(HWND hwndListView)
+{
+ LV_COLUMN column;
+ RECT rect;
+ TCHAR szStr[32];
+
+ GetClientRect(hwndListView, &rect);
+
+ memset(&column, 0x00, sizeof(column));
+ column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT;
+ column.fmt=LVCFMT_LEFT;
+ column.cx = (INT)((rect.right - rect.left) * 0.25);
+ column.iSubItem = 0;
+ LoadString(hApplet, IDS_NAME, szStr, sizeof(szStr) / sizeof(szStr[0]));
+ column.pszText = szStr;
+ (void)ListView_InsertColumn(hwndListView, 0, &column);
+
+ column.cx = (INT)((rect.right - rect.left) * 0.50);
+ column.iSubItem = 1;
+ LoadString(hApplet, IDS_FULLNAME, szStr, sizeof(szStr) / sizeof(szStr[0]));
+ column.pszText = szStr;
+ (void)ListView_InsertColumn(hwndListView, 1, &column);
+
+ column.cx = (INT)((rect.right - rect.left) * 0.25);
+ column.iSubItem = 2;
+ LoadString(hApplet, IDS_DESCRIPTION, szStr, sizeof(szStr) / sizeof(szStr[0]));
+ column.pszText = szStr;
+ (void)ListView_InsertColumn(hwndListView, 2, &column);
+}
+
+
+static VOID
+UpdateUsersList(HWND hwndListView)
+{
+ NET_API_STATUS netStatus;
+ PUSER_INFO_20 pBuffer;
+ DWORD entriesread;
+ DWORD totalentries;
+ DWORD resume_handle = 0;
+ DWORD i;
+ LV_ITEM lvi;
+ INT iItem;
+
+
+ for (;;)
+ {
+ netStatus = NetUserEnum(NULL, 20, FILTER_NORMAL_ACCOUNT,
+ (LPBYTE*)&pBuffer,
+ 1024, &entriesread,
+ &totalentries, &resume_handle);
+ if (netStatus != NERR_Success && netStatus != ERROR_MORE_DATA)
+ break;
+
+ for (i = 0; i < entriesread; i++)
+ {
+ memset(&lvi, 0x00, sizeof(lvi));
+ lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;
+ lvi.pszText = pBuffer[i].usri20_name;
+ lvi.state = 0;
+ lvi.iImage = (pBuffer[i].usri20_flags & UF_ACCOUNTDISABLE) ? 1 : 0;
+ iItem = ListView_InsertItem(hwndListView, &lvi);
+
+ ListView_SetItemText(hwndListView, iItem, 1,
+ pBuffer[i].usri20_full_name);
+
+ ListView_SetItemText(hwndListView, iItem, 2,
+ pBuffer[i].usri20_comment);
+ }
+
+ NetApiBufferFree(pBuffer);
+
+ /* No more data left */
+ if (netStatus != ERROR_MORE_DATA)
+ break;
+ }
+
+}
+
+
+static VOID
+OnInitDialog(HWND hwndDlg)
+{
+ HWND hwndListView;
+ HIMAGELIST hImgList;
+ HICON hIcon;
+
+ /* Create the image list */
+ hImgList = ImageList_Create(16, 16, ILC_COLOR8 | ILC_MASK, 5, 5);
+ hIcon = LoadImage(hApplet, MAKEINTRESOURCE(IDI_USER), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
+ ImageList_AddIcon(hImgList, hIcon);
+ hIcon = LoadImage(hApplet, MAKEINTRESOURCE(IDI_LOCKED_USER), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
+ ImageList_AddIcon(hImgList, hIcon);
+ DestroyIcon(hIcon);
+
+ hwndListView = GetDlgItem(hwndDlg, IDC_USERS_LIST);
+
+ (VOID)ListView_SetImageList(hwndListView, hImgList, LVSIL_SMALL);
+
+ (void)ListView_SetExtendedListViewStyle(hwndListView, LVS_EX_FULLROWSELECT);
+
+ SetUsersListColumns(hwndListView);
+
+ UpdateUsersList(hwndListView);
+}
+
+
+static BOOL
+OnBeginLabelEdit(LPNMLVDISPINFO pnmv)
+{
+ HWND hwndEdit;
+
+ hwndEdit = ListView_GetEditControl(pnmv->hdr.hwndFrom);
+ if (hwndEdit == NULL)
+ return TRUE;
+
+ SendMessage(hwndEdit, EM_SETLIMITTEXT, 20, 0);
+
+ return FALSE;
+}
+
+
+static BOOL
+OnEndLabelEdit(LPNMLVDISPINFO pnmv)
+{
+ TCHAR szOldUserName[UNLEN];
+ TCHAR szNewUserName[UNLEN];
+ USER_INFO_0 useri0;
+ NET_API_STATUS status;
+
+ /* Leave, if there is no valid listview item */
+ if (pnmv->item.iItem == -1)
+ return FALSE;
+
+ /* Get the new user name */
+ ListView_GetItemText(pnmv->hdr.hwndFrom,
+ pnmv->item.iItem, 0,
+ szOldUserName,
+ UNLEN);
+
+ /* Leave, if the user canceled the edit action */
+ if (pnmv->item.pszText == NULL)
+ return FALSE;
+
+ /* Get the new user name */
+ lstrcpy(szNewUserName, pnmv->item.pszText);
+
+ /* Leave, if the user name was not changed */
+ if (lstrcmp(szOldUserName, szNewUserName) == 0)
+ return FALSE;
+
+ /* Check the user name for illegal characters */
+ if (!CheckAccountName(NULL, 0, szNewUserName))
+ return FALSE;
+
+ /* Change the user name */
+ useri0.usri0_name = szNewUserName;
+
+#if 0
+ status = NetUserSetInfo(NULL, szOldUserName, 0, (LPBYTE)&useri0, NULL);
+#else
+ status = NERR_Success;
+#endif
+ if (status != NERR_Success)
+ {
+ TCHAR szText[256];
+ wsprintf(szText, TEXT("Error: %u"), status);
+ MessageBox(NULL, szText, TEXT("NetUserSetInfo"), MB_ICONERROR | MB_OK);
+ return FALSE;
+ }
+
+ /* Update the listview item */
+ ListView_SetItemText(pnmv->hdr.hwndFrom,
+ pnmv->item.iItem, 0,
+ szNewUserName);
+
+ return TRUE;
+}
+
+
+static BOOL
+OnNotify(HWND hwndDlg, PUSER_DATA pUserData, NMHDR *phdr)
+{
+ LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr;
+
+ switch (phdr->idFrom)
+ {
+ case IDC_USERS_LIST:
+ switch(phdr->code)
+ {
+ case NM_CLICK:
+ pUserData->iCurrentItem = lpnmlv->iItem;
+ break;
+
+ case NM_DBLCLK:
+ if (lpnmlv->iItem != -1)
+ {
+ UINT uItem;
+
+ uItem = GetMenuDefaultItem(GetSubMenu(pUserData->hPopupMenu, 1),
+ FALSE, 0);
+ if (uItem != (UINT)-1)
+ SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(uItem, 0), 0);
+ }
+ break;
+
+ case NM_RCLICK:
+ ClientToScreen(GetDlgItem(hwndDlg, IDC_USERS_LIST), &lpnmlv->ptAction);
+ TrackPopupMenu(GetSubMenu(pUserData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1),
+ TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, 0, hwndDlg, NULL);
+ break;
+
+ case LVN_BEGINLABELEDIT:
+ return OnBeginLabelEdit((LPNMLVDISPINFO)phdr);
+
+ case LVN_ENDLABELEDIT:
+ return OnEndLabelEdit((LPNMLVDISPINFO)phdr);
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+
+static VOID
+UpdateUserProperties(HWND hwndDlg)
+{
+ TCHAR szUserName[UNLEN];
+ INT iItem;
+ HWND hwndLV;
+ NET_API_STATUS status;
+ PUSER_INFO_2 pUserInfo = NULL;
+ LV_ITEM lvi;
+
+ hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);
+ iItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
+ if (iItem == -1)
+ return;
+
+ /* Get the new user name */
+ ListView_GetItemText(hwndLV,
+ iItem, 0,
+ szUserName,
+ UNLEN);
+
+ status = NetUserGetInfo(NULL, szUserName, 2, (LPBYTE*)&pUserInfo);
+
+ memset(&lvi, 0x00, sizeof(lvi));
+ lvi.iItem = iItem;
+ lvi.iSubItem = 0;
+ lvi.mask = LVIF_IMAGE;
+ lvi.iImage = (pUserInfo->usri2_flags & UF_ACCOUNTDISABLE) ? 1 : 0;
+ (void)ListView_SetItem(hwndLV, &lvi);
+
+ ListView_SetItemText(hwndLV, iItem, 1,
+ pUserInfo->usri2_full_name);
+
+ ListView_SetItemText(hwndLV, iItem, 2,
+ pUserInfo->usri2_comment);
+
+ NetApiBufferFree(pUserInfo);
+}
+
+
+INT_PTR CALLBACK
+UsersPageProc(HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ PUSER_DATA pUserData;
+
+ UNREFERENCED_PARAMETER(wParam);
+
+ pUserData = (PUSER_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ pUserData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(USER_DATA));
+ SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pUserData);
+
+ pUserData->hPopupMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDM_POPUP_USER));
+
+ OnInitDialog(hwndDlg);
+ SetMenuDefaultItem(GetSubMenu(pUserData->hPopupMenu, 1),
+ IDM_USER_PROPERTIES,
+ FALSE);
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDM_USER_CHANGE_PASSWORD:
+ DialogBoxParam(hApplet,
+ MAKEINTRESOURCE(IDD_CHANGE_PASSWORD),
+ hwndDlg,
+ ChangePasswordDlgProc,
+ (LPARAM)NULL);
+ break;
+
+ case IDM_USER_RENAME:
+ UserRename(hwndDlg);
+ break;
+
+ case IDM_USER_NEW:
+ UserNew(hwndDlg);
+ break;
+
+ case IDM_USER_DELETE:
+ UserDelete(hwndDlg);
+ break;
+
+ case IDM_USER_PROPERTIES:
+ if (UserProperties(hwndDlg))
+ {
+ UpdateUserProperties(hwndDlg);
+ }
+ break;
+ }
+ break;
+
+ case WM_NOTIFY:
+ return OnNotify(hwndDlg, pUserData, (NMHDR *)lParam);
+
+ case WM_DESTROY:
+ DestroyMenu(pUserData->hPopupMenu);
+ HeapFree(GetProcessHeap(), 0, pUserData);
+ break;
+ }
+
+ return FALSE;
+}