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