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