From bd7edfe0a67af34296baa530d2a2218ec4ddcb2d Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 25 Jun 2006 19:21:41 +0000 Subject: NetIDMgr updates * add scrollbars to option tree pane in configuration dialog * convert to using Microsoft's safe string library both to ensure safe string manipulation and to avoid deprecation warnings * disable deprecation warnings for Platform SDK header shlwapi.h which cannot otherwise be compiled * add kerberos 5 kvno property to tickets. display in properties dialog and main window if column selected by user * improve manifest handling in order to support both manifests generated by the compiler and those hand crafted in order to specify the correct versions of the custom control libraries. * update khimaira message types and credential acquisition documentation ticket: new git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@18212 dc483132-0cff-0310-8789-dd5450dbe970 --- src/windows/identity/plugins/common/krb5common.c | 1 + src/windows/identity/plugins/common/krb5common.h | 8 +- src/windows/identity/plugins/krb4/Makefile | 1 + src/windows/identity/plugins/krb4/errorfuncs.c | 8 +- src/windows/identity/plugins/krb4/krb4funcs.c | 125 +++++++++++---------- src/windows/identity/plugins/krb4/krb4newcreds.c | 8 +- src/windows/identity/plugins/krb5/Makefile | 1 + src/windows/identity/plugins/krb5/datarep.c | 30 +++++ src/windows/identity/plugins/krb5/datarep.h | 5 + src/windows/identity/plugins/krb5/krb5configcc.c | 16 +-- src/windows/identity/plugins/krb5/krb5configdlg.c | 27 +++-- src/windows/identity/plugins/krb5/krb5configid.c | 12 +- src/windows/identity/plugins/krb5/krb5configids.c | 2 + src/windows/identity/plugins/krb5/krb5funcs.c | 55 +++++---- src/windows/identity/plugins/krb5/krb5identpro.c | 8 +- src/windows/identity/plugins/krb5/krb5main.c | 59 ++++++++++ src/windows/identity/plugins/krb5/krbcred.h | 4 + .../identity/plugins/krb5/lang/en_us/langres.rc | 2 + src/windows/identity/plugins/krb5/langres.h | 4 +- 19 files changed, 245 insertions(+), 131 deletions(-) (limited to 'src/windows/identity/plugins') diff --git a/src/windows/identity/plugins/common/krb5common.c b/src/windows/identity/plugins/common/krb5common.c index de1cea4ab..5ba59df4e 100644 --- a/src/windows/identity/plugins/common/krb5common.c +++ b/src/windows/identity/plugins/common/krb5common.c @@ -31,6 +31,7 @@ #ifdef DEBUG #include #endif +#include /**************************************/ /* khm_krb5_error(): */ diff --git a/src/windows/identity/plugins/common/krb5common.h b/src/windows/identity/plugins/common/krb5common.h index bd6337192..df3db93ae 100644 --- a/src/windows/identity/plugins/common/krb5common.h +++ b/src/windows/identity/plugins/common/krb5common.h @@ -33,9 +33,13 @@ #ifndef NO_KRB5 int khm_krb5_error(krb5_error_code rc, LPCSTR FailedFunctionName, - int FreeContextFlag, krb5_context *ctx, - krb5_ccache *cache); + int FreeContextFlag, krb5_context *ctx, + krb5_ccache *cache); +int +khm_krb5_get_error_string(krb5_error_code rc, + wchar_t * buffer, + khm_size cb_buffer); int khm_krb5_initialize(khm_handle ident, krb5_context *, krb5_ccache *); diff --git a/src/windows/identity/plugins/krb4/Makefile b/src/windows/identity/plugins/krb4/Makefile index b1ad963f0..c5226aaaa 100644 --- a/src/windows/identity/plugins/krb4/Makefile +++ b/src/windows/identity/plugins/krb4/Makefile @@ -70,6 +70,7 @@ $(OBJ)\krb4config.c: krbconfig.csv $(CONFDIR)\csvschema.cfg $(DLLFILE): $(OBJFILES) $(VERRESFILE) $(MSGRESFILE) $(DLLGUILINK) $(LIBFILES) $(SDKLIBFILES) $(SCLIB) + $(_VC_MANIFEST_EMBED_DLL) all: mkdirs $(MSGRESFILE) $(DLLFILE) lang diff --git a/src/windows/identity/plugins/krb4/errorfuncs.c b/src/windows/identity/plugins/krb4/errorfuncs.c index 5adc66b91..f1aa63d88 100644 --- a/src/windows/identity/plugins/krb4/errorfuncs.c +++ b/src/windows/identity/plugins/krb4/errorfuncs.c @@ -27,6 +27,8 @@ #include #include +#include + extern void (__cdecl *pinitialize_krb_error_func)(); extern void (__cdecl *pinitialize_kadm_error_table)(); @@ -89,8 +91,7 @@ LPSTR err_describe(LPSTR buf, size_t len, long code) case kadm_err_base: break; default: - strncpy(buf, com_err_msg, len); - buf[len-1] = '\0'; + StringCbCopyA(buf, len, com_err_msg); return buf; } @@ -194,8 +195,7 @@ LPSTR err_describe(LPSTR buf, size_t len, long code) break; } if(com_err_msg != buf) { - strncpy(buf, com_err_msg, len); - buf[len-1] = '\0'; + StringCbCopyA(buf, len, com_err_msg); } cp = buf + strlen(buf); *cp++ = '\n'; diff --git a/src/windows/identity/plugins/krb4/krb4funcs.c b/src/windows/identity/plugins/krb4/krb4funcs.c index 8928f71fd..18c05981f 100644 --- a/src/windows/identity/plugins/krb4/krb4funcs.c +++ b/src/windows/identity/plugins/krb4/krb4funcs.c @@ -243,10 +243,10 @@ khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) { GetWindowsDirectoryA(confname,szConfname); confname[szConfname-1] = '\0'; - strncat(confname, "\\",sizeof(confname)-strlen(confname)); - confname[szConfname-1] = '\0'; - strncat(confname, KRB5_FILE,sizeof(confname)-strlen(confname)); - confname[szConfname-1] = '\0'; + + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB5_FILE); + return FALSE; } @@ -254,7 +254,7 @@ khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) if (configFile) { - strncpy(confname, *configFile, szConfname); + StringCchCopyA(confname, szConfname, *configFile); pkrb5_free_config_files(configFile); } @@ -262,10 +262,9 @@ khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) { GetWindowsDirectoryA(confname,szConfname); confname[szConfname-1] = '\0'; - strncat(confname, "\\",sizeof(confname)-strlen(confname)); - confname[szConfname-1] = '\0'; - strncat(confname, KRB5_FILE,sizeof(confname)-strlen(confname)); - confname[szConfname-1] = '\0'; + + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB5_FILE); } return FALSE; @@ -274,51 +273,41 @@ khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) BOOL khm_get_krb4_con_file(LPSTR confname, UINT szConfname) { - if (hKrb5 && !hKrb4) - { // hold krb.con where krb5.ini is located - CHAR krbConFile[MAX_PATH]=""; - LPSTR pFind; + if (hKrb5 && !hKrb4) { + // hold krb.con where krb5.ini is located + CHAR krbConFile[MAX_PATH]=""; + LPSTR pFind; - //strcpy(krbConFile, CLeashApp::m_krbv5_profile->first_file->filename); - if (khm_krb5_get_profile_file(krbConFile, sizeof(krbConFile))) - { - GetWindowsDirectoryA(krbConFile,sizeof(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; - strncat(krbConFile, "\\",sizeof(krbConFile)-strlen(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; - strncat(krbConFile, KRB5_FILE,sizeof(krbConFile)-strlen(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; - } + if (khm_krb5_get_profile_file(krbConFile, sizeof(krbConFile))) { + GetWindowsDirectoryA(krbConFile,sizeof(krbConFile)); + krbConFile[MAX_PATH-1] = '\0'; - pFind = strrchr(krbConFile, '\\'); - if (pFind) - { - *pFind = 0; - strncat(krbConFile, "\\",sizeof(krbConFile)-strlen(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; - strncat(krbConFile, KRB_FILE,sizeof(krbConFile)-strlen(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; - } - else - krbConFile[0] = 0; - - strncpy(confname, krbConFile, szConfname); + StringCbCatA(krbConFile, sizeof(krbConFile), "\\"); + } + + pFind = strrchr(krbConFile, '\\'); + + if (pFind) { + *pFind = '\0'; + + StringCbCatA(krbConFile, sizeof(krbConFile), "\\"); + StringCbCatA(krbConFile, sizeof(krbConFile), KRB_FILE); + } else { + krbConFile[0] = '\0'; + } + + StringCchCopyA(confname, szConfname, krbConFile); + } else if (hKrb4) { + unsigned int size = szConfname; + memset(confname, '\0', szConfname); + if (!pkrb_get_krbconf2(confname, &size)) { + GetWindowsDirectoryA(confname,szConfname); confname[szConfname-1] = '\0'; - } - else if (hKrb4) - { - unsigned int size = szConfname; - memset(confname, '\0', szConfname); - if (!pkrb_get_krbconf2(confname, &size)) - { // Error has happened - GetWindowsDirectoryA(confname,szConfname); - confname[szConfname-1] = '\0'; - strncat(confname, "\\",szConfname-strlen(confname)); - confname[szConfname-1] = '\0'; - strncat(confname,KRB_FILE,szConfname-strlen(confname)); - confname[szConfname-1] = '\0'; - } - } + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB_FILE); + } + } + return FALSE; } @@ -433,7 +422,12 @@ wchar_t * khm_krb5_get_realm_list(void) wchar_t * d; if (!khm_get_krb4_con_file(krb_conf,sizeof(krb_conf)) && - (file = fopen(krb_conf, "rt"))) +#if _MSC_VER >= 1400 + !fopen_s(&file, krb_conf, "rt") +#else + (file = fopen(krb_conf, "rt")) +#endif + ) { char lineBuf[256]; @@ -519,25 +513,32 @@ make_postfix(const char * base, const char * postfix, char ** rcopy) { - int base_size; - int ret_size; + size_t base_size; + size_t ret_size; char * copy = 0; char * ret = 0; + size_t t; + + if (FAILED(StringCbLengthA(base, STRSAFE_MAX_CCH * sizeof(char), &t))) + goto cleanup; + + base_size = t + 1; + + if (FAILED(StringCbLengthA(postfix, STRSAFE_MAX_CCH * sizeof(char), &t))) + goto cleanup; + + ret_size = base_size + t + 1; - base_size = (int) strlen(base) + 1; - ret_size = base_size + (int) strlen(postfix) + 1; copy = malloc(base_size); ret = malloc(ret_size); if (!copy || !ret) goto cleanup; - strncpy(copy, base, base_size); - copy[base_size - 1] = 0; - - strncpy(ret, base, base_size); - strncpy(ret + (base_size - 1), postfix, ret_size - (base_size - 1)); - ret[ret_size - 1] = 0; + StringCbCopyNA(copy, base_size, base, base_size); + StringCbCopyNA(ret, ret_size, base, base_size); + StringCbCopyNA(ret + (base_size - 1), ret_size - (base_size - 1), + postfix, ret_size - (base_size - 1)); cleanup: if (!copy || !ret) { diff --git a/src/windows/identity/plugins/krb4/krb4newcreds.c b/src/windows/identity/plugins/krb4/krb4newcreds.c index b3dd7cea7..407c30fed 100644 --- a/src/windows/identity/plugins/krb4/krb4newcreds.c +++ b/src/windows/identity/plugins/krb4/krb4newcreds.c @@ -115,10 +115,15 @@ void k4_update_data(k4_dlg_data * d) { khm_boolean k4_should_identity_get_k4(khm_handle ident) { khm_int32 idflags = 0; + khm_int32 t = TRUE; khm_handle csp_ident = NULL; khm_handle csp_k4 = NULL; khm_boolean get_k4 = TRUE; + if (KHM_SUCCEEDED(khc_read_int32(csp_params, L"Krb4NewCreds", &t)) && + !t) + return FALSE; + if (KHM_FAILED(kcdb_identity_get_flags(ident, &idflags))) return FALSE; @@ -325,8 +330,7 @@ void k4_handle_wmnc_notify(k4_dlg_data * d, l = (khui_htwnd_link *) lParam; - wcsncpy(wid, l->id, l->id_len); - wid[l->id_len] = 0; + StringCchCopyN(wid, ARRAYLENGTH(wid), l->id, l->id_len); wids = wcschr(wid, L':'); if (!wids) diff --git a/src/windows/identity/plugins/krb5/Makefile b/src/windows/identity/plugins/krb5/Makefile index 67475ee01..cfee907b2 100644 --- a/src/windows/identity/plugins/krb5/Makefile +++ b/src/windows/identity/plugins/krb5/Makefile @@ -74,6 +74,7 @@ $(OBJ)\krb5config.c: krbconfig.csv $(CONFDIR)\csvschema.cfg $(DLLFILE): $(OBJFILES) $(VERRESFILE) $(DLLGUILINK) $(MSGRESFILE) $(LIBFILES) $(SDKLIBFILES) $(SCLIB) + $(_VC_MANIFEST_EMBED_DLL) $(MSGRESFILE): $(OBJ)\krb5_msgs.rc diff --git a/src/windows/identity/plugins/krb5/datarep.c b/src/windows/identity/plugins/krb5/datarep.c index 97d629eb4..92eabf4da 100644 --- a/src/windows/identity/plugins/krb5/datarep.c +++ b/src/windows/identity/plugins/krb5/datarep.c @@ -274,6 +274,36 @@ krb5flags_toString(const void *d, } } +khm_int32 KHMAPI +kvno_toString(const void * data, khm_size cbdata, + wchar_t *destbuf, khm_size *pcbdestbuf, + khm_int32 flags) +{ + int resid = 0; + int kvno; + wchar_t buf[256]; + size_t cblength; + + if (cbdata != sizeof(khm_int32)) + return KHM_ERROR_INVALID_PARAM; + + kvno = *((khm_int32 *) data); + + StringCbPrintf(buf, sizeof(buf), L"#%d", kvno); + + StringCbLength(buf, ARRAYLENGTH(buf), &cblength); + cblength += sizeof(wchar_t); + + if (!destbuf || *pcbdestbuf < cblength) { + *pcbdestbuf = cblength; + return KHM_ERROR_TOO_LONG; + } else { + StringCbCopy(destbuf, *pcbdestbuf, buf); + *pcbdestbuf = cblength; + return KHM_ERROR_SUCCESS; + } +} + khm_int32 serialize_krb5_addresses(krb5_address ** a, void * buf, size_t * pcbbuf) { diff --git a/src/windows/identity/plugins/krb5/datarep.h b/src/windows/identity/plugins/krb5/datarep.h index eeb6970da..90f1923fa 100644 --- a/src/windows/identity/plugins/krb5/datarep.h +++ b/src/windows/identity/plugins/krb5/datarep.h @@ -59,6 +59,11 @@ khm_int32 KHMAPI krb5flags_toString(const void *, khm_size, wchar_t *, khm_size *, khm_int32); +khm_int32 KHMAPI +kvno_toString(const void * data, khm_size cbdata, + wchar_t *destbuf, khm_size *pcbdestbuf, + khm_int32 flags); + khm_int32 KHMAPI renew_for_cb(khm_handle cred, khm_int32 id, void * buffer, khm_size * pcbsize); diff --git a/src/windows/identity/plugins/krb5/krb5configcc.c b/src/windows/identity/plugins/krb5/krb5configcc.c index 66e7a08d0..425d13430 100644 --- a/src/windows/identity/plugins/krb5/krb5configcc.c +++ b/src/windows/identity/plugins/krb5/krb5configcc.c @@ -29,16 +29,16 @@ #define _WIN32_WINNT 0x501 #endif +#define STRSAFE_NO_DEPRECATE + #include #include #include #include #include - -#pragma warning(push) -#pragma warning(disable: 4995) #include -#pragma warning(pop) + +#include typedef struct tag_k5_file_cc { wchar_t path[MAX_PATH]; @@ -97,7 +97,7 @@ void k5_add_file_cc(k5_ccc_data * d, wchar_t * path) { /* see if it's there first */ for (i=0; i < d->n_file_ccs; i++) { - if(!wcsicmp(d->file_ccs[i].path, path)) + if(!_wcsicmp(d->file_ccs[i].path, path)) return; } @@ -232,7 +232,7 @@ BOOL k5_ccc_get_mod(k5_ccc_dlg_data * d) { for (i=0; i < d->work.n_file_ccs; i++) { for (j=0; j < d->save.n_file_ccs; j++) { - if (!wcsicmp(d->work.file_ccs[i].path, + if (!_wcsicmp(d->work.file_ccs[i].path, d->save.file_ccs[j].path)) break; } @@ -372,7 +372,7 @@ k5_ccconfig_dlgproc(HWND hwnd, return TRUE; /* nothing to add */ for (i=0; i < d->work.n_file_ccs; i++) { - if (!wcsicmp(path, d->work.file_ccs[i].path)) { + if (!_wcsicmp(path, d->work.file_ccs[i].path)) { /* allow the user to correct case, as appropriate */ StringCbCopy(d->work.file_ccs[i].path, @@ -522,7 +522,7 @@ k5_ccconfig_dlgproc(HWND hwnd, LVNI_SELECTED)) != -1) { ListView_GetItemText(lv, lv_idx, 0, buf, ARRAYLENGTH(buf)); for (i=0; i < d->work.n_file_ccs; i++) { - if (!wcsicmp(buf, d->work.file_ccs[i].path)) { + if (!_wcsicmp(buf, d->work.file_ccs[i].path)) { k5_del_file_cc(&d->work, i); break; } diff --git a/src/windows/identity/plugins/krb5/krb5configdlg.c b/src/windows/identity/plugins/krb5/krb5configdlg.c index ad64d4883..65f010840 100644 --- a/src/windows/identity/plugins/krb5/krb5configdlg.c +++ b/src/windows/identity/plugins/krb5/krb5configdlg.c @@ -24,17 +24,16 @@ /* $Id$ */ +#define STRSAFE_NO_DEPRECATE + #include #include #include #include #include - -#pragma warning(push) -#pragma warning(disable: 4995) #include -#pragma warning(pop) +#include typedef struct tag_k5_realm_kdc { wchar_t name[K5_MAXCCH_HOST]; @@ -134,12 +133,12 @@ k5_parse_boolean(const char *s) const char *const *p; for(p=conf_yes; *p; p++) { - if (!stricmp(*p,s)) + if (!_stricmp(*p,s)) return 1; } for(p=conf_no; *p; p++) { - if (!stricmp(*p,s)) + if (!_stricmp(*p,s)) return 0; } @@ -409,7 +408,7 @@ k5_read_config_data(k5_config_data * d) { sizeof(kdc_name), values[i]); for (j=0; j < d->realms[s].n_kdcs; j++) - if (!wcsicmp(kdc_name, d->realms[s].kdcs[j].name)) + if (!_wcsicmp(kdc_name, d->realms[s].kdcs[j].name)) break; if (j < d->realms[s].n_kdcs) { @@ -436,7 +435,7 @@ k5_read_config_data(k5_config_data * d) { AnsiStrToUnicode(kdc_name, sizeof(kdc_name), values[i]); for (j=0; j < d->realms[s].n_kdcs; j++) - if (!wcsicmp(kdc_name, d->realms[s].kdcs[j].name)) + if (!_wcsicmp(kdc_name, d->realms[s].kdcs[j].name)) break; if (j < d->realms[s].n_kdcs) { @@ -478,7 +477,7 @@ k5_read_config_data(k5_config_data * d) { AnsiStrToUnicode(wdr_to, sizeof(wdr_to), dr_to); for (j=0; j < d->n_realms; j++) { - if (!wcsicmp(wdr_to, d->realms[j].realm)) + if (!_wcsicmp(wdr_to, d->realms[j].realm)) break; } @@ -588,7 +587,7 @@ k5_write_config_data(k5_config_data * d) { UnicodeStrToAnsi(astr, sizeof(astr), d->config_file); - if (stricmp(config_file, astr)) { + if (_stricmp(config_file, astr)) { assert(FALSE); } @@ -1965,7 +1964,7 @@ k5_realms_dlgproc(HWND hwnd, (d->realms[i].flags & K5_RDFLAG_DELETED)) continue; - if (!wcsicmp(d->realms[i].realm, pdisp->item.pszText)) + if (!_wcsicmp(d->realms[i].realm, pdisp->item.pszText)) break; } @@ -2084,7 +2083,7 @@ k5_realms_dlgproc(HWND hwnd, (d->realms[r].kdcs[k].flags & K5_RKFLAG_DELETED)) continue; - if (!wcsicmp(d->realms[r].kdcs[k].name, + if (!_wcsicmp(d->realms[r].kdcs[k].name, pdisp->item.pszText)) break; } @@ -2283,8 +2282,8 @@ k5_realms_dlgproc(HWND hwnd, (d->realms[r].domain_maps[m].flags & K5_DMFLAG_DELETED)) continue; - if (!wcsicmp(d->realms[r].domain_maps[m].name, - pdisp->item.pszText)) + if (!_wcsicmp(d->realms[r].domain_maps[m].name, + pdisp->item.pszText)) break; } diff --git a/src/windows/identity/plugins/krb5/krb5configid.c b/src/windows/identity/plugins/krb5/krb5configid.c index ccc38941a..ebec91e99 100644 --- a/src/windows/identity/plugins/krb5/krb5configid.c +++ b/src/windows/identity/plugins/krb5/krb5configid.c @@ -24,16 +24,16 @@ /* $Id$ */ +#define STRSAFE_NO_DEPRECATE + #include #include #include #include #include - -#pragma warning(push) -#pragma warning(disable: 4995) #include -#pragma warning(pop) + +#include typedef struct tag_k5_id_dlg_data { khui_config_init_data cfg; @@ -164,7 +164,7 @@ k5_id_is_mod(HWND hw, k5_id_dlg_data * d) { SendDlgItemMessage(hw, IDC_CFG_PUBLICIP, IPM_GETADDRESS, 0, (LPARAM) &dwaddress); - if (wcsicmp(ccache, d->ccache) || + if (_wcsicmp(ccache, d->ccache) || d->tc_renew.current != d->renew_life || @@ -259,7 +259,7 @@ k5_id_write_params(HWND hw, k5_id_dlg_data * d) { GetDlgItemText(hw, IDC_CFG_CCACHE, ccache, ARRAYLENGTH(ccache)); if (SUCCEEDED(StringCbLength(ccache, sizeof(ccache), &cb)) && - wcsicmp(ccache, d->ccache)) { + _wcsicmp(ccache, d->ccache)) { khc_write_string(csp_ident, L"DefaultCCName", ccache); StringCbCopy(d->ccache, sizeof(d->ccache), ccache); } else { diff --git a/src/windows/identity/plugins/krb5/krb5configids.c b/src/windows/identity/plugins/krb5/krb5configids.c index 4eebb9c62..579b9f712 100644 --- a/src/windows/identity/plugins/krb5/krb5configids.c +++ b/src/windows/identity/plugins/krb5/krb5configids.c @@ -24,6 +24,8 @@ /* $Id$ */ +#define STRSAFE_NO_DEPRECATE + #include #include #include diff --git a/src/windows/identity/plugins/krb5/krb5funcs.c b/src/windows/identity/plugins/krb5/krb5funcs.c index dab522c5d..1f7b2bdad 100644 --- a/src/windows/identity/plugins/krb5/krb5funcs.c +++ b/src/windows/identity/plugins/krb5/krb5funcs.c @@ -434,12 +434,15 @@ static long get_tickets_from_cache(krb5_context ctx, if ( !pkrb5_decode_ticket(&KRBv5Credentials.ticket, &tkt)) { ti = tkt->enc_part.enctype; kcdb_cred_set_attr(cred, attr_id_tkt_enctype, &ti, sizeof(ti)); + ti = tkt->enc_part.kvno; + kcdb_cred_set_attr(cred, attr_id_kvno, &ti, sizeof(ti)); pkrb5_free_ticket(ctx, tkt); tkt = NULL; } ti = KRBv5Credentials.keyblock.enctype; kcdb_cred_set_attr(cred, attr_id_key_enctype, &ti, sizeof(ti)); + kcdb_cred_set_attr(cred, KCDB_ATTR_LOCATION, wcc_name, KCDB_CBSIZE_AUTO); @@ -1734,10 +1737,10 @@ khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) { GetWindowsDirectoryA(confname,szConfname); confname[szConfname-1] = '\0'; - strncat(confname, "\\",sizeof(confname)-strlen(confname)); - confname[szConfname-1] = '\0'; - strncat(confname, KRB5_FILE,sizeof(confname)-strlen(confname)); - confname[szConfname-1] = '\0'; + + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB5_FILE); + return FALSE; } @@ -1745,7 +1748,7 @@ khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) if (configFile) { - strncpy(confname, *configFile, szConfname); + StringCchCopyA(confname, szConfname, *configFile); pkrb5_free_config_files(configFile); } @@ -1753,10 +1756,8 @@ khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) { GetWindowsDirectoryA(confname,szConfname); confname[szConfname-1] = '\0'; - strncat(confname, "\\",sizeof(confname)-strlen(confname)); - confname[szConfname-1] = '\0'; - strncat(confname, KRB5_FILE,sizeof(confname)-strlen(confname)); - confname[szConfname-1] = '\0'; + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB5_FILE); } return FALSE; @@ -1773,25 +1774,19 @@ khm_get_krb4_con_file(LPSTR confname, UINT szConfname) if (khm_krb5_get_profile_file(krbConFile, sizeof(krbConFile))) { GetWindowsDirectoryA(krbConFile,sizeof(krbConFile)); krbConFile[MAX_PATH-1] = '\0'; - strncat(krbConFile, "\\",sizeof(krbConFile)-strlen(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; - strncat(krbConFile, KRB5_FILE,sizeof(krbConFile)-strlen(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; + StringCchCatA(confname, szConfname, "\\"); } pFind = strrchr(krbConFile, '\\'); if (pFind) { - *pFind = 0; - strncat(krbConFile, "\\",sizeof(krbConFile)-strlen(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; - strncat(krbConFile, KRB_FILE,sizeof(krbConFile)-strlen(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; + *pFind = '\0'; + StringCchCatA(krbConFile, ARRAYLENGTH(krbConFile), "\\"); + StringCchCatA(krbConFile, ARRAYLENGTH(krbConFile), KRB_FILE); } else - krbConFile[0] = 0; - - strncpy(confname, krbConFile, szConfname); - confname[szConfname-1] = '\0'; + krbConFile[0] = '\0'; + + StringCchCopyA(confname, szConfname, krbConFile); } else if (hKrb4) { unsigned int size = szConfname; @@ -1800,10 +1795,8 @@ khm_get_krb4_con_file(LPSTR confname, UINT szConfname) { // Error has happened GetWindowsDirectoryA(confname,szConfname); confname[szConfname-1] = '\0'; - strncat(confname, "\\",szConfname-strlen(confname)); - confname[szConfname-1] = '\0'; - strncat(confname,KRB_FILE,szConfname-strlen(confname)); - confname[szConfname-1] = '\0'; + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB_FILE); } } return FALSE; @@ -1922,7 +1915,12 @@ khm_krb5_get_realm_list(void) wchar_t * d; if (!khm_get_krb4_con_file(krb_conf,sizeof(krb_conf)) && - (file = fopen(krb_conf, "rt"))) +#if _MSC_VER >= 1400 + !fopen_s(&file, krb_conf, "rt") +#else + (file = fopen(krb_conf, "rt")) +#endif + ) { char lineBuf[256]; @@ -2151,7 +2149,8 @@ khm_int32 KHMAPI khm_krb5_creds_is_equal(khm_handle vcred1, khm_handle vcred2, void * dummy) { if (kcdb_creds_comp_attr(vcred1, vcred2, KCDB_ATTR_LOCATION) || kcdb_creds_comp_attr(vcred1, vcred2, attr_id_key_enctype) || - kcdb_creds_comp_attr(vcred1, vcred2, attr_id_tkt_enctype)) + kcdb_creds_comp_attr(vcred1, vcred2, attr_id_tkt_enctype) || + kcdb_creds_comp_attr(vcred1, vcred2, attr_id_kvno)) return 1; else return 0; diff --git a/src/windows/identity/plugins/krb5/krb5identpro.c b/src/windows/identity/plugins/krb5/krb5identpro.c index f52e3441d..b263e6bf3 100644 --- a/src/windows/identity/plugins/krb5/krb5identpro.c +++ b/src/windows/identity/plugins/krb5/krb5identpro.c @@ -212,7 +212,7 @@ update_crossfeed(khui_new_creds * nc, (WPARAM) idx, (LPARAM) srealm); - if (!wcsicmp(srealm, un_realm) && wcscmp(srealm, un_realm)) { + if (!_wcsicmp(srealm, un_realm) && wcscmp(srealm, un_realm)) { /* differ only by case */ StringCchCopy(un_realm, ARRAYLENGTH(un) - (un_realm - un), @@ -260,7 +260,7 @@ update_crossfeed(khui_new_creds * nc, (WPARAM) idx, (LPARAM) srealm); - if (!wcsicmp(srealm, realm) && wcscmp(srealm, realm)) { + if (!_wcsicmp(srealm, realm) && wcscmp(srealm, realm)) { StringCbCopy(realm, sizeof(realm), srealm); SetWindowText(d->hw_realm, srealm); @@ -1145,7 +1145,7 @@ k5_ident_update(khm_int32 msg_type, khm_krb5_canon_cc_name(w_ccname, sizeof(w_ccname)); khm_krb5_canon_cc_name(wid_ccname, sizeof(wid_ccname)); - if (!wcsicmp(w_ccname, wid_ccname)) + if (!_wcsicmp(w_ccname, wid_ccname)) kcdb_identity_set_default_int(ident); _iu_cleanup: @@ -1499,7 +1499,7 @@ DWORD WINAPI k5_ccname_monitor_thread(LPVOID lpParameter) { new_ccname[0] = L'\0'; } - if (wcsicmp(new_ccname, reg_ccname)) { + if (_wcsicmp(new_ccname, reg_ccname)) { k5_refresh_default_identity(ctx); StringCbCopy(reg_ccname, sizeof(reg_ccname), new_ccname); } diff --git a/src/windows/identity/plugins/krb5/krb5main.c b/src/windows/identity/plugins/krb5/krb5main.c index ee85355a0..97ef85ee9 100644 --- a/src/windows/identity/plugins/krb5/krb5main.c +++ b/src/windows/identity/plugins/krb5/krb5main.c @@ -36,23 +36,27 @@ khm_int32 type_id_enctype = -1; khm_int32 type_id_addr_list = -1; khm_int32 type_id_krb5_flags = -1; khm_int32 type_id_krb5_princ = -1; +khm_int32 type_id_kvno = -1; BOOL type_regd_enctype = FALSE; BOOL type_regd_addr_list = FALSE; BOOL type_regd_krb5_flags = FALSE; BOOL type_regd_krb5_princ = FALSE; +BOOL type_regd_kvno = FALSE; khm_int32 attr_id_key_enctype = -1; khm_int32 attr_id_tkt_enctype = -1; khm_int32 attr_id_addr_list = -1; khm_int32 attr_id_krb5_flags = -1; khm_int32 attr_id_krb5_ccname = -1; +khm_int32 attr_id_kvno = -1; BOOL attr_regd_key_enctype = FALSE; BOOL attr_regd_tkt_enctype = FALSE; BOOL attr_regd_addr_list = FALSE; BOOL attr_regd_krb5_flags = FALSE; BOOL attr_regd_krb5_ccname = FALSE; +BOOL attr_regd_kvno = FALSE; khm_handle csp_plugins = NULL; khm_handle csp_krbcred = NULL; @@ -196,6 +200,31 @@ KHMEXP khm_int32 KHMAPI init_module(kmm_module h_module) { type_regd_krb5_flags = TRUE; } + if (KHM_FAILED(kcdb_type_get_id(TYPENAME_KVNO, &type_id_kvno))) { + kcdb_type type; + kcdb_type *t32; + + kcdb_type_get_info(KCDB_TYPE_INT32, &t32); + + type.id = KCDB_TYPE_INVALID; + type.name = TYPENAME_KVNO; + type.flags = KCDB_TYPE_FLAG_CB_FIXED; + type.cb_max = t32->cb_max; + type.cb_min = t32->cb_min; + type.isValid = t32->isValid; + type.comp = t32->comp; + type.dup = t32->dup; + type.toString = kvno_toString; + + rv = kcdb_type_register(&type, &type_id_kvno); + kcdb_type_release_info(t32); + + if (KHM_FAILED(rv)) + goto _exit; + + type_regd_kvno = TRUE; + } + /* Register common attributes */ if(KHM_FAILED(kcdb_attrib_get_id(ATTRNAME_KEY_ENCTYPE, &attr_id_key_enctype))) { kcdb_attrib attrib; @@ -328,6 +357,32 @@ KHMEXP khm_int32 KHMAPI init_module(kmm_module h_module) { attr_regd_krb5_ccname = TRUE; } + if (KHM_FAILED(kcdb_attrib_get_id(ATTRNAME_KVNO, &attr_id_kvno))) { + kcdb_attrib attrib; + wchar_t sbuf[KCDB_MAXCCH_SHORT_DESC]; + wchar_t lbuf[KCDB_MAXCCH_LONG_DESC]; + /* although we are loading a long description, it still fits + in the short description buffer */ + + ZeroMemory(&attrib, sizeof(attrib)); + + attrib.name = ATTRNAME_KVNO; + attrib.id = KCDB_ATTR_INVALID; + attrib.type = type_id_kvno; + attrib.flags = KCDB_ATTR_FLAG_TRANSIENT; + LoadString(hResModule, IDS_KVNO_SHORT_DESC, sbuf, ARRAYLENGTH(sbuf)); + LoadString(hResModule, IDS_KVNO_LONG_DESC, lbuf, ARRAYLENGTH(lbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = lbuf; + + rv = kcdb_attrib_register(&attrib, &attr_id_kvno); + + if (KHM_FAILED(rv)) + goto _exit; + + attr_regd_kvno = TRUE; + } + rv = kmm_get_plugins_config(0, &csp_plugins); if(KHM_FAILED(rv)) goto _exit; @@ -359,6 +414,8 @@ KHMEXP khm_int32 KHMAPI exit_module(kmm_module h_module) { kcdb_attrib_unregister(attr_id_krb5_flags); if(attr_regd_krb5_ccname) kcdb_attrib_unregister(attr_id_krb5_ccname); + if(attr_regd_kvno) + kcdb_attrib_unregister(attr_id_kvno); if(type_regd_enctype) kcdb_type_unregister(type_id_enctype); @@ -366,6 +423,8 @@ KHMEXP khm_int32 KHMAPI exit_module(kmm_module h_module) { kcdb_type_unregister(type_id_addr_list); if(type_regd_krb5_flags) kcdb_type_unregister(type_id_krb5_flags); + if(type_regd_kvno) + kcdb_type_unregister(type_id_kvno); if(csp_params) { khc_close_space(csp_params); diff --git a/src/windows/identity/plugins/krb5/krbcred.h b/src/windows/identity/plugins/krb5/krbcred.h index 3e64b0077..4b9373d08 100644 --- a/src/windows/identity/plugins/krb5/krbcred.h +++ b/src/windows/identity/plugins/krb5/krbcred.h @@ -62,12 +62,14 @@ typedef enum tag_k5_lsa_import { #define TYPENAME_ADDR_LIST L"AddrList" #define TYPENAME_KRB5_FLAGS L"Krb5Flags" #define TYPENAME_KRB5_PRINC L"Krb5Principal" +#define TYPENAME_KVNO L"Kvno" #define ATTRNAME_KEY_ENCTYPE L"KeyEncType" #define ATTRNAME_TKT_ENCTYPE L"TktEncType" #define ATTRNAME_ADDR_LIST L"AddrList" #define ATTRNAME_KRB5_FLAGS L"Krb5Flags" #define ATTRNAME_KRB5_CCNAME L"Krb5CCName" +#define ATTRNAME_KVNO L"Kvno" void init_krb(); void exit_krb(); @@ -84,6 +86,7 @@ extern khm_int32 type_id_enctype; extern khm_int32 type_id_addr_list; extern khm_int32 type_id_krb5_flags; extern khm_int32 type_id_krb5_princ; +extern khm_int32 type_id_kvno; extern BOOL type_regd_krb5_princ; @@ -92,6 +95,7 @@ extern khm_int32 attr_id_tkt_enctype; extern khm_int32 attr_id_addr_list; extern khm_int32 attr_id_krb5_flags; extern khm_int32 attr_id_krb5_ccname; +extern khm_int32 attr_id_kvno; extern khm_ui_4 k5_commctl_version; diff --git a/src/windows/identity/plugins/krb5/lang/en_us/langres.rc b/src/windows/identity/plugins/krb5/lang/en_us/langres.rc index c54bdb4b1..49673c378 100644 --- a/src/windows/identity/plugins/krb5/lang/en_us/langres.rc +++ b/src/windows/identity/plugins/krb5/lang/en_us/langres.rc @@ -521,6 +521,8 @@ BEGIN IDS_CFG_RE_MMK "Toggle &master KDC" IDS_CFG_RE_MND "&Add new domain mapping" IDS_CFG_RE_MDD "&Remove domain mapping" + IDS_KVNO_LONG_DESC "Key version number" + IDS_KVNO_SHORT_DESC "Kvno" END #endif // English (U.S.) resources diff --git a/src/windows/identity/plugins/krb5/langres.h b/src/windows/identity/plugins/krb5/langres.h index edda7dd02..da8a62ffd 100644 --- a/src/windows/identity/plugins/krb5/langres.h +++ b/src/windows/identity/plugins/krb5/langres.h @@ -132,6 +132,8 @@ #define IDS_CFG_RE_MMK 214 #define IDS_CFG_RE_MND 215 #define IDS_CFG_RE_MDD 216 +#define IDS_KVNO_SHORT_DESC 217 +#define IDS_KVNO_LONG_DESC 218 #define IDC_NCK5_RENEWABLE 1002 #define IDC_NCK5_FORWARDABLE 1004 #define IDC_NCK5_REALM 1005 @@ -204,7 +206,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 118 +#define _APS_NEXT_RESOURCE_VALUE 219 #define _APS_NEXT_COMMAND_VALUE 40002 #define _APS_NEXT_CONTROL_VALUE 1079 #define _APS_NEXT_SYMED_VALUE 101 -- cgit