diff --git a/lib/EAPBase_UI/include/EAP_UI.h b/lib/EAPBase_UI/include/EAP_UI.h index 3d955b5..f25304a 100644 --- a/lib/EAPBase_UI/include/EAP_UI.h +++ b/lib/EAPBase_UI/include/EAP_UI.h @@ -56,7 +56,7 @@ template class wxCredentialsPanel; /// /// Password credentials panel /// -class wxPasswordCredentialsPanel; +template class wxPasswordCredentialsPanel; /// /// Sets icon from resource @@ -343,7 +343,7 @@ protected: wxEAPCredentialsDialog dlg(this); - _wxT *panel = new _wxT(m_cred, m_target.c_str(), &dlg, true); + _wxT *panel = new _wxT(m_prov, m_cred, m_target.c_str(), &dlg, true); dlg.AddContents((wxPanel**)&panel, 1); dlg.ShowModal(); @@ -365,7 +365,7 @@ protected: wxEAPCredentialsDialog dlg(this); - _wxT *panel = new _wxT(m_cred, _T(""), &dlg, true); + _wxT *panel = new _wxT(m_prov, m_cred, _T(""), &dlg, true); dlg.AddContents((wxPanel**)&panel, 1); dlg.ShowModal(); @@ -461,23 +461,79 @@ protected: }; +template class wxPasswordCredentialsPanel : public wxCredentialsPanel { public: /// /// Constructs a password credentials panel /// + /// \param[inout] prov EAP provider /// \param[inout] cred Credentials data /// \param[in] pszCredTarget Target name of credentials in Windows Credential Manager. Can be further decorated to create final target name. /// \param[in] parent Parent window /// \param[in] is_config Is this panel used to pre-enter credentials? When \c true, the "Remember" checkbox is always selected and disabled. /// - wxPasswordCredentialsPanel(eap::credentials_pass &cred, LPCTSTR pszCredTarget, wxWindow* parent, bool is_config = false); + wxPasswordCredentialsPanel(_Tprov &prov, eap::credentials_pass &cred, LPCTSTR pszCredTarget, wxWindow* parent, bool is_config = false) : + wxCredentialsPanel(cred, pszCredTarget, parent, is_config) + { + // Load and set icon. + if (m_shell32.load(_T("shell32.dll"), NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE)) + wxSetIconFromResource(m_credentials_icon, m_icon, m_shell32, MAKEINTRESOURCE(269)); + + bool layout = false; + if (!prov.m_lbl_alt_credential.empty()) { + m_credentials_label->SetLabel(prov.m_lbl_alt_credential); + m_credentials_label->Wrap( 446 ); + layout = true; + } + + if (!prov.m_lbl_alt_identity.empty()) { + m_identity_label->SetLabel(prov.m_lbl_alt_identity); + layout = true; + } + + if (!prov.m_lbl_alt_password.empty()) { + m_password_label->SetLabel(prov.m_lbl_alt_password); + layout = true; + } + + if (layout) + this->Layout(); + } protected: /// \cond internal - virtual bool TransferDataToWindow(); - virtual bool TransferDataFromWindow(); + + virtual bool TransferDataToWindow() + { + // Inherited TransferDataToWindow() calls m_cred.retrieve(). + // Therefore, call it now, to set m_cred. + wxCHECK(__super::TransferDataToWindow(), false); + + m_identity->SetValue(m_cred.m_identity); + m_identity->SetSelection(0, -1); + m_password->SetValue(m_cred.m_password.empty() ? wxEmptyString : s_dummy_password); + + return true; + } + + + virtual bool TransferDataFromWindow() + { + m_cred.m_identity = m_identity->GetValue(); + + wxString pass = m_password->GetValue(); + if (pass.compare(s_dummy_password) != 0) { + m_cred.m_password = pass; + pass.assign(pass.length(), wxT('*')); + } + + // Inherited TransferDataFromWindow() calls m_cred.store(). + // Therefore, call it only now, that m_cred is set. + return __super::TransferDataFromWindow(); + } + /// \endcond protected: @@ -489,6 +545,10 @@ private: }; +template +const wxStringCharType *wxPasswordCredentialsPanel<_Tprov>::s_dummy_password = wxT("dummypass"); + + inline bool wxSetIconFromResource(wxStaticBitmap *bmp, wxIcon &icon, HINSTANCE hinst, PCWSTR pszName) { wxASSERT(bmp); diff --git a/lib/EAPBase_UI/res/wxEAP_UI.fbp b/lib/EAPBase_UI/res/wxEAP_UI.fbp index 58fd3a0..96311ed 100644 --- a/lib/EAPBase_UI/res/wxEAP_UI.fbp +++ b/lib/EAPBase_UI/res/wxEAP_UI.fbp @@ -1856,7 +1856,7 @@ - + wxID_ANY Client Credentials @@ -1864,11 +1864,11 @@ wxVERTICAL none - + 5 wxEXPAND 0 - + sb_credentials_horiz wxHORIZONTAL @@ -1954,11 +1954,11 @@ - + 5 wxEXPAND 1 - + sb_credentials_vert wxVERTICAL @@ -2046,11 +2046,11 @@ - + 5 wxEXPAND|wxALL 0 - + 2 wxBOTH 1 diff --git a/lib/EAPBase_UI/src/EAP_UI.cpp b/lib/EAPBase_UI/src/EAP_UI.cpp index 7cc45db..2b6ff26 100644 --- a/lib/EAPBase_UI/src/EAP_UI.cpp +++ b/lib/EAPBase_UI/src/EAP_UI.cpp @@ -62,49 +62,3 @@ wxEAPBannerPanel::wxEAPBannerPanel(wxWindow* parent) : wxEAPBannerPanelBase(pare { m_title->SetLabelText(wxT(PRODUCT_NAME_STR)); } - - -////////////////////////////////////////////////////////////////////// -// wxPasswordCredentialsPanel -////////////////////////////////////////////////////////////////////// - -const wxStringCharType *wxPasswordCredentialsPanel::s_dummy_password = wxT("dummypass"); - - -wxPasswordCredentialsPanel::wxPasswordCredentialsPanel(eap::credentials_pass &cred, LPCTSTR pszCredTarget, wxWindow* parent, bool is_config) : - wxCredentialsPanel(cred, pszCredTarget, parent, is_config) -{ - // Load and set icon. - if (m_shell32.load(_T("shell32.dll"), NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE)) - wxSetIconFromResource(m_credentials_icon, m_icon, m_shell32, MAKEINTRESOURCE(269)); -} - - -bool wxPasswordCredentialsPanel::TransferDataToWindow() -{ - // Inherited TransferDataToWindow() calls m_cred.retrieve(). - // Therefore, call it now, to set m_cred. - wxCHECK(__super::TransferDataToWindow(), false); - - m_identity->SetValue(m_cred.m_identity); - m_identity->SetSelection(0, -1); - m_password->SetValue(m_cred.m_password.empty() ? wxEmptyString : s_dummy_password); - - return true; -} - - -bool wxPasswordCredentialsPanel::TransferDataFromWindow() -{ - m_cred.m_identity = m_identity->GetValue(); - - wxString pass = m_password->GetValue(); - if (pass.compare(s_dummy_password) != 0) { - m_cred.m_password = pass; - pass.assign(pass.length(), wxT('*')); - } - - // Inherited TransferDataFromWindow() calls m_cred.store(). - // Therefore, call it only now, that m_cred is set. - return __super::TransferDataFromWindow(); -} diff --git a/lib/PAP_UI/include/PAP_UI.h b/lib/PAP_UI/include/PAP_UI.h index 62c61fb..e0af10b 100644 --- a/lib/PAP_UI/include/PAP_UI.h +++ b/lib/PAP_UI/include/PAP_UI.h @@ -41,7 +41,7 @@ template class wxPAPConfigPanel; template -class wxPAPCredentialsConfigPanel : public wxEAPCredentialsConfigPanel<_Tprov, eap::config_pap, wxPasswordCredentialsPanel> +class wxPAPCredentialsConfigPanel : public wxEAPCredentialsConfigPanel<_Tprov, eap::config_pap, wxPasswordCredentialsPanel<_Tprov> > { public: /// @@ -53,7 +53,7 @@ public: /// \param[in] parent Parent window /// wxPAPCredentialsConfigPanel(_Tprov &prov, eap::config_pap &cfg, LPCTSTR pszCredTarget, wxWindow *parent) : - wxEAPCredentialsConfigPanel<_Tprov, eap::config_pap, wxPasswordCredentialsPanel>(prov, cfg, pszCredTarget, parent) + wxEAPCredentialsConfigPanel<_Tprov, eap::config_pap, wxPasswordCredentialsPanel<_Tprov> >(prov, cfg, pszCredTarget, parent) { } }; diff --git a/lib/TLS_UI/include/TLS_UI.h b/lib/TLS_UI/include/TLS_UI.h index 3fac909..913c9bd 100644 --- a/lib/TLS_UI/include/TLS_UI.h +++ b/lib/TLS_UI/include/TLS_UI.h @@ -58,7 +58,7 @@ class wxFQDNListValidator; /// /// EAPTLS credential panel /// -class wxEAPTLSCredentialsPanel; +template class wxEAPTLSCredentialsPanel; /// /// EAPTLS server trust configuration panel @@ -256,19 +256,98 @@ protected: }; +template class wxEAPTLSCredentialsPanel : public wxCredentialsPanel { public: /// /// Constructs a configuration panel /// - wxEAPTLSCredentialsPanel(eap::credentials_tls &cred, LPCTSTR pszCredTarget, wxWindow* parent, bool is_config = false); + wxEAPTLSCredentialsPanel(_Tprov &prov, eap::credentials_tls &cred, LPCTSTR pszCredTarget, wxWindow* parent, bool is_config = false) : + wxCredentialsPanel(cred, pszCredTarget, parent, is_config) + { + UNREFERENCED_PARAMETER(prov); + + // Load and set icon. + if (m_shell32.load(_T("shell32.dll"), NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE)) + wxSetIconFromResource(m_credentials_icon, m_icon, m_shell32, MAKEINTRESOURCE(269)); + } protected: /// \cond internal - virtual bool TransferDataToWindow(); - virtual bool TransferDataFromWindow(); - virtual void OnCertSelect(wxCommandEvent& event); + + virtual bool TransferDataToWindow() + { + // Populate certificate list. + bool is_found = false; + winstd::cert_store store; + if (store.create(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, (HCRYPTPROV)NULL, CERT_SYSTEM_STORE_CURRENT_USER, _T("My"))) { + for (PCCERT_CONTEXT cert = NULL; (cert = CertEnumCertificatesInStore(store, cert)) != NULL;) { + DWORD dwKeySpec = 0, dwSize = sizeof(dwKeySpec); + if (!CertGetCertificateContextProperty(cert, CERT_KEY_SPEC_PROP_ID, &dwKeySpec, &dwSize) || !dwKeySpec) { + // Skip certificates without private key. + continue; + } + + // Prepare certificate information. + std::unique_ptr data(new wxCertificateClientData(CertDuplicateCertificateContext(cert))); + + // Add to list. + bool is_selected = + m_cred.m_cert && + m_cred.m_cert->cbCertEncoded == data->m_cert->cbCertEncoded && + memcmp(m_cred.m_cert->pbCertEncoded, data->m_cert->pbCertEncoded, m_cred.m_cert->cbCertEncoded) == 0; + winstd::tstring name; + eap::get_cert_title(cert, name); + int i = m_cert_select_val->Append(name, data.release()); + if (is_selected) { + m_cert_select_val->SetSelection(i); + is_found = true; + } + } + } + + if (is_found) { + m_cert_select ->SetValue(true); + m_cert_select_val->Enable(true); + } else { + m_cert_none ->SetValue(true); + m_cert_select_val->Enable(false); + if (!m_cert_select_val->IsEmpty()) + m_cert_select_val->SetSelection(0); + } + + return __super::TransferDataToWindow(); + } + + + virtual bool TransferDataFromWindow() + { + if (m_cert_none->GetValue()) + m_cred.clear(); + else { + const wxCertificateClientData *data = dynamic_cast(m_cert_select_val->GetClientObject(m_cert_select_val->GetSelection())); + if (data) { + m_cred.m_cert.attach_duplicated(data->m_cert); + + // Generate identity. TODO: Find which CERT_NAME_... constant returns valid identity (username@domain or DOMAIN\Username). + CertGetNameString(m_cred.m_cert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, m_cred.m_identity); + } else + m_cred.clear(); + } + + // Inherited TransferDataFromWindow() calls m_cred.store(). + // Therefore, call it only now, that m_cred is set. + return __super::TransferDataFromWindow(); + } + + + virtual void OnCertSelect(wxCommandEvent& event) + { + UNREFERENCED_PARAMETER(event); + m_cert_select_val->Enable(m_cert_select->GetValue()); + } + /// \endcond protected: @@ -469,7 +548,7 @@ protected: template -class wxEAPTLSCredentialsConfigPanel : public wxEAPCredentialsConfigPanel<_Tprov, eap::config_tls, wxEAPTLSCredentialsPanel> +class wxEAPTLSCredentialsConfigPanel : public wxEAPCredentialsConfigPanel<_Tprov, eap::config_tls, wxEAPTLSCredentialsPanel<_Tprov> > { public: /// @@ -481,7 +560,7 @@ public: /// \param[in] parent Parent window /// wxEAPTLSCredentialsConfigPanel(_Tprov &prov, eap::config_tls &cfg, LPCTSTR pszCredTarget, wxWindow *parent) : - wxEAPCredentialsConfigPanel<_Tprov, eap::config_tls, wxEAPTLSCredentialsPanel>(prov, cfg, pszCredTarget, parent) + wxEAPCredentialsConfigPanel<_Tprov, eap::config_tls, wxEAPTLSCredentialsPanel<_Tprov> >(prov, cfg, pszCredTarget, parent) { } }; diff --git a/lib/TLS_UI/src/TLS_UI.cpp b/lib/TLS_UI/src/TLS_UI.cpp index a6c015a..88062a9 100644 --- a/lib/TLS_UI/src/TLS_UI.cpp +++ b/lib/TLS_UI/src/TLS_UI.cpp @@ -342,89 +342,3 @@ bool wxFQDNListValidator::Parse(const wxString &val_in, size_t i_start, size_t i } } } - - -////////////////////////////////////////////////////////////////////// -// wxEAPTLSCredentialsPanel -////////////////////////////////////////////////////////////////////// - -wxEAPTLSCredentialsPanel::wxEAPTLSCredentialsPanel(eap::credentials_tls &cred, LPCTSTR pszCredTarget, wxWindow* parent, bool is_config) : - wxCredentialsPanel(cred, pszCredTarget, parent, is_config) -{ - // Load and set icon. - if (m_shell32.load(_T("shell32.dll"), NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE)) - wxSetIconFromResource(m_credentials_icon, m_icon, m_shell32, MAKEINTRESOURCE(269)); -} - - -bool wxEAPTLSCredentialsPanel::TransferDataToWindow() -{ - // Populate certificate list. - bool is_found = false; - winstd::cert_store store; - if (store.create(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, (HCRYPTPROV)NULL, CERT_SYSTEM_STORE_CURRENT_USER, _T("My"))) { - for (PCCERT_CONTEXT cert = NULL; (cert = CertEnumCertificatesInStore(store, cert)) != NULL;) { - DWORD dwKeySpec = 0, dwSize = sizeof(dwKeySpec); - if (!CertGetCertificateContextProperty(cert, CERT_KEY_SPEC_PROP_ID, &dwKeySpec, &dwSize) || !dwKeySpec) { - // Skip certificates without private key. - continue; - } - - // Prepare certificate information. - std::unique_ptr data(new wxCertificateClientData(CertDuplicateCertificateContext(cert))); - - // Add to list. - bool is_selected = - m_cred.m_cert && - m_cred.m_cert->cbCertEncoded == data->m_cert->cbCertEncoded && - memcmp(m_cred.m_cert->pbCertEncoded, data->m_cert->pbCertEncoded, m_cred.m_cert->cbCertEncoded) == 0; - winstd::tstring name; - eap::get_cert_title(cert, name); - int i = m_cert_select_val->Append(name, data.release()); - if (is_selected) { - m_cert_select_val->SetSelection(i); - is_found = true; - } - } - } - - if (is_found) { - m_cert_select ->SetValue(true); - m_cert_select_val->Enable(true); - } else { - m_cert_none ->SetValue(true); - m_cert_select_val->Enable(false); - if (!m_cert_select_val->IsEmpty()) - m_cert_select_val->SetSelection(0); - } - - return __super::TransferDataToWindow(); -} - - -bool wxEAPTLSCredentialsPanel::TransferDataFromWindow() -{ - if (m_cert_none->GetValue()) - m_cred.clear(); - else { - const wxCertificateClientData *data = dynamic_cast(m_cert_select_val->GetClientObject(m_cert_select_val->GetSelection())); - if (data) { - m_cred.m_cert.attach_duplicated(data->m_cert); - - // Generate identity. TODO: Find which CERT_NAME_... constant returns valid identity (username@domain or DOMAIN\Username). - CertGetNameString(m_cred.m_cert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, m_cred.m_identity); - } else - m_cred.clear(); - } - - // Inherited TransferDataFromWindow() calls m_cred.store(). - // Therefore, call it only now, that m_cred is set. - return __super::TransferDataFromWindow(); -} - - -void wxEAPTLSCredentialsPanel::OnCertSelect(wxCommandEvent& event) -{ - UNREFERENCED_PARAMETER(event); - m_cert_select_val->Enable(m_cert_select->GetValue()); -}