AnyConnect Secure Mobility Client  5.1.19.1862
ClientIfcBase.h
1 /**************************************************************************
2 * Copyright (c) 2006, 2021-2025 Cisco Systems, Inc.
3 * All Rights Reserved. Cisco Highly Confidential.
4 ***************************************************************************
5 *
6 * File: ClientIfcBase.h
7 * Author: Chris Fitzgerald
8 * Date: 08/2007
9 *
10 ***************************************************************************
11 * Client Interface Base class implementation for the Client API.
12 ***************************************************************************/
13 
14 #ifndef _CLIENTIFCBASE_
15 #define _CLIENTIFCBASE_
16 
17 #include <list>
18 #include <vector>
19 #include <memory>
20 
21 #include "ClientIfcCommon.h"
22 #include "api.h"
23 #if defined(PLATFORM_DARWIN)
24 #include "ApprovalStatus.h"
25 #endif
26 
27 #if defined(ANYCONNECT_USE_SNAK)
28 #include "SNAK_CertPlugin.h"
29 #endif
30 
31 #if defined(HOST_DATA_SUPPORTED)
32 class IHostData;
33 #endif
34 
35 class ConnectPromptInfo;
36 class MsgWithArg;
37 class VPNStats;
38 class PreferenceInfo;
39 class ProxyIfc;
40 class CIpcMessage;
41 class CertObj;
42 class HostEntry;
43 class ClientIfcInternal;
44 
45 #if defined(VPNAPI_TRANSMIGRATION_SUPPORTED)
46 class CSharedAccessLock;
47 #endif
48 
49 #if defined(VPNAPI_EVENT_NOTIFICATION_SUPPORTED)
50 class CEventNotificationTlv;
51 #endif
52 
53 #if defined(CREDENTIAL_PREFILL_SUPPORTED)
54 class CredentialPrefill;
55 #endif
56 
57 #if (defined(ANYCONNECT_USE_SNAK) || defined(PLATFORM_APPLE_SSLVPN)) && !defined(PLATFORM_WIN_APP)
58 class ManagedCertificate;
59 #endif
60 
61 #if defined(PROGRAM_DATA_IMPORT_SUPPORTED)
62 class IACImporterAsync;
63 class IACImporterAsyncCB;
64 #endif
65 
66 class VPN_VPNAPI ClientIfcBase
67 {
68  friend class EventMgr;
69  friend class ClientIfcInternal;
70 
71 protected:
72 
73  ClientIfcBase();
74  virtual ~ClientIfcBase();
75 
76  /**
77  * Callback used to deliver new statistics related to the VPN
78  * connection.
79  *
80  * When a connection is active, a new set of statistics is
81  * delivered each second.
82  *
83  * @see resetStats(), stopStats() and startStats()
84  *
85  */
86  virtual void StatsCB(VPNStats &stats) = 0;
87 
88 
89  /**
90  * Callback used to deliver VPN state and state change string.
91  * The stateString delivered by this method is localized.
92  *
93  * See the ::VPNState enum found in api.h for set of valid states.
94  */
95  virtual void StateCB(const VPNState state,
96  const VPNSubState subState,
97  const tstring stateString) = 0;
98 
99  /**
100  * If a banner needs to be acknowledged, this CB delivers the banner
101  * to the client.
102  *
103  * NOTE: Connection establishment will block until the method
104  * setBannerResponse() is called.
105  *
106  * In a GUI, a banner would typically be displayed in a modal dialog
107  * with an accept or decline button selection.
108  *
109  * @see setBannerResponse() to set the user response to the banner.
110  */
111  virtual void BannerCB(const tstring &banner) = 0;
112 
113  /**
114  * If a pre-connect reminder needs to be acknowledged, this CB delivers
115  * the pre-connect reminder to the client.
116  *
117  * NOTE: Connection establishment will block until the method
118  * setPreConnectReminderResponse() is called.
119  *
120  * In a GUI, a pre-connect reminder would typically be displayed in a modal
121  * dialog with an OK button selection.
122  *
123  * @see setPreConnectReminderResponse() to set the user acknowledgement to
124  * the pre-connect reminder message.
125  */
126  virtual void PreConnectReminderCB(const tstring &rtstrPreConnectReminder);
127 
128  /**
129  * Messages are delivered via the NoticeCB and can come from multiple
130  * sources. There are four message types (error, warning, info and
131  * status). See the ::MessageType enum in api.h for the list.
132  *
133  * Clients using the API as an embedded application (not
134  * user visible) might want to further characterize
135  * messages. One option here is to use the AnyConnect message
136  * catalog and assign message codes as the translations for
137  * various messages. An application could then track messages based
138  * on its own error code scheme.
139  */
140  virtual void NoticeCB(const tstring &notice,
141  const MessageType type,
142  const bool bSensitive = false) = 0;
143 
144 #if defined(PLATFORM_DARWIN)
145  /**
146  * This CB is used to deliver service approval status updates
147  */
148  virtual void ServiceStatusCB(const VpnApprovalStatus& status);
149 #endif
150 
151 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK)
152  virtual void CertBannerCB(const tstring &certBannerSummary,
153  const uint32_t nCertBannerCertLen,
154  const uint8_t *pCertBannerCertDer,
155  const std::list<tstring> &confirmReasons,
156  const std::list<CertConfirmReason> &confirmReasonEnums,
157  bool bImportAllowed = true) = 0;
158 #endif
159 
160  /**
161  * This CB would likely occur only during a connection when it was
162  * detected that the software needed to be upgraded, or when Start
163  * Before Logon (SBL) is being used.
164  *
165  * Unlike the other callback methods, this method provides a default
166  * implementation (calling the system's exit() function).
167  * If clients of the API wish to override this behavior, they are
168  * responsible for ensuring that the current running process exits with
169  * the return code specified by returnCode.
170  *
171  * <b>Caution</b>: IF YOU OVERRIDE THIS METHOD AND DO NOT EXIT WITH
172  * THE PROPER CODE SOFTWARE UPDATE FUNCTIONALITY IN YOUR CLIENT WILL
173  * BREAK
174  */
175  virtual void ExitNoticeCB(const tstring &tstrNotice,
176  const int returnCode);
177 
178 
179  /**
180  * Under normal operating conditions, this CB is called as soon
181  * as the attach method completes. In case the service (vpn agent)
182  * is not ready, this CB is not called until it is.
183  *
184  * Any API calls made prior to this CB being called will result in a
185  * NoticeCB error message.
186  */
187  virtual void ServiceReadyCB() = 0;
188 
189 
190 
191  /**
192  * This method supports prompting for single or multiple values. All
193  * prompts are considered mandatory.
194  *
195  * The ConnectPromptInfo object contains a list of PromptEntry
196  * instances. The labels and their default values (if any) can be
197  * found in these instances. After the data has been collected from the user
198  * it can be set into these same instances. When ready, the client
199  * application should call the method UserSubmit() to have the
200  * responses read by the API.
201  */
202  virtual void UserPromptCB(ConnectPromptInfo &ConnectPrompt) = 0;
203 
204 
205  /**
206  * Use this method to provide Window Manager hints to GUI
207  * applications. To receive these hints, the application must
208  * identify itself as a GUI in the attach method. In addition, this
209  * method should be overridden to receive any generated events.
210  *
211  * Event that can be received include those indicating that a user is
212  * starting a second instance of the GUI application. This information
213  * can be used to tell the already running application to un-minimize
214  * itself and let the new program know that it should Quit (since a GUI
215  * is already running).
216  */
217  virtual void WMHintCB(const WMHint hint,
218  const WMHintReason reason);
219 
220 
221  /**
222  * This method is useful when the connection to the secure gateway
223  * has been established as part of a web-launch of the VPN tunnel.
224  *
225  * If the client application wishes to be notified of the secure
226  * gateway to which the VPN has been established, this method should
227  * be overridden.
228  *
229  * If the client application is started and a tunnel is already active,
230  * this method also delivers the name of the secure gateway host.
231  */
232  virtual void deliverWebLaunchHostCB(const tstring &activeHost);
233 
234  /**
235  * This method is called when the preference to block untrusted
236  * servers is enabled and the current VPN server being connected
237  * to is untrusted. Clients should present an error to the user
238  * notifying them that the current connection to rtstrUntrustedServer
239  * is being blocked. The client should also provide a way for the
240  * user to change the preference to block untrusted servers.
241  *
242  * The user response must be indicated using setCertBlockedResponse
243  */
244  virtual void CertBlockedCB(const tstring &rtstrUntrustedServer) = 0;
245 
246  /**
247  * This method is called when connections to untrusted VPN servers
248  * is allowed by policies and the current VPN server being connected
249  * to is untrusted. Clients should present a warning to the user
250  * notifying them that the current connection to rtstrUntrustedServer
251  * is unsafe. The reason the VPN server is untrusted is provided in
252  * rltstrCertErrors. The client should provide a way for the user to
253  * connect once, connect and always trust or cancel the connection.
254  * If bAllowImport is set to false then the always trust option should
255  * not be presented to users.
256  *
257  * The user response must be indicated using setCertWarningResponse
258  */
259  virtual void CertWarningCB(const tstring &rtstrUntrustedServer,
260  const std::list<tstring> &rltstrCertErrors,
261  bool bAllowImport) = 0;
262 
263 #if defined(PLATFORM_WIN_APP)
264  /**
265  * Same as above but also passes the Server certificate DER for details display
266  */
267  virtual void CertWarningCB(const tstring &rtstrUntrustedServer,
268  const std::list<tstring> &rltstrCertErrors,
269  const std::vector<uint8_t> &rvServerCertDER,
270  bool bAllowImport) = 0;
271 #endif
272 
273  /**
274  * This method should be overridden by the client application to
275  * exercise some control over the delivery of events from the other
276  * protected methods in this class.
277  *
278  * This might be necessary in cases where a GUI/CLI is being written and
279  * the data from this API needs to be delivered in the GUI/CLI or main
280  * thread. In this case, you should override this method and when it
281  * is called by the API post an event to your event queue (message
282  * pump, etc.). After this event executes in your GUI/CLI or main thread,
283  * call the method ClientIfc::ProcessEvents to have events delivered
284  * to your client application.
285  */
286  virtual void EventAvailable();
287 
288 #if defined(MANUAL_PKCS12_IMPORT_SUPPORTED)
289  virtual void ImportPKCS12ResultCB(const std::vector<uint8_t> &certHash,
290  const tstring &tstrError);
291 #endif
292 #if defined(PLATFORM_ANDROID)
293  virtual void ClientCertificateCB(std::vector< std::pair<uint32_t, uint8_t*> > certList) = 0;
294  virtual void AgentDetachedCB();
295 #endif
296 
297 #if defined(VPNAPI_EVENT_NOTIFICATION_SUPPORTED)
298  /**
299  * Internal callback between ClientIfcBase and ClientIfc.
300  */
301  virtual void EventNotificationInternalCB(
302  const std::shared_ptr<CEventNotificationTlv>& spEventNtfctnTlv) = 0;
303 #endif
304 
305  /**
306  * Internal methods for use by ClientIfc.
307  */
308 
309  void ResetQuarantinedReconnect();
310 
311  void ClientIfcTransmigration();
312 
313 public:
314 
315  bool attach(const ClientType clientType = ClientType_GUI,
316  const bool requestFullCapabilities = true,
317  const bool suppressAutoConnect = true,
318  const bool bSuppressEventAvailableCB = false);
319 
320  void detach();
321 
322  void ProcessEvents();
323 
324  bool hasFullCapabilities();
325 
326  bool isConnected(bool bSilent = false);
327 
328  bool isAvailable();
329 
330  std::list<tstring> getHostNames();
331 
332  std::list<HostEntry> getHostEntries();
333 
334  tstring getDefaultHostName();
335 
336  bool connect(
337 #if defined(HOST_DATA_SUPPORTED)
338  const IHostData& host);
339 #else
340  tstring host);
341 #endif
342 
343  bool connect(
344 #if defined(HOST_DATA_SUPPORTED)
345  const IHostData& host,
346 #else
347  tstring host,
348 #endif
349  unsigned int origin);
350 
351  bool setNewTunnelGroup(const tstring & group);
352 
353  void disconnect();
354 
355  void disconnect(VPNDisconnectReason disconnectEvent);
356 
357  void cancel();
358 
359  void resetStats();
360 
361  void getState();
362 
363  VPNState getCurrentVPNState();
364  VPNSubState getCurrentVPNSubState();
365  VPNSubState getPreviousVPNSubState();
366 
367  STATE getCurrentState();
368 
369  tstring getStateText();
370  static tstring getNoticeTypeText(MessageType msgType);
371 
372  static tstring getStateText(VPNState state,
373  VPNSubState subState = VPNSS_NORMAL,
374  NETENV_STATE netEnvState = NES_NETWORK_ACCESSIBLE,
375  const tstring& tstrConnectedHost = tstring());
376 
377  void setNetworkStates(NETENV_STATE netEnvState,
378  NETCTRL_STATE netCtrlState,
379  NETWORK_TYPE netType,
380  bool bACBrowserForCPRemediation,
381  bool bUpdateUI);
382  void refreshOperatingModeForCurrentNetStates();
383  NETENV_STATE getCurrentNetEnvState();
384  NETENV_STATE getPreviousNetEnvState();
385  NETCTRL_STATE getCurrentNetCtrlState();
386  NETWORK_TYPE getCurrentNetType();
387  bool isACBrowserForCPRemediation();
388 
389  static tstring getNetCtrlText(NETCTRL_STATE netCtrlState);
390  static tstring getNetEnvText(NETENV_STATE netEnvState,
391  bool bSimple = false);
392  static tstring getNetTypeText(NETWORK_TYPE netType);
393  static tstring getQuarantinedStatusText();
394  static tstring getNetworkStatusSimpleText(const NETENV_STATE netEnvState,
395  const NETCTRL_STATE netCtrlState);
396 
397  // can't be static due to requiring operating mode information
398  tstring getNetworkStatusText(const VPNState state,
399  const VPNSubState subState,
400  const NETENV_STATE netEnvState,
401  const NETCTRL_STATE netCtrlState);
402 
403  PreferenceInfo& getPreferences();
404 
405  bool savePreferences();
406 
407  void startStats();
408 
409  void stopStats();
410 
411  void UserSubmit();
412 
413  void setBanner(const tstring &banner);
414  void setBannerResponse(bool bResponse);
415 
416  void setPreConnectReminder(const tstring &tstrPreConnectReminder);
417  void setPreConnectReminderResponse();
418 
419  bool getUserResponse();
420  bool isUserResponseSet();
421 
422  void setCertBlocked(const tstring &tstrUntrustedServer);
423  void setCertWarning(const tstring &rtstrUntrustedServer,
424  const std::list<tstring> &rltstrCertErrors,
425  bool bAllowImport);
426 #if defined(PLATFORM_WIN_APP)
427  void setCertWarning(const tstring &rtstrUntrustedServer,
428  const std::list<tstring> &rltstrCertErrors,
429  const std::vector<uint8_t>& rvServerCertDER,
430  bool bAllowImport);
431 #endif
432  bool getCertImportResponse();
433 
434 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK)
435  void setCertBanner(tstring tstrCertBannerSummary,
436  uint32_t nCertBannerCertLen,
437  const uint8_t *pCertBannerCertDer,
438  const std::list<tstring> &confirmReasons,
439  const std::list<CertConfirmReason> &confirmReasonEnums,
440  bool bImportAllowed);
441 
442  void setCertBannerResponse(bool bResponse, bool bImportCert);
443  void importServerCert(std::vector<uint8_t> certData);
444  bool setFipsMode(bool bEnableFips);
445 #if defined(PLATFORM_ANDROID)
446  bool setStrictMode(bool bEnableStrictMode);
447  bool setRevocationEnabled(bool bRevocationEnabled);
448  bool IsRevocationEnabled();
449 #endif // currently supported only for android
450 #endif
451 
452  void setUserPrompt(ConnectPromptInfo &ConnectPrompt);
453 
454 #if defined(PLATFORM_ANDROID)
455  void setClientCertResponse(std::vector< std::pair<uint32_t, uint8_t*> > &derList);
456  void setAgentDetached();
457  bool getClientCertificates();
458 #endif
459 
460 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID)
461  void setSCEPEnrollInProgress(bool bInProgress);
462  bool isSCEPEnrollInProgress();
463 #endif
464 
465 #if defined(MANUAL_PKCS12_IMPORT_SUPPORTED)
466  void setImportPKCS12Result(const std::vector<uint8_t> &certHash, const tstring &tstrError);
467  bool requestImportPKCS12(const std::vector<uint8_t> &data);
468  std::vector<uint8_t> importPKCS12WithPassword(const std::vector<uint8_t> &data, const tstring &password);
469 #endif
470 
471  void setCertBlockedResponse(bool bUnlock);
472  void setCertWarningResponse(bool bConnect, bool bImportCert);
473 
474  void insertStateToConnectPrompt(ConnectPromptInfo &ConnectPrompt);
475 
476  void ExitNotice(const tstring &tstrNotice, const int code = 0);
477 
478  void notice(const tstring &tstrNotice,
479  const MessageType type = MsgType_Info,
480  bool bClearLastMsg = false,
481  bool bForce = false,
482  bool bStateMsg = false,
483  bool bSensitiveMsg = false);
484 
485  void notice(MsgWithArg &notice,
486  const MessageType type = MsgType_Info,
487  bool bClearLastMsg = false,
488  bool bForce = false,
489  bool bStateMsg = false,
490  bool bSensitiveMsg = false);
491 
492  void getStats(void);
493 
494  void setStats(VPNStats &stats);
495 
496  void exportStats(const tstring &tstrFilePath);
497 
498  void initState(VPNState state,
499  VPNState previousState,
500  VPNSubState subState);
501 
502  void setState(VPNState state,
503  VPNState previousState,
504  VPNSubState subState = VPNSS_NORMAL,
505  bool bUpdateStateMsg = true,
506  bool bOnlyUpdateUI = false);
507 
508 #if defined(PLATFORM_DARWIN)
509  void setServiceStatus(const VpnApprovalStatus& status);
510 #endif
511 
512 #if defined(PROGRAM_DATA_IMPORT_SUPPORTED)
513  IACImporterAsync *createACImporter(IACImporterAsyncCB *pCallback);
514 #endif
515 
516  void setWMHint(WMHint hint,
517  WMHintReason reason);
518 
519  bool isLastConnectType (const ConnectPromptType connPromptType);
520 
521  bool isOperatingMode(OperatingMode opMode);
522  void setOperatingMode(OperatingMode opMode);
523  void unsetOperatingMode(OperatingMode opMode);
524 
525  bool CanRemediateCaptivePortal();
526  bool policyAllowsCaptivePortalRemediation();
527 
528  bool isEventShutdown();
529 
530  bool isUsingEventModel();
531 
532  time_t getLastDisconnectTime();
533 
534  ConnectPromptInfo getConnectPromptInfo();
535  void resetConnectPromptPasswordData();
536 
537  void setStandaloneConnection(bool isStandalone);
538 
539  void deliverActiveHost(const tstring &activeHost,
540  ConnectProtocolType vpnProtocol = PROTOCOL_TYPE_UNKNOWN,
541  bool bActiveHostFriendlyName = false);
542 
543  bool isVPNServiceReady();
544 
545  // reset last disconnect time indicator.
546  //
547  void resetLastDisconnectTime(time_t time = 1);
548 
549  void processMinimize();
550 
551  // cert enrollment
552  void setEnrollClientCert(CertObj* pCert);
553 
554  // Show user banner for cert import warning on linux
555  // SCEPIfc to ConnectMgr
556  void linuxCertImportWarnUser();
557 
558  // Response to cert warning on linux
559  // ConnectMgr to SCEPIfc
560  void linuxCertImportWarnUserResponse(bool bAccept);
561 
562  void setDefaultHost(tstring &host);
563 
564 #if defined(HOST_DATA_SUPPORTED)
565  void setDefaultHostProfile(const IHostData &hostProfile);
566  IHostData* getDefaultHostData();
567 #endif
568 
569  void setLastVpnError(VPNError vpnError);
570  VPNError getLastVpnError();
571 
572 #if defined(PLATFORM_ANDROID)
573  bool requestClientCertificates();
574 #endif
575 
576  bool requestImportLocalization(const tstring tstrLocale,
577  const std::vector<unsigned char> &MoFileData);
578 
579  // Start the Automatic Headend Selection operation
580  void startAHS(const unsigned int uiReason,
581  const ProxyIfc& proxy);
582  // statusReturnCode is a long to match the current type of STATUSCODE.
583  // It is not using a STATUSCODE directly so that we do not have to
584  // expose the header files for STATUSCODEs to ClientIfcBase.h
585  void AHSSelectedHost(const unsigned int uiReason,
586  const std::vector<tstring> &headendList,
587  const long statusReturnCode,
588  const tstring& extraInfo);
589  std::vector<tstring> getAHSHostList();
590  unsigned int getAHSState();
591  bool isAHSHasRun();
592  bool IsAHSCachingRestricted();
593 
594  bool suppressConnectionErrorPopups();
595 
596  tstring getCaptivePortalDetectedMsg();
597 
598  void setProxyAuthPrompts(ProxyIfc* pProxy,
599  const tstring& promptMsg);
600 
601 #if defined(INTERPROCESS_COMMUNICATION_SUPPORTED)
602  bool handleIpcMessage(CIpcMessage *pIpcMessage);
603 #if defined(VPNAPI_EVENT_NOTIFICATION_SUPPORTED)
604  void eventNotification(const int &eventCode);
605  void signalDisconnectedToEventNtfctnThread();
606 #endif // VPNAPI_EVENT_NOTIFICATION_SUPPORTED
607 #endif // INTERPROCESS_COMMUNICATION_SUPPORTED
608  bool IsCsdTokenVerified() const;
609 
610 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID)
611  virtual void SCEPEnrollStartCB();
612  virtual void SCEPEnrollExitCB();
613 #endif
614 
615  void activateConnectMgrTunnelInitiationCompletionEvent();
616  bool isConnectRequestActive();
617  bool isConnectRequestCleanup();
618 #if defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK)
619  bool deleteProfileByName(const tstring &profileName);
620  tstring getProfileContents(const tstring &profileName);
621  bool importProfile(const tstring &profileName, const tstring &profileContents);
622 #endif
623 
624  bool syncProfileChange(const tstring &profileName);
625 
626 #if defined(CREDENTIAL_PREFILL_SUPPORTED)
627  bool hasPrefilledCredentials();
628  bool prefillCredentials(ConnectPromptInfo &connectPrompt);
629  void setPrefilledCredentials(CredentialPrefill *prefill);
630 #endif
631 
632 #if defined(PLATFORM_ANDROID) || defined(PLATFORM_APPLE_SSLVPN)
633  std::list<ManagedCertificate *> enumerateCertificates(CertificateType certType);
634  bool deleteCertificates(CertificateType certType, const std::list<std::string> &idList);
635  bool deleteServerCertificates(const std::list<std::string> &idList);
636 #endif
637 
638 #if defined(ANYCONNECT_USE_SNAK) && !defined(PLATFORM_WIN_APP)
639  std::list<ManagedCertificate *> enumerateSNAKCertificates(SNAK_CertType certType);
640  SNAK_CertType getSNAKCertType(CertificateType certType);
641  bool deleteClientCertificates(const std::list<std::string> &idList);
642 #endif
643 
644 #if defined(PLATFORM_APPLE_SSLVPN)
645  bool canUseBackupServers();
646 #endif
647 
648  tstring getConnectHost();
649 
650  tstring getMgmtTunnelHostname();
651 
652  VPN_TUNNEL_SCOPE getVpnTunnelScope();
653 
654  bool isStandaloneConnection();
655 
656  void sendSSoLogoutPrompt(ConnectPromptInfo &cpi);
657 
658  void setExternalSSOLogoutUrlFromAgent(const tstring& logoutUrl);
659 
660 private:
661 
662  //
663  // Private Member Data
664  //
665 
666 #if defined(VPNAPI_TRANSMIGRATION_SUPPORTED)
667  std::shared_ptr<CSharedAccessLock> m_spClientIfcInternalPtrSharedAccessLock;
668 #endif
669  std::unique_ptr<ClientIfcInternal> m_upClientIfcInternal;
670 
671 
672  //
673  // Private Member Methods
674  //
675 
676  // Prevent copying by declaring but not defining copy constructor and operator= methods.
677  //
678  ClientIfcBase(const ClientIfcBase& other);
679  ClientIfcBase& operator=(const ClientIfcBase& other);
680 };
681 
682 #endif // _CLIENTIFCBASE_
Definition: api.h:113
ConnectPromptType
Definition: api.h:244
Definition: PreferenceInfo.h:26
Definition: ApprovalStatus.h:35
WMHintReason
Definition: api.h:220
VPNDisconnectReason
Definition: api.h:188
VPNState
Definition: api.h:146
Definition: ClientIfcBase.h:66
#define tstring
Definition: api.h:35
WMHint
Definition: api.h:201
Definition: ConnectPromptInfo.h:37
MessageType
Definition: api.h:108
OperatingMode
Definition: api.h:545
VPNSubState
Definition: api.h:170
VPNError
Definition: api.h:597
Definition: VPNStats.h:35