2 * Copyright (c) 2005,2006 Secure Endpoints Inc.
4 * Permission is hereby granted, free of charge, to any person
5 * obtaining a copy of this software and associated documentation
6 * files (the "Software"), to deal in the Software without
7 * restriction, including without limitation the rights to use, copy,
8 * modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31 #include<help/afsplhlp.h>
34 /* disable the 'name was marked as deprecated' warnings. These get
35 issued for Str?Cat? and Str?Cpy? functions. We don't use those
38 #pragma warning(disable: 4995)
45 typedef struct tag_afs_ids_dlg_data {
46 khui_config_init_data cfg;
48 khm_boolean afs_enabled;
52 afs_cfg_ids_proc(HWND hwnd,
57 afs_ids_dlg_data * d = NULL;
64 d = PMALLOC(sizeof(*d));
65 ZeroMemory(d, sizeof(*d));
68 #pragma warning(disable: 4244)
69 SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d);
72 d->cfg = *((khui_config_init_data *) lParam);
74 khc_read_int32(csp_params, L"AFSEnabled", &t);
78 CheckDlgButton(hwnd, IDC_CFG_OBTAIN,
79 (d->afs_enabled)? BST_CHECKED: BST_UNCHECKED);
85 d = (afs_ids_dlg_data *) (LONG_PTR)
86 GetWindowLongPtr(hwnd, DWLP_USER);
94 d = (afs_ids_dlg_data *) (LONG_PTR)
95 GetWindowLongPtr(hwnd, DWLP_USER);
97 if (wParam == MAKEWPARAM(IDC_CFG_OBTAIN, BN_CLICKED)) {
99 (IsDlgButtonChecked(hwnd, IDC_CFG_OBTAIN) ==
101 khui_cfg_set_flags_inst(&d->cfg, KHUI_CNFLAG_MODIFIED,
102 KHUI_CNFLAG_MODIFIED);
108 case KHUI_WM_CFG_NOTIFY:
110 d = (afs_ids_dlg_data *) (LONG_PTR)
111 GetWindowLongPtr(hwnd, DWLP_USER);
113 if (HIWORD(wParam) == WMCFG_APPLY) {
116 if (KHM_FAILED(khc_read_int32(csp_params,
117 L"AFSEnabled", &t)) ||
118 !!t != !!d->afs_enabled) {
119 khc_write_int32(csp_params, L"AFSEnabled",
122 khui_cfg_set_flags_inst(&d->cfg,
124 KHUI_CNFLAG_APPLIED |
125 KHUI_CNFLAG_MODIFIED);
127 khui_cfg_set_flags_inst(&d->cfg,
129 KHUI_CNFLAG_MODIFIED);
140 afs_cfg_id_proc(HWND hwnd,
151 wchar_t idname[KCDB_IDENT_MAXCCH_NAME];
154 rv = afs_dlg_proc(hwnd, uMsg, wParam, 0);
156 d = (afs_dlg_data *) (LONG_PTR) GetWindowLongPtr(hwnd, DWLP_USER);
158 d->cfg = *((khui_config_init_data *) lParam);
162 khui_cfg_get_name(d->cfg.ctx_node, idname, &cb);
165 kcdb_identity_create(idname, 0, &d->ident);
171 d->config_dlg = TRUE;
173 afs_cred_get_identity_creds(&d->creds, d->ident, &d->afs_enabled);
175 afs_dlg_proc(hwnd, KHUI_WM_NC_NOTIFY,
176 MAKEWPARAM(0, WMNC_DIALOG_SETUP), 0);
180 break; /* not reached */
186 d = (afs_dlg_data *) (LONG_PTR) GetWindowLongPtr(hwnd, DWLP_USER);
188 assert(d && d->ident);
190 kcdb_identity_release(d->ident);
192 return afs_dlg_proc(hwnd, uMsg, wParam, lParam);
194 break; /* not reached */
196 case KHUI_WM_CFG_NOTIFY:
200 d = (afs_dlg_data *) (LONG_PTR) GetWindowLongPtr(hwnd, DWLP_USER);
202 if (HIWORD(wParam) == WMCFG_APPLY) {
203 afs_cred_write_ident_data(d);
209 return afs_dlg_proc(hwnd, uMsg, wParam, lParam);
214 set_service_status(HWND hwnd) {
215 static DWORD wait_start = 0;
219 wchar_t status_strings_csv[1024];
220 wchar_t status_strings_ms[1024];
224 GetServiceStatus(NULL,
226 &status, &wait_hint);
228 LoadString(hResModule, IDS_CFG_SVCSTATUS,
229 status_strings_csv, ARRAYLENGTH(status_strings_csv));
231 cb = sizeof(status_strings_ms);
232 csv_to_multi_string(status_strings_ms, &cb, status_strings_csv);
234 for(i=0, t = status_strings_ms; t && *t && *t != L' ';
235 t = multi_string_next(t), i++) {
241 t = status_strings_ms; /* the first one is "unknown". */
243 SetDlgItemText(hwnd, IDC_CFG_STATUS, t);
245 if (status != SERVICE_RUNNING) {
248 hw = GetDlgItem(hwnd, IDC_CFG_STOP);
249 if (hw == GetFocus())
250 SetFocus(GetNextDlgTabItem(hwnd, hw, FALSE));
252 EnableWindow(hw, FALSE);
254 EnableWindow(GetDlgItem(hwnd, IDC_CFG_STOP), TRUE);
257 if (status != SERVICE_STOPPED &&
258 status != SERVICE_PAUSED) {
261 hw = GetDlgItem(hwnd, IDC_CFG_START);
262 if (hw == GetFocus())
263 SetFocus(GetNextDlgTabItem(hwnd, hw, FALSE));
265 EnableWindow(hw, FALSE);
267 EnableWindow(GetDlgItem(hwnd, IDC_CFG_START), TRUE);
270 if (status == SERVICE_START_PENDING ||
271 status == SERVICE_STOP_PENDING) {
276 hw = GetDlgItem(hwnd, IDC_CFG_PROGRESS);
280 if (!IsWindowVisible(hw))
281 ShowWindow(hw, SW_SHOW);
284 wait_start = GetTickCount();
286 now = GetTickCount();
288 if (now + wait_hint != wait_start)
289 progress = (now - wait_start) * 100 /
290 (now + wait_hint - wait_start);
294 SendMessage(hw, PBM_SETPOS, progress, 0);
296 SetTimer(hwnd, 1, 500, NULL);
300 hw = GetDlgItem(hwnd, IDC_CFG_PROGRESS);
305 if (IsWindowVisible(hw))
306 ShowWindow(hw, SW_HIDE);
311 afs_cfg_show_last_error(HWND hwnd, wchar_t * prefix, DWORD code) {
313 wchar_t * err_desc = NULL;
318 r = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
319 FORMAT_MESSAGE_IGNORE_INSERTS |
320 FORMAT_MESSAGE_FROM_SYSTEM,
328 if (r == 0 || err_desc == NULL)
331 LoadString(hResModule, IDS_PLUGIN_DESC,
332 title, ARRAYLENGTH(title));
335 else if (IS_INTRESOURCE(prefix))
336 LoadString(hResModule, (UINT)(UINT_PTR) prefix,
337 tmp, ARRAYLENGTH(tmp));
339 StringCbCopy(tmp, sizeof(tmp), prefix);
341 StringCbPrintf(msg, sizeof(msg), L"%s%s",
344 MessageBox(hwnd, msg, title, MB_OK | MB_APPLMODAL);
349 #define SCNAME_AFSCREDS L"AFS Credentials.lnk"
352 afs_cfg_get_afscreds_shortcut(wchar_t * wpath) {
354 BOOL shortcut_found = FALSE;
356 hr = SHGetFolderPath(NULL, CSIDL_COMMON_STARTUP,
357 NULL, SHGFP_TYPE_CURRENT,
362 if (!PathAppend(wpath, SCNAME_AFSCREDS)) {
366 if (PathFileExists(wpath)) {
367 shortcut_found = TRUE;
372 return shortcut_found;
376 afs_cfg_main_proc(HWND hwnd,
383 wchar_t imagepath[MAX_PATH];
384 wchar_t blockname[MAX_PATH];
392 struct LANGANDCODEPATH {
397 #pragma warning(push)
398 #pragma warning(disable: 4244)
399 SetWindowLongPtr(hwnd, DWLP_USER, (DWORD_PTR) lParam);
402 /* Try to figure out if afscreds.exe is on the startup
403 group for all users. */
405 khm_handle csp_afscred = NULL;
406 khm_int32 disable = FALSE;
408 if (KHM_SUCCEEDED(kmm_get_plugin_config(AFS_PLUGIN_NAME,
412 khc_read_int32(csp_afscred, L"Disableafscreds",
415 khc_close_space(csp_afscred);
419 CheckDlgButton(hwnd, IDC_CFG_STARTAFSCREDS,
422 CheckDlgButton(hwnd, IDC_CFG_STARTAFSCREDS,
427 l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
428 L"SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon",
433 if (l != ERROR_SUCCESS)
436 cb = sizeof(imagepath);
437 l = RegQueryValueEx(service_key,
442 if (l != ERROR_SUCCESS)
445 PathUnquoteSpaces(imagepath);
448 cb = GetFileVersionInfoSize(imagepath, &dummy);
449 if (cb == 0 || dummy)
452 ver_info = malloc(cb);
459 if (!GetFileVersionInfo(imagepath,
464 if (!VerQueryValue(ver_info,
465 L"\\VarFileInfo\\Translation",
466 (LPVOID*) &translations,
471 StringCbPrintf(blockname, sizeof(blockname),
472 L"\\StringFileInfo\\%04x%04x\\FileVersion",
473 translations[0].wLanguage,
474 translations[0].wCodePage);
476 if (!VerQueryValue(ver_info,
483 SetDlgItemText(hwnd, IDC_CFG_VERSION, value);
485 StringCbPrintf(blockname, sizeof(blockname),
486 L"\\StringFileInfo\\%04x%04x\\CompanyName",
487 translations[0].wLanguage,
488 translations[0].wCodePage);
490 if (!VerQueryValue(ver_info,
497 SetDlgItemText(hwnd, IDC_CFG_COMPANY, value);
502 RegCloseKey(service_key);
504 set_service_status(hwnd);
510 case MAKEWPARAM(IDC_CFG_STOP, BN_CLICKED):
514 r = ServiceControl(NULL, TRANSARCAFSDAEMON, SERVICE_STOPPED);
517 afs_cfg_show_last_error(hwnd,
518 MAKEINTRESOURCE(IDS_CFG_CANTSTOP),
521 set_service_status(hwnd);
525 case MAKEWPARAM(IDC_CFG_START,BN_CLICKED):
528 r = ServiceControl(NULL, TRANSARCAFSDAEMON, SERVICE_RUNNING);
531 afs_cfg_show_last_error(hwnd,
532 MAKEINTRESOURCE(IDS_CFG_CANTSTART),
535 set_service_status(hwnd);
539 case MAKEWPARAM(IDC_CFG_CPL, BN_CLICKED):
540 if (32 >= (LRESULT) ShellExecute (NULL, NULL,
541 L"AFS_CONFIG.EXE", NULL,
544 L"Can't find file AFS_CONFIG.EXE",
549 case MAKEWPARAM(IDC_CFG_STARTAFSCREDS, BN_CLICKED):
551 khui_config_node node;
553 node = (khui_config_node) (DWORD_PTR)
554 GetWindowLongPtr(hwnd, DWLP_USER);
556 khui_cfg_set_flags(node,
557 KHUI_CNFLAG_MODIFIED,
558 KHUI_CNFLAG_MODIFIED);
564 case KHUI_WM_CFG_NOTIFY:
566 if (HIWORD(wParam) == WMCFG_APPLY) {
567 wchar_t wpath[MAX_PATH];
569 khui_config_node node;
570 khm_handle csp_afscred = NULL;
571 khm_int32 disable = FALSE;
573 node = (khui_config_node) (DWORD_PTR)
574 GetWindowLongPtr(hwnd, DWLP_USER);
576 kmm_get_plugin_config(AFS_PLUGIN_NAME, KHM_PERM_WRITE,
580 khc_read_int32(csp_afscred, L"Disableafscreds",
583 dlg_state = IsDlgButtonChecked(hwnd, IDC_CFG_STARTAFSCREDS);
586 (dlg_state == BST_CHECKED)) {
588 khc_write_int32(csp_afscred,
590 (dlg_state == BST_CHECKED));
592 khui_cfg_set_flags(node,
594 KHUI_CNFLAG_MODIFIED |
595 KHUI_CNFLAG_APPLIED);
597 khui_cfg_set_flags(node, 0,
598 KHUI_CNFLAG_MODIFIED);
601 if (dlg_state == BST_CHECKED &&
602 afs_cfg_get_afscreds_shortcut(wpath)) {
613 set_service_status(hwnd);
622 static const DWORD ctx_help[] = {
623 IDC_CFG_STATUS, IDH_SVCSTATUS,
624 IDC_CFG_STOP, IDH_SVCSTOP,
625 IDC_CFG_START, IDH_SVCSTART,
626 IDC_CFG_VERSION, IDH_SVCVERSION,
627 IDC_CFG_COMPANY, IDH_SVCCOMPANY,
628 IDC_CFG_CPL, IDH_SVCCPL,
629 IDC_CFG_STARTAFSCREDS, IDH_STARTAFSCREDS,
635 hlp = (LPHELPINFO) lParam;
637 if (hlp->iContextType != HELPINFO_WINDOW)
640 afs_html_help(hlp->hItemHandle, L"::/popups_cfg.txt",
641 HH_TP_HELP_WM_HELP, (DWORD_PTR) ctx_help);