From f5d647e81f25ec218505d31d59e70cac8428c6fd Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Fri, 20 May 2016 01:33:24 +0200 Subject: [PATCH] EAPTTLS split to EAP Method itself and UI --- EAPMethods/MSIBuild/Makefile | 16 ++ EAPMethods/build/EAPMethod.def | 32 +++ EAPMethods/build/EAPMethodUI.def | 26 +++ EAPMethods/build/EAPTTLS.props | 3 + EAPMethods/build/EAPTTLS.vcxproj | 3 + EAPMethods/build/EAPTTLS.vcxproj.filters | 5 + EAPMethods/build/EAPTTLSUI.props | 17 ++ EAPMethods/build/EAPTTLSUI.rc | Bin 0 -> 4892 bytes EAPMethods/build/EAPTTLSUI.vcxproj | 114 +++++++++++ EAPMethods/build/EAPTTLSUI.vcxproj.filters | 52 +++++ EAPMethods/include/EAPMethods.h | 174 +++++++++++----- EAPMethods/include/EAPTTLS.h | 58 ++++++ EAPMethods/include/StdAfx.h | 2 - EAPMethods/src/EAPMethods.cpp | 9 + EAPMethods/src/EAPTTLS.cpp | 90 +++++++++ EAPMethods/src/Main.cpp | 160 +-------------- EAPMethods/src/MainUI.cpp | 225 +++++++++++++++++++++ Makefile | 3 + VS10Solution.sln | 11 + 19 files changed, 796 insertions(+), 204 deletions(-) create mode 100644 EAPMethods/build/EAPMethod.def create mode 100644 EAPMethods/build/EAPMethodUI.def create mode 100644 EAPMethods/build/EAPTTLSUI.props create mode 100644 EAPMethods/build/EAPTTLSUI.rc create mode 100644 EAPMethods/build/EAPTTLSUI.vcxproj create mode 100644 EAPMethods/build/EAPTTLSUI.vcxproj.filters create mode 100644 EAPMethods/src/MainUI.cpp diff --git a/EAPMethods/MSIBuild/Makefile b/EAPMethods/MSIBuild/Makefile index 0b26b58..095c47f 100644 --- a/EAPMethods/MSIBuild/Makefile +++ b/EAPMethods/MSIBuild/Makefile @@ -35,6 +35,7 @@ Property Signature_ s$(MSIBUILD_LENGTH_ID) s$(MSIBUILD_LENGTH_ID) AppSearch Property Signature_ OLD$(MSIBUILD_PRODUCT_NAME_UC)DIR clEAPTTLS.dll.$(PLAT) +OLD$(MSIBUILD_PRODUCT_NAME_UC)DIR clEAPTTLSUI.dll.$(PLAT) OLD$(MSIBUILD_PRODUCT_NAME_UC)DIR clEAPMethodEvents.dll.$(PLAT) <. +; + +EXPORTS + EapPeerFreeMemory + EapPeerFreeErrorMemory + EapPeerGetInfo +; EapPeerConfigXml2Blob +; EapPeerConfigBlob2Xml +; EapPeerGetMethodProperties +; EapPeerCredentialsXml2Blob +; EapPeerQueryCredentialInputFields +; EapPeerQueryUserBlobFromCredentialInputFields +; EapPeerQueryInteractiveUIInputFields +; EapPeerQueryUIBlobFromInteractiveUIInputFields diff --git a/EAPMethods/build/EAPMethodUI.def b/EAPMethods/build/EAPMethodUI.def new file mode 100644 index 0000000..470b9fd --- /dev/null +++ b/EAPMethods/build/EAPMethodUI.def @@ -0,0 +1,26 @@ +; +; Copyright 2015-2016 Amebis +; Copyright 2016 GÉANT +; +; This file is part of GEANTLink. +; +; GEANTLink is free software: you can redistribute it and/or modify it +; under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. +; +; GEANTLink is distributed in the hope that it will be useful, but +; WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with GEANTLink. If not, see . +; + +EXPORTS + EapPeerFreeMemory + EapPeerFreeErrorMemory + EapPeerInvokeConfigUI + EapPeerInvokeIdentityUI + EapPeerInvokeInteractiveUI diff --git a/EAPMethods/build/EAPTTLS.props b/EAPMethods/build/EAPTTLS.props index 905e5a0..344008b 100644 --- a/EAPMethods/build/EAPTTLS.props +++ b/EAPMethods/build/EAPTTLS.props @@ -9,6 +9,9 @@ EAPMETHOD_TYPE=21;%(PreprocessorDefinitions) + + EAPMethod.def + \ No newline at end of file diff --git a/EAPMethods/build/EAPTTLS.vcxproj b/EAPMethods/build/EAPTTLS.vcxproj index cde66e1..33d4d69 100644 --- a/EAPMethods/build/EAPTTLS.vcxproj +++ b/EAPMethods/build/EAPTTLS.vcxproj @@ -105,6 +105,9 @@ {d63f24bd-92a0-4d6b-8b69-ed947e4d2b1b} + + + diff --git a/EAPMethods/build/EAPTTLS.vcxproj.filters b/EAPMethods/build/EAPTTLS.vcxproj.filters index be1489a..2281c44 100644 --- a/EAPMethods/build/EAPTTLS.vcxproj.filters +++ b/EAPMethods/build/EAPTTLS.vcxproj.filters @@ -44,4 +44,9 @@ Resource Files + + + Source Files + + \ No newline at end of file diff --git a/EAPMethods/build/EAPTTLSUI.props b/EAPMethods/build/EAPTTLSUI.props new file mode 100644 index 0000000..c94e3c6 --- /dev/null +++ b/EAPMethods/build/EAPTTLSUI.props @@ -0,0 +1,17 @@ + + + + + + + + + + EAPMETHOD_TYPE=21;%(PreprocessorDefinitions) + + + EAPMethodUI.def + + + + \ No newline at end of file diff --git a/EAPMethods/build/EAPTTLSUI.rc b/EAPMethods/build/EAPTTLSUI.rc new file mode 100644 index 0000000000000000000000000000000000000000..64b9712bcfec564efbbb5bfd16b1b2cd9e9f6c4f GIT binary patch literal 4892 zcmdUy?QR=I6o$`lB<^8xCDc~nxTRDABBXrSZm4TVUMD3IQj`xnvFbXJ?NBQ9hPV`N z3V7Z#p6*V(kT(8`|OnKNhJ^PZ2H`RmU$duX5AXO=CWExWKwduuZr+nJr)g8s+W zut)Z-eZ72pO5cXPwxJy(HUGf*n$@;HnAx>~&nd4vU@hs&Y(zUjceeb#v?I_6#|2~3 z(Ol~2AThO9R$tM!DigJh&^2`JbJw@9H?DtZ-=q62eOI(6^i63cd+InA&d4#NizPN8 zlGLfKF>A)xYg$Q<(4+Mh2{TtNJ9Nnf*2+TZnlVpy2kYWU8lRYr3kl@Unf37MfEmhy1KO9o z^?5>89M})^NxLwJeXTZhj?2i##LOjYjTsZ}5W_QPY2iG{1LgH!kTreV0zp`5!!|+G zaa6()BDm$>U1W0}ML>^PLaWFV(g6}%*wFDW_3qKTi(JmEI&v9rA)*40WfZrI>d_LN z@=MX0Ve=4Xj@%3Liu^xt?lQa*Se!UZ@}Z(N30vyr`S7TuDHyshE&~t;fZZ3p^<$gXK)%SK^;W3f6=%Orz88#JtiNWgQR-x zb!TO|tR#hGL@Rsm<|BkcmJ$2%uQF0Gm)U*tV#=2)yy7e8O*L-FxayhWSUb=aZ}L~z zMI%3ofiK)M+6`6zPtmwRKK^WnA5_zC83meZ;? z%PD&HKR|91L_)mn_D3sH6#s8qqDNXD&29WDu5){i&w{^OcvsogB;xnTjm)#FJSINm z`KJ3;vz0%}!BlDk-)i@5qOEGY57+ywK0u;iepNCj4w`7%LAFzpRHUh@kCwTgCAh2N zu&_GCT38!&4ykI|g>KT(pw>6Q6ldvVEId{7bXw4=Y7dE8#l22QUD)aImUD`HTsd>V zsYwiIcFX65+E=wos8q#_GQv%Cw0*_$Ox3j>>?#6kpa`daRrVIP=vJ~rHP(3~?0hjR zsSt0Riorf4E#+hCZp$LU5{oarN~0Y2<_ zH0V~h3x-|f!})&C<4(5$u^#S9BT#6+ybY4{{1OnP^=!5J=HTlmkr=IwZEAG~Y-eDc zxHr<9bhNqZj{Q4UhI{r??%6fxA>9{>s&GgSh^;76{YFX<`n+aJSM&wX`< zzou?U^rXJZ5fwZZJ*eHHPE_e$^f9aLvYPJASNL^71t_m^-8)^Z)=ehbUC!O;kJzSu zNmu!_k)X3wx=XJ1q?KhKD`)?yrli&l(59@P!+mjA5Amj|7b=c2{E9cTS+$ literal 0 HcmV?d00001 diff --git a/EAPMethods/build/EAPTTLSUI.vcxproj b/EAPMethods/build/EAPTTLSUI.vcxproj new file mode 100644 index 0000000..9a20174 --- /dev/null +++ b/EAPMethods/build/EAPTTLSUI.vcxproj @@ -0,0 +1,114 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {DD7A97CA-F18E-43B7-95C4-D06E6A291624} + EAPTTLSUI + + + + DynamicLibrary + true + Unicode + + + DynamicLibrary + true + Unicode + + + DynamicLibrary + false + true + Unicode + + + DynamicLibrary + false + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + {47399d91-7eb9-41de-b521-514ba5db0c43} + + + {d63f24bd-92a0-4d6b-8b69-ed947e4d2b1b} + + + + + + + + + \ No newline at end of file diff --git a/EAPMethods/build/EAPTTLSUI.vcxproj.filters b/EAPMethods/build/EAPTTLSUI.vcxproj.filters new file mode 100644 index 0000000..e8a7725 --- /dev/null +++ b/EAPMethods/build/EAPTTLSUI.vcxproj.filters @@ -0,0 +1,52 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/EAPMethods/include/EAPMethods.h b/EAPMethods/include/EAPMethods.h index bf821d2..40f2b31 100644 --- a/EAPMethods/include/EAPMethods.h +++ b/EAPMethods/include/EAPMethods.h @@ -34,7 +34,9 @@ extern "C" { namespace eap { class session_base; + class eap_module_base; template class peer; + class peer_ui_base; }; #pragma once @@ -132,10 +134,9 @@ namespace eap /// - /// EAP peer base class + /// EAP module base class /// - template - class peer + class eap_module_base { public: inline DWORD create() @@ -150,57 +151,12 @@ namespace eap } - virtual ~peer() + virtual ~eap_module_base() { m_ep.write(&EAPMETHOD_TRACE_EVT_MODULE_UNLOAD, winstd::event_data((BYTE)EAPMETHOD_TYPE), winstd::event_data::blank); } - /// - /// Obtains a set of function pointers for an implementation of the EAP peer method currently loaded on the EAPHost service - /// - /// \sa [EapPeerGetInfo function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363608.aspx) - /// - inline void get_info(_Out_ EAP_PEER_METHOD_ROUTINES *pEapPeerMethodRoutines) const - { - ETW_FN_VOID; - - assert(pEapPeerMethodRoutines); - - pEapPeerMethodRoutines->dwVersion = PRODUCT_VERSION; - pEapPeerMethodRoutines->pEapType = NULL; - - pEapPeerMethodRoutines->EapPeerInitialize = initialize; - pEapPeerMethodRoutines->EapPeerShutdown = shutdown; - pEapPeerMethodRoutines->EapPeerBeginSession = begin_session; - pEapPeerMethodRoutines->EapPeerEndSession = end_session; - pEapPeerMethodRoutines->EapPeerSetCredentials = NULL; // Always NULL unless we want to use generic credential UI - pEapPeerMethodRoutines->EapPeerGetIdentity = get_identity; - pEapPeerMethodRoutines->EapPeerProcessRequestPacket = process_request_packet; - pEapPeerMethodRoutines->EapPeerGetResponsePacket = get_response_packet; - pEapPeerMethodRoutines->EapPeerGetResult = get_result; - pEapPeerMethodRoutines->EapPeerGetUIContext = get_ui_context; - pEapPeerMethodRoutines->EapPeerSetUIContext = set_ui_context; - pEapPeerMethodRoutines->EapPeerGetResponseAttributes = get_response_attributes; - pEapPeerMethodRoutines->EapPeerSetResponseAttributes = set_response_attributes; - } - - - /// - /// Free BLOB allocated with this peer - /// - inline void free_memory(_In_ void *ptr) - { - ETW_FN_VOID; - - if (ptr) { - // Since we do security here and some of the BLOBs contain credentials, sanitize every memory block before freeing. - SecureZeroMemory(ptr, HeapSize(m_heap, 0, ptr)); - HeapFree(m_heap, 0, ptr); - } - } - - /// /// Allocate a EAP_ERROR and fill it according to dwErrorCode /// @@ -257,6 +213,21 @@ namespace eap } + /// + /// Free BLOB allocated with this peer + /// + inline void free_memory(_In_ void *ptr) + { + ETW_FN_VOID; + + if (ptr) { + // Since we do security here and some of the BLOBs contain credentials, sanitize every memory block before freeing. + SecureZeroMemory(ptr, HeapSize(m_heap, 0, ptr)); + HeapFree(m_heap, 0, ptr); + } + } + + /// /// Free EAP_ERROR allocated with `make_error()` method /// @@ -270,6 +241,49 @@ namespace eap } } + + protected: + winstd::heap m_heap; ///< Heap + mutable winstd::event_provider m_ep; ///< Event Provider + }; + + + /// + /// EAP peer base class + /// + template + class peer : public eap_module_base + { + public: + /// + /// Obtains a set of function pointers for an implementation of the EAP peer method currently loaded on the EAPHost service + /// + /// \sa [EapPeerGetInfo function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363608.aspx) + /// + inline void get_info(_Out_ EAP_PEER_METHOD_ROUTINES *pEapPeerMethodRoutines) const + { + ETW_FN_VOID; + + assert(pEapPeerMethodRoutines); + + pEapPeerMethodRoutines->dwVersion = PRODUCT_VERSION; + pEapPeerMethodRoutines->pEapType = NULL; + + pEapPeerMethodRoutines->EapPeerInitialize = initialize; + pEapPeerMethodRoutines->EapPeerShutdown = shutdown; + pEapPeerMethodRoutines->EapPeerBeginSession = begin_session; + pEapPeerMethodRoutines->EapPeerEndSession = end_session; + pEapPeerMethodRoutines->EapPeerSetCredentials = NULL; // Always NULL unless we want to use generic credential UI + pEapPeerMethodRoutines->EapPeerGetIdentity = get_identity; + pEapPeerMethodRoutines->EapPeerProcessRequestPacket = process_request_packet; + pEapPeerMethodRoutines->EapPeerGetResponsePacket = get_response_packet; + pEapPeerMethodRoutines->EapPeerGetResult = get_result; + pEapPeerMethodRoutines->EapPeerGetUIContext = get_ui_context; + pEapPeerMethodRoutines->EapPeerSetUIContext = set_ui_context; + pEapPeerMethodRoutines->EapPeerGetResponseAttributes = get_response_attributes; + pEapPeerMethodRoutines->EapPeerSetResponseAttributes = set_response_attributes; + } + protected: /// /// Initializes an EAP peer method for EAPHost. @@ -446,9 +460,65 @@ namespace eap assert(hSession); return static_cast(hSession)->set_response_attributes(pAttribs, pEapOutput, ppEapError); } + }; - protected: - winstd::heap m_heap; ///< Heap - mutable winstd::event_provider m_ep; ///< Event Provider + + /// + /// EAP peer UI base class + /// + class peer_ui_base : public eap_module_base + { + public: + /// + /// Constructor + /// + peer_ui_base(); + + /// + /// Raises the EAP method's specific connection configuration user interface dialog on the client. + /// + /// \sa [EapPeerInvokeConfigUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363614.aspx) + /// + virtual DWORD invoke_config_ui( + _In_ const EAP_METHOD_TYPE *pEapType, + _In_ HWND hwndParent, + _In_ DWORD dwFlags, + _In_ DWORD dwSizeOfConnectionDataIn, + _In_count_(dwSizeOfConnectionDataIn) const BYTE *pConnectionDataIn, + _Out_ DWORD *pdwSizeOfConnectionDataOut, + _Out_ BYTE **ppConnectionDataOut, + _Out_ EAP_ERROR **ppEapError) = 0; + + /// + /// Raises a custom interactive user interface dialog to obtain user identity information for the EAP method on the client. + /// + /// \sa [EapPeerInvokeIdentityUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363615.aspx) + /// + virtual DWORD invoke_identity_ui( + _In_ const EAP_METHOD_TYPE *pEapType, + _In_ DWORD dwFlags, + _In_ HWND hwndParent, + _In_ DWORD dwSizeOfConnectionData, + _In_count_(dwSizeOfConnectionData) const BYTE *pConnectionData, + _In_ DWORD dwSizeOfUserData, + _In_count_(dwSizeOfUserData) const BYTE *pUserData, + _Out_ DWORD *pdwSizeOfUserDataOut, + _Out_ BYTE **ppUserDataOut, + _Out_ LPWSTR *ppwszIdentity, + _Out_ EAP_ERROR **ppEapError) = 0; + + /// + /// Raises a custom interactive user interface dialog for the EAP method on the client. + /// + /// \sa [EapPeerInvokeInteractiveUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363616.aspx) + /// + virtual DWORD invoke_interactive_ui( + _In_ const EAP_METHOD_TYPE *pEapType, + _In_ HWND hwndParent, + _In_ DWORD dwSizeofUIContextData, + _In_count_(dwSizeofUIContextData) const BYTE *pUIContextData, + _Out_ DWORD *pdwSizeOfDataFromInteractiveUI, + _Out_ BYTE **ppDataFromInteractiveUI, + _Out_ EAP_ERROR **ppEapError) = 0; }; }; diff --git a/EAPMethods/include/EAPTTLS.h b/EAPMethods/include/EAPTTLS.h index 7bce9b7..2d85b23 100644 --- a/EAPMethods/include/EAPTTLS.h +++ b/EAPMethods/include/EAPTTLS.h @@ -24,6 +24,7 @@ namespace eap { class session_ttls; class peer_ttls; + class peer_ttls_ui; } #pragma once @@ -44,4 +45,61 @@ namespace eap class peer_ttls : public peer { }; + + + class peer_ttls_ui : public peer_ui_base + { + public: + /// + /// Constructor + /// + peer_ttls_ui(); + + /// + /// Raises the EAP method's specific connection configuration user interface dialog on the client. + /// + /// \sa [EapPeerInvokeConfigUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363614.aspx) + /// + virtual DWORD invoke_config_ui( + _In_ const EAP_METHOD_TYPE *pEapType, + _In_ HWND hwndParent, + _In_ DWORD dwFlags, + _In_ DWORD dwSizeOfConnectionDataIn, + _In_count_(dwSizeOfConnectionDataIn) const BYTE *pConnectionDataIn, + _Out_ DWORD *pdwSizeOfConnectionDataOut, + _Out_ BYTE **ppConnectionDataOut, + _Out_ EAP_ERROR **ppEapError); + + /// + /// Raises a custom interactive user interface dialog to obtain user identity information for the EAP method on the client. + /// + /// \sa [EapPeerInvokeIdentityUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363615.aspx) + /// + virtual DWORD invoke_identity_ui( + _In_ const EAP_METHOD_TYPE *pEapType, + _In_ DWORD dwFlags, + _In_ HWND hwndParent, + _In_ DWORD dwSizeOfConnectionData, + _In_count_(dwSizeOfConnectionData) const BYTE *pConnectionData, + _In_ DWORD dwSizeOfUserData, + _In_count_(dwSizeOfUserData) const BYTE *pUserData, + _Out_ DWORD *pdwSizeOfUserDataOut, + _Out_ BYTE **ppUserDataOut, + _Out_ LPWSTR *ppwszIdentity, + _Out_ EAP_ERROR **ppEapError); + + /// + /// Raises a custom interactive user interface dialog for the EAP method on the client. + /// + /// \sa [EapPeerInvokeInteractiveUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363616.aspx) + /// + virtual DWORD invoke_interactive_ui( + _In_ const EAP_METHOD_TYPE *pEapType, + _In_ HWND hwndParent, + _In_ DWORD dwSizeofUIContextData, + _In_count_(dwSizeofUIContextData) const BYTE *pUIContextData, + _Out_ DWORD *pdwSizeOfDataFromInteractiveUI, + _Out_ BYTE **ppDataFromInteractiveUI, + _Out_ EAP_ERROR **ppEapError); + }; } diff --git a/EAPMethods/include/StdAfx.h b/EAPMethods/include/StdAfx.h index 30139ff..793ca00 100644 --- a/EAPMethods/include/StdAfx.h +++ b/EAPMethods/include/StdAfx.h @@ -28,9 +28,7 @@ #include #include -extern "C" { #include -} #include #include diff --git a/EAPMethods/src/EAPMethods.cpp b/EAPMethods/src/EAPMethods.cpp index 3c46fc6..91a824d 100644 --- a/EAPMethods/src/EAPMethods.cpp +++ b/EAPMethods/src/EAPMethods.cpp @@ -130,3 +130,12 @@ DWORD eap::session_base::set_response_attributes(_In_ EapAttributes *pAttribs, _ return ERROR_SUCCESS; } + + +////////////////////////////////////////////////////////////////////// +// eap::peer_ui_base +////////////////////////////////////////////////////////////////////// + +eap::peer_ui_base::peer_ui_base() : eap_module_base() +{ +} diff --git a/EAPMethods/src/EAPTTLS.cpp b/EAPMethods/src/EAPTTLS.cpp index 711444d..c880f79 100644 --- a/EAPMethods/src/EAPTTLS.cpp +++ b/EAPMethods/src/EAPTTLS.cpp @@ -20,6 +20,8 @@ #include +#pragma comment(lib, "Comctl32.lib") + ////////////////////////////////////////////////////////////////////// // eap::session_ttls @@ -28,3 +30,91 @@ eap::session_ttls::session_ttls() : session_base() { } + + +////////////////////////////////////////////////////////////////////// +// eap::peer_ui_base +////////////////////////////////////////////////////////////////////// + +eap::peer_ttls_ui::peer_ttls_ui() : peer_ui_base() +{ +} + + +DWORD eap::peer_ttls_ui::invoke_config_ui( + _In_ const EAP_METHOD_TYPE *pEapType, + _In_ HWND hwndParent, + _In_ DWORD dwFlags, + _In_ DWORD dwSizeOfConnectionDataIn, + _In_count_(dwSizeOfConnectionDataIn) const BYTE *pConnectionDataIn, + _Out_ DWORD *pdwSizeOfConnectionDataOut, + _Out_ BYTE **ppConnectionDataOut, + _Out_ EAP_ERROR **ppEapError) +{ + UNREFERENCED_PARAMETER(pEapType); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(dwSizeOfConnectionDataIn); + UNREFERENCED_PARAMETER(pConnectionDataIn); + UNREFERENCED_PARAMETER(pdwSizeOfConnectionDataOut); + UNREFERENCED_PARAMETER(ppConnectionDataOut); + UNREFERENCED_PARAMETER(ppEapError); + + InitCommonControls(); + MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" configuration goes here!"), _T(PRODUCT_NAME_STR) _T(" Settings"), MB_OK); + + return ERROR_SUCCESS; +} + + +DWORD eap::peer_ttls_ui::invoke_identity_ui( + _In_ const EAP_METHOD_TYPE *pEapType, + _In_ DWORD dwFlags, + _In_ HWND hwndParent, + _In_ DWORD dwSizeOfConnectionData, + _In_count_(dwSizeOfConnectionData) const BYTE *pConnectionData, + _In_ DWORD dwSizeOfUserData, + _In_count_(dwSizeOfUserData) const BYTE *pUserData, + _Out_ DWORD *pdwSizeOfUserDataOut, + _Out_ BYTE **ppUserDataOut, + _Out_ LPWSTR *ppwszIdentity, + _Out_ EAP_ERROR **ppEapError) +{ + UNREFERENCED_PARAMETER(pEapType); + UNREFERENCED_PARAMETER(dwFlags); + UNREFERENCED_PARAMETER(dwSizeOfConnectionData); + UNREFERENCED_PARAMETER(pConnectionData); + UNREFERENCED_PARAMETER(dwSizeOfUserData); + UNREFERENCED_PARAMETER(pUserData); + UNREFERENCED_PARAMETER(pdwSizeOfUserDataOut); + UNREFERENCED_PARAMETER(ppUserDataOut); + UNREFERENCED_PARAMETER(ppwszIdentity); + UNREFERENCED_PARAMETER(ppEapError); + + InitCommonControls(); + MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" credential prompt goes here!"), _T(PRODUCT_NAME_STR) _T(" Credentials"), MB_OK); + + return ERROR_SUCCESS; +} + + +DWORD eap::peer_ttls_ui::invoke_interactive_ui( + _In_ const EAP_METHOD_TYPE *pEapType, + _In_ HWND hwndParent, + _In_ DWORD dwSizeofUIContextData, + _In_count_(dwSizeofUIContextData) const BYTE *pUIContextData, + _Out_ DWORD *pdwSizeOfDataFromInteractiveUI, + _Out_ BYTE **ppDataFromInteractiveUI, + _Out_ EAP_ERROR **ppEapError) +{ + UNREFERENCED_PARAMETER(pEapType); + UNREFERENCED_PARAMETER(dwSizeofUIContextData); + UNREFERENCED_PARAMETER(pUIContextData); + UNREFERENCED_PARAMETER(pdwSizeOfDataFromInteractiveUI); + UNREFERENCED_PARAMETER(ppDataFromInteractiveUI); + UNREFERENCED_PARAMETER(ppEapError); + + InitCommonControls(); + MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" interactive UI goes here!"), _T(PRODUCT_NAME_STR) _T(" Prompt"), MB_OK); + + return ERROR_SUCCESS; +} diff --git a/EAPMethods/src/Main.cpp b/EAPMethods/src/Main.cpp index 6031a2e..e0e5e82 100644 --- a/EAPMethods/src/Main.cpp +++ b/EAPMethods/src/Main.cpp @@ -20,8 +20,6 @@ #include -#pragma comment(lib, "Comctl32.lib") -#pragma comment(lib, "Shlwapi.lib") #if EAPMETHOD_TYPE==21 #define _EAPMETHOD_PEER eap::peer_ttls @@ -43,19 +41,13 @@ BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ LPVOID l UNREFERENCED_PARAMETER(lpvReserved); if (fdwReason == DLL_PROCESS_ATTACH) { - //// Load EAPMethodEvents.dll - //tstring path; - //GetModuleFileName(hinstDLL, path); - //LPTSTR pszFilename = PathFindFileName(path.c_str()); - //path.resize(pszFilename ? (size_t)(pszFilename - (LPCTSTR)path.c_str()) : 0); - //path += _T("EAPMethodEvents.dll"); - //g_EAPMethodEvents.load(path.c_str(), NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE); - - if (!g_peer.create()) +#ifdef _DEBUG + //Sleep(10000); +#endif + if (g_peer.create() != ERROR_SUCCESS) return FALSE; - } else if (fdwReason == DLL_PROCESS_DETACH) { + } else if (fdwReason == DLL_PROCESS_DETACH) assert(!_CrtDumpMemoryLeaks()); - } return TRUE; } @@ -71,8 +63,6 @@ VOID WINAPI EapPeerFreeMemory(_In_ void *pUIContextData) g_peer.free_memory(pUIContextData); } -#pragma comment(linker, "/EXPORT:EapPeerFreeMemory") - /// /// Releases error-specific memory allocated by the EAP peer method. @@ -84,8 +74,6 @@ VOID WINAPI EapPeerFreeErrorMemory(_In_ EAP_ERROR *ppEapError) g_peer.free_error_memory(ppEapError); } -#pragma comment(linker, "/EXPORT:EapPeerFreeErrorMemory") - /// /// Obtains a set of function pointers for an implementation of the EAP peer method currently loaded on the EAPHost service. @@ -100,144 +88,16 @@ DWORD WINAPI EapPeerGetInfo(_In_ EAP_TYPE* pEapType, _Out_ EAP_PEER_METHOD_ROUTI #endif // Parameter check - if (!ppEapError) { + if (!ppEapError) dwResult = ERROR_INVALID_PARAMETER; - } else if (!pEapType) { + else if (!pEapType) *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL); - } else if (pEapType->type != EAPMETHOD_TYPE) { + else if (pEapType->type != EAPMETHOD_TYPE) *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->type, (int)EAPMETHOD_TYPE).c_str(), NULL); - } else if (!pEapPeerMethodRoutines) { + else if (!pEapPeerMethodRoutines) *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapPeerMethodRoutines is NULL."), NULL); - } else + else g_peer.get_info(pEapPeerMethodRoutines); return dwResult; } - -#pragma comment(linker, "/EXPORT:EapPeerGetInfo") - - -/// -/// Raises the EAP method's specific connection configuration user interface dialog on the client. -/// -/// \sa [EapPeerInvokeConfigUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363614.aspx) -/// -DWORD WINAPI EapPeerInvokeConfigUI(_In_ EAP_METHOD_TYPE *pEapType, _In_ HWND hwndParent, _In_ DWORD dwFlags, _In_ DWORD dwSizeOfConnectionDataIn, _In_ BYTE *pConnectionDataIn, _Out_ DWORD *pdwSizeOfConnectionDataOut, _Out_ BYTE **ppConnectionDataOut, _Out_ EAP_ERROR **ppEapError) -{ - DWORD dwResult = NO_ERROR; - -#ifdef _DEBUG - //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK); -#endif - - // Parameter check - if (!ppEapError) { - dwResult = ERROR_INVALID_PARAMETER; - } else if (!pEapType) { - *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL); - } else if (pEapType->eapType.type != EAPMETHOD_TYPE) { - *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL); - } else if (pEapType->dwAuthorId != 67532) { - *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL); - } else if (!pdwSizeOfConnectionDataOut) { - *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfConnectionDataOut is NULL."), NULL); - } else if (!ppConnectionDataOut) { - *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppConnectionDataOut is NULL."), NULL); - } else { - UNREFERENCED_PARAMETER(dwFlags); - UNREFERENCED_PARAMETER(dwSizeOfConnectionDataIn); - UNREFERENCED_PARAMETER(pConnectionDataIn); - - InitCommonControls(); - MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" configuration goes here!"), _T(PRODUCT_NAME_STR) _T(" Settings"), MB_OK); - } - - return dwResult; -} - -#pragma comment(linker, "/EXPORT:EapPeerInvokeConfigUI") - - -/// -/// Raises a custom interactive user interface dialog to obtain user identity information for the EAP method on the client. -/// -/// \sa [EapPeerInvokeIdentityUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363615.aspx) -/// -DWORD WINAPI EapPeerInvokeIdentityUI(_In_ EAP_METHOD_TYPE *pEapType, _In_ DWORD dwFlags, _In_ HWND hwndParent, _In_ DWORD dwSizeOfConnectionData, _In_ const BYTE *pConnectionData, _Out_ DWORD dwSizeOfUserData, _In_ const BYTE *pUserData, _Out_ DWORD *pdwSizeOfUserDataOut, _Out_ BYTE **ppUserDataOut, _Out_ LPWSTR *ppwszIdentity, _Out_ EAP_ERROR **ppEapError) -{ - DWORD dwResult = NO_ERROR; - -#ifdef _DEBUG - //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK); -#endif - - // Parameter check - if (!ppEapError) { - dwResult = ERROR_INVALID_PARAMETER; - } else if (!pEapType) { - *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL); - } else if (pEapType->eapType.type != EAPMETHOD_TYPE) { - *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL); - } else if (pEapType->dwAuthorId != 67532) { - *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL); - } else if (!pdwSizeOfUserDataOut) { - *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfUserDataOut is NULL."), NULL); - } else if (!ppUserDataOut) { - *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppUserDataOut is NULL."), NULL); - } else if (!ppwszIdentity) { - *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppwszIdentity is NULL."), NULL); - } else { - UNREFERENCED_PARAMETER(dwFlags); - UNREFERENCED_PARAMETER(pUserData); - UNREFERENCED_PARAMETER(dwSizeOfUserData); - UNREFERENCED_PARAMETER(pConnectionData); - UNREFERENCED_PARAMETER(dwSizeOfConnectionData); - - InitCommonControls(); - MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" credential prompt goes here!"), _T(PRODUCT_NAME_STR) _T(" Credentials"), MB_OK); - } - - return dwResult; -} - -#pragma comment(linker, "/EXPORT:EapPeerInvokeIdentityUI") - - -/// -/// Raises a custom interactive user interface dialog for the EAP method on the client. -/// -/// \sa [EapPeerInvokeInteractiveUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363616.aspx) -/// -DWORD WINAPI EapPeerInvokeInteractiveUI(_In_ EAP_METHOD_TYPE *pEapType, _In_ HWND hwndParent, _In_ DWORD dwSizeofUIContextData, _In_ BYTE *pUIContextData, _Out_ DWORD *pdwSizeOfDataFromInteractiveUI, _Out_ BYTE **ppDataFromInteractiveUI, _Out_ EAP_ERROR **ppEapError) -{ - DWORD dwResult = NO_ERROR; - -#ifdef _DEBUG - //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK); -#endif - - // Parameter check - if (!ppEapError) { - dwResult = ERROR_INVALID_PARAMETER; - } else if (!pEapType) { - *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL); - } else if (pEapType->eapType.type != EAPMETHOD_TYPE) { - *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL); - } else if (pEapType->dwAuthorId != 67532) { - *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL); - } else if (!pdwSizeOfDataFromInteractiveUI) { - *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfDataFromInteractiveUI is NULL."), NULL); - } else if (!ppDataFromInteractiveUI) { - *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppDataFromInteractiveUI is NULL."), NULL); - } else { - UNREFERENCED_PARAMETER(dwSizeofUIContextData); - UNREFERENCED_PARAMETER(pUIContextData); - - InitCommonControls(); - MessageBox(hwndParent, _T(PRODUCT_NAME_STR) _T(" interactive UI goes here!"), _T(PRODUCT_NAME_STR) _T(" Prompt"), MB_OK); - } - - return dwResult; -} - -#pragma comment(linker, "/EXPORT:EapPeerInvokeInteractiveUI") diff --git a/EAPMethods/src/MainUI.cpp b/EAPMethods/src/MainUI.cpp new file mode 100644 index 0000000..abf9494 --- /dev/null +++ b/EAPMethods/src/MainUI.cpp @@ -0,0 +1,225 @@ +/* + Copyright 2015-2016 Amebis + Copyright 2016 GÉANT + + This file is part of GEANTLink. + + GEANTLink is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + GEANTLink is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GEANTLink. If not, see . +*/ + +#include + + +#if EAPMETHOD_TYPE==21 +#define _EAPMETHOD_PEER_UI eap::peer_ttls_ui +#else +#error Unknown EAP Method type. +#endif + +_EAPMETHOD_PEER_UI g_peer; + + +/// +/// DLL main entry point +/// +/// \sa [DllMain entry point](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583.aspx) +/// +BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ LPVOID lpvReserved) +{ + UNREFERENCED_PARAMETER(hinstDLL); + UNREFERENCED_PARAMETER(lpvReserved); + + if (fdwReason == DLL_PROCESS_ATTACH) { +#ifdef _DEBUG + //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK); +#endif + if (g_peer.create() != ERROR_SUCCESS) + return FALSE; + } else if (fdwReason == DLL_PROCESS_DETACH) + assert(!_CrtDumpMemoryLeaks()); + + return TRUE; +} + + +/// +/// Releases all memory associated with an opaque user interface context data buffer. +/// +/// \sa [EapPeerFreeMemory function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363606.aspx) +/// +VOID WINAPI EapPeerFreeMemory(_In_ void *pUIContextData) +{ + g_peer.free_memory(pUIContextData); +} + + +/// +/// Releases error-specific memory allocated by the EAP peer method. +/// +/// \sa [EapPeerFreeErrorMemory function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363605.aspx) +/// +VOID WINAPI EapPeerFreeErrorMemory(_In_ EAP_ERROR *ppEapError) +{ + g_peer.free_error_memory(ppEapError); +} + + +/// +/// Raises the EAP method's specific connection configuration user interface dialog on the client. +/// +/// \sa [EapPeerInvokeConfigUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363614.aspx) +/// +DWORD WINAPI EapPeerInvokeConfigUI( + _In_ /*const*/ EAP_METHOD_TYPE *pEapType, + _In_ HWND hwndParent, + _In_ DWORD dwFlags, + _In_ DWORD dwSizeOfConnectionDataIn, + _In_count_(dwSizeOfConnectionDataIn) /*const*/ BYTE *pConnectionDataIn, + _Out_ DWORD *pdwSizeOfConnectionDataOut, + _Out_ BYTE **ppConnectionDataOut, + _Out_ EAP_ERROR **ppEapError) +{ + DWORD dwResult = NO_ERROR; +#ifdef _DEBUG + //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK); +#endif + + // Parameter check + if (!ppEapError) + dwResult = ERROR_INVALID_PARAMETER; + else if (!pEapType) + *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL); + else if (pEapType->eapType.type != EAPMETHOD_TYPE) + *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL); + else if (pEapType->dwAuthorId != 67532) + *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL); + else if (!pdwSizeOfConnectionDataOut) + *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfConnectionDataOut is NULL."), NULL); + else if (!ppConnectionDataOut) + *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppConnectionDataOut is NULL."), NULL); + else + dwResult = g_peer.invoke_config_ui( + pEapType, + hwndParent, + dwFlags, + dwSizeOfConnectionDataIn, + pConnectionDataIn, + pdwSizeOfConnectionDataOut, + ppConnectionDataOut, + ppEapError); + + return dwResult; +} + + +/// +/// Raises a custom interactive user interface dialog to obtain user identity information for the EAP method on the client. +/// +/// \sa [EapPeerInvokeIdentityUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363615.aspx) +/// +DWORD WINAPI EapPeerInvokeIdentityUI( + _In_ /*const*/ EAP_METHOD_TYPE *pEapType, + _In_ DWORD dwFlags, + _In_ HWND hwndParent, + _In_ DWORD dwSizeOfConnectionData, + _In_count_(dwSizeOfConnectionData) const BYTE *pConnectionData, + _In_ DWORD dwSizeOfUserData, + _In_count_(dwSizeOfUserData) const BYTE *pUserData, + _Out_ DWORD *pdwSizeOfUserDataOut, + _Out_ BYTE **ppUserDataOut, + _Out_ LPWSTR *ppwszIdentity, + _Out_ EAP_ERROR **ppEapError) +{ + DWORD dwResult = NO_ERROR; +#ifdef _DEBUG + //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK); +#endif + + // Parameter check + if (!ppEapError) + dwResult = ERROR_INVALID_PARAMETER; + else if (!pEapType) + *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL); + else if (pEapType->eapType.type != EAPMETHOD_TYPE) + *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL); + else if (pEapType->dwAuthorId != 67532) + *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL); + else if (!pdwSizeOfUserDataOut) + *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfUserDataOut is NULL."), NULL); + else if (!ppUserDataOut) + *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppUserDataOut is NULL."), NULL); + else if (!ppwszIdentity) + *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppwszIdentity is NULL."), NULL); + else + dwResult = g_peer.invoke_identity_ui( + pEapType, + dwFlags, + hwndParent, + dwSizeOfConnectionData, + pConnectionData, + dwSizeOfUserData, + pUserData, + pdwSizeOfUserDataOut, + ppUserDataOut, + ppwszIdentity, + ppEapError); + + return dwResult; +} + + +/// +/// Raises a custom interactive user interface dialog for the EAP method on the client. +/// +/// \sa [EapPeerInvokeInteractiveUI function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363616.aspx) +/// +DWORD WINAPI EapPeerInvokeInteractiveUI( + _In_ /*const*/ EAP_METHOD_TYPE *pEapType, + _In_ HWND hwndParent, + _In_ DWORD dwSizeofUIContextData, + _In_count_(dwSizeofUIContextData) /*const*/ BYTE *pUIContextData, + _Out_ DWORD *pdwSizeOfDataFromInteractiveUI, + _Out_ BYTE **ppDataFromInteractiveUI, + _Out_ EAP_ERROR **ppEapError) +{ + DWORD dwResult = NO_ERROR; +#ifdef _DEBUG + //MessageBox(NULL, _T("Attach debugger!"), _T(__FUNCTION__), MB_OK); +#endif + + // Parameter check + if (!ppEapError) + dwResult = ERROR_INVALID_PARAMETER; + else if (!pEapType) + *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pEapType is NULL."), NULL); + else if (pEapType->eapType.type != EAPMETHOD_TYPE) + *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" Input EAP type (%d) does not match the supported EAP type (%d)."), (int)pEapType->eapType.type, (int)EAPMETHOD_TYPE).c_str(), NULL); + else if (pEapType->dwAuthorId != 67532) + *ppEapError = g_peer.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, winstd::wstring_printf(_T(__FUNCTION__) _T(" EAP author (%d) does not match the supported author (%d)."), (int)pEapType->dwAuthorId, (int)67532).c_str(), NULL); + else if (!pdwSizeOfDataFromInteractiveUI) + *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" pdwSizeOfDataFromInteractiveUI is NULL."), NULL); + else if (!ppDataFromInteractiveUI) + *ppEapError = g_peer.make_error(dwResult = ERROR_INVALID_PARAMETER, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" ppDataFromInteractiveUI is NULL."), NULL); + else + dwResult = g_peer.invoke_interactive_ui( + pEapType, + hwndParent, + dwSizeofUIContextData, + pUIContextData, + pdwSizeOfDataFromInteractiveUI, + ppDataFromInteractiveUI, + ppEapError); + + return dwResult; +} diff --git a/Makefile b/Makefile index 5fdbde6..d4b6e9e 100644 --- a/Makefile +++ b/Makefile @@ -188,6 +188,9 @@ RegisterDLLs :: \ "$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLS.dll" reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532" /ve /t REG_SZ /d "$(PRODUCT_NAME)" /f > NUL reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerDllPath" /t REG_SZ /d "$(MAKEDIR)\$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLS.dll" /f > NUL + reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerConfigUIPath" /t REG_SZ /d "$(MAKEDIR)\$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLSUI.dll" /f > NUL + reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerIdentityPath" /t REG_SZ /d "$(MAKEDIR)\$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLSUI.dll" /f > NUL + reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerInteractiveUIPath" /t REG_SZ /d "$(MAKEDIR)\$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLSUI.dll" /f > NUL reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerFriendlyName" /t REG_SZ /d "@$(MAKEDIR)\$(OUTPUT_DIR)\$(PLAT).Debug\EAPTTLS.dll,-1" /f > NUL reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerInvokePasswordDialog" /t REG_DWORD /d 0 /f > NUL reg.exe add "HKLM\SYSTEM\CurrentControlSet\services\EapHost\Methods\67532\21" /v "PeerInvokeUsernameDialog" /t REG_DWORD /d 0 /f > NUL diff --git a/VS10Solution.sln b/VS10Solution.sln index 7efe58f..29e8efe 100644 --- a/VS10Solution.sln +++ b/VS10Solution.sln @@ -20,6 +20,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CredWrite", "CredWrite\Cred EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EAPMethodEvents", "EAPMethods\build\EAPMethodEvents.vcxproj", "{D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EAPTTLSUI", "EAPMethods\build\EAPTTLSUI.vcxproj", "{DD7A97CA-F18E-43B7-95C4-D06E6A291624}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -60,6 +62,14 @@ Global {D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B}.Release|Win32.Build.0 = Release|Win32 {D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B}.Release|x64.ActiveCfg = Release|x64 {D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B}.Release|x64.Build.0 = Release|x64 + {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Debug|Win32.ActiveCfg = Debug|Win32 + {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Debug|Win32.Build.0 = Debug|Win32 + {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Debug|x64.ActiveCfg = Debug|x64 + {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Debug|x64.Build.0 = Debug|x64 + {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|Win32.ActiveCfg = Release|Win32 + {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|Win32.Build.0 = Release|Win32 + {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|x64.ActiveCfg = Release|x64 + {DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -67,6 +77,7 @@ Global GlobalSection(NestedProjects) = preSolution {331B6077-E3E2-4867-B93E-9D3F57280DE7} = {60BAAC3D-DC98-4C19-BC40-1A86963DE86C} {D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B} = {60BAAC3D-DC98-4C19-BC40-1A86963DE86C} + {DD7A97CA-F18E-43B7-95C4-D06E6A291624} = {60BAAC3D-DC98-4C19-BC40-1A86963DE86C} {47399D91-7EB9-41DE-B521-514BA5DB0C43} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393} {2D3CE079-7EB1-4F47-B79E-F0310671ECCB} = {7B5EC9B7-208C-426A-941D-DAF9271BD4A4} EndGlobalSection