2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
14 #include <afsconfig.h>
15 #include <afs/param.h>
18 #include <afs/afskfw.h>
19 #include "ipaddrchg.h"
24 #define SECURITY_WIN32 1
28 * DEFINITIONS ________________________________________________________________
32 #define ID_REMIND_TIMER 1000
33 #define ID_SERVICE_TIMER 1001
35 #define cREALLOC_TABS 4
37 #define dwTABPARAM_MOUNT (LPTSTR)0
38 #define dwTABPARAM_ADVANCED (LPTSTR)1
39 #define ISCELLTAB(_psz) ((HIWORD((LONG)(_psz))) != 0)
43 * PROTOTYPES _________________________________________________________________
47 void Main_OnInitDialog (HWND hDlg);
48 void Main_OnCheckMenuRemind (void);
49 void Main_OnRemindTimer (void);
50 void Main_OnMouseOver (void);
51 void Main_OnSelectTab (void);
52 void Main_OnCheckTerminate (void);
53 HWND Main_CreateTabDialog (HWND hTab, size_t iTab);
55 BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
56 void Terminate_OnInitDialog (HWND hDlg);
57 void Terminate_OnOK (HWND hDlg);
61 * ROUTINES ___________________________________________________________________
65 BOOL CALLBACK Main_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
67 static UINT msgCheckTerminate = 0;
68 if (msgCheckTerminate == 0)
69 msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate"));
71 if (msg == msgCheckTerminate)
73 Main_OnCheckTerminate();
79 Main_OnInitDialog (hDlg);
83 Creds_CloseLibraries();
84 ChangeTrayIcon (NIM_DELETE);
90 Main_RepopulateTabs (FALSE);
103 if (g.fIsWinNT || IsServiceRunning())
105 if (!lp) // Got here from "/show" parameter? switch tabs.
107 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
108 TabCtrl_SetCurSel (hTab, 0);
115 Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
120 #ifndef UAC_COMPATIBLE
121 if (g.fIsWinNT && IsServiceRunning())
122 ModalDialog (IDD_TERMINATE, NULL, (DLGPROC)Terminate_DlgProc);
126 ModalDialog (IDD_TERMINATE_SMALL, NULL, (DLGPROC)Terminate_DlgProc);
127 else // (!g.fIsWinNT)
128 ModalDialog (IDD_TERMINATE_SMALL_95, NULL, (DLGPROC)Terminate_DlgProc);
131 case M_TERMINATE_NOW:
136 Main_OnCheckMenuRemind();
142 Main_OnRemindTimer();
146 switch (((NMHDR*)lp)->code)
158 if (IsServiceRunning() || !IsServiceConfigured())
160 else if (!g.fIsWinNT)
161 Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
168 if ((hm = TaLocale_LoadMenu (MENU_TRAYICON)) != 0)
173 HMENU hmDummy = CreateMenu();
174 InsertMenu (hmDummy, 0, MF_POPUP, (UINT)hm, NULL);
176 BOOL fRemind = FALSE;
177 lock_ObtainMutex(&g.credsLock);
178 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
180 if (g.aCreds[ iCreds ].fRemind)
183 lock_ReleaseMutex(&g.credsLock);
184 CheckMenuItem (hm, M_REMIND, MF_BYCOMMAND | ((fRemind) ? MF_CHECKED : MF_UNCHECKED));
185 SetForegroundWindow(hDlg);
186 TrackPopupMenu (GetSubMenu (hmDummy, 0),
187 TPM_RIGHTALIGN | TPM_RIGHTBUTTON,
188 pt.x, pt.y, NULL, hDlg, NULL);
189 PostMessage(hDlg, WM_NULL, 0, 0);
190 DestroyMenu (hmDummy);
199 case WM_OBTAIN_TOKENS:
200 if ( InterlockedIncrement (&g.fShowingMessage) != 1 )
201 InterlockedDecrement (&g.fShowingMessage);
203 ShowObtainCreds (wp, (char *)lp);
204 GlobalFree((void *)lp);
207 case WM_START_SERVICE:
210 if ((hManager = OpenSCManager ( NULL, NULL,
212 SC_MANAGER_ENUMERATE_SERVICE |
213 SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
216 if ((hService = OpenService ( hManager, TEXT("TransarcAFSDaemon"),
217 SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
219 if (StartService (hService, 0, 0))
220 TestAndDoMapShare(SERVICE_START_PENDING);
221 if ( KFW_is_available() && KFW_AFS_wait_for_service_start() ) {
223 KFW_import_windows_lsa();
224 #endif /* USE_MS2MIT */
225 KFW_AFS_renew_tokens_for_all_cells();
228 CloseServiceHandle (hService);
231 CloseServiceHandle (hManager);
233 if (KFW_AFS_wait_for_service_start())
234 ObtainTokensFromUserIfNeeded(g.hMain);
243 void Main_Show (BOOL fShow)
247 ShowWindow (g.hMain, SW_SHOW);
248 SetWindowPos (g.hMain, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
249 SetForegroundWindow (g.hMain);
253 SetWindowPos (g.hMain, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
258 void Main_OnInitDialog (HWND hDlg)
263 GetString (szTitle, IDS_TITLE_95);
264 SetWindowText (hDlg, szTitle);
267 TCHAR szVersion[256];
270 GetString (szVersion, IDS_UNKNOWN);
271 GetString (szUser, IDS_UNKNOWN);
274 if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSREG_CLT_SW_VERSION_SUBKEY, 0,
275 (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
277 DWORD dwSize = sizeof(szVersion);
278 DWORD dwType = REG_SZ;
279 RegQueryValueEx (hk, REGVAL_AFS_VERSION, NULL, &dwType, (PBYTE)szVersion, &dwSize);
281 dwSize = sizeof(dwPatch);
283 RegQueryValueEx (hk, REGVAL_AFS_PATCH, NULL, &dwType, (PBYTE)&dwPatch, &dwSize);
287 DWORD dwUserLen = sizeof(szUser)/sizeof(TCHAR);
288 if (!GetUserNameEx(NameUserPrincipal, szUser, &dwUserLen))
289 GetUserNameEx(NameSamCompatible, szUser, &dwUserLen);
291 TCHAR szSource[ cchRESOURCE ];
292 TCHAR szTarget[ cchRESOURCE ];
294 GetString (szSource, (dwPatch) ? IDS_TITLE_VERSION : IDS_TITLE_VERSION_NOPATCH);
295 wsprintf (szTarget, szSource, szVersion, dwPatch);
296 SetDlgItemText (hDlg, IDC_TITLE_VERSION, szTarget);
298 GetDlgItemText (hDlg, IDC_TITLE_NT, szSource, cchRESOURCE);
299 wsprintf (szTarget, szSource, szUser);
300 SetDlgItemText (hDlg, IDC_TITLE_NT, szTarget);
304 void Main_OnCheckMenuRemind (void)
306 BOOL fRemind = FALSE;
307 lock_ObtainMutex(&g.credsLock);
309 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
311 if (g.aCreds[ iCreds ].fRemind)
316 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
318 if (g.aCreds[ iCreds ].fRemind != fRemind)
320 g.aCreds[ iCreds ].fRemind = fRemind;
324 lock_ReleaseMutex(&g.credsLock);
326 // Check the active tab, and fix its checkbox if necessary
328 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
329 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
330 if (ISCELLTAB(pszTab) && (*pszTab))
332 HWND hDlg = GetTabChild (hTab);
334 CheckDlgButton (hDlg, IDC_CREDS_REMIND, fRemind);
337 // Make sure the reminder timer is going
339 Main_EnableRemindTimer (fRemind);
343 void Main_OnRemindTimer (void)
345 Main_RepopulateTabs (TRUE);
347 // See if anything is close to expiring; if so, display a warning
348 // dialog. Make sure we never display a warning more than once.
351 if ((iExpired = Main_FindExpiredCreds()) != -1) {
352 if (InterlockedIncrement (&g.fShowingMessage) != 1) {
353 InterlockedDecrement (&g.fShowingMessage);
355 char * rootcell = NULL;
356 char password[PROBE_PASSWORD_LEN+1];
357 struct afsconf_cell cellconfig;
358 BOOL serverReachable = FALSE;
361 rootcell = (char *)GlobalAlloc(GPTR,MAXCELLCHARS+1);
365 code = KFW_AFS_get_cellconfig(g.aCreds[ iExpired ].szCell,
366 (afsconf_cell*)&cellconfig, rootcell);
370 if (KFW_is_available()) {
371 // If we can't use the FSProbe interface we can attempt to forge
372 // a kinit and if we can back an invalid user error we know the
373 // kdc is at least reachable
374 serverReachable = KFW_probe_kdc(&cellconfig);
378 for ( i=0 ; i<PROBE_PASSWORD_LEN ; i++ )
381 code = ObtainNewCredentials(rootcell, PROBE_USERNAME, password, TRUE);
384 case KERB_ERR_PRINCIPAL_UNKNOWN:
385 case KERB_ERR_SERVICE_EXP:
387 serverReachable = TRUE;
390 serverReachable = FALSE;
395 GlobalFree(rootcell);
398 ShowObtainCreds (TRUE, g.aCreds[ iExpired ].szCell);
400 InterlockedDecrement (&g.fShowingMessage);
406 void Main_OnMouseOver (void)
408 if ((GetTickCount() - g.tickLastRetest) > cmsecMOUSEOVER)
410 Main_RepopulateTabs (TRUE);
415 void Main_OnSelectTab (void)
417 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
418 size_t iTab = TabCtrl_GetCurSel (hTab);
420 HWND hDlgOld = GetTabChild (hTab);
423 if ((hDlgNew = Main_CreateTabDialog (hTab, iTab)) != NULL)
424 ShowWindow (hDlgNew, SW_SHOW);
427 DestroyWindow (hDlgOld);
431 void Main_OnCheckTerminate (void)
434 BOOL bSuccess = FALSE;
436 if (RegOpenKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0,
437 (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
439 DWORD dwSize = sizeof(g.fStartup);
440 DWORD dwType = REG_DWORD;
441 bSuccess = (RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize) == 0);
446 RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, 0,
447 (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
449 DWORD dwSize = sizeof(g.fStartup);
450 DWORD dwType = REG_DWORD;
451 RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize);
455 Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
462 HWND Main_CreateTabDialog (HWND hTab, size_t iTab)
468 memset (&Item, 0x00, sizeof(Item));
469 Item.mask = TCIF_PARAM;
470 if (TabCtrl_GetItem (hTab, iTab, &Item))
472 psz = (LPTSTR)(Item.lParam);
475 if (psz == dwTABPARAM_ADVANCED) // Advanced tab
477 hDlg = ModelessDialog (IDD_TAB_ADVANCED, hTab, (DLGPROC)Advanced_DlgProc);
479 else if (psz == dwTABPARAM_MOUNT) // Mount Points tab
481 hDlg = ModelessDialog (IDD_TAB_MOUNT, hTab, (DLGPROC)Mount_DlgProc);
483 else if (ISCELLTAB(psz) && !*psz) // No Creds tab
485 hDlg = ModelessDialogParam (IDD_TAB_NOCREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz);
487 else if (ISCELLTAB(psz) && *psz) // Creds tab for a particular cell
489 hDlg = ModelessDialogParam (IDD_TAB_CREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz);
495 static BOOL Main_ShowMountTab(void)
499 BOOL bSuccess = FALSE;
501 if (RegOpenKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0,
502 (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
504 DWORD dwSize = sizeof(bShow);
505 DWORD dwType = REG_DWORD;
506 bSuccess = (RegQueryValueEx (hk, TEXT("ShowMountTab"), NULL, &dwType, (PBYTE)&bShow, &dwSize) == 0);
511 RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, 0,
512 (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
514 DWORD dwSize = sizeof(bShow);
515 DWORD dwType = REG_DWORD;
516 bSuccess = (RegQueryValueEx (hk, TEXT("ShowMountTab"), NULL, &dwType, (PBYTE)&bShow, &dwSize) == 0);
523 void Main_RepopulateTabs (BOOL fDestroyInvalid)
525 static BOOL fInHere = FALSE;
530 if (IsWindowVisible (g.hMain))
531 fDestroyInvalid = FALSE;
533 // First we'll have to look around and see what credentials we currently
534 // have. This call just updates g.aCreds[]; it doesn't do anything else.
536 (void)GetCurrentCredentials();
538 // We want one tab on the main dialog for each g.aCredentials entry,
539 // and one tab for Advanced.
541 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
543 // Generate a list of the lParams we'll be giving tabs...
545 LPTSTR *aTabs = NULL;
550 lock_ObtainMutex(&g.credsLock);
552 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
554 if (g.aCreds[ iCreds ].szCell[0])
559 fDestroyInvalid = TRUE;
562 if (!fDestroyInvalid)
564 int nTabs = TabCtrl_GetItemCount(hTab);
565 for (int iTab = 0; iTab < nTabs; ++iTab)
567 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab);
568 if (ISCELLTAB(pszTab) && (*pszTab))
570 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
571 aTabs[ iTabOut++ ] = CloneString(pszTab);
578 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
579 aTabs[ iTabOut++ ] = CloneString (TEXT(""));
581 else for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
583 if (g.aCreds[ iCreds ].szCell[0])
586 for (ii = 0; ii < iTabOut; ++ii)
588 if (!ISCELLTAB (aTabs[ii]))
590 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, aTabs[ ii ]))
595 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
596 aTabs[ iTabOut++ ] = CloneString (g.aCreds[ iCreds ].szCell);
600 lock_ReleaseMutex(&g.credsLock);
602 if (Main_ShowMountTab())
604 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
605 aTabs[ iTabOut++ ] = dwTABPARAM_MOUNT;
608 #ifndef UAC_COMPATIBLE
611 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
612 aTabs[ iTabOut++ ] = dwTABPARAM_ADVANCED;
615 // Now erase the current tabs, and re-add new ones. Remember which tab is
616 // currently selected, so we can try to go back to it later.
619 if (TabCtrl_GetItemCount(hTab))
621 LPTSTR pszTabSel = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
622 for (size_t iSel = 0; iSel < iTabOut; ++iSel)
624 if ((!ISCELLTAB(pszTabSel)) && (!ISCELLTAB(aTabs[iSel])) && (pszTabSel == aTabs[iSel]))
626 else if (ISCELLTAB(pszTabSel) && ISCELLTAB(aTabs[iSel]) && !lstrcmpi (pszTabSel, aTabs[iSel]))
631 int nTabs = TabCtrl_GetItemCount(hTab);
632 for (int iTab = 0; iTab < nTabs; ++iTab)
634 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab);
635 if (ISCELLTAB(pszTab))
638 TabCtrl_DeleteAllItems (hTab);
640 for (size_t ii = 0; ii < iTabOut; ++ii)
642 TCHAR szTitle[cchRESOURCE];
643 if (aTabs[ii] == dwTABPARAM_ADVANCED)
644 GetString (szTitle, IDS_ADVANCED);
645 else if (aTabs[ii] == dwTABPARAM_MOUNT)
646 GetString (szTitle, IDS_MOUNT);
647 else if ((nCreds <= 1) || (aTabs[ii][0] == TEXT('\0')))
648 GetString (szTitle, IDS_CREDENTIALS);
650 lstrcpy (szTitle, aTabs[ii]);
653 memset (&Item, 0x00, sizeof(Item));
654 Item.mask = TCIF_PARAM | TCIF_TEXT;
655 Item.pszText = szTitle;
656 Item.cchTextMax = cchRESOURCE;
657 Item.lParam = (LPARAM)(aTabs[ii]);
659 TabCtrl_InsertItem (hTab, ii, &Item);
665 TabCtrl_SetCurSel (hTab, iTabSel);
673 void Main_EnableRemindTimer (BOOL fEnable)
675 static BOOL bEnabled = FALSE;
677 if ( fEnable == FALSE && bEnabled == TRUE ) {
678 KillTimer (g.hMain, ID_REMIND_TIMER);
680 } else if ( fEnable == TRUE && bEnabled == FALSE ) {
681 SetTimer (g.hMain, ID_REMIND_TIMER, (ULONG)cmsec1MINUTE * cminREMIND_TEST, NULL);
687 size_t Main_FindExpiredCreds (void)
689 size_t retval = (size_t) -1;
690 static bool expirationCheck = false;
691 lock_ObtainMutex(&g.expirationCheckLock);
692 if (expirationCheck) {
693 lock_ReleaseMutex(&g.expirationCheckLock);
696 expirationCheck = true;
697 lock_ReleaseMutex(&g.expirationCheckLock);
699 if ( KFW_is_available() )
700 KFW_AFS_renew_expiring_tokens();
702 lock_ObtainMutex(&g.credsLock);
703 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
705 if (!g.aCreds[ iCreds ].szCell[0])
707 if (!g.aCreds[ iCreds ].fRemind)
711 GetLocalTime (&stNow);
714 SystemTimeToFileTime (&stNow, &ftNow);
717 SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftExpires);
719 LONGLONG llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime);
720 LONGLONG llExpires = (((LONGLONG)ftExpires.dwHighDateTime) << 32) + (LONGLONG)(ftExpires.dwLowDateTime);
722 llNow /= c100ns1SECOND;
723 llExpires /= c100ns1SECOND;
725 if (llExpires <= (llNow + (LONGLONG)cminREMIND_WARN * csec1MINUTE))
727 if ( KFW_is_available() &&
728 KFW_AFS_renew_token_for_cell(g.aCreds[ iCreds ].szCell) )
730 retval = (size_t) iCreds;
735 lock_ReleaseMutex(&g.credsLock);
737 lock_ObtainMutex(&g.expirationCheckLock);
738 expirationCheck = false;
739 lock_ReleaseMutex(&g.expirationCheckLock);
745 BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
750 Terminate_OnInitDialog (hDlg);
757 Terminate_OnOK (hDlg);
761 EndDialog (hDlg, IDCANCEL);
771 void Terminate_OnInitDialog (HWND hDlg)
773 BOOL fPersistent = IsServicePersistent();
775 CheckDlgButton (hDlg, IDC_STARTUP, g.fStartup);
776 CheckDlgButton (hDlg, IDC_LEAVE, fPersistent);
777 CheckDlgButton (hDlg, IDC_STOP, !fPersistent);
781 void Terminate_OnOK (HWND hDlg)
783 if (IsServiceRunning())
785 if (IsDlgButtonChecked (hDlg, IDC_STOP))
788 if ((hManager = OpenSCManager (NULL, NULL,
790 SC_MANAGER_ENUMERATE_SERVICE |
791 SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
794 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
795 SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
797 SERVICE_STATUS Status;
798 ControlService (hService, SERVICE_CONTROL_STOP, &Status);
800 CloseServiceHandle (hService);
803 CloseServiceHandle (hManager);
808 g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP);
811 if (RegCreateKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0, NULL, 0,
812 (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hk, NULL) == 0)
814 DWORD dwSize = sizeof(g.fStartup);
815 DWORD dwType = REG_DWORD;
816 RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize);
820 Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
823 EndDialog (hDlg, IDOK);