Custom credential prompt labels are honored now (for password-based methods)
This commit is contained in:
parent
e52b9a636f
commit
ac23d5f04f
@ -56,7 +56,7 @@ template <class _Tcred, class _Tbase> class wxCredentialsPanel;
|
|||||||
///
|
///
|
||||||
/// Password credentials panel
|
/// Password credentials panel
|
||||||
///
|
///
|
||||||
class wxPasswordCredentialsPanel;
|
template <class _Tprov> class wxPasswordCredentialsPanel;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Sets icon from resource
|
/// Sets icon from resource
|
||||||
@ -343,7 +343,7 @@ protected:
|
|||||||
|
|
||||||
wxEAPCredentialsDialog dlg(this);
|
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.AddContents((wxPanel**)&panel, 1);
|
||||||
dlg.ShowModal();
|
dlg.ShowModal();
|
||||||
@ -365,7 +365,7 @@ protected:
|
|||||||
|
|
||||||
wxEAPCredentialsDialog dlg(this);
|
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.AddContents((wxPanel**)&panel, 1);
|
||||||
dlg.ShowModal();
|
dlg.ShowModal();
|
||||||
@ -461,23 +461,79 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <class _Tprov>
|
||||||
class wxPasswordCredentialsPanel : public wxCredentialsPanel<eap::credentials_pass, wxPasswordCredentialsPanelBase>
|
class wxPasswordCredentialsPanel : public wxCredentialsPanel<eap::credentials_pass, wxPasswordCredentialsPanelBase>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
/// Constructs a password credentials panel
|
/// Constructs a password credentials panel
|
||||||
///
|
///
|
||||||
|
/// \param[inout] prov EAP provider
|
||||||
/// \param[inout] cred Credentials data
|
/// \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] 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] 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.
|
/// \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<eap::credentials_pass, wxPasswordCredentialsPanelBase>(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:
|
protected:
|
||||||
/// \cond internal
|
/// \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
|
/// \endcond
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -489,6 +545,10 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <class _Tprov>
|
||||||
|
const wxStringCharType *wxPasswordCredentialsPanel<_Tprov>::s_dummy_password = wxT("dummypass");
|
||||||
|
|
||||||
|
|
||||||
inline bool wxSetIconFromResource(wxStaticBitmap *bmp, wxIcon &icon, HINSTANCE hinst, PCWSTR pszName)
|
inline bool wxSetIconFromResource(wxStaticBitmap *bmp, wxIcon &icon, HINSTANCE hinst, PCWSTR pszName)
|
||||||
{
|
{
|
||||||
wxASSERT(bmp);
|
wxASSERT(bmp);
|
||||||
|
@ -1856,7 +1856,7 @@
|
|||||||
<event name="OnSetFocus"></event>
|
<event name="OnSetFocus"></event>
|
||||||
<event name="OnSize"></event>
|
<event name="OnSize"></event>
|
||||||
<event name="OnUpdateUI"></event>
|
<event name="OnUpdateUI"></event>
|
||||||
<object class="wxStaticBoxSizer" expanded="0">
|
<object class="wxStaticBoxSizer" expanded="1">
|
||||||
<property name="id">wxID_ANY</property>
|
<property name="id">wxID_ANY</property>
|
||||||
<property name="label">Client Credentials</property>
|
<property name="label">Client Credentials</property>
|
||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
@ -1864,11 +1864,11 @@
|
|||||||
<property name="orient">wxVERTICAL</property>
|
<property name="orient">wxVERTICAL</property>
|
||||||
<property name="permission">none</property>
|
<property name="permission">none</property>
|
||||||
<event name="OnUpdateUI"></event>
|
<event name="OnUpdateUI"></event>
|
||||||
<object class="sizeritem" expanded="0">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxEXPAND</property>
|
<property name="flag">wxEXPAND</property>
|
||||||
<property name="proportion">0</property>
|
<property name="proportion">0</property>
|
||||||
<object class="wxBoxSizer" expanded="0">
|
<object class="wxBoxSizer" expanded="1">
|
||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
<property name="name">sb_credentials_horiz</property>
|
<property name="name">sb_credentials_horiz</property>
|
||||||
<property name="orient">wxHORIZONTAL</property>
|
<property name="orient">wxHORIZONTAL</property>
|
||||||
@ -1954,11 +1954,11 @@
|
|||||||
<event name="OnUpdateUI"></event>
|
<event name="OnUpdateUI"></event>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem" expanded="0">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxEXPAND</property>
|
<property name="flag">wxEXPAND</property>
|
||||||
<property name="proportion">1</property>
|
<property name="proportion">1</property>
|
||||||
<object class="wxBoxSizer" expanded="0">
|
<object class="wxBoxSizer" expanded="1">
|
||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
<property name="name">sb_credentials_vert</property>
|
<property name="name">sb_credentials_vert</property>
|
||||||
<property name="orient">wxVERTICAL</property>
|
<property name="orient">wxVERTICAL</property>
|
||||||
@ -2046,11 +2046,11 @@
|
|||||||
<event name="OnUpdateUI"></event>
|
<event name="OnUpdateUI"></event>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
<object class="sizeritem" expanded="0">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxEXPAND|wxALL</property>
|
<property name="flag">wxEXPAND|wxALL</property>
|
||||||
<property name="proportion">0</property>
|
<property name="proportion">0</property>
|
||||||
<object class="wxFlexGridSizer" expanded="0">
|
<object class="wxFlexGridSizer" expanded="1">
|
||||||
<property name="cols">2</property>
|
<property name="cols">2</property>
|
||||||
<property name="flexible_direction">wxBOTH</property>
|
<property name="flexible_direction">wxBOTH</property>
|
||||||
<property name="growablecols">1</property>
|
<property name="growablecols">1</property>
|
||||||
|
@ -62,49 +62,3 @@ wxEAPBannerPanel::wxEAPBannerPanel(wxWindow* parent) : wxEAPBannerPanelBase(pare
|
|||||||
{
|
{
|
||||||
m_title->SetLabelText(wxT(PRODUCT_NAME_STR));
|
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<eap::credentials_pass, wxPasswordCredentialsPanelBase>(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();
|
|
||||||
}
|
|
||||||
|
@ -41,7 +41,7 @@ template <class _Tprov> class wxPAPConfigPanel;
|
|||||||
|
|
||||||
|
|
||||||
template <class _Tprov>
|
template <class _Tprov>
|
||||||
class wxPAPCredentialsConfigPanel : public wxEAPCredentialsConfigPanel<_Tprov, eap::config_pap, wxPasswordCredentialsPanel>
|
class wxPAPCredentialsConfigPanel : public wxEAPCredentialsConfigPanel<_Tprov, eap::config_pap, wxPasswordCredentialsPanel<_Tprov> >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
@ -53,7 +53,7 @@ public:
|
|||||||
/// \param[in] parent Parent window
|
/// \param[in] parent Parent window
|
||||||
///
|
///
|
||||||
wxPAPCredentialsConfigPanel(_Tprov &prov, eap::config_pap &cfg, LPCTSTR pszCredTarget, wxWindow *parent) :
|
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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -58,7 +58,7 @@ class wxFQDNListValidator;
|
|||||||
///
|
///
|
||||||
/// EAPTLS credential panel
|
/// EAPTLS credential panel
|
||||||
///
|
///
|
||||||
class wxEAPTLSCredentialsPanel;
|
template <class _Tprov> class wxEAPTLSCredentialsPanel;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// EAPTLS server trust configuration panel
|
/// EAPTLS server trust configuration panel
|
||||||
@ -256,19 +256,98 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <class _Tprov>
|
||||||
class wxEAPTLSCredentialsPanel : public wxCredentialsPanel<eap::credentials_tls, wxEAPTLSCredentialsPanelBase>
|
class wxEAPTLSCredentialsPanel : public wxCredentialsPanel<eap::credentials_tls, wxEAPTLSCredentialsPanelBase>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
/// Constructs a configuration panel
|
/// 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<eap::credentials_tls, wxEAPTLSCredentialsPanelBase>(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:
|
protected:
|
||||||
/// \cond internal
|
/// \cond internal
|
||||||
virtual bool TransferDataToWindow();
|
|
||||||
virtual bool TransferDataFromWindow();
|
virtual bool TransferDataToWindow()
|
||||||
virtual void OnCertSelect(wxCommandEvent& event);
|
{
|
||||||
|
// 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<wxCertificateClientData> 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<const wxCertificateClientData*>(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
|
/// \endcond
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -469,7 +548,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
template <class _Tprov>
|
template <class _Tprov>
|
||||||
class wxEAPTLSCredentialsConfigPanel : public wxEAPCredentialsConfigPanel<_Tprov, eap::config_tls, wxEAPTLSCredentialsPanel>
|
class wxEAPTLSCredentialsConfigPanel : public wxEAPCredentialsConfigPanel<_Tprov, eap::config_tls, wxEAPTLSCredentialsPanel<_Tprov> >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
@ -481,7 +560,7 @@ public:
|
|||||||
/// \param[in] parent Parent window
|
/// \param[in] parent Parent window
|
||||||
///
|
///
|
||||||
wxEAPTLSCredentialsConfigPanel(_Tprov &prov, eap::config_tls &cfg, LPCTSTR pszCredTarget, wxWindow *parent) :
|
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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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<eap::credentials_tls, wxEAPTLSCredentialsPanelBase>(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<wxCertificateClientData> 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<const wxCertificateClientData*>(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());
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user