f7a66b6870fde6aa06a65b7f34de0404bc2d3c9e
[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
110          case 'm':
111          case 'M':
112             fRenewMaps = TRUE;
113             break;
114
115          case 'n':
116          case 'N':
117             fNetDetect = TRUE;
118             break;
119
120          case 's':
121          case 'S':
122             fShow = TRUE;
123             break;
124
125          case 'q':
126          case 'Q':
127             fQuiet = TRUE;
128             break;
129
130          case 'e':
131          case 'E':
132             fExit = TRUE;
133             break;
134
135          case 'i':
136          case 'I':
137             fInstall = TRUE;
138             break;
139
140          case 'u':
141          case 'U':
142             fUninstall = TRUE;
143             break;
144
145                  case ':':
146                          MapShareName(pszCmdLineA);
147                          break;
148
149          case 'z':
150          case 'Z':
151              DoUnMapShare(TRUE);
152              return(0);
153
154          case 'x':
155          case 'X':
156              TestAndDoMapShare(SERVICE_START_PENDING);
157              TestAndDoMapShare(SERVICE_RUNNING);
158              return 0;
159          }
160
161       while (*pszCmdLineA && (*pszCmdLineA != ' '))
162          ++pszCmdLineA;
163           if (*pszCmdLineA==' ') ++pszCmdLineA;
164       }
165
166    if (fInstall)
167       Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = TRUE);
168    else if (fUninstall)
169       Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = FALSE);
170
171    if (fInstall)
172       {
173       HKEY hk;
174       if (RegCreateKey (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"), &hk) == 0)
175          {
176          DWORD dwSize = sizeof(g.fStartup);
177          DWORD dwType = REG_DWORD;
178          RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize);
179          RegCloseKey (hk);
180          }
181       }
182
183    // Only show up if there's not another version of this app around already.
184    //
185    for (HWND hSearch = GetWindow (GetDesktopWindow(), GW_CHILD);
186         hSearch && IsWindow(hSearch);
187         hSearch = GetWindow (hSearch, GW_HWNDNEXT))
188       {
189       TCHAR szClassName[ cchRESOURCE ];
190       if (GetClassName (hSearch, szClassName, cchRESOURCE))
191          {
192          if (!lstrcmpi (szClassName, cszCLASSNAME))
193             {
194             if (fShow)
195                PostMessage (hSearch, WM_COMMAND, M_ACTIVATE, 0);
196             else if (fExit)
197                PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0);
198             else if (fUninstall)
199                PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0);
200             return FALSE;
201             }
202          }
203       }
204
205    if (fExit || fUninstall || fInstall)
206       return FALSE;
207
208    // Initialize our global variables and window classes
209    //
210    memset (&g, 0x00, sizeof(g));
211    g.fStartup = TRUE;
212
213    HKEY hk;
214    if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"), &hk) == 0)
215       {
216       DWORD dwSize = sizeof(g.fStartup);
217       DWORD dwType = REG_DWORD;
218       RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize);
219       RegCloseKey (hk);
220       }
221
222    Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
223
224    // Is this Windows NT?
225    //
226    OSVERSIONINFO Version;
227    memset (&Version, 0x00, sizeof(Version));
228    Version.dwOSVersionInfoSize = sizeof(Version);
229    if (GetVersionEx (&Version))
230       g.fIsWinNT = (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) ? TRUE : FALSE;
231
232    if (!g.fIsWinNT)
233       lstrcpy (g.szHelpFile, TEXT("afs-light.hlp"));
234    else
235       lstrcpy (g.szHelpFile, TEXT("afs-nt.hlp"));
236
237    // Initialize winsock etc
238    //
239    WSADATA Data;
240    WSAStartup (0x0101, &Data);
241
242    InitCommonControls();
243    RegisterCheckListClass();
244    osi_Init();
245    lock_InitializeMutex(&g.expirationCheckLock, "expiration check lock");
246    lock_InitializeMutex(&g.credsLock, "global creds lock");
247
248    KFW_AFS_wait_for_service_start();
249
250    if ( IsDebuggerPresent() ) {
251        if ( !g.fIsWinNT )
252            OutputDebugString("No Service Present on non-NT systems\n");
253        else {
254            if ( IsServiceRunning() )
255                OutputDebugString("AFSD Service started\n");
256            else {
257                OutputDebugString("AFSD Service stopped\n");
258                if ( !IsServiceConfigured() )
259                    OutputDebugString("AFSD Service not configured\n");
260                else if ( fAutoInit )
261                    OutputDebugString("AFSD Service will be started\n");
262            }   
263        }
264    }
265
266     // If the service isn't started yet, and autoInit start the service
267     if ( g.fIsWinNT && !IsServiceRunning() && IsServiceConfigured() && fAutoInit ) {
268         SC_HANDLE hManager;
269
270         if ((hManager = OpenSCManager( NULL, NULL, 
271                                        SC_MANAGER_CONNECT |
272                                        SC_MANAGER_ENUMERATE_SERVICE |
273                                        SC_MANAGER_QUERY_LOCK_STATUS)) != NULL )
274         {
275             SC_HANDLE hService;
276             if ((hService = OpenService( hManager, TEXT("TransarcAFSDaemon"), 
277                                          SERVICE_QUERY_STATUS | SERVICE_START) ) != NULL)
278             {
279                 if (StartService(hService, 0, 0)) {
280                     if ( IsDebuggerPresent() )
281                         OutputDebugString("AFSD Service start successful\n");
282                     fRenewMaps = TRUE;
283                 } else if ( IsDebuggerPresent() )
284                     OutputDebugString("AFSD Service start failed\n");
285
286                 CloseServiceHandle (hService);
287             }
288
289             CloseServiceHandle (hManager);
290         }
291         KFW_AFS_wait_for_service_start();
292     }
293
294     KFW_initialize();
295
296    // Create a main window. All further initialization will be done during
297    // processing of WM_INITDIALOG.
298    //
299    WNDCLASS wc;
300    if (!GetClassInfo (NULL, WC_DIALOG, &wc))   // Get dialog class info
301       return FALSE;
302    wc.hInstance = THIS_HINST;
303    wc.hIcon = TaLocale_LoadIcon (IDI_MAIN);
304    wc.lpszClassName = cszCLASSNAME;
305    wc.style |= CS_GLOBALCLASS;
306    RegisterClass(&wc);
307
308    g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DlgProc);
309    if (g.hMain == NULL)
310       return FALSE;
311
312    // If the service isn't started yet, show our startup wizard.
313    //
314    if (!IsServiceRunning() && !fQuiet)
315       {
316       if (!g.fIsWinNT)
317          Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
318       else if (IsServiceConfigured())
319          ShowStartupWizard();
320       else if (!IsServerInstalled())
321          Message (MB_ICONHAND, IDS_UNCONFIG_TITLE, IDS_UNCONFIG_DESC);
322       }
323    if (IsServiceRunning()) { 
324       if ( fRenewMaps )
325       {
326           if ( IsDebuggerPresent() )
327               OutputDebugString("Renewing Drive Maps\n");
328           TestAndDoMapShare(SERVICE_START_PENDING);
329           TestAndDoMapShare(SERVICE_RUNNING);
330       }
331       if (fShow)
332       {
333       if ( IsDebuggerPresent() )
334           OutputDebugString("Displaying Main window\n");
335       Main_Show (TRUE);
336       }
337       // If the root cell is reachable and we have no tokens
338       // display the Obtain Tokens dialog to the user
339       if ( fAutoInit ) {
340           if ( IsDebuggerPresent() )
341               OutputDebugString("Obtaining Tokens (if needed)\n");
342           ObtainTokensFromUserIfNeeded(g.hMain);
343       }
344    } else if ( IsDebuggerPresent() )
345        OutputDebugString("AFSD Service Stopped\n");
346
347     if ( fNetDetect ) {
348         // Start IP Address Change Monitor
349         if ( IsDebuggerPresent() )
350             OutputDebugString("Activating Network Change Monitor\n");
351         IpAddrChangeMonitorInit(g.hMain);
352     }
353     Main_EnableRemindTimer(TRUE);
354     return TRUE;
355 }
356
357
358 void ExitApp (void)
359 {
360    KFW_cleanup();
361    g.hMain = NULL;
362 }
363
364
365 void PumpMessage (MSG *pmsg)
366 {
367    if (!IsMemoryManagerMessage (pmsg))
368       {
369       if (!IsDialogMessage (g.hMain, pmsg))
370          {
371          TranslateMessage (pmsg);
372          DispatchMessage (pmsg);
373          }
374       }
375 }
376
377
378 void Quit (void)
379 {
380    if (IsWindow (g.hMain))
381       {
382       ChangeTrayIcon (NIM_DELETE);
383       DestroyWindow (g.hMain);
384       }
385    PostQuitMessage (0);
386 }
387
388
389 BOOL IsServerInstalled (void)
390 {
391    BOOL fInstalled = FALSE;
392
393    TCHAR szKey[] = AFSREG_SVR_SVC_KEY;
394    LPCTSTR pch = lstrchr (szKey, TEXT('\\'));
395
396    HKEY hk;
397    if (RegOpenKey (HKEY_LOCAL_MACHINE, &pch[1], &hk) == 0)
398       {
399       fInstalled = TRUE;
400       RegCloseKey (hk);
401       }
402
403    return fInstalled;
404 }
405