event-object-naming-20040308
[openafs.git] / src / WINNT / client_creds / main.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
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
8  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 #include <osilog.h>
14 #include <afs/fs_utils.h>
15 }
16
17 #include "afscreds.h"
18 #include "..\afsreg\afsreg.h" // So we can see if the server's installed
19 #include "drivemap.h"
20 #include <stdlib.h>
21 #include <stdio.h>
22 #include "rxkad.h"
23 #include "afskfw.h"
24
25 /*
26  * DEFINITIONS ________________________________________________________________
27  *
28  */
29
30 const TCHAR cszCLASSNAME[] = TEXT("AfsCreds");
31
32
33 /*
34  * VARIABLES __________________________________________________________________
35  *
36  */
37
38 GLOBALS g;
39
40
41 /*
42  * PROTOTYPES _________________________________________________________________
43  *
44  */
45
46 BOOL InitApp (LPSTR pszCmdLineA);
47 void ExitApp (void);
48 void Quit (void);
49 void PumpMessage (MSG *pmsg);
50 BOOL IsServerInstalled (void);
51
52
53 /*
54  * ROUTINES ___________________________________________________________________
55  *
56  */
57
58 extern "C" int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR pCmdLine, int nCmdShow)
59 {
60    Shortcut_Init();
61    TaLocale_LoadCorrespondingModule (hInst);
62
63    osi_InitTraceOption();
64    osi_LogEvent0("AFSCreds Main command line",pCmdLine);
65    fs_utils_InitMountRoot();
66
67    if (InitApp (pCmdLine))
68       {
69       MSG msg;
70       while (GetMessage (&msg, NULL, 0, 0) > 0)
71          {
72          PumpMessage (&msg);
73          }
74
75       ExitApp();
76       }
77
78    Shortcut_Exit();
79    return 0;
80 }
81
82 #define ISHIGHSECURITY(v) ( ((v) & LOGON_OPTION_HIGHSECURITY)==LOGON_OPTION_HIGHSECURITY)
83 #define REG_CLIENT_PROVIDER_KEY "SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\NetworkProvider"
84
85 BOOL InitApp (LPSTR pszCmdLineA)
86 {
87    BOOL fShow = FALSE;
88    BOOL fQuiet = FALSE;
89    BOOL fExit = FALSE;
90    BOOL fInstall = FALSE;
91    BOOL fUninstall = FALSE;
92    BOOL fAutoInit = FALSE;
93    BOOL fNetDetect = FALSE;
94    BOOL fRenewMaps = FALSE;
95
96    // Parse the command-line
97    //
98    while (pszCmdLineA && *pszCmdLineA)
99       {
100       if ((*pszCmdLineA != '-') && (*pszCmdLineA != '/'))
101          break;
102
103       switch (*(++pszCmdLineA))
104          {
105          case 'a':
106          case 'A':
107             fAutoInit = TRUE;
108             break;
109          case 'm':
110          case 'M':
111             fRenewMaps = TRUE;
112             break;
113          case 'n':
114          case 'N':
115             fNetDetect = TRUE;
116             break;
117          case 's':
118          case 'S':
119             fShow = TRUE;
120             break;
121
122          case 'q':
123          case 'Q':
124             fQuiet = TRUE;
125             break;
126
127          case 'e':
128          case 'E':
129             fExit = TRUE;
130             break;
131
132          case 'i':
133          case 'I':
134             fInstall = TRUE;
135             break;
136
137          case 'u':
138          case 'U':
139             fUninstall = TRUE;
140             break;
141                  case ':':
142                          MapShareName(pszCmdLineA);
143                          break;
144          case 'x':
145          case 'X':
146              TestAndDoMapShare(SERVICE_START_PENDING);
147              TestAndDoMapShare(SERVICE_RUNNING);
148              return 0;
149          }
150
151       while (*pszCmdLineA && (*pszCmdLineA != ' '))
152          ++pszCmdLineA;
153           if (*pszCmdLineA==' ') ++pszCmdLineA;
154       }
155
156    if (fInstall)
157       Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = TRUE);
158    else if (fUninstall)
159       Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = FALSE);
160
161    if (fInstall)
162       {
163       HKEY hk;
164       if (RegCreateKey (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"), &hk) == 0)
165          {
166          DWORD dwSize = sizeof(g.fStartup);
167          DWORD dwType = REG_DWORD;
168          RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize);
169          RegCloseKey (hk);
170          }
171       }
172
173    // Only show up if there's not another version of this app around already.
174    //
175    for (HWND hSearch = GetWindow (GetDesktopWindow(), GW_CHILD);
176         hSearch && IsWindow(hSearch);
177         hSearch = GetWindow (hSearch, GW_HWNDNEXT))
178       {
179       TCHAR szClassName[ cchRESOURCE ];
180       if (GetClassName (hSearch, szClassName, cchRESOURCE))
181          {
182          if (!lstrcmpi (szClassName, cszCLASSNAME))
183             {
184             if (fShow)
185                PostMessage (hSearch, WM_COMMAND, M_ACTIVATE, 0);
186             else if (fExit)
187                PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0);
188             else if (fUninstall)
189                PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0);
190             return FALSE;
191             }
192          }
193       }
194
195    if (fExit || fUninstall || fInstall)
196       return FALSE;
197
198    // Initialize our global variables and window classes
199    //
200    memset (&g, 0x00, sizeof(g));
201    g.fStartup = TRUE;
202
203    HKEY hk;
204    if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"), &hk) == 0)
205       {
206       DWORD dwSize = sizeof(g.fStartup);
207       DWORD dwType = REG_DWORD;
208       RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize);
209       RegCloseKey (hk);
210       }
211
212    Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
213
214    // Is this Windows NT?
215    //
216    OSVERSIONINFO Version;
217    memset (&Version, 0x00, sizeof(Version));
218    Version.dwOSVersionInfoSize = sizeof(Version);
219    if (GetVersionEx (&Version))
220       g.fIsWinNT = (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) ? TRUE : FALSE;
221
222    if (!g.fIsWinNT)
223       lstrcpy (g.szHelpFile, TEXT("afs-light.hlp"));
224    else
225       lstrcpy (g.szHelpFile, TEXT("afs-nt.hlp"));
226
227    // Initialize winsock etc
228    //
229    WSADATA Data;
230    WSAStartup (0x0101, &Data);
231
232    InitCommonControls();
233    RegisterCheckListClass();
234    osi_Init();
235    lock_InitializeMutex(&g.expirationCheckLock, "expiration check lock");
236    lock_InitializeMutex(&g.credsLock, "global creds lock");
237
238    KFW_AFS_wait_for_service_start();
239
240    if ( IsDebuggerPresent() ) {
241        if ( !g.fIsWinNT )
242            OutputDebugString("No Service Present on non-NT systems\n");
243        else {
244            if ( IsServiceRunning() )
245                OutputDebugString("AFSD Service started\n");
246            else {
247                OutputDebugString("AFSD Service stopped\n");
248                if ( !IsServiceConfigured() )
249                    OutputDebugString("AFSD Service not configured\n");
250                else if ( fAutoInit )
251                    OutputDebugString("AFSD Service will be started\n");
252            }   
253        }
254    }
255
256     // If the service isn't started yet, and autoInit start the service
257     if ( g.fIsWinNT && !IsServiceRunning() && IsServiceConfigured() && fAutoInit ) {
258         SC_HANDLE hManager;
259
260         if ((hManager = OpenSCManager( NULL, NULL, 
261                                        SC_MANAGER_CONNECT |
262                                        SC_MANAGER_ENUMERATE_SERVICE |
263                                        SC_MANAGER_QUERY_LOCK_STATUS)) != NULL )
264         {
265             SC_HANDLE hService;
266             if ((hService = OpenService( hManager, TEXT("TransarcAFSDaemon"), 
267                                          SERVICE_QUERY_STATUS | SERVICE_START) ) != NULL)
268             {
269                 if (StartService(hService, 0, 0)) {
270                     if ( IsDebuggerPresent() )
271                         OutputDebugString("AFSD Service start successful\n");
272                     fRenewMaps = TRUE;
273                 } else if ( IsDebuggerPresent() )
274                     OutputDebugString("AFSD Service start failed\n");
275
276                 CloseServiceHandle (hService);
277             }
278
279             CloseServiceHandle (hManager);
280         }
281         KFW_AFS_wait_for_service_start();
282     }
283
284     KFW_initialize();
285
286    // Create a main window. All further initialization will be done during
287    // processing of WM_INITDIALOG.
288    //
289    WNDCLASS wc;
290    if (!GetClassInfo (NULL, WC_DIALOG, &wc))   // Get dialog class info
291       return FALSE;
292    wc.hInstance = THIS_HINST;
293    wc.hIcon = TaLocale_LoadIcon (IDI_MAIN);
294    wc.lpszClassName = cszCLASSNAME;
295    wc.style |= CS_GLOBALCLASS;
296    RegisterClass(&wc);
297
298    g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DlgProc);
299    if (g.hMain == NULL)
300       return FALSE;
301
302    // If the service isn't started yet, show our startup wizard.
303    //
304    if (!IsServiceRunning() && !fQuiet)
305       {
306       if (!g.fIsWinNT)
307          Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
308       else if (IsServiceConfigured())
309          ShowStartupWizard();
310       else if (!IsServerInstalled())
311          Message (MB_ICONHAND, IDS_UNCONFIG_TITLE, IDS_UNCONFIG_DESC);
312       }
313    if (IsServiceRunning()) { 
314       if ( fRenewMaps )
315       {
316           if ( IsDebuggerPresent() )
317               OutputDebugString("Renewing Drive Maps\n");
318           TestAndDoMapShare(SERVICE_START_PENDING);
319           TestAndDoMapShare(SERVICE_RUNNING);
320       }
321       if (fShow)
322       {
323       if ( IsDebuggerPresent() )
324           OutputDebugString("Displaying Main window\n");
325       Main_Show (TRUE);
326       }
327       // If the root cell is reachable and we have no tokens
328       // display the Obtain Tokens dialog to the user
329       if ( fAutoInit ) {
330           if ( IsDebuggerPresent() )
331               OutputDebugString("Obtaining Tokens (if needed)\n");
332           ObtainTokensFromUserIfNeeded(g.hMain);
333       }
334    } else if ( IsDebuggerPresent() )
335        OutputDebugString("AFSD Service Stopped\n");
336
337     if ( fNetDetect ) {
338         // Start IP Address Change Monitor
339         if ( IsDebuggerPresent() )
340             OutputDebugString("Activating Network Change Monitor\n");
341         IpAddrChangeMonitorInit(g.hMain);
342     }
343     Main_EnableRemindTimer(TRUE);
344     return TRUE;
345 }
346
347
348 void ExitApp (void)
349 {
350    KFW_cleanup();
351    g.hMain = NULL;
352 }
353
354
355 void PumpMessage (MSG *pmsg)
356 {
357    if (!IsMemoryManagerMessage (pmsg))
358       {
359       if (!IsDialogMessage (g.hMain, pmsg))
360          {
361          TranslateMessage (pmsg);
362          DispatchMessage (pmsg);
363          }
364       }
365 }
366
367
368 void Quit (void)
369 {
370    if (IsWindow (g.hMain))
371       {
372       ChangeTrayIcon (NIM_DELETE);
373       DestroyWindow (g.hMain);
374       }
375    PostQuitMessage (0);
376 }
377
378
379 BOOL IsServerInstalled (void)
380 {
381    BOOL fInstalled = FALSE;
382
383    TCHAR szKey[] = AFSREG_SVR_SVC_KEY;
384    LPCTSTR pch = lstrchr (szKey, TEXT('\\'));
385
386    HKEY hk;
387    if (RegOpenKey (HKEY_LOCAL_MACHINE, &pch[1], &hk) == 0)
388       {
389       fInstalled = TRUE;
390       RegCloseKey (hk);
391       }
392
393    return fInstalled;
394 }
395