Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
e75d31dd9b | |||
0b4e4571b6 | |||
435157955e | |||
f155b93ac2 | |||
0865318278 | |||
271e062be2 | |||
ebe12e5157 | |||
f197c0c937 | |||
29d5769060 | |||
0afbdadea7 | |||
cebcf7506e |
13
Doxyfile
13
Doxyfile
@@ -51,7 +51,7 @@ PROJECT_BRIEF = "EAP Supplicant for Windows"
|
||||
# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
|
||||
# to the output directory.
|
||||
|
||||
PROJECT_LOGO =
|
||||
PROJECT_LOGO = include\icon_ui.ico
|
||||
|
||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
|
||||
# into which the generated documentation will be written. If a relative path is
|
||||
@@ -694,7 +694,7 @@ CITE_BIB_FILES =
|
||||
# messages are off.
|
||||
# The default value is: NO.
|
||||
|
||||
QUIET = NO
|
||||
QUIET = YES
|
||||
|
||||
# The WARNINGS tag can be used to turn on/off the warning messages that are
|
||||
# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
|
||||
@@ -718,7 +718,7 @@ WARN_IF_UNDOCUMENTED = YES
|
||||
# markup commands wrongly.
|
||||
# The default value is: YES.
|
||||
|
||||
WARN_IF_DOC_ERROR = NO
|
||||
WARN_IF_DOC_ERROR = YES
|
||||
|
||||
# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
|
||||
# are documented, but have no documentation for their parameters or return
|
||||
@@ -790,11 +790,16 @@ RECURSIVE = YES
|
||||
# run.
|
||||
|
||||
EXCLUDE = \
|
||||
CredWrite\README.md \
|
||||
EventMonitor\res \
|
||||
lib\EAPBase_UI\res \
|
||||
lib\EapHost_UI\res \
|
||||
lib\TLS_UI\res \
|
||||
lib\TTLS_UI\res \
|
||||
lib\WinStd
|
||||
lib\WinStd \
|
||||
lib\wxExtend \
|
||||
MsiUseFeature\README.md \
|
||||
WLANManager\README.md
|
||||
|
||||
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
|
||||
# directories that are symbolic links (a Unix file system feature) are excluded
|
||||
|
@@ -2,14 +2,14 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: EAPMethods\n"
|
||||
"POT-Creation-Date: 2016-09-28 13:27+0200\n"
|
||||
"POT-Creation-Date: 2016-11-07 12:58+0100\n"
|
||||
"PO-Revision-Date: 2016-06-02 12:27+0200\n"
|
||||
"Last-Translator: Simon Rozman <simon.rozman@amebis.si>\n"
|
||||
"Language-Team: Amebis, d. o. o., Kamnik <info@amebis.si>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.8.9\n"
|
||||
"X-Generator: Poedit 1.8.10\n"
|
||||
"X-Poedit-Basepath: ../..\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
"X-Poedit-KeywordsList: _\n"
|
||||
@@ -44,7 +44,7 @@ msgstr ""
|
||||
msgid "Opens dialog with provider settings"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/res/wxEAP_UI.cpp:229 lib/EAPBase_UI/include/EAP_UI.h:581
|
||||
#: lib/EAPBase_UI/res/wxEAP_UI.cpp:229 lib/EAPBase_UI/include/EAP_UI.h:605
|
||||
#, c-format
|
||||
msgid "%s User Credentials"
|
||||
msgstr ""
|
||||
@@ -211,66 +211,75 @@ msgstr ""
|
||||
msgid "(Warning: Once locked, you can not revert using this dialog!)"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:97
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:99
|
||||
#, c-format
|
||||
msgid "%s Credentials"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:122 lib/EAPBase_UI/include/EAP_UI.h:355
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:365 lib/EAPBase_UI/res/wxEAP_UI.h:119
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:128 lib/EAPBase_UI/include/EAP_UI.h:367
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:377 lib/EAPBase_UI/res/wxEAP_UI.h:119
|
||||
msgid "EAP Credentials"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:165
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:173
|
||||
#, c-format
|
||||
msgid "For additional help and instructions, please contact %s at:"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:166
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:174
|
||||
msgid "your provider"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:185
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:193
|
||||
msgid "Open the default web browser"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:196
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:204
|
||||
msgid "Open your e-mail program"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:207
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:215
|
||||
msgid "Dial the phone number"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:227
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:235
|
||||
#, c-format
|
||||
msgid "%s has pre-set parts of this configuration. Those parts are locked to prevent accidental modification."
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:228
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:236
|
||||
msgid "Your provider"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:249
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:257
|
||||
msgid "Previous attempt to connect reported invalid credentials."
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:250
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:258
|
||||
msgid "Previous attempt to connect reported your credentials expired."
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:251
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:259
|
||||
msgid "Previous attempt to connect reported your credentials are being changed."
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:252
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:260
|
||||
msgid "Previous attempt to connect failed."
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:253
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:261
|
||||
msgid "Please, make sure your credentials are correct, or try again later."
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:282
|
||||
#, c-format
|
||||
msgid "The %s version installed on this computer logs credentials in visible and easy to read way."
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/src/EAP_UI.cpp:283
|
||||
msgid "Please, reconsider necessity to enter your credentials."
|
||||
msgstr ""
|
||||
|
||||
#: lib/MSCHAPv2_UI/src/MSCHAPv2_UI.cpp:33
|
||||
msgid "MSCHAPv2 User ID and Password"
|
||||
msgstr ""
|
||||
@@ -331,7 +340,7 @@ msgstr ""
|
||||
msgid "(Example: foo.bar.com;server2.bar.com)"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/res/wxTLS_UI.cpp:119 lib/TLS_UI/src/TLS_UI.cpp:571
|
||||
#: lib/TLS_UI/res/wxTLS_UI.cpp:119 lib/TLS_UI/src/TLS_UI.cpp:317
|
||||
msgid "User Certificate"
|
||||
msgstr ""
|
||||
|
||||
@@ -351,46 +360,37 @@ msgstr ""
|
||||
msgid "Your identity (username@domain) to override one from certificate; or blank to use one provided in certificate"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:118
|
||||
#, c-format
|
||||
msgid "Invalid character in host name found: %c"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:118
|
||||
msgid "Validation conflict"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:327 lib/EAPBase_UI/include/EAP_UI.h:769
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:778
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:59 lib/EAPBase_UI/include/EAP_UI.h:803
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:812
|
||||
msgid "<empty>"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:500
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:246
|
||||
msgid "Add Certificate"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:501
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:247
|
||||
msgid "Certificate Files (*.cer;*.crt;*.der;*.p7b;*.pem)"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:502
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:248
|
||||
msgid "X.509 Certificate Files (*.cer;*.crt;*.der;*.pem)"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:503
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:249
|
||||
msgid "PKCS #7 Certificate Files (*.p7b)"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:504
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:250
|
||||
msgid "All Files (*.*)"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:520
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:264
|
||||
#, c-format
|
||||
msgid "Invalid or unsupported certificate file %s"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:520
|
||||
#: lib/TLS_UI/src/TLS_UI.cpp:264
|
||||
msgid "Error"
|
||||
msgstr ""
|
||||
|
||||
@@ -431,76 +431,76 @@ msgid "Custom outer identity to use"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TTLS_UI/src/Module.cpp:274 lib/TTLS_UI/src/Module.cpp:284
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:696
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:724
|
||||
#, c-format
|
||||
msgid "Error writing credentials to Credential Manager: %hs (error %u)"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TTLS_UI/src/Module.cpp:276 lib/TTLS_UI/src/Module.cpp:286
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:699
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:727
|
||||
msgid "Writing credentials failed."
|
||||
msgstr ""
|
||||
|
||||
#: lib/TTLS_UI/src/TTLS_UI.cpp:36 lib/TTLS_UI/src/TTLS_UI.cpp:181
|
||||
#: lib/TTLS_UI/src/TTLS_UI.cpp:36 lib/TTLS_UI/src/TTLS_UI.cpp:182
|
||||
msgid "Inner Authentication"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TTLS_UI/src/TTLS_UI.cpp:61 lib/TTLS_UI/src/TTLS_UI.cpp:196
|
||||
#: lib/TTLS_UI/src/TTLS_UI.cpp:61 lib/TTLS_UI/src/TTLS_UI.cpp:197
|
||||
msgid "Outer Authentication"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TTLS_UI/src/TTLS_UI.cpp:187
|
||||
#: lib/TTLS_UI/src/TTLS_UI.cpp:188
|
||||
msgid "Select inner authentication method from the list"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TTLS_UI/src/TTLS_UI.cpp:189
|
||||
#: lib/TTLS_UI/src/TTLS_UI.cpp:190
|
||||
msgid "PAP"
|
||||
msgstr ""
|
||||
|
||||
#: lib/TTLS_UI/src/TTLS_UI.cpp:191
|
||||
#: lib/TTLS_UI/src/TTLS_UI.cpp:192
|
||||
msgid "MSCHAPv2"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:292
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:302
|
||||
#, c-format
|
||||
msgid "Are you sure you want to permanently remove %s provider from configuration?"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:292
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:302
|
||||
msgid "Warning"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:552
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:576
|
||||
msgid "Provider Settings"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:717
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:747
|
||||
#, c-format
|
||||
msgid "Deleting credentials failed (error %u)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:754
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:788
|
||||
#, c-format
|
||||
msgid "<error %u>"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:758
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:792
|
||||
msgid "<error>"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:769 lib/EAPBase_UI/include/EAP_UI.h:778
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:803 lib/EAPBase_UI/include/EAP_UI.h:812
|
||||
msgid "<blank ID>"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:820
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:854
|
||||
msgid "&Remember"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:821
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:855
|
||||
msgid "Check if you would like to save credentials"
|
||||
msgstr ""
|
||||
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:964
|
||||
#: lib/EAPBase_UI/include/EAP_UI.h:1000
|
||||
msgid "<Your Organization>"
|
||||
msgstr ""
|
||||
|
||||
|
@@ -19,8 +19,10 @@
|
||||
*/
|
||||
|
||||
///
|
||||
/// EventMonitor application
|
||||
/// \defgroup EventMonitor Event Monitor
|
||||
/// Real-time log of application events
|
||||
///
|
||||
|
||||
class wxEventMonitorApp;
|
||||
|
||||
#pragma once
|
||||
@@ -32,6 +34,12 @@ class wxEventMonitorApp;
|
||||
#include <wx/intl.h>
|
||||
|
||||
|
||||
/// \addtogroup EventMonitor
|
||||
/// @{
|
||||
|
||||
///
|
||||
/// EventMonitor application
|
||||
///
|
||||
class wxEventMonitorApp : public wxApp
|
||||
{
|
||||
public:
|
||||
@@ -57,4 +65,6 @@ public:
|
||||
wxLocale m_locale; ///< Current locale
|
||||
};
|
||||
|
||||
/// @}
|
||||
|
||||
wxDECLARE_APP(wxEventMonitorApp);
|
||||
|
@@ -115,6 +115,8 @@ void wxEventTraceProcessorThread::Abort()
|
||||
}
|
||||
|
||||
|
||||
/// \cond internal
|
||||
|
||||
wxThread::ExitCode wxEventTraceProcessorThread::Entry()
|
||||
{
|
||||
// Process events.
|
||||
@@ -139,6 +141,8 @@ VOID WINAPI wxEventTraceProcessorThread::EventRecordCallback(_In_ PEVENT_RECORD
|
||||
_this->m_parent->QueueEvent(new wxETWEvent(wxEVT_ETW_EVENT, *pEvent));
|
||||
}
|
||||
|
||||
/// \endcond
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// wxETWListCtrl
|
||||
@@ -228,7 +232,7 @@ wxETWListCtrl::wxETWListCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos
|
||||
wxLogError(_("Access denied creating event session: you need administrative privileges (Run As Administrator) or be a member of Performance Log Users group to start event tracing session."));
|
||||
return;
|
||||
} else if (ulResult == ERROR_ALREADY_EXISTS) {
|
||||
wxLogDebug(_("The %s event session already exists."), name.c_str());
|
||||
wxLogDebug(_("The %s event session already exists."), name);
|
||||
// Do not despair... Retry with a new session name and ID.
|
||||
continue;
|
||||
} else {
|
||||
@@ -460,6 +464,8 @@ void wxETWListCtrl::RebuildItems()
|
||||
}
|
||||
|
||||
|
||||
/// \cond internal
|
||||
|
||||
bool wxETWListCtrl::IsVisible(const EVENT_RECORD &rec) const
|
||||
{
|
||||
return
|
||||
@@ -561,7 +567,7 @@ wxString wxETWListCtrl::OnGetItemText(long item, long column) const
|
||||
}
|
||||
|
||||
|
||||
wxString wxETWListCtrl::OnGetItemText(const event_rec &rec, long column) const
|
||||
wxString wxETWListCtrl::OnGetItemText(const winstd::event_rec &rec, long column) const
|
||||
{
|
||||
switch (column) {
|
||||
case 0: {
|
||||
@@ -678,6 +684,8 @@ void wxETWListCtrl::OnETWEvent(wxETWEvent& event)
|
||||
}
|
||||
}
|
||||
|
||||
/// \endcond
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// wxPersistentETWListCtrl
|
||||
@@ -703,7 +711,7 @@ void wxPersistentETWListCtrl::Save() const
|
||||
col.SetMask(wxLIST_MASK_TEXT | wxLIST_MASK_WIDTH);
|
||||
for (int i = 0, n = wnd->GetColumnCount(); i < n; i++) {
|
||||
wnd->GetColumn(i, col);
|
||||
SaveValue(wxString::Format(wxT("Column%sWidth"), col.GetText().c_str()), col.GetWidth());
|
||||
SaveValue(wxString::Format(wxT("Column%sWidth"), col.GetText()), col.GetWidth());
|
||||
}
|
||||
|
||||
SaveValue(wxT("ScrollAuto"), wnd->m_scroll_auto);
|
||||
@@ -728,7 +736,7 @@ bool wxPersistentETWListCtrl::Restore()
|
||||
wnd->GetColumn(i, col);
|
||||
|
||||
int width;
|
||||
if (RestoreValue(wxString::Format(wxT("Column%sWidth"), col.GetText().c_str()), &width))
|
||||
if (RestoreValue(wxString::Format(wxT("Column%sWidth"), col.GetText()), &width))
|
||||
wnd->SetColumnWidth(i, width);
|
||||
}
|
||||
|
||||
|
@@ -20,32 +20,23 @@
|
||||
|
||||
#include <wx/event.h>
|
||||
|
||||
/// \addtogroup EventMonitor
|
||||
/// @{
|
||||
|
||||
///
|
||||
/// Maximum number of event records kept
|
||||
///
|
||||
#define wxETWEVENT_RECORDS_MAX 1000000
|
||||
|
||||
///
|
||||
/// ETW event
|
||||
///
|
||||
/// @}
|
||||
|
||||
class wxETWEvent;
|
||||
wxDECLARE_EVENT(wxEVT_ETW_EVENT, wxETWEvent);
|
||||
#define wxETWEventHandler(func) wxEVENT_HANDLER_CAST(wxETWEventFunction, func)
|
||||
#define EVT_ETW_EVENT(func) wx__DECLARE_EVT0(wxEVT_ETW_EVENT, wxETWEventHandler(func))
|
||||
|
||||
///
|
||||
/// Event trace processor
|
||||
///
|
||||
class wxEventTraceProcessorThread;
|
||||
|
||||
///
|
||||
/// Event list control
|
||||
///
|
||||
class wxETWListCtrl;
|
||||
|
||||
///
|
||||
/// Supports saving/restoring wxETWListCtrl state
|
||||
///
|
||||
class wxPersistentETWListCtrl;
|
||||
|
||||
#pragma once
|
||||
@@ -61,47 +52,106 @@ class wxPersistentETWListCtrl;
|
||||
#include <set>
|
||||
|
||||
|
||||
/// \addtogroup EventMonitor
|
||||
/// @{
|
||||
|
||||
///
|
||||
/// ETW event
|
||||
///
|
||||
class wxETWEvent : public wxEvent
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// Creates ETW event
|
||||
///
|
||||
/// \param[in] type The unique type of event
|
||||
/// \param[in] record ETW event record
|
||||
///
|
||||
wxETWEvent(wxEventType type = wxEVT_NULL, const EVENT_RECORD &record = s_record_null);
|
||||
|
||||
///
|
||||
/// Copies an ETW event
|
||||
///
|
||||
/// \param[in] event ETW event to copy from
|
||||
///
|
||||
wxETWEvent(const wxETWEvent& event);
|
||||
virtual wxEvent *Clone() const { return new wxETWEvent(*this); }
|
||||
|
||||
inline const winstd::event_rec& GetRecord() const { return m_record; }
|
||||
inline winstd::event_rec& GetRecord() { return m_record; }
|
||||
///
|
||||
/// Clones the ETW event
|
||||
///
|
||||
/// \returns Event copy
|
||||
///
|
||||
virtual wxEvent *Clone() const
|
||||
{
|
||||
return new wxETWEvent(*this);
|
||||
}
|
||||
|
||||
protected:
|
||||
bool DoSetExtendedData(size_t extended_data_count, const EVENT_HEADER_EXTENDED_DATA_ITEM *extended_data);
|
||||
bool DoSetUserData(size_t user_data_length, const void *user_data);
|
||||
///
|
||||
/// Returns ETW event record assosiated with event
|
||||
///
|
||||
inline const winstd::event_rec& GetRecord() const
|
||||
{
|
||||
return m_record;
|
||||
}
|
||||
|
||||
///
|
||||
/// Returns ETW event record assosiated with event
|
||||
///
|
||||
inline winstd::event_rec& GetRecord()
|
||||
{
|
||||
return m_record;
|
||||
}
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxETWEvent)
|
||||
|
||||
public:
|
||||
static const EVENT_RECORD s_record_null;
|
||||
static const EVENT_RECORD s_record_null; ///< Blank ETW event record
|
||||
|
||||
protected:
|
||||
winstd::event_rec m_record; ///< ETW event record
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Prototype of the function consuming `wxETWEvent` events
|
||||
///
|
||||
typedef void (wxEvtHandler::*wxETWEventFunction)(wxETWEvent&);
|
||||
|
||||
|
||||
///
|
||||
/// Monitors ETW events and forwards them as `wxETWEvent` event
|
||||
///
|
||||
class wxEventTraceProcessorThread : public wxThread
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// A thread to process ETW events
|
||||
///
|
||||
/// \param[in] parent Event handler this thread will send record notifications
|
||||
/// \param[in] sessions An array of sessions to monitor
|
||||
///
|
||||
wxEventTraceProcessorThread(wxEvtHandler *parent, const wxArrayString &sessions);
|
||||
|
||||
///
|
||||
/// Destructor
|
||||
///
|
||||
virtual ~wxEventTraceProcessorThread();
|
||||
|
||||
///
|
||||
/// Closes all session handles to allow graceful thread termination
|
||||
///
|
||||
void Abort();
|
||||
|
||||
protected:
|
||||
/// \cond internal
|
||||
virtual ExitCode Entry();
|
||||
/// \endcond
|
||||
|
||||
private:
|
||||
/// \cond internal
|
||||
static VOID WINAPI EventRecordCallback(PEVENT_RECORD pEvent);
|
||||
/// \endcond
|
||||
|
||||
protected:
|
||||
std::vector<TRACEHANDLE> m_traces; ///< An array of tracing sessions this thread is monitoring
|
||||
@@ -109,6 +159,9 @@ protected:
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Event list control
|
||||
///
|
||||
class wxETWListCtrl : public wxListCtrl
|
||||
{
|
||||
protected:
|
||||
@@ -117,6 +170,9 @@ protected:
|
||||
///
|
||||
struct less_guid : public std::binary_function<GUID, GUID, bool>
|
||||
{
|
||||
///
|
||||
/// Compares two GUIDs
|
||||
///
|
||||
bool operator()(const GUID &a, const GUID &b) const
|
||||
{
|
||||
if (a.Data1 < b.Data1) return true;
|
||||
@@ -136,6 +192,17 @@ protected:
|
||||
typedef std::set<GUID, less_guid> guidset;
|
||||
|
||||
public:
|
||||
///
|
||||
/// Creates a list control for ETW log display
|
||||
///
|
||||
/// \param[in] parent Parent window. Must not be \c NULL.
|
||||
/// \param[in] id Window identifier. The value \c wxID_ANY indicates a default value.
|
||||
/// \param[in] pos Window position. If \c wxDefaultPosition is specified then a default position is chosen.
|
||||
/// \param[in] size Window size. If \c wxDefaultSize is specified then the window is sized appropriately.
|
||||
/// \param[in] style Window style. See \c wxListCtrl.
|
||||
/// \param[in] validator Window validator
|
||||
/// \param[in] name Window name
|
||||
///
|
||||
wxETWListCtrl(
|
||||
wxWindow *parent,
|
||||
wxWindowID id = wxID_ANY,
|
||||
@@ -144,21 +211,70 @@ public:
|
||||
long style = wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_VIRTUAL|wxNO_BORDER,
|
||||
const wxValidator &validator = wxDefaultValidator,
|
||||
const wxString &name = wxListCtrlNameStr);
|
||||
|
||||
///
|
||||
/// Destructor
|
||||
///
|
||||
virtual ~wxETWListCtrl();
|
||||
|
||||
inline bool IsEmpty() const { return m_rec_db.empty(); }
|
||||
///
|
||||
/// Returns true if the list is empty
|
||||
///
|
||||
inline bool IsEmpty() const
|
||||
{
|
||||
return m_rec_db.empty();
|
||||
}
|
||||
|
||||
///
|
||||
/// Copies selected rows to clipboard
|
||||
///
|
||||
void CopySelected() const;
|
||||
|
||||
///
|
||||
/// Copies all rows (including hidden ones) to clipboard
|
||||
///
|
||||
void CopyAll() const;
|
||||
|
||||
///
|
||||
/// Empties the list
|
||||
///
|
||||
void ClearAll();
|
||||
|
||||
///
|
||||
/// Selects all rows
|
||||
///
|
||||
void SelectAll();
|
||||
|
||||
///
|
||||
/// Clears row selection
|
||||
///
|
||||
void SelectNone();
|
||||
|
||||
///
|
||||
/// Rebuilds the list
|
||||
///
|
||||
void RebuildItems();
|
||||
|
||||
///
|
||||
/// Checks if given ETW source is enabled
|
||||
///
|
||||
/// \param[in] guid GUID of ETW source
|
||||
///
|
||||
/// \returns
|
||||
/// - \c true if ETW source with \p guid GUID is enabled;
|
||||
/// - \c false otherwise.
|
||||
///
|
||||
inline bool IsSourceEnabled(const GUID &guid) const
|
||||
{
|
||||
return m_sources.find(guid) != m_sources.end();
|
||||
}
|
||||
|
||||
///
|
||||
/// Enables/Disables ETW source
|
||||
///
|
||||
/// \param[in] guid GUID of ETW source
|
||||
/// \param[in] enable \c true to enable, \c false to disable
|
||||
///
|
||||
inline void EnableSource(const GUID &guid, bool enable = true)
|
||||
{
|
||||
auto s = m_sources.find(guid);
|
||||
@@ -178,6 +294,7 @@ public:
|
||||
friend class wxPersistentETWListCtrl; // Allow saving/restoring window state.
|
||||
|
||||
protected:
|
||||
/// \cond internal
|
||||
bool IsVisible(const EVENT_RECORD &rec) const;
|
||||
void FormatRow(const winstd::event_rec &rec, std::string &rowA, std::wstring &rowW) const;
|
||||
bool CopyToClipboard(const std::string &dataA, const std::wstring &dataW) const;
|
||||
@@ -186,6 +303,8 @@ protected:
|
||||
virtual wxString OnGetItemText(long item, long column) const;
|
||||
virtual wxString OnGetItemText(const winstd::event_rec &rec, long column) const;
|
||||
void OnETWEvent(wxETWEvent& event);
|
||||
/// \endcond
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
||||
public:
|
||||
@@ -209,18 +328,48 @@ protected:
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Supports saving/restoring `wxETWListCtrl` state
|
||||
///
|
||||
class wxPersistentETWListCtrl : public wxPersistentWindow<wxETWListCtrl>
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// Constructor for a persistent window object
|
||||
///
|
||||
/// \param[in] wnd Window this object will save/restore
|
||||
///
|
||||
wxPersistentETWListCtrl(wxETWListCtrl *wnd);
|
||||
|
||||
///
|
||||
/// Returns the string uniquely identifying the objects supported by this adapter.
|
||||
///
|
||||
/// \returns This implementation always returns `wxT(wxPERSIST_TLW_KIND)`
|
||||
///
|
||||
virtual wxString GetKind() const;
|
||||
|
||||
///
|
||||
/// Saves the object properties
|
||||
///
|
||||
virtual void Save() const;
|
||||
|
||||
///
|
||||
/// Restores the object properties
|
||||
///
|
||||
/// \returns
|
||||
/// - \c true if the properties were successfully restored;
|
||||
/// - \c false otherwise.
|
||||
///
|
||||
virtual bool Restore();
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Creates persistent window object for `wxETWListCtrl` class window
|
||||
///
|
||||
inline wxPersistentObject *wxCreatePersistentObject(wxETWListCtrl *wnd)
|
||||
{
|
||||
return new wxPersistentETWListCtrl(wnd);
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
@@ -261,6 +261,8 @@ wxEventMonitorFrame::~wxEventMonitorFrame()
|
||||
}
|
||||
|
||||
|
||||
/// \cond internal
|
||||
|
||||
void wxEventMonitorFrame::OnExit(wxCommandEvent& event)
|
||||
{
|
||||
Close();
|
||||
@@ -408,6 +410,8 @@ void wxEventMonitorFrame::OnViewToolbar(wxCommandEvent& event)
|
||||
}
|
||||
}
|
||||
|
||||
/// \endcond
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// wxPersistentEventMonitorFrame
|
||||
|
@@ -18,14 +18,7 @@
|
||||
along with GÉANTLink. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
///
|
||||
/// EventMonitor main frame
|
||||
///
|
||||
class wxEventMonitorFrame;
|
||||
|
||||
///
|
||||
/// Supports saving/restoring wxEventMonitorFrame GUI state
|
||||
///
|
||||
class wxPersistentEventMonitorFrame;
|
||||
|
||||
#pragma once;
|
||||
@@ -42,6 +35,12 @@ class wxPersistentEventMonitorFrame;
|
||||
#include <WinStd/Win.h>
|
||||
|
||||
|
||||
/// \addtogroup EventMonitor
|
||||
/// @{
|
||||
|
||||
///
|
||||
/// EventMonitor main frame
|
||||
///
|
||||
class wxEventMonitorFrame : public wxFrame
|
||||
{
|
||||
protected:
|
||||
@@ -62,12 +61,28 @@ protected:
|
||||
};
|
||||
|
||||
public:
|
||||
///
|
||||
/// Creates an EventMonitor frame window
|
||||
///
|
||||
/// \param[in] parent The window parent. This may be \c NULL. If it is non-NULL, the frame will always be displayed on top of the parent window on Windows.
|
||||
/// \param[in] id The window identifier. It may take a value of \c wxID_ANY to indicate a default value.
|
||||
/// \param[in] title The caption to be displayed on the frame's title bar.
|
||||
/// \param[in] pos The window position. The value \c wxDefaultPosition indicates a default position, chosen by either the windowing system or wxWidgets, depending on platform.
|
||||
/// \param[in] size The window size. The value \c wxDefaultSize indicates a default size, chosen by either the windowing system or wxWidgets, depending on platform.
|
||||
/// \param[in] style The window style. See `wxFrame` class description.
|
||||
/// \param[in] name The name of the window. This parameter is used to associate a name with the item, allowing the application user to set Motif resource values for individual windows.
|
||||
///
|
||||
wxEventMonitorFrame(wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Event Monitor"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize(600,400), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL, const wxString& name = wxT("EventMonitor"));
|
||||
|
||||
///
|
||||
/// Destructor
|
||||
///
|
||||
~wxEventMonitorFrame();
|
||||
|
||||
friend class wxPersistentEventMonitorFrame;
|
||||
|
||||
protected:
|
||||
/// \cond internal
|
||||
void OnExit(wxCommandEvent& event);
|
||||
void OnEditCopyUpdate(wxUpdateUIEvent& event);
|
||||
void OnEditCopy(wxCommandEvent& event);
|
||||
@@ -87,8 +102,10 @@ protected:
|
||||
void OnViewLevel(wxCommandEvent& event);
|
||||
void OnViewToolbarUpdate(wxUpdateUIEvent& event);
|
||||
void OnViewToolbar(wxCommandEvent& event);
|
||||
/// \endcond
|
||||
|
||||
protected:
|
||||
/// \cond internal
|
||||
wxMenuBar* m_menubar;
|
||||
wxMenu* m_menuProgram;
|
||||
wxMenu* m_menuEdit;
|
||||
@@ -114,20 +131,45 @@ protected:
|
||||
wxStatusBar* m_statusBar;
|
||||
wxEventMonitorLogPanel* m_panel;
|
||||
wxAuiManager m_mgr;
|
||||
/// \endcond
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Supports saving/restoring `wxEventMonitorFrame` GUI state
|
||||
///
|
||||
class wxPersistentEventMonitorFrame : public wxPersistentTLW
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// Constructor for a persistent window object
|
||||
///
|
||||
/// \param[in] wnd Window this object will save/restore
|
||||
///
|
||||
wxPersistentEventMonitorFrame(wxEventMonitorFrame *wnd);
|
||||
|
||||
///
|
||||
/// Saves the object properties
|
||||
///
|
||||
virtual void Save() const;
|
||||
|
||||
///
|
||||
/// Restores the object properties
|
||||
///
|
||||
/// \returns
|
||||
/// - \c true if the properties were successfully restored;
|
||||
/// - \c false otherwise.
|
||||
///
|
||||
virtual bool Restore();
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Creates persistent window object for `wxETWListCtrl` class window
|
||||
///
|
||||
inline wxPersistentObject *wxCreatePersistentObject(wxEventMonitorFrame *wnd)
|
||||
{
|
||||
return new wxPersistentEventMonitorFrame(wnd);
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
@@ -18,14 +18,7 @@
|
||||
along with GÉANTLink. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
///
|
||||
/// EventMonitor trace log panel
|
||||
///
|
||||
class wxEventMonitorLogPanel;
|
||||
|
||||
///
|
||||
/// Supports saving/restoring wxEventMonitorLogPanel state
|
||||
///
|
||||
class wxPersistentEventMonitorLogPanel;
|
||||
|
||||
#pragma once
|
||||
@@ -34,27 +27,68 @@ class wxPersistentEventMonitorLogPanel;
|
||||
#include <wx/persist/window.h>
|
||||
|
||||
|
||||
/// \addtogroup EventMonitor
|
||||
/// @{
|
||||
|
||||
///
|
||||
/// EventMonitor trace log panel
|
||||
///
|
||||
class wxEventMonitorLogPanel : public wxEventMonitorLogPanelBase
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// Constructs EventMonitor log panel
|
||||
///
|
||||
/// \param[in] parent Parent window. Must not be \c NULL.
|
||||
///
|
||||
wxEventMonitorLogPanel(wxWindow* parent);
|
||||
|
||||
friend class wxPersistentEventMonitorLogPanel; // Allow saving/restoring window state.
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Supports saving/restoring `wxEventMonitorLogPanel` state
|
||||
///
|
||||
class wxPersistentEventMonitorLogPanel : public wxPersistentWindow<wxEventMonitorLogPanel>
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// Constructor for a persistent window object
|
||||
///
|
||||
/// \param[in] wnd Window this object will save/restore
|
||||
///
|
||||
wxPersistentEventMonitorLogPanel(wxEventMonitorLogPanel *wnd);
|
||||
|
||||
///
|
||||
/// Returns the string uniquely identifying the objects supported by this adapter.
|
||||
///
|
||||
/// \returns This implementation always returns `wxT(wxPERSIST_TLW_KIND)`
|
||||
///
|
||||
virtual wxString GetKind() const;
|
||||
|
||||
///
|
||||
/// Saves the object properties
|
||||
///
|
||||
virtual void Save() const;
|
||||
|
||||
///
|
||||
/// Restores the object properties
|
||||
///
|
||||
/// \returns
|
||||
/// - \c true if the properties were successfully restored;
|
||||
/// - \c false otherwise.
|
||||
///
|
||||
virtual bool Restore();
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// Creates persistent window object for `wxEventMonitorLogPanel` class window
|
||||
///
|
||||
inline wxPersistentObject *wxCreatePersistentObject(wxEventMonitorLogPanel *wnd)
|
||||
{
|
||||
return new wxPersistentEventMonitorLogPanel(wnd);
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
17
README.md
17
README.md
@@ -8,22 +8,22 @@ Suite of EAP supplicants for Windows - IEEE 802.1X plug-ins for enterprise netwo
|
||||
- Microsoft Windows Vista or later
|
||||
- Microsoft Visual Studio 2010 SP1
|
||||
- _msgfmt.exe_ from [gettext](https://www.gnu.org/software/gettext/);
|
||||
Hint: [Poedit](https://poedit.net/) contains up-to-date binary Win32 compiled gettext-utilities. Install it and add _GettextTools\bin_ folder to path.
|
||||
Hint: [Poedit](https://poedit.net/) contains up-to-date binary Win32 compiled gettext-utilities. Install it and add `GettextTools\bin` folder to the system path.
|
||||
- _sed.exe_ and _grep.exe_
|
||||
- _MsiDb.Exe_ and other command line utilities for MSI packaging distributed as a part of Microsoft Windows SDK (installed with Visual Studio). Add SDK's _Bin_ folder to path.
|
||||
- _MsiDb.Exe_ and other command line utilities for MSI packaging distributed as a part of Microsoft Windows SDK (installed with Visual Studio). Add SDK's `Bin` folder to the system path.
|
||||
|
||||
### wxWidgets
|
||||
GÉANTLink is using wxWidgets v3.0.2 static libraries. Unfortunately, only dynamic libraries (DLL) variant is available as a binary download. Therefore static libraries needs to be compiled from [source](https://github.com/wxWidgets/wxWidgets).
|
||||
|
||||
#### Compiling wxWidgets Win32 static libraries
|
||||
1. Start _Visual Studio Command Prompt (2010)_
|
||||
2. Change working directory to _build\msw_
|
||||
2. Change working folder to `build\msw`
|
||||
3. Run: `nmake /f makefile.vc /ls RUNTIME_LIBS=static SHARED=0`
|
||||
4. Run: `nmake /f makefile.vc /ls RUNTIME_LIBS=static SHARED=0 BUILD=release`
|
||||
|
||||
#### Compiling wxWidgets x64 static libraries
|
||||
1. Start _Visual Studio x64 Cross Tools Command Prompt (2010)_
|
||||
2. Change working directory to _build\msw_
|
||||
2. Change working folder to `build\msw`
|
||||
3. Run: `nmake /f makefile.vc /ls RUNTIME_LIBS=static SHARED=0 TARGET_CPU=X64`
|
||||
4. Run: `nmake /f makefile.vc /ls RUNTIME_LIBS=static SHARED=0 TARGET_CPU=X64 BUILD=release`
|
||||
|
||||
@@ -43,6 +43,9 @@ Please note that only Release builds are configured for timestamp signing. Debug
|
||||
### Building
|
||||
|
||||
#### Building in Visual Studio IDE
|
||||
GÉANTLink has some submodules. When cloning Git repository, make sure to use `--recursive` Git switch to clone submodules too. Example:
|
||||
`git clone --recursive "https://github.com/Amebis/GEANTLink.git" "C:\Projects\GEANTLink"`
|
||||
|
||||
GÉANTLink can be build and debugged opening _VS10Solution.sln_ in Visual C++ 2010 IDE.
|
||||
|
||||
Before one can attempt to debug EAP DLLs, you should run `nmake register` from an elevated command prompt. See _Building in command line_ chapter below.
|
||||
@@ -66,7 +69,7 @@ A few seconds after desired function call has finished, _DllHost.exe_ terminates
|
||||
To debug early life of our GUI DLL, uncomment `Sleep(10000)` in `DllMain()` of the module, and set breakpoints. This should give you plenty of time to attach the debugger to _DllHost.exe_ process before our DLL starts.
|
||||
|
||||
#### Building in command line
|
||||
Use of standard command prompt is recommended, providing that Microsoft Visual Studio 2010 folders containing _nmake.exe_ and _devenv.com_ are added to the path.
|
||||
Use of standard command prompt is recommended, providing that Microsoft Visual Studio 2010 folders containing _nmake.exe_ and _devenv.com_ are added to the system path.
|
||||
|
||||
Use Microsoft NMAKE to build the project.
|
||||
|
||||
@@ -75,7 +78,7 @@ Command | Explanation
|
||||
`nmake Clean` | Deletes all intermediate and output files.
|
||||
`nmake Register` | Builds a debug version of project, registers DLLs, and adds Start Menu shortcuts. For testing and development purposes only! Requires elevated command prompt.
|
||||
`nmake Unregister` | Removes Start Menu shortcuts, unregisters DLLs. For testing development purposes only! Requires elevated command prompt.
|
||||
`nmake Setup` | Builds a release version of project and release MSI setup files. The resulting files can be found in _output\Setup_ folder.
|
||||
`nmake SetupDebug` | Builds a debug version of project and debug MSI setup files. The resulting files can be found in _output\Setup_ folder.
|
||||
`nmake Setup` | Builds a release version of project and release MSI setup files. The resulting files can be found in `output\Setup` folder.
|
||||
`nmake SetupDebug` | Builds a debug version of project and debug MSI setup files. The resulting files can be found in `output\Setup` folder.
|
||||
|
||||
The `/ls` flag can be appended to the commands above to reduce NMAKE’s verbosity. You can combine multiple targets (i.e. nmake Unregister Clean). Please, see NMAKE reference for further reading.
|
||||
|
@@ -29,7 +29,7 @@
|
||||
// Product version as a single DWORD
|
||||
// Note: Used for version comparison within C/C++ code.
|
||||
//
|
||||
#define PRODUCT_VERSION 0x01001a00
|
||||
#define PRODUCT_VERSION 0x01001b00
|
||||
|
||||
//
|
||||
// Product version by components
|
||||
@@ -39,26 +39,26 @@
|
||||
//
|
||||
#define PRODUCT_VERSION_MAJ 1
|
||||
#define PRODUCT_VERSION_MIN 0
|
||||
#define PRODUCT_VERSION_REV 26
|
||||
#define PRODUCT_VERSION_REV 27
|
||||
#define PRODUCT_VERSION_BUILD 0
|
||||
|
||||
//
|
||||
// Human readable product version and build year for UI
|
||||
//
|
||||
#define PRODUCT_VERSION_STR "1.0-beta8"
|
||||
#define PRODUCT_VERSION_STR "1.0"
|
||||
#define PRODUCT_BUILD_YEAR_STR "2016"
|
||||
|
||||
//
|
||||
// Numerical version presentation for ProductVersion propery in
|
||||
// MSI packages (syntax: N.N[.N[.N]])
|
||||
//
|
||||
#define PRODUCT_VERSION_INST "1.0.26"
|
||||
#define PRODUCT_VERSION_INST "1.0.27"
|
||||
|
||||
//
|
||||
// The product code for ProductCode property in MSI packages
|
||||
// Replace with new on every version change, regardless how minor it is.
|
||||
//
|
||||
#define PRODUCT_VERSION_GUID "{710D80D0-D104-4A2A-872C-A5C7BF0FB9D8}"
|
||||
#define PRODUCT_VERSION_GUID "{8589167A-BEE3-4C2D-9B18-444699E95F42}"
|
||||
|
||||
//
|
||||
// Product vendor
|
||||
|
@@ -855,7 +855,7 @@ template<class _Traits, class _Ax>
|
||||
inline void operator<<(_Inout_ eap::cursor_out &cursor, _In_ const std::basic_string<wchar_t, _Traits, _Ax> &val)
|
||||
{
|
||||
std::string val_utf8;
|
||||
WideCharToMultiByte(CP_UTF8, 0, val.c_str(), (int)val.length(), val_utf8, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, val, val_utf8, NULL, NULL);
|
||||
cursor << val_utf8;
|
||||
}
|
||||
|
||||
@@ -872,7 +872,7 @@ inline void operator>>(_Inout_ eap::cursor_in &cursor, _Out_ std::basic_string<w
|
||||
{
|
||||
std::string val_utf8;
|
||||
cursor >> val_utf8;
|
||||
MultiByteToWideChar(CP_UTF8, 0, val_utf8.c_str(), (int)val_utf8.length(), val);
|
||||
MultiByteToWideChar(CP_UTF8, 0, val_utf8, val);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -225,7 +225,8 @@ namespace eap
|
||||
///
|
||||
inline void log_config_discrete(_In_z_ LPCWSTR name, _In_z_ LPCWSTR value) const
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
#ifdef __DANGEROUS__LOG_CONFIDENTIAL_DATA
|
||||
#pragma message (__FILE__ "(" STRING(__LINE__) "): Warning: !!! DANGER !!! Passwords and certificates will be logged as a clear-text. Please, consider undefining __DANGEROUS__LOG_CONFIDENTIAL_DATA.")
|
||||
log_config(name, value);
|
||||
#else
|
||||
log_config(name, value ? value[0] ? L"********" : L"" : NULL);
|
||||
@@ -239,7 +240,8 @@ namespace eap
|
||||
///
|
||||
inline void log_config_discrete(_In_z_ LPCWSTR name, _In_bytecount_(size) const void *data, _In_ ULONG size) const
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
#ifdef __DANGEROUS__LOG_CONFIDENTIAL_DATA
|
||||
#pragma message (__FILE__ "(" STRING(__LINE__) "): Warning: !!! DANGER !!! Passwords and certificates will be logged as a clear-text. Please, consider undefining __DANGEROUS__LOG_CONFIDENTIAL_DATA.")
|
||||
log_config(name, data, size);
|
||||
#else
|
||||
log_config(name, data ? size ? L"********" : L"" : NULL);
|
||||
@@ -305,7 +307,7 @@ namespace eap
|
||||
std::vector<unsigned char> encrypt(_In_ HCRYPTPROV hProv, _In_ const std::basic_string<wchar_t, _Traits, _Ax> &val, _Out_opt_ HCRYPTHASH hHash = NULL) const
|
||||
{
|
||||
winstd::sanitizing_string val_utf8;
|
||||
WideCharToMultiByte(CP_UTF8, 0, val.c_str(), (int)val.length(), val_utf8, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, val, val_utf8, NULL, NULL);
|
||||
return encrypt(hProv, val_utf8, hHash);
|
||||
}
|
||||
|
||||
@@ -349,7 +351,7 @@ namespace eap
|
||||
std::vector<unsigned char> encrypt_md5(_In_ HCRYPTPROV hProv, _In_ const std::basic_string<wchar_t, _Traits, _Ax> &val) const
|
||||
{
|
||||
winstd::sanitizing_string val_utf8;
|
||||
WideCharToMultiByte(CP_UTF8, 0, val.c_str(), (int)val.length(), val_utf8, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, val, val_utf8, NULL, NULL);
|
||||
return encrypt_md5(hProv, val_utf8);
|
||||
}
|
||||
|
||||
@@ -430,7 +432,7 @@ namespace eap
|
||||
{
|
||||
winstd::sanitizing_string buf(std::move(decrypt_str(hProv, data, size, hHash)));
|
||||
std::basic_string<wchar_t, _Traits, _Ax> dec;
|
||||
MultiByteToWideChar(CP_UTF8, 0, buf.data(), (int)buf.size(), dec);
|
||||
MultiByteToWideChar(CP_UTF8, 0, buf, dec);
|
||||
return dec;
|
||||
}
|
||||
|
||||
@@ -502,7 +504,7 @@ namespace eap
|
||||
{
|
||||
winstd::sanitizing_string buf(std::move(decrypt_str_md5<char, std::char_traits<char>, sanitizing_allocator<char> >(hProv, data, size)));
|
||||
std::basic_string<wchar_t, _Traits, _Ax> dec;
|
||||
MultiByteToWideChar(CP_UTF8, 0, buf.data(), (int)buf.size(), dec);
|
||||
MultiByteToWideChar(CP_UTF8, 0, buf, dec);
|
||||
return dec;
|
||||
}
|
||||
|
||||
|
@@ -251,7 +251,7 @@ void eap::credentials_pass::save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *p
|
||||
switch (m_enc_alg) {
|
||||
case enc_alg_kph: {
|
||||
sanitizing_string password_utf8;
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_password.c_str(), -1, password_utf8, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_password, password_utf8, NULL, NULL);
|
||||
wstring password_enc(std::move(kph_encrypt<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >(cp, password_utf8.c_str())));
|
||||
com_obj<IXMLDOMElement> pXmlElPassword;
|
||||
if (FAILED(hr = eapxml::put_element_value(pDoc, pConfigRoot, bstr(L"Password"), namespace_eapmetadata, bstr(password_enc), std::addressof(pXmlElPassword))))
|
||||
@@ -308,7 +308,7 @@ void eap::credentials_pass::load(_In_ IXMLDOMNode *pConfigRoot)
|
||||
} else if (encryption && CompareStringEx(LOCALE_NAME_INVARIANT, NORM_IGNORECASE, encryption, encryption.length(), _L("KPH"), -1, NULL, NULL, 0) == CSTR_EQUAL) {
|
||||
// Decrypt password.
|
||||
sanitizing_string password_utf8(std::move(kph_decrypt<OLECHAR>(password)));
|
||||
MultiByteToWideChar(CP_UTF8, 0, password_utf8.c_str(), -1, m_password);
|
||||
MultiByteToWideChar(CP_UTF8, 0, password_utf8, m_password);
|
||||
m_enc_alg = enc_alg_kph;
|
||||
} else if (encryption && encryption[0]) {
|
||||
// Encryption is defined but unrecognized.
|
||||
@@ -354,13 +354,13 @@ void eap::credentials_pass::store(_In_z_ LPCTSTR pszTargetName, _In_ unsigned in
|
||||
|
||||
// Convert password to UTF-8.
|
||||
sanitizing_string cred_utf8;
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_password.c_str(), (int)m_password.length(), cred_utf8, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_password, cred_utf8, NULL, NULL);
|
||||
|
||||
// Encrypt the password using user's key.
|
||||
DATA_BLOB cred_blob = { (DWORD)cred_utf8.size() , const_cast<LPBYTE>(reinterpret_cast<LPCBYTE>(cred_utf8.data())) };
|
||||
DATA_BLOB entropy_blob = { sizeof(s_entropy), const_cast<LPBYTE>( s_entropy ) };
|
||||
data_blob cred_enc;
|
||||
if (!CryptProtectData(&cred_blob, NULL, &entropy_blob, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &cred_enc))
|
||||
if (!CryptProtectData(&cred_blob, NULL, &entropy_blob, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN | CRYPTPROTECT_AUDIT, &cred_enc))
|
||||
throw win_runtime_error(__FUNCTION__ " CryptProtectData failed.");
|
||||
|
||||
tstring target(target_name(pszTargetName, level));
|
||||
@@ -650,14 +650,14 @@ void eap::credentials_connection::load(_In_ IXMLDOMNode *pConfigRoot)
|
||||
if (match(*cfg_prov)) {
|
||||
// Matching provider found. Create matching blank credential set, then load.
|
||||
if (cfg_prov->m_methods.empty())
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " %ls provider has no methods.", cfg_prov->get_id().c_str()).c_str());
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " %ls provider has no methods.", cfg_prov->get_id().c_str()));
|
||||
const config_method_with_cred *cfg_method = dynamic_cast<const config_method_with_cred*>(cfg_prov->m_methods.front().get());
|
||||
m_cred.reset(cfg_method->make_credentials());
|
||||
m_cred->load(pXmlElClientSideCredential);
|
||||
break;
|
||||
}
|
||||
} else
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Credentials do not match to any provider within this connection configuration (provider: %ls).", get_id().c_str()).c_str());
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Credentials do not match to any provider within this connection configuration (provider: %ls).", get_id().c_str()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -693,14 +693,14 @@ void eap::credentials_connection::operator>>(_Inout_ cursor_in &cursor)
|
||||
if (match(*cfg_prov)) {
|
||||
// Matching provider found. Create matching blank credential set, then read.
|
||||
if (cfg_prov->m_methods.empty())
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " %ls provider has no methods.", cfg_prov->get_id().c_str()).c_str());
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " %ls provider has no methods.", cfg_prov->get_id().c_str()));
|
||||
const config_method_with_cred *cfg_method = dynamic_cast<const config_method_with_cred*>(cfg_prov->m_methods.front().get());
|
||||
m_cred.reset(cfg_method->make_credentials());
|
||||
cursor >> *m_cred;
|
||||
break;
|
||||
}
|
||||
} else
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Credentials do not match to any provider within this connection configuration (provider: %ls).", get_id().c_str()).c_str());
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Credentials do not match to any provider within this connection configuration (provider: %ls).", get_id().c_str()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -146,7 +146,7 @@ void eap::method_noneap::get_response_packet(
|
||||
|
||||
size_t size_packet = m_packet_res.size();
|
||||
if (size_packet > *pdwSendPacketSize)
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " This method does not support packet fragmentation, but the data size is too big to fit in one packet (packet: %u, maximum: %u).", size_packet, *pdwSendPacketSize).c_str());
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " This method does not support packet fragmentation, but the data size is too big to fit in one packet (packet: %u, maximum: %u).", size_packet, *pdwSendPacketSize));
|
||||
|
||||
memcpy(pSendPacket, m_packet_res.data(), size_packet);
|
||||
*pdwSendPacketSize = (DWORD)size_packet;
|
||||
|
@@ -67,6 +67,13 @@ class wxEAPProviderLockedPanel;
|
||||
///
|
||||
class wxEAPCredentialWarningPanel;
|
||||
|
||||
#ifdef __DANGEROUS__LOG_CONFIDENTIAL_DATA
|
||||
///
|
||||
/// EAP credential logging enabled warning note
|
||||
///
|
||||
class wxEAPCredentialLogWarningPanel;
|
||||
#endif
|
||||
|
||||
///
|
||||
/// EAP Configuration window
|
||||
///
|
||||
@@ -445,6 +452,18 @@ public:
|
||||
};
|
||||
|
||||
|
||||
#ifdef __DANGEROUS__LOG_CONFIDENTIAL_DATA
|
||||
class wxEAPCredentialLogWarningPanel : public wxEAPNotePanel
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// Constructs a notice pannel and set the title text
|
||||
///
|
||||
wxEAPCredentialLogWarningPanel(wxWindow* parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
class wxEAPConfigWindow : public wxScrolledWindow
|
||||
{
|
||||
public:
|
||||
|
@@ -97,6 +97,10 @@ wxEAPCredentialsDialog::wxEAPCredentialsDialog(const eap::config_provider &prov,
|
||||
{
|
||||
// Set banner title.
|
||||
m_banner->m_title->SetLabel(wxString::Format(_("%s Credentials"), wxEAPGetProviderName(prov.m_name)));
|
||||
|
||||
#ifdef __DANGEROUS__LOG_CONFIDENTIAL_DATA
|
||||
AddContent(new wxEAPCredentialLogWarningPanel(this));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -263,6 +267,27 @@ wxEAPCredentialWarningPanel::wxEAPCredentialWarningPanel(const eap::config_provi
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// wxEAPCredentialWarningPanel
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __DANGEROUS__LOG_CONFIDENTIAL_DATA
|
||||
wxEAPCredentialLogWarningPanel::wxEAPCredentialLogWarningPanel(wxWindow* parent) : wxEAPNotePanel(parent)
|
||||
{
|
||||
// Load and set icon.
|
||||
winstd::library lib_shell32;
|
||||
if (lib_shell32.load(_T("imageres.dll"), NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE))
|
||||
m_note_icon->SetIcon(wxLoadIconFromResource(lib_shell32, MAKEINTRESOURCE(105)));
|
||||
|
||||
m_note_label->SetLabel(wxString::Format(_("The %s version installed on this computer logs credentials in visible and easy to read way."), wxT(PRODUCT_NAME_STR)) + " " +
|
||||
_("Please, reconsider necessity to enter your credentials."));
|
||||
m_note_label->Wrap(449);
|
||||
|
||||
this->Layout();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// wxEAPConfigWindow
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
@@ -101,7 +101,7 @@ void eap::method_mschapv2::process_request_packet(
|
||||
case phase_init: {
|
||||
// Convert username to UTF-8.
|
||||
sanitizing_string identity_utf8;
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_cred.m_identity.c_str(), (int)m_cred.m_identity.length(), identity_utf8, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_cred.m_identity, identity_utf8, NULL, NULL);
|
||||
|
||||
// Randomize Peer-Challenge
|
||||
m_challenge_client.randomize(m_cp);
|
||||
@@ -178,7 +178,7 @@ void eap::method_mschapv2::process_packet(_In_bytecount_(size_pck) const void *_
|
||||
if (code == 26 && vendor == 311) {
|
||||
// MS-CHAP2-Success
|
||||
if (msg[0] != m_ident)
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Wrong MSCHAPv2 ident (expected: %u, received: %u).", m_ident, msg[0]).c_str());
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Wrong MSCHAPv2 ident (expected: %u, received: %u).", m_ident, msg[0]));
|
||||
const char *str = reinterpret_cast<const char*>(msg + 1);
|
||||
process_success(parse_response(str, (reinterpret_cast<const char*>(msg_end) - str)));
|
||||
} else if (code == 2 && vendor == 311) {
|
||||
@@ -187,7 +187,7 @@ void eap::method_mschapv2::process_packet(_In_bytecount_(size_pck) const void *_
|
||||
const char *str = reinterpret_cast<const char*>(msg + 1);
|
||||
process_error(parse_response(str, (reinterpret_cast<const char*>(msg_end) - str)));
|
||||
} else if (hdr->flags & diameter_avp_flag_mandatory)
|
||||
throw win_runtime_error(ERROR_NOT_SUPPORTED, string_printf(__FUNCTION__ " Server sent mandatory Diameter AVP we do not support (code: %u, vendor: %u).", code, vendor).c_str());
|
||||
throw win_runtime_error(ERROR_NOT_SUPPORTED, string_printf(__FUNCTION__ " Server sent mandatory Diameter AVP we do not support (code: %u, vendor: %u).", code, vendor));
|
||||
|
||||
pck = msg_next;
|
||||
}
|
||||
@@ -209,7 +209,7 @@ void eap::method_mschapv2::process_success(_In_ const list<string> &argv)
|
||||
|
||||
// Calculate expected authenticator response.
|
||||
sanitizing_string identity_utf8;
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_cred.m_identity.c_str(), (int)m_cred.m_identity.length(), identity_utf8, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_cred.m_identity, identity_utf8, NULL, NULL);
|
||||
authenticator_response resp_exp(m_cp, m_challenge_server, m_challenge_client, identity_utf8.c_str(), m_cred.m_password.c_str(), m_nt_resp);
|
||||
|
||||
// Compare against provided authemticator response.
|
||||
@@ -246,10 +246,10 @@ void eap::method_mschapv2::process_error(_In_ const list<string> &argv)
|
||||
bool is_last;
|
||||
dec.decode(resp, is_last, val.data() + 2, (size_t)-1);
|
||||
if (resp.size() != sizeof(m_challenge_server))
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Incorrect MSCHAPv2 challenge length (expected: %uB, received: %uB).", sizeof(m_challenge_server), resp.size()).c_str());
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Incorrect MSCHAPv2 challenge length (expected: %uB, received: %uB).", sizeof(m_challenge_server), resp.size()));
|
||||
memcpy(&m_challenge_server, resp.data(), sizeof(m_challenge_server));
|
||||
} else if ((val[0] == 'M' || val[0] == 'm') && val[1] == '=') {
|
||||
MultiByteToWideChar(CP_UTF8, 0, val.data() + 2, -1, m_cfg.m_last_msg);
|
||||
MultiByteToWideChar(CP_UTF8, 0, val.data() + 2, (int)val.length() - 2, m_cfg.m_last_msg);
|
||||
m_module.log_event(&EAPMETHOD_METHOD_FAILURE_ERROR1, event_data((unsigned int)eap_type_legacy_mschapv2), event_data(m_cfg.m_last_msg), event_data::blank);
|
||||
}
|
||||
}
|
||||
|
@@ -39,6 +39,12 @@ namespace eap
|
||||
|
||||
namespace eap
|
||||
{
|
||||
/// \addtogroup EAPBaseConfig
|
||||
/// @{
|
||||
|
||||
///
|
||||
/// PAP configuration
|
||||
///
|
||||
class config_method_pap : public config_method_with_cred
|
||||
{
|
||||
public:
|
||||
|
@@ -84,8 +84,8 @@ void eap::method_pap::process_request_packet(
|
||||
case phase_init: {
|
||||
// Convert username and password to UTF-8.
|
||||
sanitizing_string identity_utf8, password_utf8;
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_cred.m_identity.c_str(), (int)m_cred.m_identity.length(), identity_utf8, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_cred.m_password.c_str(), (int)m_cred.m_password.length(), password_utf8, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_cred.m_identity, identity_utf8, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, m_cred.m_password, password_utf8, NULL, NULL);
|
||||
|
||||
// PAP passwords must be padded to 16B boundary according to RFC 5281. Will not add random extra padding here, as length obfuscation should be done by outer transport layers.
|
||||
size_t padding_password_ex = (16 - password_utf8.length()) % 16;
|
||||
|
@@ -179,7 +179,7 @@ void eap::credentials_tls::store(_In_z_ LPCTSTR pszTargetName, _In_ unsigned int
|
||||
// Encrypt the certificate using user's key.
|
||||
DATA_BLOB cred_blob = { m_cert->cbCertEncoded, m_cert->pbCertEncoded };
|
||||
DATA_BLOB entropy_blob = { sizeof(s_entropy) , const_cast<LPBYTE>(s_entropy) };
|
||||
if (!CryptProtectData(&cred_blob, NULL, &entropy_blob, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &cred_enc))
|
||||
if (!CryptProtectData(&cred_blob, NULL, &entropy_blob, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN | CRYPTPROTECT_AUDIT, &cred_enc))
|
||||
throw win_runtime_error(__FUNCTION__ " CryptProtectData failed.");
|
||||
}
|
||||
|
||||
|
@@ -206,7 +206,7 @@ void eap::method_tls::begin_session(
|
||||
m_sc_target_name.insert(m_sc_target_name.end(), name->begin(), name->end());
|
||||
#else
|
||||
string buf;
|
||||
WideCharToMultiByte(CP_ACP, 0, name->c_str(), -1, buf, NULL, NULL);
|
||||
WideCharToMultiByte(CP_ACP, 0, name, buf, NULL, NULL);
|
||||
m_sc_target_name.insert(m_sc_target_name.end(), buf.begin(), buf.end());
|
||||
#endif
|
||||
}
|
||||
|
@@ -261,7 +261,7 @@ void wxTLSServerTrustPanel::OnRootCAAddFile(wxCommandEvent& event)
|
||||
for (PCCERT_CONTEXT cert = NULL; (cert = CertEnumCertificatesInStore(cs, cert)) != NULL;)
|
||||
AddRootCA(cert);
|
||||
} else
|
||||
wxMessageBox(wxString::Format(_("Invalid or unsupported certificate file %s"), paths[i].c_str()), _("Error"), wxOK | wxICON_EXCLAMATION, this);
|
||||
wxMessageBox(wxString::Format(_("Invalid or unsupported certificate file %s"), paths[i]), _("Error"), wxOK | wxICON_EXCLAMATION, this);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -306,6 +306,6 @@ void eap::method_ttls::process_application_data(_In_bytecount_(size_msg) const v
|
||||
}
|
||||
|
||||
default:
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Inner method returned an unsupported action (action %u).", eap_output.action).c_str());
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Inner method returned an unsupported action (action %u).", eap_output.action));
|
||||
}
|
||||
}
|
||||
|
@@ -209,12 +209,12 @@ EAP_SESSION_HANDLE eap::peer_ttls::begin_session(
|
||||
if (s->m_cred.match(*cfg_prov)) {
|
||||
// Matching provider found.
|
||||
if (cfg_prov->m_methods.empty())
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " %ls provider has no methods.", cfg_prov->get_id().c_str()).c_str());
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " %ls provider has no methods.", cfg_prov->get_id().c_str()));
|
||||
cfg_method = dynamic_cast<config_method_ttls*>(cfg_prov->m_methods.front().get());
|
||||
break;
|
||||
}
|
||||
} else
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Credentials do not match to any provider within this connection configuration (provider: %ls).", s->m_cred.get_id().c_str()).c_str());
|
||||
throw invalid_argument(string_printf(__FUNCTION__ " Credentials do not match to any provider within this connection configuration (provider: %ls).", s->m_cred.get_id().c_str()));
|
||||
}
|
||||
|
||||
// We have configuration, we have credentials, create method.
|
||||
|
Submodule lib/WinStd updated: 6acc318f87...cea06e8f48
Reference in New Issue
Block a user