AnyConnect Secure Mobility Client  4.0.00061
include/ClientIfcBase.h
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> &ltstrCertErrors,
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 &notice,
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_