AnyConnect Secure Mobility Client
4.0.00061
|
00001 /************************************************************************** 00002 * Copyright (c) 2006, Cisco Systems, All Rights Reserved 00003 *************************************************************************** 00004 * 00005 * File: ClientIfcBase.h 00006 * Author: Chris Fitzgerald 00007 * Date: 08/2007 00008 * 00009 *************************************************************************** 00010 * 00011 * Client Interface Base class implementation for the Client API. 00012 * 00013 ***************************************************************************/ 00014 00015 // The ClientIfcBase class contains the majority of private methods and members. 00016 // The purpose of this class is to hide all but the necessary methods from 00017 // being exposed. 00018 // 00019 00020 #ifndef _CLIENTIFCBASE_ 00021 #define _CLIENTIFCBASE_ 00022 00023 #include <list> 00024 #include <vector> 00025 00026 /* 00027 * When changing the SCRIPTING_SUPPORTED definition, you MUST also update GenDefs.h! 00028 * We duplicate this definition here due to the manner in which we distribute our 00029 * code to partners; we cannot include GenDefs.h from here. 00030 */ 00031 #if !defined(PLATFORM_APPLE_SSLVPN) && !defined(PLATFORM_ANDROID) 00032 #define SCRIPTING_SUPPORTED 00033 #endif 00034 00035 #include "api.h" 00036 #include "PreferenceUpdate.h" 00037 00038 class ConnectPromptInfo; 00039 class ConnectMgr; 00040 class MsgWithArg; 00041 class VPNStats; 00042 class AgentIfc; 00043 class ProfileMgr; 00044 class ApiThread; 00045 class EventMgr; 00046 class PreferenceMgr; 00047 class PreferenceInfo; 00048 class UserPreferences; 00049 class CScriptingMgr; 00050 class CManualLock; 00051 class ApiThread; 00052 class ProxyIfc; 00053 class CIpcMessage; 00054 class SCEPIfc; 00055 class CertObj; 00056 class CExecutionContext; 00057 class HostEntry; 00058 00059 #if !defined(PLATFORM_APPLE_SSLVPN) 00060 class CStoragePath; 00061 #endif 00062 00063 #ifdef ANYCONNECT_USE_SNAK 00064 class PluginLoader; 00065 class SNAK_StoragePlugin; 00066 class SNAK_CertPlugin; 00067 class SNAK_SocketPlugin; 00068 #endif 00069 00070 class VPN_VPNAPI ClientIfcBase : private IPreferenceUpdateCB 00071 { 00072 friend class EventMgr; 00073 00074 protected: 00075 00076 virtual void StatsCB(VPNStats &stats) = 0; 00077 00078 virtual void StateCB(const VPNState state, 00079 const tstring stateString) = 0; 00080 00081 virtual void BannerCB(const tstring &banner) = 0; 00082 00083 virtual void NoticeCB(const tstring notice, 00084 const MessageType type) = 0; 00085 00086 virtual void ExitNoticeCB(const tstring &tstrNotice, 00087 const int returnCode); 00088 00089 virtual void ServiceReadyCB() = 0; 00090 00091 virtual void UserPromptCB(ConnectPromptInfo &ConnectPrompt) = 0; 00092 00093 virtual void WMHintCB(const WMHint hint, 00094 const WMHintReason reason); 00095 00096 virtual void deliverWebLaunchHostCB(const tstring &activeHost); 00097 00098 virtual void EventAvailable(); 00099 00100 #ifdef PLATFORM_ANDROID 00101 virtual void ClientCertificateCB(std::vector< std::pair<uint32_t, uint8_t*> > certList) = 0; 00102 virtual void AgentDetachedCB(); 00103 #endif 00104 00105 virtual void ImportPKCS12ResultCB(bool bResult, const tstring &strError); 00106 00107 virtual void CertBlockedCB(const tstring &rtstrUntrustedServer) = 0; 00108 virtual void CertWarningCB(const tstring &rtstrUntrustedServer, 00109 const std::list<tstring> &rltstrCertErrors, 00110 bool bAllowImport) = 0; 00111 00112 AgentIfc &getAgentIfc(); 00113 00114 ClientIfcBase(); 00115 00116 00117 public: 00118 00119 virtual bool attach(bool SBL = false, 00120 bool isGUI = true, 00121 bool requestFullCapabilities = true, 00122 bool suppressAutoConnect = true); 00123 00124 virtual void detach(); 00125 00126 virtual void ProcessEvents(); 00127 00128 virtual bool hasFullCapabilities(); 00129 00130 virtual bool isConnected(); 00131 00132 virtual bool isAvailable(); 00133 00134 virtual std::list<tstring> getHostNames(); 00135 00136 virtual tstring getDefaultHostName(); 00137 00138 #if defined (PLATFORM_ANDROID) 00139 virtual bool connect(tstring host, const CertAuthMode mode=CertAuth_Automatic, const tstring &hash=""); 00140 00141 bool connect(tstring host, unsigned int origin, const CertAuthMode mode=CertAuth_Automatic, const tstring &hash=""); 00142 #else 00143 virtual bool connect(tstring host); 00144 00145 bool connect(tstring host, unsigned int origin); 00146 #endif 00147 00148 virtual bool setNewTunnelGroup(const tstring & group); 00149 00150 virtual void disconnect(); 00151 00152 virtual void resetStats(); 00153 00154 virtual void getState(); 00155 00156 VPNState getCurrentState(); 00157 VPNSubState getCurrentSubState(); 00158 VPNSubState getPreviousSubState(); 00159 00160 tstring getStateText(); 00161 static tstring getNoticeTypeText(MessageType msgType); 00162 00163 static tstring getStateText(VPNState state, 00164 VPNSubState subState = VPNSS_NORMAL, 00165 NETENV_STATE netEnvState = NES_NETWORK_ACCESSIBLE); 00166 00167 void setNetworkStates(NETENV_STATE netEnvState, 00168 NETCTRL_STATE netCtrlState, 00169 NETWORK_TYPE netType, 00170 bool bUpdateUI); 00171 void refreshOperatingModeForCurrentNetStates(); 00172 NETENV_STATE getCurrentNetEnvState(); 00173 NETENV_STATE getPreviousNetEnvState(); 00174 NETCTRL_STATE getCurrentNetCtrlState(); 00175 NETWORK_TYPE getCurrentNetType(); 00176 00177 static tstring getNetCtrlText(NETCTRL_STATE netCtrlState); 00178 static tstring getNetEnvText(NETENV_STATE netEnvState, 00179 bool bSimple = false); 00180 static tstring getNetTypeText(NETWORK_TYPE netType); 00181 static tstring getQuarantinedStatusText(); 00182 static tstring getNetworkStatusSimpleText(const NETENV_STATE netEnvState, 00183 const NETCTRL_STATE netCtrlState); 00184 00185 // can't be static due to requiring operating mode information 00186 tstring getNetworkStatusText(const VPNState state, 00187 const VPNSubState subState, 00188 const NETENV_STATE netEnvState, 00189 const NETCTRL_STATE netCtrlState); 00190 00191 PreferenceInfo &getPreferences(); 00192 00193 bool savePreferences(); 00194 00195 virtual void startStats(); 00196 00197 virtual void stopStats(); 00198 00199 virtual void UserSubmit(); 00200 00201 void setBanner(const tstring &banner); 00202 void setBannerResponse(bool bResponse); 00203 bool getUserResponse(); 00204 bool isUserResponseSet(); 00205 00206 void setCertBlocked(const tstring &tstrUntrustedServer); 00207 void setCertWarning(const tstring &tstrUntrustedServer, 00208 const std::list<tstring> <strCertErrors, 00209 bool bAllowImport); 00210 bool getCertImportResponse(); 00211 00212 void setUserPrompt(ConnectPromptInfo &ConnectPrompt); 00213 00214 #ifdef PLATFORM_ANDROID 00215 void setClientCertResponse(std::vector< std::pair<uint32_t, uint8_t*> > &derList); 00216 #endif 00217 00218 void setImportPKCS12Result(bool bResult, const tstring &strError); 00219 00220 void setCertBlockedResponse(bool bUnlock); 00221 void setCertWarningResponse(bool bConnect, bool bImportCert); 00222 00223 void insertStateToConnectPrompt(ConnectPromptInfo &ConnectPrompt); 00224 00225 void ExitNotice(const tstring &tstrNotice, const int code = 0); 00226 00227 void notice(const tstring tstrNotice, 00228 const MessageType type = MsgType_Info, 00229 bool bClearLastMsg = false); 00230 00231 void notice(MsgWithArg ¬ice, 00232 const MessageType type = MsgType_Info, 00233 bool bClearLastMsg = false); 00234 00235 void getStats(void); 00236 00237 void setStats(VPNStats &stats); 00238 00239 void exportStats(const tstring &tstrFilePath); 00240 00241 void setState(VPNState state, 00242 VPNState previousState, 00243 VPNSubState subState = VPNSS_NORMAL, 00244 bool bUpdateStateMsg = true, 00245 bool bOnlyUpdateUI = false); 00246 00247 void setWMHint(WMHint hint, 00248 WMHintReason reason); 00249 00250 bool isLastConnectType (const ConnectPromptType connPromptType); 00251 00252 bool isOperatingMode(OperatingMode opMode); 00253 void setOperatingMode(OperatingMode opMode); 00254 void unsetOperatingMode(OperatingMode opMode); 00255 00256 bool CanRemediateCaptivePortal(); 00257 00258 bool isUsingEventModel(); 00259 00260 time_t getLastDisconnectTime(); 00261 00262 ConnectPromptInfo getConnectPromptInfo(); 00263 00264 void setStandaloneConnection(bool isStandalone); 00265 00266 void deliverActiveHost(const tstring &activeHost, 00267 ConnectProtocolType vpnProtocol = PROTOCOL_TYPE_UNKNOWN); 00268 00269 bool isVPNServiceReady(); 00270 00271 // reset last disconnect time indicator. 00272 // 00273 void resetLastDisconnectTime(time_t time = 1); 00274 00275 void processMinimize(); 00276 00277 // cert enrollment 00278 void setEnrollClientCert(CertObj* pCert); 00279 00280 // Show user banner for cert import warning on linux 00281 // SCEPIfc to ConnectMgr 00282 void linuxCertImportWarnUser(); 00283 00284 // Response to cert warning on linux 00285 // ConnectMgr to SCEPIfc 00286 void linuxCertImportWarnUserResponse(bool bAccept); 00287 00288 void setDefaultHost(tstring &host); 00289 00290 #ifdef PLATFORM_ANDROID 00291 bool requestClientCertificates(); 00292 #endif 00293 00294 bool requestImportPKCS12(const std::vector<unsigned char> &der); 00295 00296 bool requestImportLocalization(const tstring tstrLocale, 00297 const std::vector<unsigned char> &MoFileData); 00298 00299 // Start the Automatic Headend Selection operation 00300 void startAHS(const unsigned int uiReason, 00301 const ProxyIfc& proxy); 00302 // statusReturnCode is a long to match the current type of STATUSCODE. 00303 // It is not using a STATUSCODE directly so that we do not have to 00304 // expose the header files for STATUSCODEs to ClientIfcBase.h 00305 void AHSSelectedHost(const unsigned int uiReason, 00306 const std::vector<tstring> &headendList, 00307 const long statusReturnCode, 00308 const tstring& extraInfo); 00309 std::vector<tstring> getAHSHostList(); 00310 unsigned int getAHSState(); 00311 bool isAHSHasRun(); 00312 00313 bool suppressConnectionErrorPopups(); 00314 00315 tstring getCaptivePortalDetectedMsg(); 00316 00317 void setProxyAuthPrompts(ProxyIfc* pProxy, 00318 const tstring& promptMsg); 00319 00320 00321 bool handleIpcMessage(CIpcMessage *pIpcMessage); 00322 00323 bool IsCsdTokenVerified() const; 00324 00325 bool isConnectRequestActive(); 00326 00327 virtual ~ClientIfcBase(); 00328 00329 tstring getConnectHost(); 00330 00331 private: 00332 CExecutionContext* m_pExecutionContext; 00333 00334 AgentIfc *mo_AgentIfc; 00335 00336 ConnectMgr *mo_ConnectMgr; 00337 00338 ApiThread *mo_ConnectThread; 00339 00340 EventMgr *mo_EventMgr; 00341 00342 PreferenceMgr *mo_PreferenceMgr; 00343 00344 ConnectPromptInfo *mp_currentConnectPromptInfo; 00345 00346 PreferenceInfo *mo_EditablePrefs; 00347 00348 #if defined(SCRIPTING_SUPPORTED) 00349 CScriptingMgr *mo_ScriptingMgr; 00350 #endif // SCRIPTING_SUPPORTED 00351 #ifndef PLATFORM_APPLE_SSLVPN 00352 SCEPIfc* m_pSCEPIfc; 00353 bool m_bInformedAgentOfSCEP; 00354 CStoragePath* m_pStoragePath; 00355 #endif // !PLATFORM_APPLE_SSLVPN 00356 00357 #ifdef ANYCONNECT_USE_SNAK 00358 PluginLoader *m_pPluginLoader; 00359 SNAK_CertPlugin *m_pSNAKCert; 00360 SNAK_SocketPlugin *m_pSNAKSocket; 00361 SNAK_StoragePlugin *m_pSNAKStorage; 00362 00363 bool mb_SNAKInitialized; 00364 #endif 00365 00366 bool mb_PreferenceMgrCreated; 00367 bool mb_StandaloneConnection; 00368 bool mb_UsingEventModel; 00369 bool mb_UserResponse; 00370 bool mb_IsUserResponseSet; 00371 bool mb_PerformedAutoCertEnrollment; 00372 tstring ms_PostEnrollmentConnectHost; 00373 bool mb_CaptivePortalMsgDisplayed; 00374 bool m_bSuppressMinimizeOnConnect; 00375 bool m_bSuppressConnectionErrorPopups; 00376 bool m_bLastConnectionAutomatic; 00377 bool m_bImportCertResp; 00378 00379 unsigned int mui_OperatingMode; 00380 NETENV_STATE m_currentNetEnvState; 00381 NETENV_STATE m_previousNetEnvState; 00382 NETCTRL_STATE m_currentNetCtrlState; 00383 NETWORK_TYPE m_currentNetType; 00384 00385 tstring ms_message; 00386 00387 time_t m_disconnectTime; 00388 00389 static std::string ms_ThreadName; 00390 00391 CManualLock* m_pClientIfcStateLock; 00392 CManualLock* m_pClientIfcLock; 00393 CManualLock* m_pClientIfcPromptsLock; 00394 CManualLock* m_pClientIfcOpModeLock; 00395 CManualLock* m_pClientIfcAHSLock; 00396 CManualLock* m_pClientIfcConnectModeLock; 00397 CManualLock* m_pClientIfcInformAgentOfSCEPLock; 00398 00399 std::vector<tstring> msl_AHSSelectedHosts; 00400 ApiThread* m_pAHSThread; 00401 unsigned int m_uiAHSState; 00402 00403 static volatile bool mb_deleteFirstPass; 00404 00405 ConnectMgr &getConnectMgr(); 00406 00407 ProfileMgr &getProfileMgr(); 00408 UserPreferences &getUserPreferences(); 00409 00410 void displayAgentAttachMessage(); 00411 00412 void setLastDisconnectTime(time_t time); 00413 00414 void setCurrentStatePrompts(const VPNState state, 00415 const VPNState prevState, 00416 const VPNSubState subState, 00417 const bool bUpdateStateMsg); 00418 void setCurrentStateErrorMessage(VPNState state, CONNECT_FAILURE_REASON cfr); 00419 void getStateMessage(const VPNState state, 00420 const VPNState prevState, 00421 const VPNSubState subState, 00422 const NETENV_STATE neState, 00423 /*out*/ MsgWithArg& stateMessage); 00424 00425 bool isStandaloneConnection(); 00426 00427 virtual void OnLoadPreferencesComplete(); 00428 void RefreshPreferences(void); 00429 00430 void displayAHSPrompt(const bool isComplete); 00431 void handleAHSPreferences(const unsigned int uiReason); 00432 void setAHSState(const unsigned int ahsState); 00433 00434 bool autoConnectIfEnabled(const bool suppressAutoConnect); 00435 00436 void clearUserSetResponseFlag(); 00437 00438 #ifndef PLATFORM_APPLE_SSLVPN 00439 bool processSCEPIpcMessage(CIpcMessage *pIpcMessage); 00440 bool isSCEPRedirect(); 00441 void processSCEPRedirect(); 00442 #endif // PLATFORM_APPLE_SSLVPN 00443 00444 ClientIfcBase(const ClientIfcBase& other); 00445 ClientIfcBase& operator=(const ClientIfcBase& other); 00446 00447 #ifdef ANYCONNECT_USE_SNAK 00448 bool initializeSNAK(); 00449 #endif 00450 00451 }; 00452 00453 00454 #endif // _CLIENTIFCBASE_