KHMEXP khm_int32 KHMAPI kcdb_buf_get_attr_string( khm_handle record, khm_int32 attr_id, wchar_t * buffer, khm_size * pcbbuf, khm_int32 flags) { if(kcdb_cred_is_active_cred(record)) return kcdb_cred_get_attr_string(record, attr_id, buffer, pcbbuf, flags); else if(kcdb_is_active_identity(record)) return kcdb_identity_get_attr_string(record, attr_id, buffer, pcbbuf, flags); else return KHM_ERROR_INVALID_PARAM; }
/* Dialog procedure for the property sheet. This will run under the UI thread when a property sheet is being displayed for one of our credentials.. */ INT_PTR CALLBACK pp_cred_dlg_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { khui_property_sheet * ps; switch (uMsg) { case WM_INITDIALOG: { PROPSHEETPAGE * p; wchar_t notavailable[128]; p = (PROPSHEETPAGE *) lParam; ps = (khui_property_sheet *) p->lParam; #pragma warning(push) #pragma warning(disable: 4244) SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) ps); #pragma warning(pop) if (ps->cred) { wchar_t tbuf[512]; khm_size cb; khm_handle ident = NULL; LoadString(hResModule, IDS_NOTAVAILABLE, notavailable, ARRAYLENGTH(notavailable)); cb = sizeof(tbuf); if (KHM_SUCCEEDED(kcdb_cred_get_attr_string(ps->cred, attr_id_subj_email, tbuf, &cb, KCDB_TS_LONG))) { SetDlgItemText(hwnd, IDC_PP_SUBJ_E, tbuf); } else { SetDlgItemText(hwnd, IDC_PP_SUBJ_E, notavailable); } cb = sizeof(tbuf); if (KHM_SUCCEEDED(kcdb_cred_get_attr_string(ps->cred, attr_id_subj_display, tbuf, &cb, KCDB_TS_LONG))) { SetDlgItemText(hwnd, IDC_PP_SUBJ_D, tbuf); } else { SetDlgItemText(hwnd, IDC_PP_SUBJ_D, notavailable); } cb = sizeof(tbuf); if (KHM_SUCCEEDED(kcdb_cred_get_attr_string(ps->cred, attr_id_auth_realm, tbuf, &cb, KCDB_TS_LONG))) { SetDlgItemText(hwnd, IDC_PP_REALM, tbuf); } else { SetDlgItemText(hwnd, IDC_PP_REALM, notavailable); } cb = sizeof(tbuf); if (KHM_SUCCEEDED(kcdb_cred_get_attr_string(ps->cred, attr_id_issuer_display, tbuf, &cb, KCDB_TS_LONG))) { SetDlgItemText(hwnd, IDC_PP_ISSUER, tbuf); } else { SetDlgItemText(hwnd, IDC_PP_ISSUER, notavailable); } cb = sizeof(tbuf); if (KHM_SUCCEEDED(kcdb_cred_get_attr_string(ps->cred, KCDB_ATTR_ISSUE, tbuf, &cb, KCDB_TS_LONG))) { SetDlgItemText(hwnd, IDC_PP_NOTBEFORE, tbuf); } else { SetDlgItemText(hwnd, IDC_PP_NOTBEFORE, notavailable); } cb = sizeof(tbuf); if (KHM_SUCCEEDED(kcdb_cred_get_attr_string(ps->cred, KCDB_ATTR_EXPIRE, tbuf, &cb, KCDB_TS_LONG))) { SetDlgItemText(hwnd, IDC_PP_NOTAFTER, tbuf); } else { SetDlgItemText(hwnd, IDC_PP_NOTAFTER, notavailable); } } else { #ifdef DEBUG /* we really shouldn't get here */ DebugBreak(); #endif } } return FALSE; case WM_COMMAND: { HCERTSTORE hStoreHandle = NULL; PCCERT_CONTEXT pCertContext = NULL; CERT_ID certId; BYTE sn_buf[1024]; BYTE issuer_buf[1024]; CRYPTUI_VIEWCERTIFICATE_STRUCT vcs; wchar_t title_fmt[128]; wchar_t cert_name[128]; wchar_t title[256]; BOOL b; khm_size cb; if (wParam != MAKEWPARAM(IDC_PP_DETAILS, BN_CLICKED)) break; ps = (khui_property_sheet *) GetWindowLongPtr(hwnd, DWLP_USER); if (ps == NULL || ps->cred == NULL) { #ifdef DEBUG DebugBreak(); #endif break; } /* we need to display the standard UI for this certificate */ ZeroMemory(&certId, sizeof(certId)); cb = sizeof(sn_buf); if (KHM_FAILED(kcdb_cred_get_attr(ps->cred, attr_id_serial_number, NULL, sn_buf, &cb))) { break; } certId.IssuerSerialNumber.SerialNumber.cbData = (DWORD)cb; certId.IssuerSerialNumber.SerialNumber.pbData = sn_buf; cb = sizeof(issuer_buf); if (KHM_FAILED(kcdb_cred_get_attr(ps->cred, attr_id_issuer_name, NULL, issuer_buf, &cb))) { break; } certId.IssuerSerialNumber.Issuer.cbData = (DWORD)cb; certId.IssuerSerialNumber.Issuer.pbData = issuer_buf; certId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; if (!(hStoreHandle = CertOpenSystemStore(0, WIN32MYCERT_STORE))) { log_printf("Unable to access the system store"); return TRUE; } pCertContext = CertFindCertificateInStore(hStoreHandle, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_CERT_ID, &certId, NULL); if (!pCertContext) { /* the certificate was not found */ EnableWindow(GetDlgItem(hwnd, IDC_PP_DETAILS), FALSE); goto _clean_dt; } ZeroMemory(&vcs, sizeof(vcs)); vcs.dwSize = sizeof(vcs); vcs.hwndParent = hwnd; vcs.dwFlags = 0; LoadString(hResModule, IDS_PP_TITLE, title_fmt, ARRAYLENGTH(title_fmt)); cb = sizeof(cert_name); if (KHM_FAILED(kcdb_cred_get_attr(ps->cred, attr_id_auth_realm, NULL, cert_name, &cb))) { cb = sizeof(cert_name); if (KHM_FAILED(kcdb_cred_get_attr(ps->cred, attr_id_subj_email, NULL, cert_name, &cb))) { cb = sizeof(cert_name); kcdb_get_resource(ps->cred, KCDB_RES_DISPLAYNAME, 0, NULL, NULL, cert_name, &cb); } } StringCbPrintf(title, sizeof(title), title_fmt, cert_name); vcs.szTitle = title; vcs.pCertContext = pCertContext; CryptUIDlgViewCertificate(&vcs, &b); _clean_dt: if (pCertContext) { CertFreeCertificateContext(pCertContext); pCertContext = NULL; } if (hStoreHandle) { CertCloseStore(hStoreHandle, 0); hStoreHandle = NULL; } return TRUE; } break; } return FALSE; }
/* Property page Runs in the context of the UI thread. */ INT_PTR CALLBACK krb5_pp_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg) { case WM_INITDIALOG: { khui_property_sheet * s; PROPSHEETPAGE * p; wchar_t buf[512]; wchar_t unavailable[64]; khm_size cbsize; khm_int32 rv; khm_int32 tflags; p = (PROPSHEETPAGE *) lParam; s = (khui_property_sheet *) p->lParam; #pragma warning(push) #pragma warning(disable: 4244) SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) s); #pragma warning(pop) LoadString(hResModule, IDS_UNAVAILABLE, unavailable, ARRAYLENGTH(unavailable)); if(s->cred) { cbsize = sizeof(buf); kcdb_cred_get_name(s->cred, buf, &cbsize); SetDlgItemText(hwnd, IDC_PPK5_NAME, buf); cbsize = sizeof(buf); rv = kcdb_cred_get_attr_string(s->cred, KCDB_ATTR_ISSUE, buf, &cbsize, 0); if (KHM_SUCCEEDED(rv)) SetDlgItemText(hwnd, IDC_PPK5_ISSUE, buf); else SetDlgItemText(hwnd, IDC_PPK5_ISSUE, unavailable); cbsize = sizeof(buf); rv = kcdb_cred_get_attr_string(s->cred, KCDB_ATTR_EXPIRE, buf, &cbsize, 0); if (KHM_SUCCEEDED(rv)) SetDlgItemText(hwnd, IDC_PPK5_VALID, buf); else SetDlgItemText(hwnd, IDC_PPK5_VALID, unavailable); cbsize = sizeof(buf); rv = kcdb_cred_get_attr_string(s->cred, KCDB_ATTR_RENEW_EXPIRE, buf, &cbsize, 0); if (KHM_SUCCEEDED(rv)) SetDlgItemText(hwnd, IDC_PPK5_RENEW, buf); else SetDlgItemText(hwnd, IDC_PPK5_RENEW, unavailable); tflags = 0; cbsize = sizeof(tflags); rv = kcdb_cred_get_attr(s->cred, attr_id_krb5_flags, NULL, &tflags, &cbsize); if (KHM_SUCCEEDED(rv)) { #define ADDBITFLAG(f,s) \ if (tflags & f) { \ LoadString(hResModule, s, buf, ARRAYLENGTH(buf)); \ SendDlgItemMessage(hwnd, IDC_PPK5_FLAGS, LB_ADDSTRING, 0, (LPARAM) buf); \ } ADDBITFLAG(TKT_FLG_FORWARDABLE, IDS_FLG_FORWARDABLE); ADDBITFLAG(TKT_FLG_FORWARDED, IDS_FLG_FORWARDED); ADDBITFLAG(TKT_FLG_PROXIABLE, IDS_FLG_PROXIABLE); ADDBITFLAG(TKT_FLG_PROXY, IDS_FLG_PROXY); ADDBITFLAG(TKT_FLG_MAY_POSTDATE, IDS_FLG_MAY_POSTDATE); ADDBITFLAG(TKT_FLG_POSTDATED, IDS_FLG_POSTDATED); ADDBITFLAG(TKT_FLG_INVALID, IDS_FLG_INVALID); ADDBITFLAG(TKT_FLG_RENEWABLE, IDS_FLG_RENEWABLE); ADDBITFLAG(TKT_FLG_INITIAL, IDS_FLG_INITIAL); ADDBITFLAG(TKT_FLG_PRE_AUTH, IDS_FLG_PRE_AUTH); ADDBITFLAG(TKT_FLG_HW_AUTH, IDS_FLG_HW_AUTH); ADDBITFLAG(TKT_FLG_TRANSIT_POLICY_CHECKED, IDS_FLG_TRANSIT_POL); ADDBITFLAG(TKT_FLG_OK_AS_DELEGATE, IDS_FLG_OK_DELEGATE); ADDBITFLAG(TKT_FLG_ANONYMOUS, IDS_FLG_ANONYMOUS); #undef ADDBITFLAG } } else { #ifdef DEBUG assert(FALSE); #endif } } return FALSE; } return FALSE; }