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