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
11 #include <afs/param.h>
13 #include <afs/afskfw.h>
14 #include "ipaddrchg.h"
20 * DEFINITIONS ________________________________________________________________
24 #define ID_REMIND_TIMER 1000
25 #define ID_SERVICE_TIMER 1001
27 #define cREALLOC_TABS 4
29 #define dwTABPARAM_MOUNT (LPTSTR)0
30 #define dwTABPARAM_ADVANCED (LPTSTR)1
31 #define ISCELLTAB(_psz) ((HIWORD((LONG)(_psz))) != 0)
35 * PROTOTYPES _________________________________________________________________
39 void Main_OnInitDialog (HWND hDlg);
40 void Main_OnCheckMenuRemind (void);
41 void Main_OnRemindTimer (void);
42 void Main_OnMouseOver (void);
43 void Main_OnSelectTab (void);
44 void Main_OnCheckTerminate (void);
45 HWND Main_CreateTabDialog (HWND hTab, size_t iTab);
47 BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
48 void Terminate_OnInitDialog (HWND hDlg);
49 void Terminate_OnOK (HWND hDlg);
53 * ROUTINES ___________________________________________________________________
57 BOOL CALLBACK Main_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
59 static UINT msgCheckTerminate = 0;
60 if (msgCheckTerminate == 0)
61 msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate"));
63 if (msg == msgCheckTerminate)
65 Main_OnCheckTerminate();
71 Main_OnInitDialog (hDlg);
75 Creds_CloseLibraries();
76 ChangeTrayIcon (NIM_DELETE);
82 Main_RepopulateTabs (FALSE);
95 if (g.fIsWinNT || IsServiceRunning())
97 if (!lp) // Got here from "/show" parameter? switch tabs.
99 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
100 TabCtrl_SetCurSel (hTab, 0);
107 Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
112 if (g.fIsWinNT && IsServiceRunning())
113 ModalDialog (IDD_TERMINATE, NULL, (DLGPROC)Terminate_DlgProc);
115 ModalDialog (IDD_TERMINATE_SMALL, NULL, (DLGPROC)Terminate_DlgProc);
116 else // (!g.fIsWinNT)
117 ModalDialog (IDD_TERMINATE_SMALL_95, NULL, (DLGPROC)Terminate_DlgProc);
120 case M_TERMINATE_NOW:
125 Main_OnCheckMenuRemind();
131 Main_OnRemindTimer();
135 switch (((NMHDR*)lp)->code)
147 if (IsServiceRunning() || !IsServiceConfigured())
149 else if (!g.fIsWinNT)
150 Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
157 if ((hm = TaLocale_LoadMenu (MENU_TRAYICON)) != 0)
162 HMENU hmDummy = CreateMenu();
163 InsertMenu (hmDummy, 0, MF_POPUP, (UINT)hm, NULL);
165 BOOL fRemind = FALSE;
166 lock_ObtainMutex(&g.credsLock);
167 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
169 if (g.aCreds[ iCreds ].fRemind)
172 lock_ReleaseMutex(&g.credsLock);
173 CheckMenuItem (hm, M_REMIND, MF_BYCOMMAND | ((fRemind) ? MF_CHECKED : MF_UNCHECKED));
175 TrackPopupMenu (GetSubMenu (hmDummy, 0),
176 TPM_RIGHTALIGN | TPM_RIGHTBUTTON,
177 pt.x, pt.y, NULL, hDlg, NULL);
179 DestroyMenu (hmDummy);
188 case WM_OBTAIN_TOKENS:
189 if ( InterlockedIncrement (&g.fShowingMessage) != 1 )
190 InterlockedDecrement (&g.fShowingMessage);
192 ShowObtainCreds (wp, (char *)lp);
193 GlobalFree((void *)lp);
196 case WM_START_SERVICE:
199 if ((hManager = OpenSCManager ( NULL, NULL,
201 SC_MANAGER_ENUMERATE_SERVICE |
202 SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
205 if ((hService = OpenService ( hManager, TEXT("TransarcAFSDaemon"),
206 SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
208 if (StartService (hService, 0, 0))
209 TestAndDoMapShare(SERVICE_START_PENDING);
210 if ( KFW_is_available() && KFW_AFS_wait_for_service_start() ) {
212 KFW_import_windows_lsa();
213 #endif /* USE_MS2MIT */
214 KFW_AFS_renew_tokens_for_all_cells();
217 CloseServiceHandle (hService);
220 CloseServiceHandle (hManager);
222 KFW_AFS_wait_for_service_start();
223 ObtainTokensFromUserIfNeeded(g.hMain);
232 void Main_Show (BOOL fShow)
236 ShowWindow (g.hMain, SW_SHOW);
237 SetWindowPos (g.hMain, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
238 SetForegroundWindow (g.hMain);
242 SetWindowPos (g.hMain, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
247 void Main_OnInitDialog (HWND hDlg)
252 GetString (szTitle, IDS_TITLE_95);
253 SetWindowText (hDlg, szTitle);
256 TCHAR szVersion[256];
259 GetString (szVersion, IDS_UNKNOWN);
260 GetString (szUser, IDS_UNKNOWN);
263 if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_CLT_SW_VERSION_SUBKEY, &hk) == 0)
265 DWORD dwSize = sizeof(szVersion);
266 DWORD dwType = REG_SZ;
267 RegQueryValueEx (hk, REGVAL_AFS_VERSION, NULL, &dwType, (PBYTE)szVersion, &dwSize);
269 dwSize = sizeof(dwPatch);
271 RegQueryValueEx (hk, REGVAL_AFS_PATCH, NULL, &dwType, (PBYTE)&dwPatch, &dwSize);
275 /* We should probably be using GetUserNameEx() for this */
276 BOOL fFoundUserName = FALSE;
277 if (RegOpenKey (HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"), &hk) == 0)
279 DWORD dwSize = sizeof(szUser);
280 DWORD dwType = REG_SZ;
281 if (RegQueryValueEx (hk, TEXT("Logon User Name"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0)
282 fFoundUserName = TRUE;
285 if (!fFoundUserName )
287 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Explorer"), &hk) == 0)
289 DWORD dwSize = sizeof(szUser);
290 DWORD dwType = REG_SZ;
291 if (RegQueryValueEx (hk, TEXT("Logon User Name"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0)
292 fFoundUserName = TRUE;
296 if (!fFoundUserName )
298 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0)
300 DWORD dwSize = sizeof(szUser);
301 DWORD dwType = REG_SZ;
302 if (RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0)
303 fFoundUserName = TRUE;
309 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Network\\Logon"), &hk) == 0)
311 DWORD dwSize = sizeof(szUser);
312 DWORD dwType = REG_SZ;
313 if (RegQueryValueEx (hk, TEXT("UserName"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0)
314 fFoundUserName = TRUE;
319 TCHAR szSource[ cchRESOURCE ];
320 TCHAR szTarget[ cchRESOURCE ];
322 GetString (szSource, (dwPatch) ? IDS_TITLE_VERSION : IDS_TITLE_VERSION_NOPATCH);
323 wsprintf (szTarget, szSource, szVersion, dwPatch);
324 SetDlgItemText (hDlg, IDC_TITLE_VERSION, szTarget);
326 GetDlgItemText (hDlg, IDC_TITLE_NT, szSource, cchRESOURCE);
327 wsprintf (szTarget, szSource, szUser);
328 SetDlgItemText (hDlg, IDC_TITLE_NT, szTarget);
332 void Main_OnCheckMenuRemind (void)
334 BOOL fRemind = FALSE;
335 lock_ObtainMutex(&g.credsLock);
336 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
338 if (g.aCreds[ iCreds ].fRemind)
343 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
345 if (g.aCreds[ iCreds ].fRemind != fRemind)
347 g.aCreds[ iCreds ].fRemind = fRemind;
351 lock_ReleaseMutex(&g.credsLock);
353 // Check the active tab, and fix its checkbox if necessary
355 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
356 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
357 if (ISCELLTAB(pszTab) && (*pszTab))
359 HWND hDlg = GetTabChild (hTab);
361 CheckDlgButton (hDlg, IDC_CREDS_REMIND, fRemind);
364 // Make sure the reminder timer is going
366 Main_EnableRemindTimer (fRemind);
370 void Main_OnRemindTimer (void)
372 Main_RepopulateTabs (TRUE);
374 // See if anything is close to expiring; if so, display a warning
375 // dialog. Make sure we never display a warning more than once.
378 if ((iExpired = Main_FindExpiredCreds()) != -1)
380 if (InterlockedIncrement (&g.fShowingMessage) != 1)
381 InterlockedDecrement (&g.fShowingMessage);
383 ShowObtainCreds (TRUE, g.aCreds[ iExpired ].szCell);
388 void Main_OnMouseOver (void)
390 if ((GetTickCount() - g.tickLastRetest) > cmsecMOUSEOVER)
392 Main_RepopulateTabs (TRUE);
397 void Main_OnSelectTab (void)
399 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
400 size_t iTab = TabCtrl_GetCurSel (hTab);
402 HWND hDlgOld = GetTabChild (hTab);
405 if ((hDlgNew = Main_CreateTabDialog (hTab, iTab)) != NULL)
406 ShowWindow (hDlgNew, SW_SHOW);
409 DestroyWindow (hDlgOld);
413 void Main_OnCheckTerminate (void)
417 if (RegOpenKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, &hk) == 0)
419 DWORD dwSize = sizeof(g.fStartup);
420 DWORD dwType = REG_DWORD;
421 RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize);
424 else if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, &hk) == 0)
426 DWORD dwSize = sizeof(g.fStartup);
427 DWORD dwType = REG_DWORD;
428 RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize);
432 Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
439 HWND Main_CreateTabDialog (HWND hTab, size_t iTab)
445 memset (&Item, 0x00, sizeof(Item));
446 Item.mask = TCIF_PARAM;
447 if (TabCtrl_GetItem (hTab, iTab, &Item))
449 psz = (LPTSTR)(Item.lParam);
452 if (psz == dwTABPARAM_ADVANCED) // Advanced tab
454 hDlg = ModelessDialog (IDD_TAB_ADVANCED, hTab, (DLGPROC)Advanced_DlgProc);
456 else if (psz == dwTABPARAM_MOUNT) // Mount Points tab
458 hDlg = ModelessDialog (IDD_TAB_MOUNT, hTab, (DLGPROC)Mount_DlgProc);
460 else if (ISCELLTAB(psz) && !*psz) // No Creds tab
462 hDlg = ModelessDialogParam (IDD_TAB_NOCREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz);
464 else if (ISCELLTAB(psz) && *psz) // Creds tab for a particular cell
466 hDlg = ModelessDialogParam (IDD_TAB_CREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz);
473 void Main_RepopulateTabs (BOOL fDestroyInvalid)
475 static BOOL fInHere = FALSE;
480 if (IsWindowVisible (g.hMain))
481 fDestroyInvalid = FALSE;
483 // First we'll have to look around and see what credentials we currently
484 // have. This call just updates g.aCreds[]; it doesn't do anything else.
486 (void)GetCurrentCredentials();
488 // We want one tab on the main dialog for each g.aCredentials entry,
489 // and one tab for Advanced.
491 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
493 // Generate a list of the lParams we'll be giving tabs...
495 LPTSTR *aTabs = NULL;
500 lock_ObtainMutex(&g.credsLock);
501 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
503 if (g.aCreds[ iCreds ].szCell[0])
508 fDestroyInvalid = TRUE;
511 if (!fDestroyInvalid)
513 int nTabs = TabCtrl_GetItemCount(hTab);
514 for (int iTab = 0; iTab < nTabs; ++iTab)
516 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab);
517 if (ISCELLTAB(pszTab) && (*pszTab))
519 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
520 aTabs[ iTabOut++ ] = CloneString(pszTab);
527 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
528 aTabs[ iTabOut++ ] = CloneString (TEXT(""));
530 else for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
532 if (g.aCreds[ iCreds ].szCell[0])
534 for (size_t ii = 0; ii < iTabOut; ++ii)
536 if (!ISCELLTAB (aTabs[ii]))
538 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, aTabs[ ii ]))
543 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
544 aTabs[ iTabOut++ ] = CloneString (g.aCreds[ iCreds ].szCell);
548 lock_ReleaseMutex(&g.credsLock);
550 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
551 aTabs[ iTabOut++ ] = dwTABPARAM_MOUNT;
555 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
556 aTabs[ iTabOut++ ] = dwTABPARAM_ADVANCED;
559 // Now erase the current tabs, and re-add new ones. Remember which tab is
560 // currently selected, so we can try to go back to it later.
563 if (TabCtrl_GetItemCount(hTab))
565 LPTSTR pszTabSel = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
566 for (size_t iSel = 0; iSel < iTabOut; ++iSel)
568 if ((!ISCELLTAB(pszTabSel)) && (!ISCELLTAB(aTabs[iSel])) && (pszTabSel == aTabs[iSel]))
570 else if (ISCELLTAB(pszTabSel) && ISCELLTAB(aTabs[iSel]) && !lstrcmpi (pszTabSel, aTabs[iSel]))
575 int nTabs = TabCtrl_GetItemCount(hTab);
576 for (int iTab = 0; iTab < nTabs; ++iTab)
578 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab);
579 if (ISCELLTAB(pszTab))
582 TabCtrl_DeleteAllItems (hTab);
584 for (size_t ii = 0; ii < iTabOut; ++ii)
586 TCHAR szTitle[cchRESOURCE];
587 if (aTabs[ii] == dwTABPARAM_ADVANCED)
588 GetString (szTitle, IDS_ADVANCED);
589 else if (aTabs[ii] == dwTABPARAM_MOUNT)
590 GetString (szTitle, IDS_MOUNT);
591 else if ((nCreds <= 1) || (aTabs[ii][0] == TEXT('\0')))
592 GetString (szTitle, IDS_CREDENTIALS);
594 lstrcpy (szTitle, aTabs[ii]);
597 memset (&Item, 0x00, sizeof(Item));
598 Item.mask = TCIF_PARAM | TCIF_TEXT;
599 Item.pszText = szTitle;
600 Item.cchTextMax = cchRESOURCE;
601 Item.lParam = (LPARAM)(aTabs[ii]);
603 TabCtrl_InsertItem (hTab, ii, &Item);
609 TabCtrl_SetCurSel (hTab, iTabSel);
617 void Main_EnableRemindTimer (BOOL fEnable)
619 static BOOL bEnabled = FALSE;
621 if ( fEnable == FALSE && bEnabled == TRUE ) {
622 KillTimer (g.hMain, ID_REMIND_TIMER);
624 } else if ( fEnable == TRUE && bEnabled == FALSE ) {
625 SetTimer (g.hMain, ID_REMIND_TIMER, (ULONG)cmsec1MINUTE * cminREMIND_TEST, NULL);
631 size_t Main_FindExpiredCreds (void)
633 size_t retval = (size_t) -1;
634 lock_ObtainMutex(&g.expirationCheckLock);
635 if ( KFW_is_available() )
636 KFW_AFS_renew_expiring_tokens();
637 lock_ObtainMutex(&g.credsLock);
638 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
640 if (!g.aCreds[ iCreds ].szCell[0])
642 if (!g.aCreds[ iCreds ].fRemind)
646 GetLocalTime (&stNow);
649 SystemTimeToFileTime (&stNow, &ftNow);
652 SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftExpires);
654 LONGLONG llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime);
655 LONGLONG llExpires = (((LONGLONG)ftExpires.dwHighDateTime) << 32) + (LONGLONG)(ftExpires.dwLowDateTime);
657 llNow /= c100ns1SECOND;
658 llExpires /= c100ns1SECOND;
660 if (llExpires <= (llNow + (LONGLONG)cminREMIND_WARN * csec1MINUTE))
662 if ( KFW_is_available() &&
663 KFW_AFS_renew_token_for_cell(g.aCreds[ iCreds ].szCell) )
665 retval = (size_t) iCreds;
670 lock_ReleaseMutex(&g.credsLock);
671 lock_ReleaseMutex(&g.expirationCheckLock);
677 BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
682 Terminate_OnInitDialog (hDlg);
689 Terminate_OnOK (hDlg);
693 EndDialog (hDlg, IDCANCEL);
703 void Terminate_OnInitDialog (HWND hDlg)
705 BOOL fPersistent = IsServicePersistent();
707 CheckDlgButton (hDlg, IDC_STARTUP, g.fStartup);
708 CheckDlgButton (hDlg, IDC_LEAVE, fPersistent);
709 CheckDlgButton (hDlg, IDC_STOP, !fPersistent);
713 void Terminate_OnOK (HWND hDlg)
715 if (IsServiceRunning())
717 if (IsDlgButtonChecked (hDlg, IDC_STOP))
720 if ((hManager = OpenSCManager (NULL, NULL,
722 SC_MANAGER_ENUMERATE_SERVICE |
723 SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
726 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
727 SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
729 SERVICE_STATUS Status;
730 ControlService (hService, SERVICE_CONTROL_STOP, &Status);
732 CloseServiceHandle (hService);
735 CloseServiceHandle (hManager);
740 g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP);
743 if (RegCreateKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, &hk) == 0)
745 DWORD dwSize = sizeof(g.fStartup);
746 DWORD dwType = REG_DWORD;
747 RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize);
751 Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
754 EndDialog (hDlg, IDOK);