AnyConnect Secure Mobility Client 5.1.8.105

include/ClientIfcBase.h

00001 /**************************************************************************
00002 *   Copyright (c) 2006, 2021-2024 Cisco Systems, Inc.
00003 *   All Rights Reserved. Cisco Highly Confidential.
00004 ***************************************************************************
00005 *
00006 *   File:   ClientIfcBase.h
00007 *   Author: Chris Fitzgerald
00008 *   Date:   08/2007
00009 *
00010 ***************************************************************************
00011 *   Client Interface Base class implementation for the Client API.
00012 ***************************************************************************/
00013 
00014 #ifndef _CLIENTIFCBASE_
00015 #define _CLIENTIFCBASE_
00016 
00017 #include <list>
00018 #include <vector>
00019 #include <memory>
00020 
00021 #include "ClientIfcCommon.h"
00022 #include "api.h"
00023 
00024 #if defined(ANYCONNECT_USE_SNAK)
00025 #include "SNAK_CertPlugin.h"
00026 #endif
00027 
00028 #if defined(HOST_DATA_SUPPORTED)
00029 class IHostData;
00030 #endif
00031 
00032 class ConnectPromptInfo;
00033 class MsgWithArg;
00034 class VPNStats;
00035 class PreferenceInfo;
00036 class ProxyIfc;
00037 class CIpcMessage;
00038 class CertObj;
00039 class HostEntry;
00040 class ClientIfcInternal;
00041 
00042 #if defined(VPNAPI_EVENT_NOTIFICATION_SUPPORTED)
00043 class CEventNotificationTlv;
00044 #endif
00045 
00046 #if defined(CREDENTIAL_PREFILL_SUPPORTED)
00047 class CredentialPrefill;
00048 #endif
00049 
00050 #if (defined(ANYCONNECT_USE_SNAK) || defined(PLATFORM_APPLE_SSLVPN)) && !defined(PLATFORM_WIN_APP)
00051 class ManagedCertificate;
00052 #endif
00053 
00054 #if defined(PROGRAM_DATA_IMPORT_SUPPORTED)
00055 class IACImporterAsync;
00056 class IACImporterAsyncCB;
00057 #endif
00058 
00059 class VPN_VPNAPI ClientIfcBase
00060 {
00061     friend class EventMgr;
00062     friend class ClientIfcInternal;
00063 
00064 protected:
00065 
00066         ClientIfcBase();
00067         virtual ~ClientIfcBase();
00068 
00069         /**
00070         * Callback used to deliver new statistics related to the VPN
00071         * connection.
00072         *
00073         * When a connection is active, a new set of statistics is
00074         * delivered each second.
00075         *
00076         * @see resetStats(), stopStats() and startStats()
00077         *
00078         */
00079         virtual void StatsCB(VPNStats &stats) = 0;
00080 
00081 
00082         /**
00083         * Callback used to deliver VPN state and state change string.
00084         * The stateString delivered by this method is localized.
00085         *
00086         * See the ::VPNState enum found in api.h for set of valid states.
00087         */
00088         virtual void StateCB(const VPNState state,
00089                              const VPNSubState subState,
00090                              const tstring stateString) = 0;
00091 
00092 
00093         /**
00094         * If a banner needs to be acknowledged, this CB delivers the banner
00095         * to the client.
00096         *
00097         * NOTE: Connection establishment will block until the method
00098         * setBannerResponse() is called.
00099         *
00100         * In a GUI, a banner would typically be displayed in a modal dialog
00101         * with an accept or decline button selection.
00102         *
00103         * @see setBannerResponse() to set the user response to the banner.
00104         */
00105         virtual void BannerCB(const tstring &banner) = 0;
00106 
00107         /**
00108          * If a pre-connect reminder needs to be acknowledged, this CB delivers
00109          * the pre-connect reminder to the client. 
00110          *
00111          * NOTE: Connection establishment will block until the method
00112          * setPreConnectReminderResponse() is called.
00113          *
00114          * In a GUI, a pre-connect reminder would typically be displayed in a modal
00115          * dialog with an OK button selection.
00116          *
00117          * @see setPreConnectReminderResponse() to set the user acknowledgement to
00118          * the pre-connect reminder message.
00119          */  
00120         virtual void PreConnectReminderCB(const tstring &rtstrPreConnectReminder);
00121 
00122         /**
00123         * Messages are delivered via the NoticeCB and can come from multiple
00124         * sources.  There are four message types (error, warning, info and
00125         * status).  See the ::MessageType enum in api.h for the list.
00126         *
00127         * Clients using the API as an embedded application (not
00128         * user visible) might want to further characterize
00129         * messages.  One option here is to use the AnyConnect message
00130         * catalog and assign message codes as the translations for
00131         * various messages.  An application could then track messages based
00132         * on its own error code scheme.
00133         */    
00134         virtual void NoticeCB(const tstring &notice,
00135                               const MessageType type,
00136                               const bool bSensitive = false) = 0;
00137 
00138 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK)
00139         virtual void CertBannerCB(const tstring &certBannerSummary,
00140                                   const uint32_t nCertBannerCertLen,
00141                                   const uint8_t *pCertBannerCertDer,
00142                                   const std::list<tstring> &confirmReasons,
00143                                   const std::list<CertConfirmReason> &confirmReasonEnums,
00144                                   bool bImportAllowed = true) = 0;
00145 #endif
00146 
00147         /**
00148         * This CB would likely occur only during a connection when it was
00149         * detected that the software needed to be upgraded, or when Start
00150         * Before Logon (SBL) is being used.
00151         *
00152         * Unlike the other callback methods, this method provides a default
00153         * implementation (calling the system's exit() function).
00154         * If clients of the API wish to override this behavior, they are
00155         * responsible for ensuring that the current running process exits with
00156         * the return code specified by returnCode.
00157         *
00158         * <b>Caution</b>: IF YOU OVERRIDE THIS METHOD AND DO NOT EXIT WITH
00159         * THE PROPER CODE SOFTWARE UPDATE FUNCTIONALITY IN YOUR CLIENT WILL
00160         * BREAK
00161         */
00162         virtual void ExitNoticeCB(const tstring &tstrNotice,
00163                                   const int returnCode);
00164 
00165 
00166         /**
00167         * Under normal operating conditions, this CB is called as soon
00168         * as the attach method completes.  In case the service (vpn agent)
00169         * is not ready, this CB is not called until it is.
00170         *
00171         * Any API calls made prior to this CB being called will result in a
00172         * NoticeCB error message.
00173         */
00174         virtual void ServiceReadyCB() = 0;
00175 
00176 
00177 
00178         /**
00179         * This method supports prompting for single or multiple values.  All
00180         * prompts are considered mandatory.
00181         *
00182         * The ConnectPromptInfo object contains a list of PromptEntry
00183         * instances.  The labels and their default values (if any) can be
00184         * found in these instances.  After the data has been collected from the user
00185         * it can be set into these same instances.  When ready, the client
00186         * application should call the method UserSubmit() to have the
00187         * responses read by the API.
00188         */
00189         virtual void UserPromptCB(ConnectPromptInfo &ConnectPrompt) = 0;
00190 
00191 
00192         /**
00193         * Use this method to provide Window Manager hints to GUI
00194         * applications.  To receive these hints, the application must
00195         * identify itself as a GUI in the attach method.  In addition, this
00196         * method should be overridden to receive any generated events.
00197         *
00198         * Event that can be received include those indicating that a user is
00199         * starting a second instance of the GUI application.  This information
00200         * can be used to tell the already running application to un-minimize
00201         * itself and let the new program know that it should Quit (since a GUI
00202         * is already running).
00203         */
00204         virtual void WMHintCB(const WMHint hint,
00205                               const WMHintReason reason);
00206 
00207 
00208         /**
00209         * This method is useful when the connection to the secure gateway
00210         * has been established as part of a web-launch of the VPN tunnel.
00211         *
00212         * If the client application wishes to be notified of the secure
00213         * gateway to which the VPN has been established, this method should
00214         * be overridden.
00215         *
00216         * If the client application is started and a tunnel is already active,
00217         * this method also delivers the name of the secure gateway host.
00218         */
00219         virtual void deliverWebLaunchHostCB(const tstring &activeHost);
00220 
00221         /**
00222         * This method is called when the preference to block untrusted
00223         * servers is enabled and the current VPN server being connected
00224         * to is untrusted. Clients should present an error to the user
00225         * notifying them that the current connection to rtstrUntrustedServer
00226         * is being blocked. The client should also provide a way for the
00227         * user to change the preference to block untrusted servers.
00228         *
00229         * The user response must be indicated using setCertBlockedResponse
00230         */
00231         virtual void CertBlockedCB(const tstring &rtstrUntrustedServer) = 0;
00232 
00233         /**
00234         * This method is called when connections to untrusted VPN servers
00235         * is allowed by policies and the current VPN server being connected
00236         * to is untrusted. Clients should present a warning to the user
00237         * notifying them that the current connection to rtstrUntrustedServer
00238         * is unsafe. The reason the VPN server is untrusted is provided in
00239         * rltstrCertErrors. The client should provide a way for the user to
00240         * connect once, connect and always trust or cancel the connection.
00241         * If bAllowImport is set to false then the always trust option should
00242         * not be presented to users.
00243         *
00244         * The user response must be indicated using setCertWarningResponse
00245         */
00246         virtual void CertWarningCB(const tstring &rtstrUntrustedServer,
00247                                    const std::list<tstring> &rltstrCertErrors,
00248                                    bool bAllowImport) = 0;
00249 
00250 #if defined(PLATFORM_WIN_APP)
00251         /**
00252         * Same as above but also passes the Server certificate DER for details display
00253         */
00254         virtual void CertWarningCB(const tstring &rtstrUntrustedServer,
00255                                    const std::list<tstring> &rltstrCertErrors,
00256                                    const std::vector<uint8_t> &rvServerCertDER,
00257                                    bool bAllowImport) = 0;
00258 #endif
00259 
00260         /**
00261         * This method should be overridden by the client application to
00262         * exercise some control over the delivery of events from the other
00263         * protected methods in this class.
00264         *
00265         * This might be necessary in cases where a GUI/CLI is being written and
00266         * the data from this API needs to be delivered in the GUI/CLI or main
00267         * thread.  In this case, you should override this method and when it
00268         * is called by the API post an event to your event queue (message
00269         * pump, etc.).  After this event executes in your GUI/CLI or main thread,
00270         * call the method ClientIfc::ProcessEvents to have events delivered
00271         * to your client application.
00272         */
00273         virtual void EventAvailable();
00274 
00275 #if defined(MANUAL_PKCS12_IMPORT_SUPPORTED)
00276         virtual void ImportPKCS12ResultCB(const std::vector<uint8_t> &certHash,
00277                                           const tstring &tstrError);
00278 #endif        
00279 #if defined(PLATFORM_ANDROID)
00280         virtual void ClientCertificateCB(std::vector< std::pair<uint32_t, uint8_t*> > certList) = 0;
00281         virtual void AgentDetachedCB();
00282 #endif
00283 
00284 #if defined(VPNAPI_EVENT_NOTIFICATION_SUPPORTED)
00285         /**
00286         * Internal callback between ClientIfcBase and ClientIfc.
00287         */
00288         virtual void EventNotificationInternalCB(
00289             const std::shared_ptr<CEventNotificationTlv>& spEventNtfctnTlv) = 0;
00290 #endif
00291 
00292 
00293         /**
00294         * Internal methods for use by ClientIfc.
00295         */
00296 
00297         void ResetQuarantinedReconnect();
00298 
00299         void ClientIfcTransmigration();
00300 
00301 public:
00302 
00303         bool attach(const ClientType clientType = ClientType_GUI,
00304                     const bool requestFullCapabilities = true,
00305                     const bool suppressAutoConnect = true,
00306                     const bool bSuppressEventAvailableCB = false);
00307 
00308         void detach();
00309 
00310         void ProcessEvents();
00311 
00312         bool hasFullCapabilities();
00313 
00314         bool isConnected(bool bSilent = false);
00315 
00316         bool isAvailable();
00317 
00318         std::list<tstring> getHostNames();
00319 
00320         std::list<HostEntry> getHostEntries();
00321 
00322         tstring getDefaultHostName();
00323 
00324         bool connect(
00325 #if defined(HOST_DATA_SUPPORTED)
00326             const IHostData& host);
00327 #else
00328             tstring host);
00329 #endif
00330 
00331         bool connect(
00332 #if defined(HOST_DATA_SUPPORTED)
00333             const IHostData& host,
00334 #else
00335             tstring host,
00336 #endif
00337             unsigned int origin);
00338 
00339         bool setNewTunnelGroup(const tstring & group);
00340 
00341         void disconnect();
00342 
00343         void cancel();
00344 
00345         void resetStats();
00346 
00347         void getState();
00348 
00349         VPNState getCurrentVPNState();
00350         VPNSubState getCurrentVPNSubState();
00351         VPNSubState getPreviousVPNSubState();
00352 
00353         STATE getCurrentState();
00354 
00355         tstring getStateText();
00356         static tstring getNoticeTypeText(MessageType msgType);
00357 
00358         static tstring getStateText(VPNState state,
00359                                     VPNSubState subState = VPNSS_NORMAL,
00360                                     NETENV_STATE netEnvState = NES_NETWORK_ACCESSIBLE,
00361                                     const tstring& tstrConnectedHost = tstring());
00362 
00363         void setNetworkStates(NETENV_STATE netEnvState, 
00364                               NETCTRL_STATE netCtrlState,
00365                               NETWORK_TYPE netType,
00366                               bool bACBrowserForCPRemediation,
00367                               bool bUpdateUI);
00368         void refreshOperatingModeForCurrentNetStates();
00369         NETENV_STATE getCurrentNetEnvState();
00370         NETENV_STATE getPreviousNetEnvState();
00371         NETCTRL_STATE getCurrentNetCtrlState();
00372         NETWORK_TYPE getCurrentNetType();
00373         bool isACBrowserForCPRemediation();
00374 
00375         static tstring getNetCtrlText(NETCTRL_STATE netCtrlState);
00376         static tstring getNetEnvText(NETENV_STATE netEnvState,
00377                                      bool bSimple = false);
00378         static tstring getNetTypeText(NETWORK_TYPE netType);
00379         static tstring getQuarantinedStatusText();
00380         static tstring getNetworkStatusSimpleText(const NETENV_STATE netEnvState,
00381                                                   const NETCTRL_STATE netCtrlState);
00382 
00383         // can't be static due to requiring operating mode information
00384         tstring getNetworkStatusText(const VPNState state,
00385                                      const VPNSubState subState,
00386                                      const NETENV_STATE netEnvState,
00387                                      const NETCTRL_STATE netCtrlState);
00388 
00389         PreferenceInfo& getPreferences();
00390 
00391         bool savePreferences();
00392 
00393         void startStats();
00394 
00395         void stopStats();
00396 
00397         void UserSubmit();
00398 
00399         void setBanner(const tstring &banner);
00400         void setBannerResponse(bool bResponse);
00401 
00402         void setPreConnectReminder(const tstring &tstrPreConnectReminder);
00403         void setPreConnectReminderResponse();
00404 
00405         bool getUserResponse();
00406         bool isUserResponseSet();
00407 
00408         void setCertBlocked(const tstring &tstrUntrustedServer);
00409         void setCertWarning(const tstring &rtstrUntrustedServer,
00410                             const std::list<tstring> &rltstrCertErrors,
00411                             bool bAllowImport);
00412 #if defined(PLATFORM_WIN_APP)
00413         void setCertWarning(const tstring &rtstrUntrustedServer,
00414                             const std::list<tstring> &rltstrCertErrors,
00415                             const std::vector<uint8_t>& rvServerCertDER,
00416                             bool bAllowImport);
00417 #endif
00418         bool getCertImportResponse();
00419 
00420 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK)
00421         void setCertBanner(tstring tstrCertBannerSummary,
00422                            uint32_t nCertBannerCertLen,
00423                            const uint8_t *pCertBannerCertDer,
00424                            const std::list<tstring> &confirmReasons,
00425                            const std::list<CertConfirmReason> &confirmReasonEnums,
00426                            bool bImportAllowed);
00427 
00428         void setCertBannerResponse(bool bResponse, bool bImportCert);
00429         void importServerCert(std::vector<uint8_t> certData);
00430         bool setFipsMode(bool bEnableFips);
00431 #if defined(PLATFORM_ANDROID)
00432         bool setStrictMode(bool bEnableStrictMode);
00433         bool setRevocationEnabled(bool bRevocationEnabled);
00434         bool IsRevocationEnabled();
00435 #endif // currently supported only for android
00436 #endif
00437 
00438         void setUserPrompt(ConnectPromptInfo &ConnectPrompt);
00439 
00440 #if defined(PLATFORM_ANDROID)
00441         void setClientCertResponse(std::vector< std::pair<uint32_t, uint8_t*> > &derList);
00442         void setAgentDetached();
00443         bool getClientCertificates();
00444 #endif
00445 
00446 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID)
00447         void setSCEPEnrollInProgress(bool bInProgress);
00448         bool isSCEPEnrollInProgress();
00449 #endif
00450 
00451 #if defined(MANUAL_PKCS12_IMPORT_SUPPORTED)
00452         void setImportPKCS12Result(const std::vector<uint8_t> &certHash, const tstring &tstrError);
00453         bool requestImportPKCS12(const std::vector<uint8_t> &data);
00454         std::vector<uint8_t> importPKCS12WithPassword(const std::vector<uint8_t> &data, const tstring &password);
00455 #endif
00456 
00457         void setCertBlockedResponse(bool bUnlock);
00458         void setCertWarningResponse(bool bConnect, bool bImportCert);
00459 
00460         void insertStateToConnectPrompt(ConnectPromptInfo &ConnectPrompt);
00461 
00462         void ExitNotice(const tstring &tstrNotice, const int code = 0);
00463 
00464         void notice(const tstring &tstrNotice,
00465                     const MessageType type = MsgType_Info,
00466                     bool bClearLastMsg = false,
00467                     bool bForce = false,
00468                     bool bStateMsg = false,
00469                     bool bSensitiveMsg = false);
00470 
00471         void notice(MsgWithArg &notice,
00472                     const MessageType type = MsgType_Info,
00473                     bool bClearLastMsg = false,
00474                     bool bForce = false,
00475                     bool bStateMsg = false,
00476                     bool bSensitiveMsg = false);
00477 
00478         void getStats(void);
00479 
00480         void setStats(VPNStats &stats);
00481 
00482         void exportStats(const tstring &tstrFilePath);
00483 
00484         void initState(VPNState state,
00485                        VPNState previousState,
00486                        VPNSubState subState);
00487 
00488         void setState(VPNState state,
00489                       VPNState previousState,
00490                       VPNSubState subState = VPNSS_NORMAL,
00491                       bool bUpdateStateMsg = true,
00492                       bool bOnlyUpdateUI = false);
00493 
00494 #if defined(PROGRAM_DATA_IMPORT_SUPPORTED)
00495         IACImporterAsync *createACImporter(IACImporterAsyncCB *pCallback);
00496 #endif
00497 
00498         void setWMHint(WMHint hint,
00499                        WMHintReason reason);
00500 
00501         bool isLastConnectType (const ConnectPromptType connPromptType);
00502 
00503         bool isOperatingMode(OperatingMode opMode);
00504         void setOperatingMode(OperatingMode opMode);
00505         void unsetOperatingMode(OperatingMode opMode);
00506 
00507         bool CanRemediateCaptivePortal();
00508         bool policyAllowsCaptivePortalRemediation();
00509 
00510         bool isEventShutdown();
00511 
00512         bool isUsingEventModel();
00513 
00514         time_t getLastDisconnectTime();
00515 
00516         ConnectPromptInfo getConnectPromptInfo();
00517         void resetConnectPromptPasswordData();
00518 
00519         void setStandaloneConnection(bool isStandalone);
00520 
00521         void deliverActiveHost(const tstring &activeHost,
00522                                ConnectProtocolType vpnProtocol = PROTOCOL_TYPE_UNKNOWN,
00523                                bool bActiveHostFriendlyName = false);
00524 
00525         bool isVPNServiceReady();
00526 
00527         // reset last disconnect time indicator.
00528         //
00529         void resetLastDisconnectTime(time_t time = 1);
00530 
00531         void processMinimize();
00532         
00533         // cert enrollment
00534         void setEnrollClientCert(CertObj* pCert);
00535 
00536         // Show user banner for cert import warning on linux
00537         // SCEPIfc to ConnectMgr
00538         void linuxCertImportWarnUser();
00539 
00540         // Response to cert warning on linux
00541         // ConnectMgr to SCEPIfc
00542         void linuxCertImportWarnUserResponse(bool bAccept);
00543 
00544         void setDefaultHost(tstring &host);
00545 
00546 #if defined(HOST_DATA_SUPPORTED)
00547         void setDefaultHostProfile(const IHostData &hostProfile);
00548         IHostData* getDefaultHostData();
00549 #endif
00550 
00551         void setLastVpnError(VPNError vpnError);
00552         VPNError getLastVpnError();
00553 
00554 #if defined(PLATFORM_ANDROID)
00555         bool requestClientCertificates();
00556 #endif
00557 
00558         bool requestImportLocalization(const tstring tstrLocale,
00559                                        const std::vector<unsigned char> &MoFileData);
00560 
00561         // Start the Automatic Headend Selection operation
00562         void startAHS(const unsigned int uiReason, 
00563                       const ProxyIfc& proxy);
00564         // statusReturnCode is a long to match the current type of STATUSCODE.
00565         // It is not using a STATUSCODE directly so that we do not have to
00566         // expose the header files for STATUSCODEs to ClientIfcBase.h
00567         void AHSSelectedHost(const unsigned int uiReason,
00568                              const std::vector<tstring> &headendList,
00569                              const long statusReturnCode,
00570                              const tstring& extraInfo);
00571         std::vector<tstring> getAHSHostList();
00572         unsigned int getAHSState();
00573         bool isAHSHasRun();
00574     bool IsAHSCachingRestricted();
00575 
00576         bool suppressConnectionErrorPopups();
00577 
00578         tstring getCaptivePortalDetectedMsg();
00579 
00580         void setProxyAuthPrompts(ProxyIfc* pProxy,
00581                                  const tstring& promptMsg);
00582 
00583 #if defined(INTERPROCESS_COMMUNICATION_SUPPORTED)
00584         bool handleIpcMessage(CIpcMessage *pIpcMessage);
00585 #if defined(VPNAPI_EVENT_NOTIFICATION_SUPPORTED)
00586         void signalDisconnectedToEventNtfctnThread();
00587 #endif
00588 #endif
00589         bool IsCsdTokenVerified() const;
00590 
00591 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID)
00592         virtual void SCEPEnrollStartCB();
00593         virtual void SCEPEnrollExitCB();
00594 #endif
00595         
00596         void activateConnectMgrTunnelInitiationCompletionEvent();
00597         bool isConnectRequestActive();
00598         bool isConnectRequestCleanup();
00599 #if defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK)
00600         bool deleteProfileByName(const tstring &profileName);
00601         tstring getProfileContents(const tstring &profileName);
00602         bool importProfile(const tstring &profileName, const tstring &profileContents);
00603 #endif
00604 
00605         bool syncProfileChange(const tstring &profileName);
00606 
00607 #if defined(CREDENTIAL_PREFILL_SUPPORTED)
00608         bool hasPrefilledCredentials();
00609         bool prefillCredentials(ConnectPromptInfo &connectPrompt);
00610         void setPrefilledCredentials(CredentialPrefill *prefill);
00611 #endif
00612 
00613 #if defined(PLATFORM_ANDROID) || defined(PLATFORM_APPLE_SSLVPN)
00614         std::list<ManagedCertificate *> enumerateCertificates(CertificateType certType);
00615         bool deleteCertificates(CertificateType certType, const std::list<std::string> &idList);
00616         bool deleteServerCertificates(const std::list<std::string> &idList);
00617 #endif
00618 
00619 #if defined(ANYCONNECT_USE_SNAK) && !defined(PLATFORM_WIN_APP)
00620         std::list<ManagedCertificate *> enumerateSNAKCertificates(SNAK_CertType certType);
00621         SNAK_CertType getSNAKCertType(CertificateType certType);
00622         bool deleteClientCertificates(const std::list<std::string> &idList);
00623 #endif
00624 
00625 #if defined(PLATFORM_APPLE_SSLVPN)
00626         bool canUseBackupServers();
00627 #endif
00628 
00629         tstring getConnectHost();
00630 
00631         tstring getMgmtTunnelHostname();
00632 
00633         VPN_TUNNEL_SCOPE getVpnTunnelScope();
00634 
00635         bool isStandaloneConnection();
00636 
00637         void sendSSoLogoutPrompt(ConnectPromptInfo &cpi);
00638 
00639         void setExternalSSOLogoutUrlFromAgent(const tstring& logoutUrl);
00640 
00641 private:
00642 
00643     //
00644     // Private Member Data
00645     //
00646 
00647     std::unique_ptr<ClientIfcInternal> m_upClientIfcInternal;
00648 
00649 
00650     //
00651     // Private Member Methods
00652     //
00653 
00654     // Prevent copying by declaring but not defining copy constructor and operator= methods.
00655     //
00656     ClientIfcBase(const ClientIfcBase& other);
00657     ClientIfcBase& operator=(const ClientIfcBase& other);
00658 };
00659 
00660 #endif // _CLIENTIFCBASE_