BOOL InitApp (LPSTR pszCmdLineA) { BOOL fShow = FALSE; BOOL fQuiet = FALSE; BOOL fExit = FALSE; BOOL fInstall = FALSE; BOOL fUninstall = FALSE; BOOL fAutoInit = FALSE; BOOL fNetDetect = FALSE; BOOL fRenewMaps = FALSE; // Initialize our global variables and window classes // memset (&g, 0x00, sizeof(g)); g.fStartup = TRUE; // Parse the command-line // while (pszCmdLineA && *pszCmdLineA) { if ((*pszCmdLineA != '-') && (*pszCmdLineA != '/')) break; switch (*(++pszCmdLineA)) { case 'a': case 'A': fAutoInit = TRUE; break; case 'm': case 'M': fRenewMaps = TRUE; break; case 'n': case 'N': fNetDetect = TRUE; break; case 's': case 'S': fShow = TRUE; break; case 'q': case 'Q': fQuiet = TRUE; break; case 'e': case 'E': fExit = TRUE; break; case 'i': case 'I': fInstall = TRUE; break; case 'u': case 'U': fUninstall = TRUE; break; case ':': CopyAnsiToString(g.SmbName,pszCmdLineA); MapShareName(pszCmdLineA); break; case 'z': case 'Z': DoUnMapShare(TRUE); return(0); case 'x': case 'X': TestAndDoMapShare(SERVICE_START_PENDING); TestAndDoMapShare(SERVICE_RUNNING); return 0; } while (*pszCmdLineA && (*pszCmdLineA != ' ')) ++pszCmdLineA; if (*pszCmdLineA==' ') ++pszCmdLineA; } if (fInstall) Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = TRUE); else if (fUninstall) Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup = FALSE); if (fInstall || fUninstall) { HKEY hk; if (RegCreateKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0, NULL, 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hk, NULL) == 0) { DWORD dwSize = sizeof(g.fStartup); DWORD dwType = REG_DWORD; RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize); RegCloseKey (hk); } } // Only show up if there's not another version of this app around already. // for (HWND hSearch = GetWindow (GetDesktopWindow(), GW_CHILD); hSearch && IsWindow(hSearch); hSearch = GetWindow (hSearch, GW_HWNDNEXT)) { TCHAR szClassName[ cchRESOURCE ]; if (GetClassName (hSearch, szClassName, cchRESOURCE)) { if (!lstrcmpi (szClassName, cszCLASSNAME)) { if (fShow) PostMessage (hSearch, WM_COMMAND, M_ACTIVATE, 0); else if (fExit) PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0); else if (fUninstall) PostMessage (hSearch, WM_COMMAND, M_TERMINATE_NOW, 0); return FALSE; } } } if (fExit || fUninstall || fInstall) return FALSE; HKEY hk; if (RegOpenKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0) { DWORD dwSize = sizeof(g.fStartup); DWORD dwType = REG_DWORD; RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize); RegCloseKey (hk); } else if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0) { DWORD dwSize = sizeof(g.fStartup); DWORD dwType = REG_DWORD; RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize); RegCloseKey (hk); } Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup); // Is this Windows NT? // OSVERSIONINFO Version; memset (&Version, 0x00, sizeof(Version)); Version.dwOSVersionInfoSize = sizeof(Version); if (GetVersionEx (&Version)) g.fIsWinNT = (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) ? TRUE : FALSE; if (!g.fIsWinNT) lstrcpy (g.szHelpFile, TEXT("afs-light.hlp")); else lstrcpy (g.szHelpFile, TEXT("afs-nt.hlp")); // Initialize winsock etc // WSADATA Data; WSAStartup (0x0101, &Data); InitCommonControls(); RegisterCheckListClass(); osi_Init(); lock_InitializeMutex(&g.expirationCheckLock, "expiration check lock", 0); lock_InitializeMutex(&g.credsLock, "global creds lock", 0); KFW_AFS_wait_for_service_start(); if ( IsDebuggerPresent() ) { if ( !g.fIsWinNT ) OutputDebugString("No Service Present on non-NT systems\n"); else { if ( IsServiceRunning() ) OutputDebugString("AFSD Service started\n"); else { OutputDebugString("AFSD Service stopped\n"); if ( !IsServiceConfigured() ) OutputDebugString("AFSD Service not configured\n"); else if ( fAutoInit ) OutputDebugString("AFSD Service will be started\n"); } } } // If the service isn't started yet, and autoInit start the service if ( g.fIsWinNT && !IsServiceRunning() && IsServiceConfigured() && fAutoInit ) { SC_HANDLE hManager; if ((hManager = OpenSCManager( NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_QUERY_LOCK_STATUS)) != NULL ) { SC_HANDLE hService; if ((hService = OpenService( hManager, TEXT("TransarcAFSDaemon"), SERVICE_QUERY_STATUS | SERVICE_START) ) != NULL) { if (StartService(hService, 0, 0)) { if ( IsDebuggerPresent() ) OutputDebugString("AFSD Service start successful\n"); fRenewMaps = TRUE; } else if ( IsDebuggerPresent() ) OutputDebugString("AFSD Service start failed\n"); CloseServiceHandle (hService); } CloseServiceHandle (hManager); } KFW_AFS_wait_for_service_start(); } KFW_initialize(); // Create a main window. All further initialization will be done during // processing of WM_INITDIALOG. // WNDCLASS wc; if (!GetClassInfo (NULL, WC_DIALOG, &wc)) // Get dialog class info return FALSE; wc.hInstance = THIS_HINST; wc.hIcon = TaLocale_LoadIcon (IDI_MAIN); wc.lpszClassName = cszCLASSNAME; wc.style |= CS_GLOBALCLASS; RegisterClass(&wc); g.hMain = ModelessDialog (IDD_MAIN, NULL, (DLGPROC)Main_DlgProc); if (g.hMain == NULL) return FALSE; // If the service isn't started yet, show our startup wizard. // if (!IsServiceRunning() && !fQuiet) { if (!g.fIsWinNT) Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95); else if (IsServiceConfigured()) ShowStartupWizard(); else if (!IsServerInstalled()) Message (MB_ICONHAND, IDS_UNCONFIG_TITLE, IDS_UNCONFIG_DESC); } if (IsServiceRunning()) { if ( fRenewMaps ) { if ( IsDebuggerPresent() ) OutputDebugString("Renewing Drive Maps\n"); DoMapShareChange(FALSE); } if (fShow) { if ( IsDebuggerPresent() ) OutputDebugString("Displaying Main window\n"); Main_Show (TRUE); } // If the root cell is reachable and we have no tokens // display the Obtain Tokens dialog to the user if ( fAutoInit ) { if ( IsDebuggerPresent() ) OutputDebugString("Obtaining Tokens (if needed)\n"); ObtainTokensFromUserIfNeeded(g.hMain); } } else if ( IsDebuggerPresent() ) OutputDebugString("AFSD Service Stopped\n"); if ( fNetDetect ) { // Start IP Address Change Monitor if ( IsDebuggerPresent() ) OutputDebugString("Activating Network Change Monitor\n"); IpAddrChangeMonitorInit(g.hMain); } Main_EnableRemindTimer(TRUE); return TRUE; }
BOOL AfsAppLib_CrackCredentials (UINT_PTR hCreds, LPTSTR pszCell, LPTSTR pszUser, LPSYSTEMTIME pst, ULONG *pStatus) { BOOL rc = FALSE; ULONG status = 0; UINT_PTR idClient; if ((idClient = AfsAppLib_GetAdminServerClientID()) != 0) { rc = asc_CredentialsCrack (idClient, (PVOID) hCreds, pszCell, pszUser, pst, &status); } else if (OpenClientLibrary()) { char szUserA[ cchRESOURCE ], szUser2A[ cchRESOURCE ]; char szCellA[ cchRESOURCE ]; unsigned long dateExpire; int fHasKasToken; if (afsclient_TokenQuery ((PVOID)hCreds, &dateExpire, szUserA, szUser2A, szCellA, &fHasKasToken, (afs_status_p)&status)) { rc = TRUE; CopyAnsiToString (pszUser, szUserA); CopyAnsiToString (pszCell, szCellA); AfsAppLib_UnixTimeToSystemTime (pst, dateExpire); } CloseClientLibrary(); } if (!hCreds && pStatus) *pStatus = status; return rc; }
BOOL USER::RefreshStatus (BOOL fNotify, ULONG *pStatus) { BOOL rc = TRUE; DWORD status = 0; DWORD kasStatus = 0; DWORD ptsStatus = 0; if (m_fStatusOutOfDate) { m_fStatusOutOfDate = FALSE; if (fNotify) NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); memset (&m_us, 0x00, sizeof(m_us)); FreeString (m_mszOwnerOf); m_mszOwnerOf = NULL; FreeString (m_mszMemberOf); m_mszMemberOf = NULL; TCHAR szFullName[ cchNAME ]; AfsClass_GenFullUserName (szFullName, m_szPrincipal, m_szInstance); LPCELL lpCell; if ((lpCell = OpenCell (&status)) == NULL) rc = FALSE; else { PVOID hCell; if ((hCell = lpCell->GetCellObject (&status)) == NULL) rc = FALSE; else { // Try to get KAS information. // WORKERPACKET wpGetKas; wpGetKas.wpKasPrincipalGet.hCell = hCell; wpGetKas.wpKasPrincipalGet.hServer = lpCell->GetKasObject (&kasStatus); wpGetKas.wpKasPrincipalGet.pszPrincipal = m_szPrincipal; wpGetKas.wpKasPrincipalGet.pszInstance = m_szInstance; if (Worker_DoTask (wtaskKasPrincipalGet, &wpGetKas, &kasStatus)) { m_us.fHaveKasInfo = TRUE; TCHAR szLastModPrincipal[ cchNAME ]; TCHAR szLastModInstance[ cchNAME ]; CopyAnsiToString (szLastModPrincipal, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.principal); CopyAnsiToString (szLastModInstance, wpGetKas.wpKasPrincipalGet.Data.lastModPrincipal.instance); m_us.KASINFO.fIsAdmin = (wpGetKas.wpKasPrincipalGet.Data.adminSetting == KAS_ADMIN) ? TRUE : FALSE; m_us.KASINFO.fCanGetTickets = (wpGetKas.wpKasPrincipalGet.Data.tgsSetting == TGS) ? TRUE : FALSE; m_us.KASINFO.fEncrypt = (wpGetKas.wpKasPrincipalGet.Data.encSetting == ENCRYPT) ? TRUE : FALSE; m_us.KASINFO.fCanChangePassword = (wpGetKas.wpKasPrincipalGet.Data.cpwSetting == CHANGE_PASSWORD) ? TRUE : FALSE; m_us.KASINFO.fCanReusePasswords = (wpGetKas.wpKasPrincipalGet.Data.rpwSetting == REUSE_PASSWORD) ? TRUE : FALSE; AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeExpires, wpGetKas.wpKasPrincipalGet.Data.userExpiration); AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastPwChange, wpGetKas.wpKasPrincipalGet.Data.lastChangePasswordTime); AfsClass_UnixTimeToSystemTime (&m_us.KASINFO.timeLastMod, wpGetKas.wpKasPrincipalGet.Data.lastModTime); m_us.KASINFO.lpiLastMod = IDENT::FindUser (m_lpiCell, szLastModPrincipal, szLastModInstance); m_us.KASINFO.csecTicketLifetime = wpGetKas.wpKasPrincipalGet.Data.maxTicketLifetime; m_us.KASINFO.keyVersion = wpGetKas.wpKasPrincipalGet.Data.keyVersion; memcpy (&m_us.KASINFO.key.key, &wpGetKas.wpKasPrincipalGet.Data.key.key, ENCRYPTIONKEY_LEN); m_us.KASINFO.dwKeyChecksum = wpGetKas.wpKasPrincipalGet.Data.keyCheckSum; m_us.KASINFO.cdayPwExpire = wpGetKas.wpKasPrincipalGet.Data.daysToPasswordExpire; m_us.KASINFO.cFailLogin = wpGetKas.wpKasPrincipalGet.Data.failLoginCount; m_us.KASINFO.csecFailLoginLock = wpGetKas.wpKasPrincipalGet.Data.lockTime; } // Try to get PTS information. // WORKERPACKET wpGetPts; wpGetPts.wpPtsUserGet.hCell = hCell; wpGetPts.wpPtsUserGet.pszUser = szFullName; if (Worker_DoTask (wtaskPtsUserGet, &wpGetPts, &ptsStatus)) { m_us.fHavePtsInfo = TRUE; m_us.PTSINFO.cgroupCreationQuota = wpGetPts.wpPtsUserGet.Entry.groupCreationQuota; m_us.PTSINFO.cgroupMember = wpGetPts.wpPtsUserGet.Entry.groupMembershipCount; m_us.PTSINFO.uidName = wpGetPts.wpPtsUserGet.Entry.nameUid; m_us.PTSINFO.uidOwner = wpGetPts.wpPtsUserGet.Entry.ownerUid; m_us.PTSINFO.uidCreator = wpGetPts.wpPtsUserGet.Entry.creatorUid; CopyAnsiToString (m_us.PTSINFO.szOwner, wpGetPts.wpPtsUserGet.Entry.owner); CopyAnsiToString (m_us.PTSINFO.szCreator, wpGetPts.wpPtsUserGet.Entry.creator); m_us.PTSINFO.aaListStatus = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listStatus); m_us.PTSINFO.aaGroupsOwned = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listGroupsOwned); m_us.PTSINFO.aaMembership = USERACCESS_TO_ACCOUNTACCESS (wpGetPts.wpPtsUserGet.Entry.listMembership); } // Grab the list of groups to which this user belongs // WORKERPACKET wpBegin; wpBegin.wpPtsUserMemberListBegin.hCell = hCell; wpBegin.wpPtsUserMemberListBegin.pszUser = szFullName; if (Worker_DoTask (wtaskPtsUserMemberListBegin, &wpBegin, &status)) { for (;;) { TCHAR szGroup[ cchNAME ]; WORKERPACKET wpNext; wpNext.wpPtsUserMemberListNext.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum; wpNext.wpPtsUserMemberListNext.pszGroup = szGroup; if (!Worker_DoTask (wtaskPtsUserMemberListNext, &wpNext)) break; FormatMultiString (&m_mszMemberOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup); } WORKERPACKET wpDone; wpDone.wpPtsUserMemberListDone.hEnum = wpBegin.wpPtsUserMemberListBegin.hEnum; Worker_DoTask (wtaskPtsUserMemberListDone, &wpDone); } // Grab the list of groups which this user owns // wpBegin.wpPtsOwnedGroupListBegin.hCell = hCell; wpBegin.wpPtsOwnedGroupListBegin.pszOwner = szFullName; if (Worker_DoTask (wtaskPtsOwnedGroupListBegin, &wpBegin, &status)) { for (;;) { TCHAR szGroup[ cchNAME ]; WORKERPACKET wpNext; wpNext.wpPtsOwnedGroupListNext.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum; wpNext.wpPtsOwnedGroupListNext.pszGroup = szGroup; if (!Worker_DoTask (wtaskPtsOwnedGroupListNext, &wpNext)) break; FormatMultiString (&m_mszOwnerOf, FALSE, TEXT("%1"), TEXT("%s"), szGroup); } WORKERPACKET wpDone; wpDone.wpPtsOwnedGroupListDone.hEnum = wpBegin.wpPtsOwnedGroupListBegin.hEnum; Worker_DoTask (wtaskPtsOwnedGroupListDone, &wpDone); } } lpCell->Close(); } if (fNotify) NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), ((rc) ? 0 : status)); } if (rc && (!m_us.fHaveKasInfo) && (!status) && kasStatus) { status = kasStatus; rc = FALSE; } if (rc && (!m_us.fHavePtsInfo) && (!status) && ptsStatus) { status = ptsStatus; // not fatal; rc remains TRUE } if (pStatus && !rc) *pStatus = status; return TRUE; }