![]() |
AnyConnect Secure Mobility Client 5.1.8.105
|
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 ¬ice, 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 ¬ice, 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_