From 75ae1a996b339226ce5e947b407ed0ffc74825ba Mon Sep 17 00:00:00 2001 From: Tom Yu Date: Fri, 2 Dec 2005 21:58:24 +0000 Subject: [PATCH] Pull up r17535, r17536 from trunk ticket: 3263 verion_fixed: 1.4.4 git-svn-id: svn://anonsvn.mit.edu/krb5/branches/krb5-1-4@17542 dc483132-0cff-0310-8789-dd5450dbe970 --- src/windows/identity/apiversion.txt | 6 +- src/windows/identity/config/Makefile | 2 +- src/windows/identity/config/Makefile.w32 | 7 +- src/windows/identity/doc/main_page.h | 3 +- src/windows/identity/help/khhelp.h | 2 - src/windows/identity/kconfig/api.c | 131 +++++++++++------- src/windows/identity/kcreddb/credential.c | 5 +- src/windows/identity/kmm/kmm_registrar.c | 8 +- src/windows/identity/kmm/kmmconfig.csv | 10 +- src/windows/identity/nidmgrdll/Makefile | 3 +- .../identity/plugins/common/dynimport.c | 80 +++++------ .../identity/plugins/common/dynimport.h | 1 + .../identity/plugins/common/krb5common.c | 3 + .../identity/plugins/krb5/krb5configcc.c | 66 ++++++--- src/windows/identity/plugins/krb5/krb5funcs.c | 98 +++++++++---- .../identity/plugins/krb5/krb5identpro.c | 2 +- src/windows/identity/plugins/krb5/krb5main.c | 4 + .../identity/plugins/krb5/krb5newcreds.c | 65 ++++++--- .../identity/plugins/krb5/krb5plugin.c | 18 ++- src/windows/identity/plugins/krb5/krbcred.h | 4 + src/windows/identity/ui/Makefile | 3 +- src/windows/identity/ui/aboutwnd.c | 6 - src/windows/identity/ui/appglobal.h | 8 ++ src/windows/identity/ui/cfg_identities_wnd.c | 3 - src/windows/identity/ui/cfg_plugins_wnd.c | 3 - .../identity/ui/images/app_notify_error.ico | Bin 25214 -> 2862 bytes .../identity/ui/images/app_notify_info.ico | Bin 25214 -> 2862 bytes .../identity/ui/images/app_notify_warn.ico | Bin 25214 -> 2862 bytes src/windows/identity/ui/images/chpw-sm.bmp | Bin 822 -> 822 bytes src/windows/identity/ui/images/chpw.bmp | Bin 2430 -> 2430 bytes src/windows/identity/ui/images/help-sm.bmp | Bin 1014 -> 822 bytes src/windows/identity/ui/images/help.bmp | Bin 2430 -> 2430 bytes src/windows/identity/ui/images/id-dis-sm.bmp | Bin 822 -> 822 bytes src/windows/identity/ui/images/id-sm.bmp | Bin 822 -> 822 bytes src/windows/identity/ui/images/id.ico | Bin 2166 -> 2862 bytes src/windows/identity/ui/images/import-sm.bmp | Bin 774 -> 822 bytes src/windows/identity/ui/images/import.bmp | Bin 2430 -> 2430 bytes .../identity/ui/images/tk-delete-sm.bmp | Bin 822 -> 822 bytes src/windows/identity/ui/images/tk-delete.bmp | Bin 2430 -> 2430 bytes src/windows/identity/ui/images/tk-new-sm.bmp | Bin 822 -> 822 bytes src/windows/identity/ui/images/tk-new.bmp | Bin 2430 -> 2430 bytes .../identity/ui/images/tk-refresh-sm.bmp | Bin 822 -> 822 bytes src/windows/identity/ui/images/tk-refresh.bmp | Bin 2430 -> 2430 bytes .../identity/ui/images/vw-refresh-sm.bmp | Bin 822 -> 822 bytes src/windows/identity/ui/images/vw-refresh.bmp | Bin 2430 -> 2430 bytes src/windows/identity/ui/main.c | 39 +++++- src/windows/identity/ui/mainwnd.c | 13 +- src/windows/identity/ui/notifier.c | 5 +- src/windows/identity/ui/reqdaemon.c | 3 +- src/windows/identity/uilib/Makefile | 3 +- src/windows/identity/uilib/khuidefs.h | 38 ++++- src/windows/identity/uilib/version.c | 83 +++++++++++ 52 files changed, 515 insertions(+), 210 deletions(-) create mode 100644 src/windows/identity/uilib/version.c diff --git a/src/windows/identity/apiversion.txt b/src/windows/identity/apiversion.txt index 44ce7603f..c382eb52e 100644 --- a/src/windows/identity/apiversion.txt +++ b/src/windows/identity/apiversion.txt @@ -44,11 +44,11 @@ Date=NOTRELEASED Version=2 AppVersion=0.1.1.0 Date=Nov 01, 2005 -# Alpha release of NetIDMgr +# Beta 1 release of NetIDMgr #---------------------------------------------------------------- Version=3 AppVersion=0.1.2.0 -Date=NOTRELEASED -# Beta release +Date=Nov 30, 2005 +# Beta 2 release diff --git a/src/windows/identity/config/Makefile b/src/windows/identity/config/Makefile index e720bd804..f10928fc5 100644 --- a/src/windows/identity/config/Makefile +++ b/src/windows/identity/config/Makefile @@ -94,7 +94,7 @@ mkversion: $(VERSIONINT) $(VERSIONEXT) NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION) NETIDMGR_COMMENT_STR_1033=Official build. Please send bug reports to kfw-bugs@MIT.EDU !elseif "$(KH_RELEASE)" == "PRERELEASE" -NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION) Alpha +NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION) Prelease $(NETIDMGR_RELEASEDESC) NETIDMGR_COMMENT_STR_1033=Prerelease build. Please send bug reports to kfw-bugs@MIT.EDU !elseif "$(KH_RELEASE)" == "PRIVATE" NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION).PRIVATE diff --git a/src/windows/identity/config/Makefile.w32 b/src/windows/identity/config/Makefile.w32 index 84e856651..49524dfd9 100644 --- a/src/windows/identity/config/Makefile.w32 +++ b/src/windows/identity/config/Makefile.w32 @@ -46,8 +46,9 @@ KHIMAIRA_WIN32_CONFIG=1 # Version info NETIDMGR_VERSION_MAJOR=0 NETIDMGR_VERSION_MINOR=1 -NETIDMGR_VERSION_PATCH=2 +NETIDMGR_VERSION_PATCH=3 NETIDMGR_VERSION_AUX=0 +NETIDMGR_RELEASEDESC=Beta 3 # The API version. This number must be incremented each time the API # changes. Plugins specify the version of the API that they were @@ -197,6 +198,10 @@ khcwarn=/Wp64 khcwarn=$(khcwarn) /WX !endif +#DEBUG_SYMBOLS +ldebug=$(ldebug) /DEBUG +cdebug=$(cdebug) -Os -Zi + khcflags=$(cdebug) $(cflags) $(incflags) $(khdefines) $(khcwarn) khlguiflags=$(ldebug) $(guilflags) khlconflags=$(ldebug) $(conlflags) diff --git a/src/windows/identity/doc/main_page.h b/src/windows/identity/doc/main_page.h index 2a74e8f4a..238ce3e6c 100644 --- a/src/windows/identity/doc/main_page.h +++ b/src/windows/identity/doc/main_page.h @@ -105,5 +105,6 @@ - 0.1.1 First Alpha release Nov 01, 2005\n Released along with Kerberos for Windows 3.0.0 beta. - - 0.1.2 (tbd) [tbd]\n + - 0.1.2 Second Alpha release Nov 30, 2005\n + Released along with Kerberos for Windows 3.0.0 beta 2. */ diff --git a/src/windows/identity/help/khhelp.h b/src/windows/identity/help/khhelp.h index 1324c3dc4..2e07838c6 100644 --- a/src/windows/identity/help/khhelp.h +++ b/src/windows/identity/help/khhelp.h @@ -1,5 +1,3 @@ -#define NIDM_HELPFILE L"netidmgr.chm" - #define IDH_WELCOME 1000 #define IDH_WIN_MAIN 1001 diff --git a/src/windows/identity/kconfig/api.c b/src/windows/identity/kconfig/api.c index 41b6ccb11..e860e9e51 100644 --- a/src/windows/identity/kconfig/api.c +++ b/src/windows/identity/kconfig/api.c @@ -202,9 +202,37 @@ khcint_RegOpenKeyEx(HKEY hkey, LPCWSTR sSubKey, DWORD ulOptions, LONG rv = ERROR_SUCCESS; hkp = hkey; + t = sSubKey; + + /* check for case insensitive prefix first */ + if (!wcsnicmp(sSubKey, CONFIG_REGPATHW, ARRAYLENGTH(CONFIG_REGPATHW) - 1)) { + HKEY hkt; + + t = sSubKey + (ARRAYLENGTH(CONFIG_REGPATHW) - 1); + +#ifdef DEBUG + assert(*t == L'\0' || *t == L'\\'); +#endif + + rv = RegOpenKeyEx(hkp, + CONFIG_REGPATHW, + ulOptions, + samDesired, + &hkt); + + if (rv != ERROR_SUCCESS) + return rv; + + if (*t == L'\0') { + *phkResult = hkt; + return rv; + } + + t++; + hkp = hkt; + } /* descend down the components of the subkey */ - t = sSubKey; while(TRUE) { wchar_t * slash; HKEY hkt; @@ -260,11 +288,7 @@ khcint_RegOpenKeyEx(HKEY hkey, LPCWSTR sSubKey, DWORD ulOptions, goto _cleanup; } - /* FIX ME - This is not what we intended to do. We want - * a case sensitive match but we are running into a problem - * because of "HKLM\SOFTWARE" and "HKCU\Software" - */ - if (!(wcsnicmp(sk_name, t, cch))) { + if (!(wcsncmp(sk_name, t, cch))) { /* bingo! ?? */ if (cch < KCONF_MAXCCH_NAME && (sk_name[cch] == L'\0' || @@ -285,9 +309,9 @@ khcint_RegOpenKeyEx(HKEY hkey, LPCWSTR sSubKey, DWORD ulOptions, LONG khcint_RegCreateKeyEx(HKEY hKey, - LPCTSTR lpSubKey, + LPCWSTR lpSubKey, DWORD Reserved, - LPTSTR lpClass, + LPWSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, @@ -305,6 +329,39 @@ khcint_RegCreateKeyEx(HKEY hKey, hkp = hKey; t = lpSubKey; + + /* check for case insensitive prefix first */ + if (!wcsnicmp(lpSubKey, CONFIG_REGPATHW, ARRAYLENGTH(CONFIG_REGPATHW) - 1)) { + HKEY hkt; + + t = lpSubKey + (ARRAYLENGTH(CONFIG_REGPATHW) - 1); + +#ifdef DEBUG + assert(*t == L'\0' || *t == L'\\'); +#endif + + rv = RegCreateKeyEx(hkp, + CONFIG_REGPATHW, + Reserved, + lpClass, + dwOptions, + samDesired, + lpSecurityAttributes, + &hkt, + lpdwDisposition); + + if (rv != ERROR_SUCCESS) + return rv; + + if (*t == L'\0') { + *phkResult = hkt; + return rv; + } + + t++; + hkp = hkt; + } + while(TRUE) { wchar_t * slash; HKEY hkt; @@ -328,7 +385,6 @@ khcint_RegCreateKeyEx(HKEY hKey, if (hkp != hKey) RegCloseKey(hkp); hkp = hkt; - } else { rv = RegCreateKeyEx(hKey, @@ -341,7 +397,6 @@ khcint_RegCreateKeyEx(HKEY hKey, phkResult, lpdwDisposition); goto _cleanup; - } } @@ -360,11 +415,7 @@ khcint_RegCreateKeyEx(HKEY hKey, if (l != ERROR_SUCCESS) break; - /* FIX ME - This is not what we intended to do. We want - * a case sensitive match but we are running into a problem - * because of "HKLM\SOFTWARE" and "HKCU\Software" - */ - if (!(wcsnicmp(sk_name, t, cch))) { + if (!(wcsncmp(sk_name, t, cch))) { /* bingo! ?? */ if (sk_name[cch] == L'\0' || sk_name[cch] == L'~') { @@ -602,11 +653,7 @@ khcint_open_space_int(kconf_conf_space * parent, EnterCriticalSection(&cs_conf_global); c = TFIRSTCHILD(p); while(c) { - /* FIX ME - This is not what we intended to do. We want - * a case sensitive match but we are running into a problem - * because of "HKLM\SOFTWARE" and "HKCU\Software" - */ - if(c->name && !wcsicmp(c->name, buf)) + if(c->name && !wcscmp(c->name, buf)) break; c = LNEXT(c); @@ -624,19 +671,21 @@ khcint_open_space_int(kconf_conf_space * parent, /* we are not creating the space, so it must exist in the form of a registry key in HKLM or HKCU. If it existed as a schema, we would have already retured it above. */ - if(flags & KCONF_FLAG_USER) + + if (flags & KCONF_FLAG_USER) pkey = khcint_space_open_key(p, KHM_PERM_READ | KCONF_FLAG_USER); - if((!pkey || - (khcint_RegOpenKeyEx(pkey, buf, 0, KEY_READ, &ckey) != - ERROR_SUCCESS)) + if((!pkey || + (khcint_RegOpenKeyEx(pkey, buf, 0, KEY_READ, &ckey) != + ERROR_SUCCESS)) && (flags & KCONF_FLAG_MACHINE)) { pkey = khcint_space_open_key(p, KHM_PERM_READ | KCONF_FLAG_MACHINE); - if(!pkey || - (khcint_RegOpenKeyEx(pkey, buf, 0, KEY_READ, &ckey) != + if(!pkey || + (khcint_RegOpenKeyEx(pkey, buf, 0, KEY_READ, &ckey) != ERROR_SUCCESS)) { *result = NULL; + return KHM_ERROR_NOT_FOUND; } } @@ -899,11 +948,7 @@ khc_read_string(khm_handle pconf, if(c->schema && khc_is_schema_handle(conf)) { for(i=0;inSchema;i++) { - /* FIX ME - This is not what we intended to do. We want - * a case sensitive match but we are running into a problem - * because of "HKLM\SOFTWARE" and "HKCU\Software" - */ - if(c->schema[i].type == KC_STRING && !wcsicmp(value, c->schema[i].name)) { + if(c->schema[i].type == KC_STRING && !wcscmp(value, c->schema[i].name)) { /* found it */ size_t cbsize = 0; @@ -1048,11 +1093,7 @@ khc_read_int32(khm_handle pconf, wchar_t * pvalue, khm_int32 * buf) { if(c->schema && khc_is_schema_handle(conf)) { for(i=0;inSchema;i++) { - /* FIX ME - This is not what we intended to do. We want - * a case sensitive match but we are running into a problem - * because of "HKLM\SOFTWARE" and "HKCU\Software" - */ - if(c->schema[i].type == KC_INT32 && !wcsicmp(value, c->schema[i].name)) { + if(c->schema[i].type == KC_INT32 && !wcscmp(value, c->schema[i].name)) { *buf = (khm_int32) c->schema[i].value; rv = KHM_ERROR_SUCCESS; goto _exit; @@ -1171,11 +1212,7 @@ khc_read_int64(khm_handle pconf, wchar_t * pvalue, khm_int64 * buf) { if(c->schema && khc_is_schema_handle(conf)) { for(i=0;inSchema;i++) { - /* FIX ME - This is not what we intended to do. We want - * a case sensitive match but we are running into a problem - * because of "HKLM\SOFTWARE" and "HKCU\Software" - */ - if(c->schema[i].type == KC_INT64 && !wcsicmp(value, c->schema[i].name)) { + if(c->schema[i].type == KC_INT64 && !wcscmp(value, c->schema[i].name)) { *buf = (khm_int64) c->schema[i].value; rv = KHM_ERROR_SUCCESS; goto _exit; @@ -1699,11 +1736,7 @@ khc_get_type(khm_handle conf, wchar_t * value) { int i; for(i=0; inSchema; i++) { - /* FIX ME - This is not what we intended to do. We want - * a case sensitive match but we are running into a problem - * because of "HKLM\SOFTWARE" and "HKCU\Software" - */ - if(!wcsicmp(c->schema[i].name, value)) { + if(!wcscmp(c->schema[i].name, value)) { return c->schema[i].type; } } @@ -1760,11 +1793,7 @@ khc_value_exists(khm_handle conf, wchar_t * value) { if(c->schema) { for(i=0; inSchema; i++) { - /* FIX ME - This is not what we intended to do. We want - * a case sensitive match but we are running into a problem - * because of "HKLM\SOFTWARE" and "HKCU\Software" - */ - if(!wcsicmp(c->schema[i].name, value)) { + if(!wcscmp(c->schema[i].name, value)) { rv |= KCONF_FLAG_SCHEMA; break; } diff --git a/src/windows/identity/kcreddb/credential.c b/src/windows/identity/kcreddb/credential.c index 335521e12..ccad383e6 100644 --- a/src/windows/identity/kcreddb/credential.c +++ b/src/windows/identity/kcreddb/credential.c @@ -533,12 +533,12 @@ KHMEXP khm_int32 KHMAPI kcdb_cred_get_attr_string( if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { code = KHM_ERROR_INVALID_PARAM; - goto _exit; + goto _exit_nolock; } if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { code = KHM_ERROR_UNKNOWN; - goto _exit; + goto _exit_nolock; } kcdb_cred_lock_read(); @@ -603,6 +603,7 @@ KHMEXP khm_int32 KHMAPI kcdb_cred_get_attr_string( _exit: kcdb_cred_unlock_read(); +_exit_nolock: if(type) kcdb_type_release_info(type); if(attrib) diff --git a/src/windows/identity/kmm/kmm_registrar.c b/src/windows/identity/kmm/kmm_registrar.c index ae94a9ed3..f9fdd4de8 100644 --- a/src/windows/identity/kmm/kmm_registrar.c +++ b/src/windows/identity/kmm/kmm_registrar.c @@ -544,7 +544,7 @@ void kmm_init_module(kmm_module_i * m) { /* If the module is not in the pre-init state, we can't initialize it. */ if(m->state != KMM_MODULE_STATE_PREINIT) { - _report_mr1(KHERR_WARNING, MSG_IM_NOT_PREINIT, _int32(m->state)); + _report_mr1(KHERR_INFO, MSG_IM_NOT_PREINIT, _int32(m->state)); goto _exit; } @@ -558,7 +558,7 @@ void kmm_init_module(kmm_module_i * m) { if(KHM_SUCCEEDED(khc_read_int32(csp_mod, L"Flags", &i)) && (i & KMM_MODULE_FLAG_DISABLED)) { - _report_mr0(KHERR_ERROR, MSG_IM_DISABLED); + _report_mr0(KHERR_INFO, MSG_IM_DISABLED); m->state = KMM_MODULE_STATE_FAIL_DISABLED; goto _exit; @@ -578,11 +578,9 @@ void kmm_init_module(kmm_module_i * m) { if(tm > 0 && FtIntervalToSeconds((LPFILETIME) &ct) > fail_reset_time) { - i = 0; khc_write_int32(csp_mod, L"FailureCount", 0); khc_write_int64(csp_mod, L"FailureTime", 0); - } khc_read_int32(csp_mod, L"FailureReason", &last_reason); @@ -593,7 +591,7 @@ void kmm_init_module(kmm_module_i * m) { if(i > max_fail_count && last_reason != KMM_MODULE_STATE_FAIL_NOT_FOUND) { /* failed too many times */ - _report_mr0(KHERR_ERROR, MSG_IM_MAX_FAIL); + _report_mr0(KHERR_INFO, MSG_IM_MAX_FAIL); m->state = KMM_MODULE_STATE_FAIL_MAX_FAILURE; goto _exit; diff --git a/src/windows/identity/kmm/kmmconfig.csv b/src/windows/identity/kmm/kmmconfig.csv index b22e9b205..171d667dd 100644 --- a/src/windows/identity/kmm/kmmconfig.csv +++ b/src/windows/identity/kmm/kmmconfig.csv @@ -3,7 +3,6 @@ PluginManager,KC_SPACE,0,Plugin Manager Configuration Plugins,KC_SPACE,0,Plugin Specific configuration PluginMaxFailureCount,KC_INT32,3,Maximum number of failure counts before plugin is disabled PluginFailureCountResetTime,KC_INT64,36000,Time after first failure at which the failure count is reset - LoadList,KC_STRING,AfsCred,List of plugins that are active _Schema,KC_SPACE,0,Plugin schema Module,KC_STRING,,The name of the module that registered this plugin Description,KC_STRING,,Description of the plugin @@ -18,7 +17,6 @@ PluginManager,KC_SPACE,0,Plugin Manager Configuration _Schema,KC_ENDSPACE,0, Plugins,KC_ENDSPACE,0, Modules,KC_SPACE,0,Module Specific configuration - LoadList,KC_STRING,"OpenAFS,MITKrb5,MITKrb4",List of modules to load at startup ModuleMaxFailureCount,KC_INT32,3,Maximum number of failure counts before module is disabled ModuleFailureCountResetTime,KC_INT64,72000,Time after first failure at which the failure count is reset _Schema,KC_SPACE,0,Module schema @@ -29,10 +27,10 @@ PluginManager,KC_SPACE,0,Plugin Manager Configuration FailureReason,KC_INT32,0,Reason for last failure. One of the module status values. PluginList,KC_STRING,,List of plugins implemented in the module _Schema,KC_ENDSPACE,0, - OpenAFS,KC_SPACE,0,OpenAFS Module - ImagePath,KC_STRING,afscred.dll, - PluginList,KC_STRING,AfsCred, - OpenAFS,KC_ENDSPACE,0, +# OpenAFS,KC_SPACE,0,OpenAFS Module +# ImagePath,KC_STRING,afscred.dll, +# PluginList,KC_STRING,AfsCred, +# OpenAFS,KC_ENDSPACE,0, MITKrb5,KC_SPACE,0,MIT Kerberos V ImagePath,KC_STRING,krb5cred.dll, PluginList,KC_STRING,Krb5Cred, diff --git a/src/windows/identity/nidmgrdll/Makefile b/src/windows/identity/nidmgrdll/Makefile index fc2887cc1..03d3c3d54 100644 --- a/src/windows/identity/nidmgrdll/Makefile +++ b/src/windows/identity/nidmgrdll/Makefile @@ -86,7 +86,8 @@ OBJFILES= \ $(UIDIR)\actiondef.obj \ $(UIDIR)\acceldef.obj \ $(UIDIR)\configui.obj \ - $(UIDIR)\trackerwnd.obj + $(UIDIR)\trackerwnd.obj \ + $(UIDIR)\version.obj RESFILES= \ $(OBJ)\nidmgrdll.res \ diff --git a/src/windows/identity/plugins/common/dynimport.c b/src/windows/identity/plugins/common/dynimport.c index ed5110e66..b906b6ae9 100644 --- a/src/windows/identity/plugins/common/dynimport.c +++ b/src/windows/identity/plugins/common/dynimport.c @@ -91,6 +91,7 @@ DECL_FUNC_PTR(krb5_get_init_creds_password); DECL_FUNC_PTR(krb5_get_prompt_types); DECL_FUNC_PTR(krb5_build_principal_ext); DECL_FUNC_PTR(krb5_cc_get_name); +DECL_FUNC_PTR(krb5_cc_get_type); DECL_FUNC_PTR(krb5_cc_resolve); DECL_FUNC_PTR(krb5_cc_default); DECL_FUNC_PTR(krb5_cc_default_name); @@ -190,36 +191,36 @@ FUNC_INFO ccapi_fi[] = { FUNC_INFO k4_fi[] = { MAKE_FUNC_INFO(get_krb_err_txt_entry), - MAKE_FUNC_INFO(k_isinst), - MAKE_FUNC_INFO(k_isname), - MAKE_FUNC_INFO(k_isrealm), - MAKE_FUNC_INFO(kadm_change_your_password), - MAKE_FUNC_INFO(kname_parse), - MAKE_FUNC_INFO(krb_get_cred), - MAKE_FUNC_INFO(krb_get_krbhst), - MAKE_FUNC_INFO(krb_get_lrealm), - MAKE_FUNC_INFO(krb_get_pw_in_tkt), - MAKE_FUNC_INFO(krb_get_tf_realm), - MAKE_FUNC_INFO(krb_mk_req), - MAKE_FUNC_INFO(krb_realmofhost), - MAKE_FUNC_INFO(tf_init), - MAKE_FUNC_INFO(tf_close), - MAKE_FUNC_INFO(tf_get_cred), - MAKE_FUNC_INFO(tf_get_pname), - MAKE_FUNC_INFO(tf_get_pinst), - MAKE_FUNC_INFO(LocalHostAddr), - MAKE_FUNC_INFO(tkt_string), - MAKE_FUNC_INFO(krb_set_tkt_string), - MAKE_FUNC_INFO(initialize_krb_error_func), - MAKE_FUNC_INFO(initialize_kadm_error_table), - MAKE_FUNC_INFO(dest_tkt), - /* MAKE_FUNC_INFO(lsh_LoadKrb4LeashErrorTables), */// XXX - MAKE_FUNC_INFO(krb_in_tkt), - MAKE_FUNC_INFO(krb_save_credentials), - MAKE_FUNC_INFO(krb_get_krbconf2), - MAKE_FUNC_INFO(krb_get_krbrealm2), - MAKE_FUNC_INFO(krb_life_to_time), - END_FUNC_INFO + MAKE_FUNC_INFO(k_isinst), + MAKE_FUNC_INFO(k_isname), + MAKE_FUNC_INFO(k_isrealm), + MAKE_FUNC_INFO(kadm_change_your_password), + MAKE_FUNC_INFO(kname_parse), + MAKE_FUNC_INFO(krb_get_cred), + MAKE_FUNC_INFO(krb_get_krbhst), + MAKE_FUNC_INFO(krb_get_lrealm), + MAKE_FUNC_INFO(krb_get_pw_in_tkt), + MAKE_FUNC_INFO(krb_get_tf_realm), + MAKE_FUNC_INFO(krb_mk_req), + MAKE_FUNC_INFO(krb_realmofhost), + MAKE_FUNC_INFO(tf_init), + MAKE_FUNC_INFO(tf_close), + MAKE_FUNC_INFO(tf_get_cred), + MAKE_FUNC_INFO(tf_get_pname), + MAKE_FUNC_INFO(tf_get_pinst), + MAKE_FUNC_INFO(LocalHostAddr), + MAKE_FUNC_INFO(tkt_string), + MAKE_FUNC_INFO(krb_set_tkt_string), + MAKE_FUNC_INFO(initialize_krb_error_func), + MAKE_FUNC_INFO(initialize_kadm_error_table), + MAKE_FUNC_INFO(dest_tkt), + /* MAKE_FUNC_INFO(lsh_LoadKrb4LeashErrorTables), */// XXX + MAKE_FUNC_INFO(krb_in_tkt), + MAKE_FUNC_INFO(krb_save_credentials), + MAKE_FUNC_INFO(krb_get_krbconf2), + MAKE_FUNC_INFO(krb_get_krbrealm2), + MAKE_FUNC_INFO(krb_life_to_time), + END_FUNC_INFO }; FUNC_INFO k5_fi[] = { @@ -234,6 +235,7 @@ FUNC_INFO k5_fi[] = { MAKE_FUNC_INFO(krb5_get_prompt_types), MAKE_FUNC_INFO(krb5_build_principal_ext), MAKE_FUNC_INFO(krb5_cc_get_name), + MAKE_FUNC_INFO(krb5_cc_get_type), MAKE_FUNC_INFO(krb5_cc_resolve), MAKE_FUNC_INFO(krb5_cc_default), MAKE_FUNC_INFO(krb5_cc_default_name), @@ -290,8 +292,8 @@ FUNC_INFO k5_fi[] = { FUNC_INFO k524_fi[] = { MAKE_FUNC_INFO(krb524_init_ets), - MAKE_FUNC_INFO(krb524_convert_creds_kdc), - END_FUNC_INFO + MAKE_FUNC_INFO(krb524_convert_creds_kdc), + END_FUNC_INFO }; FUNC_INFO profile_fi[] = { @@ -312,8 +314,8 @@ FUNC_INFO profile_fi[] = { FUNC_INFO ce_fi[] = { MAKE_FUNC_INFO(com_err), - MAKE_FUNC_INFO(error_message), - END_FUNC_INFO + MAKE_FUNC_INFO(error_message), + END_FUNC_INFO }; FUNC_INFO service_fi[] = { @@ -327,11 +329,11 @@ FUNC_INFO service_fi[] = { FUNC_INFO lsa_fi[] = { MAKE_FUNC_INFO(LsaConnectUntrusted), - MAKE_FUNC_INFO(LsaLookupAuthenticationPackage), - MAKE_FUNC_INFO(LsaCallAuthenticationPackage), - MAKE_FUNC_INFO(LsaFreeReturnBuffer), - MAKE_FUNC_INFO(LsaGetLogonSessionData), - END_FUNC_INFO + MAKE_FUNC_INFO(LsaLookupAuthenticationPackage), + MAKE_FUNC_INFO(LsaCallAuthenticationPackage), + MAKE_FUNC_INFO(LsaFreeReturnBuffer), + MAKE_FUNC_INFO(LsaGetLogonSessionData), + END_FUNC_INFO }; // psapi functions diff --git a/src/windows/identity/plugins/common/dynimport.h b/src/windows/identity/plugins/common/dynimport.h index 99aad9aed..778bff324 100644 --- a/src/windows/identity/plugins/common/dynimport.h +++ b/src/windows/identity/plugins/common/dynimport.h @@ -203,6 +203,7 @@ extern DECL_FUNC_PTR(krb5_get_init_creds_password); extern DECL_FUNC_PTR(krb5_get_prompt_types); extern DECL_FUNC_PTR(krb5_build_principal_ext); extern DECL_FUNC_PTR(krb5_cc_get_name); +extern DECL_FUNC_PTR(krb5_cc_get_type); extern DECL_FUNC_PTR(krb5_cc_resolve); extern DECL_FUNC_PTR(krb5_cc_default); extern DECL_FUNC_PTR(krb5_cc_default_name); diff --git a/src/windows/identity/plugins/common/krb5common.c b/src/windows/identity/plugins/common/krb5common.c index 6019c928e..cb9d86bc5 100644 --- a/src/windows/identity/plugins/common/krb5common.c +++ b/src/windows/identity/plugins/common/krb5common.c @@ -139,6 +139,9 @@ khm_krb5_initialize(khm_handle ident, } while(FALSE); } +#ifndef FAILOVER_TO_DEFAULT_CCACHE + rc = 1; +#endif if (*cache == 0 #ifdef FAILOVER_TO_DEFAULT_CCACHE && (rc = (*pkrb5_cc_default)(*ctx, cache)) diff --git a/src/windows/identity/plugins/krb5/krb5configcc.c b/src/windows/identity/plugins/krb5/krb5configcc.c index 256f6b75e..66e7a08d0 100644 --- a/src/windows/identity/plugins/krb5/krb5configcc.c +++ b/src/windows/identity/plugins/krb5/krb5configcc.c @@ -24,6 +24,11 @@ /* $Id$ */ +#if _WIN32_WINNT < 0x501 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x501 +#endif + #include #include #include @@ -381,42 +386,63 @@ k5_ccconfig_dlgproc(HWND hwnd, /* not there. we need to add. but check a few things first */ if (!PathFileExists(path)) { - EDITBALLOONTIP bt; wchar_t title[64]; wchar_t text[128]; - bt.cbStruct = sizeof(bt); - bt.pszTitle = title; LoadString(hResModule, IDS_CFG_FCN_WARNING, title, ARRAYLENGTH(title)); - bt.pszText = text; + LoadString(hResModule, IDS_CFG_FCN_W_NOTFOUND, text, ARRAYLENGTH(text)); - bt.ttiIcon = TTI_WARNING; - - SendDlgItemMessage(hwnd, IDC_CFG_FCNAME, - EM_SHOWBALLOONTIP, - 0, - (LPARAM) &bt); - +#if _WIN32_WINNT >= 0x501 + if (IS_COMMCTL6()) + { + EDITBALLOONTIP bt; + + bt.cbStruct = sizeof(bt); + bt.pszTitle = title; + bt.pszText = text; + bt.ttiIcon = TTI_WARNING; + + SendDlgItemMessage(hwnd, IDC_CFG_FCNAME, + EM_SHOWBALLOONTIP, + 0, + (LPARAM) &bt); + } else { +#endif + MessageBox(hwnd, text, title, MB_OK | MB_ICONWARNING); +#if _WIN32_WINNT >= 0x501 + } +#endif } else if (PathIsRelative(path)) { - EDITBALLOONTIP bt; wchar_t title[64]; wchar_t text[128]; - bt.cbStruct = sizeof(bt); - bt.pszTitle = title; LoadString(hResModule, IDS_CFG_FCN_WARNING, title, ARRAYLENGTH(title)); - bt.pszText = text; LoadString(hResModule, IDS_CFG_FCN_W_RELATIVE, text, ARRAYLENGTH(text)); - bt.ttiIcon = TTI_WARNING; - SendDlgItemMessage(hwnd, IDC_CFG_FCNAME, - EM_SHOWBALLOONTIP, - 0, - (LPARAM) &bt); +#if _WIN32_WINNT >= 0x501 + if (IS_COMMCTL6()) + { + EDITBALLOONTIP bt; + + bt.cbStruct = sizeof(bt); + bt.pszTitle = title; + bt.pszText = text; + bt.ttiIcon = TTI_WARNING; + + SendDlgItemMessage(hwnd, IDC_CFG_FCNAME, + EM_SHOWBALLOONTIP, + 0, + (LPARAM) &bt); + } else { +#endif + MessageBox(hwnd, text, title, MB_OK | MB_ICONWARNING); +#if _WIN32_WINNT >= 0x501 + } +#endif } k5_add_file_cc(&d->work, path); diff --git a/src/windows/identity/plugins/krb5/krb5funcs.c b/src/windows/identity/plugins/krb5/krb5funcs.c index d1a897d63..3dfea750c 100644 --- a/src/windows/identity/plugins/krb5/krb5funcs.c +++ b/src/windows/identity/plugins/krb5/krb5funcs.c @@ -206,17 +206,17 @@ int com_addr(void) static long get_tickets_from_cache(krb5_context ctx, krb5_ccache cache) { - krb5_error_code code; - krb5_principal KRBv5Principal; - krb5_flags flags = 0; - krb5_cc_cursor KRBv5Cursor; - krb5_creds KRBv5Credentials; + krb5_error_code code; + krb5_principal KRBv5Principal; + krb5_flags flags = 0; + krb5_cc_cursor KRBv5Cursor; + krb5_creds KRBv5Credentials; krb5_ticket *tkt=NULL; - char *ClientName; - char *PrincipalName; - wchar_t wbuf[256]; /* temporary conversion buffer */ - wchar_t *wcc_name = NULL; /* credential cache name */ - char *sServerName; + char *ClientName; + char *PrincipalName; + wchar_t wbuf[256]; /* temporary conversion buffer */ + wchar_t wcc_name[KRB5_MAXCCH_CCNAME]; /* credential cache name */ + char *sServerName; khm_handle ident = NULL; khm_handle cred = NULL; time_t tt; @@ -231,18 +231,28 @@ static long get_tickets_from_cache(krb5_context ctx, #endif { - char * cc_name; - size_t namelen; + const char * cc_name; + const char * cc_type; cc_name = (*pkrb5_cc_get_name)(ctx, cache); if(cc_name) { - namelen = strlen(cc_name); - namelen = (namelen + 1 + 5) * sizeof(wchar_t); - /* the +5 is for the possible addtion of API: or FILE: - during the cannonicalization process */ - wcc_name = PMALLOC(namelen); - AnsiStrToUnicode(wcc_name, namelen, cc_name); - khm_krb5_canon_cc_name(wcc_name, namelen); + cc_type = (*pkrb5_cc_get_type)(ctx, cache); + if (cc_type) { + StringCbPrintf(wcc_name, sizeof(wcc_name), L"%S:%S", cc_type, cc_name); + } else { + AnsiStrToUnicode(wcc_name, sizeof(wcc_name), cc_name); + khm_krb5_canon_cc_name(wcc_name, sizeof(wcc_name)); + } + } else { + cc_type = (*pkrb5_cc_get_type)(ctx, cache); + if (cc_type) { + StringCbPrintf(wcc_name, sizeof(wcc_name), L"%S:", cc_type); + } else { +#ifdef DEBUG + assert(FALSE); +#endif + StringCbCopy(wcc_name, sizeof(wcc_name), L""); + } } } @@ -543,8 +553,6 @@ static long get_tickets_from_cache(krb5_context ctx, } _exit: - if(wcc_name) - PFREE(wcc_name); return code; } @@ -1507,30 +1515,60 @@ khm_krb5_ms2mit(BOOL save_creds) char *princ_name = NULL; BOOL rc = FALSE; +#ifdef DEBUG + kherr_debug_printf(L"Begin : khm_krb5_ms2mit. save_cred=%d\n", (int) save_creds); +#endif if ( !pkrb5_init_context ) goto cleanup; if (code = pkrb5_init_context(&kcontext)) goto cleanup; +#ifdef DEBUG + kherr_debug_printf(L"Resolving MSLSA\n"); +#endif if (code = pkrb5_cc_resolve(kcontext, "MSLSA:", &mslsa_ccache)) goto cleanup; if ( save_creds ) { - if (code = pkrb5_cc_get_principal(kcontext, mslsa_ccache, &princ)) +#ifdef DEBUG + kherr_debug_printf(L"Getting principal\n"); +#endif + if (code = pkrb5_cc_get_principal(kcontext, mslsa_ccache, &princ)) goto cleanup; - if (code = pkrb5_unparse_name(kcontext, princ, &princ_name)) +#ifdef DEBUG + kherr_debug_printf(L"Unparsing name\n"); +#endif + if (code = pkrb5_unparse_name(kcontext, princ, &princ_name)) goto cleanup; +#ifdef DEBUG + kherr_debug_printf(L"Unparsed [%S]. Resolving target cache\n", princ_name); +#endif /* TODO: actually look up the preferred ccache name */ - if ((code = pkrb5_cc_resolve(kcontext, princ_name, &ccache)) || - (code = pkrb5_cc_default(kcontext, &ccache))) - goto cleanup; + if (code = pkrb5_cc_resolve(kcontext, princ_name, &ccache)) { +#ifdef DEBUG + kherr_debug_printf(L"Cannot resolve cache [%S] with code=%d. Trying default.\n", princ_name, code); +#endif + + if (code = pkrb5_cc_default(kcontext, &ccache)) { +#ifdef DEBUG + kherr_debug_printf(L"Failed to resolve default ccache. Code=%d", code); +#endif + goto cleanup; + } + } +#ifdef DEBUG + kherr_debug_printf(L"Initializing ccache\n"); +#endif if (code = pkrb5_cc_initialize(kcontext, ccache, princ)) goto cleanup; +#ifdef DEBUG + kherr_debug_printf(L"Copying credentials\n"); +#endif if (code = pkrb5_cc_copy_creds(kcontext, mslsa_ccache, ccache)) goto cleanup; @@ -1540,8 +1578,8 @@ khm_krb5_ms2mit(BOOL save_creds) if ((code = pkrb5_cc_start_seq_get(kcontext, mslsa_ccache, &cursor))) goto cleanup; - while (!(code = pkrb5_cc_next_cred(kcontext, mslsa_ccache, &cursor, &creds))) - { + while (!(code = pkrb5_cc_next_cred(kcontext, mslsa_ccache, + &cursor, &creds))) { if ( creds.ticket_flags & TKT_FLG_INITIAL ) { rc = TRUE; pkrb5_free_cred_contents(kcontext, &creds); @@ -1553,6 +1591,10 @@ khm_krb5_ms2mit(BOOL save_creds) } cleanup: +#ifdef DEBUG + kherr_debug_printf(L" Received code=%d", code); +#endif + if (princ_name) pkrb5_free_unparsed_name(kcontext, princ_name); if (princ) diff --git a/src/windows/identity/plugins/krb5/krb5identpro.c b/src/windows/identity/plugins/krb5/krb5identpro.c index dd4782e6f..858243daf 100644 --- a/src/windows/identity/plugins/krb5/krb5identpro.c +++ b/src/windows/identity/plugins/krb5/krb5identpro.c @@ -438,7 +438,7 @@ ui_cb(khui_new_creds * nc, NULL, &cb_ms); - if (rv != KHM_ERROR_TOO_LONG) + if (rv != KHM_ERROR_TOO_LONG || cb_ms <= sizeof(wchar_t) * 2) goto _add_lru_realms; ms = PMALLOC(cb_ms); diff --git a/src/windows/identity/plugins/krb5/krb5main.c b/src/windows/identity/plugins/krb5/krb5main.c index 7bf121dd0..d324857fe 100644 --- a/src/windows/identity/plugins/krb5/krb5main.c +++ b/src/windows/identity/plugins/krb5/krb5main.c @@ -60,6 +60,8 @@ khm_handle csp_params = NULL; BOOL is_k5_identpro = TRUE; +khm_ui_4 k5_commctl_version; + kmm_module_locale locales[] = { LOCALE_DEF(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), L"krb5cred_en_us.dll", KMM_MLOC_FLAG_DEFAULT) }; @@ -86,6 +88,8 @@ KHMEXP khm_int32 KHMAPI init_module(kmm_module h_module) { } else goto _exit; + k5_commctl_version = khm_get_commctl_version(NULL); + /* register the plugin */ ZeroMemory(&pi, sizeof(pi)); pi.name = KRB5_PLUGIN_NAME; diff --git a/src/windows/identity/plugins/krb5/krb5newcreds.c b/src/windows/identity/plugins/krb5/krb5newcreds.c index fc36d2c20..a08fb91d9 100644 --- a/src/windows/identity/plugins/krb5/krb5newcreds.c +++ b/src/windows/identity/plugins/krb5/krb5newcreds.c @@ -1771,6 +1771,18 @@ k5_msg_cred_dialog(khm_int32 msg_type, khm_krb5_list_tickets(&ctx); + /* If there is no default identity, then make this the default */ + kcdb_identity_refresh(nc->identities[0]); + { + khm_handle tdefault = NULL; + + if (KHM_SUCCEEDED(kcdb_identity_get_default(&tdefault))) { + kcdb_identity_release(tdefault); + } else { + kcdb_identity_set_default(nc->identities[0]); + } + } + /* also add the principal and the realm in to the LRU lists */ rv = kcdb_identity_get_name(nc->identities[0], @@ -1808,11 +1820,14 @@ k5_msg_cred_dialog(khm_int32 msg_type, assert(KHM_SUCCEEDED(rv)); if (multi_string_find(wbuf, - idname, - KHM_CASE_SENSITIVE) - != NULL) - /* it's already there */ - goto _add_realm_to_LRU; + idname, + KHM_CASE_SENSITIVE) + != NULL) { + /* it's already there. We remove it here + and add it at the top of the LRU + list. */ + multi_string_delete(wbuf, idname, KHM_CASE_SENSITIVE); + } } else { multi_string_init(wbuf, cb_ms); } @@ -1825,13 +1840,14 @@ k5_msg_cred_dialog(khm_int32 msg_type, L"LRUPrincipals", wbuf); - _add_realm_to_LRU: - atsign = wcschr(idname, L'@'); - assert(atsign != NULL); + if (atsign != NULL) + goto _done_with_LRU; atsign++; - assert(*atsign != L'\0'); + + if (*atsign == L'\0') + goto _done_with_LRU; cb = cb_ms; rv = khc_read_multi_string(csp_params, @@ -1854,25 +1870,28 @@ k5_msg_cred_dialog(khm_int32 msg_type, assert(KHM_SUCCEEDED(rv)); } else if (rv == KHM_ERROR_SUCCESS) { if (multi_string_find(wbuf, - atsign, - KHM_CASE_SENSITIVE) - != NULL) - goto _done_with_LRU; + atsign, + KHM_CASE_SENSITIVE) + != NULL) { + /* remove the realm and add it at the top + later. */ + multi_string_delete(wbuf, atsign, KHM_CASE_SENSITIVE); + } } else { multi_string_init(wbuf, cb_ms); } cb = cb_ms; rv = multi_string_prepend(wbuf, - &cb, - atsign); + &cb, + atsign); if (rv == KHM_ERROR_TOO_LONG) { - wbuf = realloc(wbuf, cb); + wbuf = PREALLOC(wbuf, cb); rv = multi_string_prepend(wbuf, - &cb, - atsign); + &cb, + atsign); assert(KHM_SUCCEEDED(rv)); } @@ -2201,7 +2220,15 @@ k5_msg_cred_dialog(khm_int32 msg_type, case KMSG_CRED_IMPORT: { - khm_krb5_ms2mit(TRUE); + khm_int32 t = 0; + +#ifdef DEBUG + assert(csp_params); +#endif + khc_read_int32(csp_params, L"MsLsaImport", &t); + + if (t == 1) + khm_krb5_ms2mit(TRUE); } break; } diff --git a/src/windows/identity/plugins/krb5/krb5plugin.c b/src/windows/identity/plugins/krb5/krb5plugin.c index ecfde2f5a..e58e69f34 100644 --- a/src/windows/identity/plugins/krb5/krb5plugin.c +++ b/src/windows/identity/plugins/krb5/krb5plugin.c @@ -31,6 +31,10 @@ #include #include +#ifdef DEBUG +#include +#endif + khm_int32 credtype_id_krb5 = KCDB_CREDTYPE_INVALID; khm_boolean krb5_initialized = FALSE; khm_handle krb5_credset = NULL; @@ -141,10 +145,20 @@ k5_msg_system(khm_int32 msg_type, khm_int32 msg_subtype, } if(k5_main_fiber != NULL) { -#if (_WIN32_WINNT >= 0x0501) - ConvertFiberToThread(); + + if (k5_kinit_fiber) { +#ifdef DEBUG + assert(k5_kinit_fiber != GetCurrentFiber()); +#endif +#if CLEANUP_FIBERS_ON_EXIT + DeleteFiber(k5_kinit_fiber); + CloseHandle(k5_kinit_fiber); #endif + k5_kinit_fiber = NULL; + } + k5_main_fiber = NULL; + } if(k5_sub != NULL) { diff --git a/src/windows/identity/plugins/krb5/krbcred.h b/src/windows/identity/plugins/krb5/krbcred.h index 7efc360a0..7ab035c8c 100644 --- a/src/windows/identity/plugins/krb5/krbcred.h +++ b/src/windows/identity/plugins/krb5/krbcred.h @@ -93,6 +93,10 @@ extern khm_int32 attr_id_addr_list; extern khm_int32 attr_id_krb5_flags; extern khm_int32 attr_id_krb5_ccname; +extern khm_ui_4 k5_commctl_version; + +#define IS_COMMCTL6() (k5_commctl_version >= 0x60000) + /* Configuration spaces */ #define CSNAME_KRB5CRED L"Krb5Cred" #define CSNAME_PARAMS L"Parameters" diff --git a/src/windows/identity/ui/Makefile b/src/windows/identity/ui/Makefile index 4419444a3..7b3acc40f 100644 --- a/src/windows/identity/ui/Makefile +++ b/src/windows/identity/ui/Makefile @@ -64,7 +64,8 @@ SDKLIBFILES= \ comctl32.lib \ shell32.lib \ htmlhelp.lib \ - iphlpapi.lib + iphlpapi.lib \ + shlwapi.lib $(OBJ)\uiconfig.c: uiconfig.csv $(CONFDIR)\csvschema.cfg $(CCSV) $** $@ diff --git a/src/windows/identity/ui/aboutwnd.c b/src/windows/identity/ui/aboutwnd.c index 4f5d38ef4..da7abdfee 100644 --- a/src/windows/identity/ui/aboutwnd.c +++ b/src/windows/identity/ui/aboutwnd.c @@ -108,12 +108,6 @@ about_dlg_proc(HWND hwnd, mod.dwSize = sizeof(mod); } while(Module32Next(hsnap, &mod)); -#if (_WIN32_WINNT >= 0x501) - /* we are also setting the report style when creating - the control. this is actually optional. */ - ListView_SetView(hw, LV_VIEW_DETAILS); -#endif - _done_with_modules: CloseHandle(hsnap); } diff --git a/src/windows/identity/ui/appglobal.h b/src/windows/identity/ui/appglobal.h index d7e5667af..585ec090a 100644 --- a/src/windows/identity/ui/appglobal.h +++ b/src/windows/identity/ui/appglobal.h @@ -27,11 +27,17 @@ #ifndef __KHIMAIRA_APPGLOBAL_H #define __KHIMAIRA_APPGLOBAL_H +/* Helpfile */ +#define NIDM_HELPFILE L"netidmgr.chm" + /* global data */ extern HINSTANCE khm_hInstance; extern int khm_nCmdShow; extern const wchar_t * khm_facility; extern kconf_schema schema_uiconfig[]; +extern khm_ui_4 khm_commctl_version; + +#define IS_COMMCTL6() (khm_commctl_version >= 0x60000) typedef struct tag_khm_startup_options { BOOL seen; @@ -67,6 +73,8 @@ void khm_exit_gui(void); void khm_parse_commandline(); void khm_register_window_classes(void); +HWND khm_html_help(HWND hwnd, UINT command, DWORD_PTR data); + #define MAX_RES_STRING 1024 #define ELIPSIS L"..." diff --git a/src/windows/identity/ui/cfg_identities_wnd.c b/src/windows/identity/ui/cfg_identities_wnd.c index 8b27c3334..d38b338d2 100644 --- a/src/windows/identity/ui/cfg_identities_wnd.c +++ b/src/windows/identity/ui/cfg_identities_wnd.c @@ -946,9 +946,6 @@ khm_cfg_ids_tab_proc(HWND hwnd, cfg_idents.idents[i].lv_idx = ListView_InsertItem(hw, &lvi); } -#if (_WIN32_WINNT >= 0x501) - ListView_SetView(hw, LV_VIEW_DETAILS); -#endif } return FALSE; diff --git a/src/windows/identity/ui/cfg_plugins_wnd.c b/src/windows/identity/ui/cfg_plugins_wnd.c index 8bf767e8c..6dad3698f 100644 --- a/src/windows/identity/ui/cfg_plugins_wnd.c +++ b/src/windows/identity/ui/cfg_plugins_wnd.c @@ -119,9 +119,6 @@ khm_cfg_plugins_proc(HWND hwnd, hw = GetDlgItem(hwnd, IDC_CFG_PLUGINS); #ifdef DEBUG assert(hw); -#endif -#if (_WIN32_WINNT >= 0x501) - ListView_SetView(hw, LV_VIEW_DETAILS); #endif ZeroMemory(&lvc, sizeof(lvc)); diff --git a/src/windows/identity/ui/images/app_notify_error.ico b/src/windows/identity/ui/images/app_notify_error.ico index 8dcb29e7a66f097ad2f67b181bb352fb2421d3d9..b17c045c70ec2d53cf79dca4ff93c3119c988e9e 100644 GIT binary patch literal 2862 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

k3sxyV0h8 z14y-t8tH+*NAcQ(OdO`s1M)=;dxmZj_6v�Jk?KB_&Y&gD^@AzC#JY_b4$ugpwja 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

k3sxyV0h8 z14y-t8tH+*NAcQ(OdO`s1M)=;dxmZj_6v�Jk?KB_&Y&gD^@AzC#JY_b4$ugpwja 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

k3sxyV0h8 z14y-t8tH+*NAcQ(OdO`s1M)=;dxmZj_6v�Jk?KB_&Y&gD^@AzC#JY_b4$ugpwja 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 CM>cW* literal 822 zcmb7Cu?@mN3^ZZ^O1iWt1Eh^aPnnug7=@lC7=v-1^IzlyzfHjMTlV>UabADE411|I zAf9jz^V!L<;xhMHFut}-qz7}0we)|KwE^i=AGRQ+NGT}gS=8_9T3#PAP9!sO1mu`M z-UR+>s*~{(eSRg2CZ7=;zTVum!t&qy4@IV~cQ~$njTnImyUbl|TkQ=v!V0z!Qi SXl47@8ZE)5!XG5aDdcYyKhCQF diff --git a/src/windows/identity/ui/images/chpw.bmp b/src/windows/identity/ui/images/chpw.bmp index 71c95ad4ab86dc604782a084b96ee72e124e64fa..43d0d5ed940f0216e399cacd57c024a82d9e3a60 100644 GIT binary patch literal 2430 zcmcJQA#B?~6ox&s4FpfCRya)q1_c2H0YOux1r`(-6a)kW1Oylu7#J7?1O^xc1Q-Ma z3}D)f4LuxXVvlFX~2Rb1j!A8fTuX-CfUxKY-^(; zFZK{TF_~jJwI%OiI2^Kd$J}YUHN6aLMLFEYI9J_xz10^>Of3Yt-qC2p)*W*x=uR`U z_kdZ!N(Jsb6Hvv4Ai3l5*y;C6xzt!rV%{y35g$Vp7lPzQQRFxd^sS~mFTz>cau&7L z)NDq|h;4s4jaS;leYjtl<4EpoHgjEIA`#!suX-d;oyhv2yy45qkwD77+o>6UX zMlA%%T`rd#VNP3mLiOgYS^I%MF`iNjL2{EMA&dBdQe9ouP4g4Jbd;njmt1ZIK5#aa zgK?gyg&?^+9S_2FW}ho+AxQ3ey-w2ycCU&cNbcV^lH}%ZB+1oJc$HXk>5K3Eylx4X UROvgn82nDh8qX(R50N)Cp$|RvU_wMrNXh zy4e=21?x*Or{RJPMT?bRW0MAJM_QX3?IU&ev@=e=+q&`SpXdB}-v9ePzjutoIbAH@ zO;S~Weh5!Kp8a@skiF=H6s7l5i*%dWo+8_Wok?@oQzf}_S%^3Y_e1}2%gaiI3uubl z(f&wQEfub}Z(h^f$L*CB9*}xJJXX8tL_H?i9N!(#P{UV!_y7G&(#cp3vGx zD8~iiqs>Nf%`Z%KwX$rkc`iW|eyGIo6XBD+0d8qs{GH7O!C|*k+*cOM&H5Vydfj?5 znW0*)7ZJ7oPlZ_C7z4%rXIGJ3G TaNC-IO5z)v!R0R5!cP7G@lw?l diff --git a/src/windows/identity/ui/images/help-sm.bmp b/src/windows/identity/ui/images/help-sm.bmp index 49e560fb467274e42779c54e477eb7c6b20ba541..582bbb0d877a619a830f8696b8c057c04744653f 100644 GIT binary patch literal 822 zcmZ8fA&jFy6y;b?PHiqLDpp-iRII3|s93RLldC{hR3H#55ET^&L@$IoKi1XFFJ(XPgB7~8fb zgs_;VswmI%u%%s6-lR*9YT2~}n=Txhw-j3$hJhr}b<;HazMsOzprsVJJq|Xf+h7o^ zA#Z4hQ*<5wDvF|N2j1vN)(vUbK#_hsva08Y9`YpX_{tj76-osVSwb->_3OeEK709iX@^r z5msSVxk;H6R|)e;i&Z}dK_2%#IhEOvMlkUh~@IH%39VP&zE&;DV^XD%Xt)!&pXWzf+&ir zs$v(!Q@O6I8|LF?$G?crZ~I?cnQ;)?anQxK2zNK&IDBY8Ico1a2_^17RP6-EvMhvI p5MOPYfEk#^AP7$X0AmIR^LC5S^Z9(AmOH8I8t(zIyTb^=e*s`uBF_K- literal 1014 zcmZ?r{l?4y24+A~1BeBHm>-B485Dpd1RUXGU;tqlxPJZme_CL#+`9idIoA|IszwWa&S3>eT;3hYtNeckUcn`ir`z{r9b%{D11A6=dlTsGIVizvuY> zlAdW~=?|%$0M>6=*!_RTV$$8PWA~o_u?-XcOIIxUFI2zje{f~@|C6UqlkApFJ9hs! zFX{uk#kHvY|CK9ONH*i(;UoX0ist<1?>P9sWy)-l^@GxZuin{K@N z-?-+$|MaP={)f)o@!x&_OsiWL5`fj}TC5ET^&L#-YeJGl&+{PHvr3}3;L$DpxNu#!nT0m13!xgS zsve?v=#)e|0@v$O@Jo4Ds{5*jV%Mm60NpSQWf==QrL(&5Q7jjWB+GkNm4+LD%Eh_) ze!qtTtBcWab@U)3N-|uhMV>b?_bQ&k4KG|c49cSc5mwhU&E0PIWG7@9Yr8bRw7Hjp zr*IG1r89r9sx0u>MpoCdti$0jFe0)DoqdvJX%mtggQs}Qix|v|)x{>@CJwYck%Kfz z7)VYCp27~|Rxe_L;FT_xP|bI>BhuCl!uZleYY(2n^4qW*seQAy0mVKbpz^otU1{p8=g0^iKx*#d0idlOM+wD#i@T;{0U5K#vf$k<8 zw&Q*r&&j=bFRGi3OEH)!U?@b@prmQpH&608azhnZ-TM477gaYt45wtk-A+W^Fm2m5 z*VY{;p*s#VA)(U>FGy;fZHhTKflGz~}6NX=MX<}Z&fmWH&&VljE* z2BU|Y+djqUVa!c=MNtgHz@9RRtSf9`f7F|%U TUYtK8s3_`}_qeA1N~7}&3xJzp literal 2430 zcmcJQZA@Eb6vwY0)hUT4#zYMoznHlMCDCj%6LoW$Srme9OVDl^66P{sINn4$m;tp#Dr+Nj@-irIEu}zVmKJDxTPUs2w*g(DP@uJ=w9wLm2OeyC3w|-~`Iv&Xc~{mv54j zZxt0G_H95SGC`kz_kKZ2PWn2G+?;HwM535lV(YdF@LgJ`x5ka;_O`aGX{llTa0DNM zZ)L^pw3I7Bva>S#MIyFtGwR+Z#@L70?oH`KH=oA~j-ZX8i%;-n&}rG38HjQUMf<=K z)9%L@+eC8wS0(-eMW9?AfE+9EN3eEFa5NbW`Q*IdY;TW{;LEyGbDf+A6c-j+9j>TG zFGll5)OcAFzD++N0)D^4vr!=PK?881&o?(~L9>wi`$Ys_PF-zrQ6Vt(z!X*Q!Kfa{ z%Wj{4V;hshCwjO`P!yTH5zOt*{E_wHAt@Rci~k__HZ?R*N=v(Vyz4_AtjZP1UR`pn zZ}_|jB!Uj~&8!7=*dx(sUuRY`z+p%#CHS^-Tc}l)CW|eC_7_&}=y|ZZzUB!+9$Wzt z5mrhOZI?)0kH*zw;2@XD2)_Kz&W`rBYTSX9&L6wG=yth6`F_9-Izpg#hL+~+D@cb; z4U?%-Dha+lLZMtXlEAfMKbmQ>#YawODBtxhfR5l#EQgk0f4X4~N}zY~`D*nT!FOO_ zKsPz@UX2O6scTnT?aND{WDCroBmS)lJqo$}Ppy{VE0szNdfic)1|usM=B;65w(CJh zaPgUatI(sw6?&bH;47EQCMPBi-sA>JhEPl)VT2%7Pn6$BQ@BDgGd)f4h3^HfmQ#BlORA6kMWEGa z!f5W7vjxM$_*j?@$7ilI!IV&{f``mvu@HO>2E9^=cZj6emvo?0B!P96Uu(;y4Q>lYuageuCsURXQmed7xc1zcR zb0wfx{N4!<12`-$+6cb0vljT;G@9|24&Do&=V2dTJDFZ46m}zyT>c3ZLLvP+X=olo6WovgM(rUgZ)%YB6gT`=uCPwyN=7{*3~z@L&`aL z_S%_@TX2NPEvb4s<|6dG`dJE8M@L7|xYOw*_&V(Nh5314)?$HoK~Y)d^GD*bgC~La z&t1Bdl}|4E89_?Rjr{N|Dn-X7F@C)R|BYxC@~X>4@LgG10c(V9VS&fvQOYYmh(C|L z9JMdc9Xdw3{4JeMmq;YRLD;N$JOp3Yo=~Y&3_AVB4>!L^xN!9NC$GI3jW~Wfj+B^O zQc}WVu?z-7*qqnvCHTVo4y3(-<2Z-IDJv@@{}WUywYj+&ejIz7-EMdIdlSwOKA&&% SzeXSsKqiFyMTh?}V}AoBVWltt diff --git a/src/windows/identity/ui/images/id-dis-sm.bmp b/src/windows/identity/ui/images/id-dis-sm.bmp index d028d84ca89804ab8d62141f18eac3d16a89820b..ee55b0f20786dd29a2ff11db0c6615bd4f984067 100644 GIT binary patch literal 822 zcmb7?A#TJl5JlZAud1M;;Hn4M0~AK;HFAs`qF`YUU{Fx7pkPsDU=U#7l?)6F3=9Gc z3=FLP*iBVM*^TyVY>k{ZlbO-HyzX}-YmfU0=i&Fv`IUov0hkSaNzD1JnC2p z@Fr0e3VwMjK^SsGV3#}^Bh16qc*fvs diff --git a/src/windows/identity/ui/images/id-sm.bmp b/src/windows/identity/ui/images/id-sm.bmp index e507a62d5d0dcc258bed0913e5ff3f91f735de22..6edfb07d9514fc52ef00b7ce8bf79abbf1303028 100644 GIT binary patch literal 822 zcmb7?p>Kmg6vkQh4@@qICr*&1qN3si0#Sh=*#x2zQHhwCKulIlR8&?@AdwY_$qEFb zk|q-s69`1bi4!L-`wl9aK)dzJ-OD@p@x8}`=`+8#T5-fD?1$67vmV>)*6DtC=;Ho% zoj-m(@4UfiNGe$$(qtZx9Wp|6iN>~#H6fcb2CUCln{+l}fPEtHoD4iM3H5lbgjCJp z6D1gVWEOb%yNqJr?ePk{7NRLOvBxw&YBFOl=L`SByAkFs9QlJeZsR-;${6#fFOg6eCd%`R9Tjrk{olmz D{&9b{ diff --git a/src/windows/identity/ui/images/id.ico b/src/windows/identity/ui/images/id.ico index 1f0f676ffd4aeee1c712027c9852986425d1430e..aa15f05fd29d04bf0a23c94c7b63fa59dc369806 100644 GIT binary patch literal 2862 zcmeHJUu;ul6h9pu9f-Dr>1O}jc6U&=>Bdr6SMRn$r_5OmYKePeD7=h5kj%&=zF2u6 zh=x6hZ%X0wTqI18;EnO|ae|2R1akosptvET%Z9~DBR4Xp#{jW@Ccj6vQ$>H=NH$;_5AdxVBOuPihHs%a+0oTbh0l-x;jgWEKyLB=|b`h%}!5}B1!b-z9{LlDGKn} zD93ZEM!9r~V$F@D>pFchc!;J)lN9e(D1G??$F5UvqfFh*)is^8o72n{yc~_4IYIHR zFrWL9y8V7S8}Fl_EYrluSyHb~(qM0tMotgXp|C=!$uY{Y)*x%$XXwn)X+x(<6Ra=H zIp2vzS+A2~tV?HINugzIgtYWc{%*XN(>X3;If`;Ug=?u-FBcp0aDLc<|3L@#u4&Z) zYrE|ko4vezbGEF0N(t|@?|I4^2}De+Se{t_^u{~z z;~foFB@!_C)ypRGuWtYDbJq7?|6;_O>On?Hm+`VG%r9Ya<_3~)9mY!@7hbKE5S83e z+-|hEUD)ArBH(eOP4<;)t;qjo^c;E{>d+&(@Vw+f2lHDwUx4vWNkXgFyCNS8c`T_J zWM_WFr^gQCMcIR}M?$Bl$vSp8YoOG6aAa@$ihQ9zuP&mXsUcs+dCOQ8su#{h&|I5$#d?fU+ABi8b^Pm6Ct0B*TW&CE}chVZXQc>IppWE zK;f_X;{Lu)4xwkeA8p<`47}Wfg&S9(Gf!{}bD1^y9~|6|4!)xx_wCqgFCg>NHGpdu z7I>^uU!Tu`-=`Q(97U|D0bN@q48Q+23cqpBME(2ZXK&xax95j(@w1Pi-MYs2sqrZC nSNr~=FUHV~b`~eGz7v}vZv0*SH*x7+@7I^^?}7b4ea`#=(=`(R literal 2166 zcmeH{F>6#o5Xb))Pq^aHq)8R)&$gur$wRIsqgC%DSO zOr12QN)ZWyNq3;Q{$^i}1VQYy(D&Z#?)-0e=J#gzoz&BUMx#aL^=UzRK)=|zdU{*B zb4z-NHo_ibJ@sk1m^;66`qdIfllEvb$q~lQU^<=Br&8OaT62VPrz}RwXW*}1 zdCv13kFcHwv~AG!^KozPPV#VLobT-NW{~H6`f;j@4{y}(_ca&{G#n1Kw6vt<s7j!xWdY}h-AOw2FulO}uW}`KN8-a{P#&_G& z(-;f}gTY`hG$a@d27|$1Fc=yp3)hL|S zVR2X-miEf9ILVzvPEd!Xm4P3ffy3gkw6ehAa5x+ehr`iI1&71nFgOfZI)}qya2TTf zV?|d&@^m+TD{oc@DsmU*wNjJ2z*I430NZQ(OB{{AiefiM{JVW==v z7%B{e#?WD?FjN>S0G0efu*$;9BqxUBI~=ve&N;68dadp4ZSCyrXm@v4dwY92JUrCF z!GVsCk9Bf#qSMn;ou8lU^72x%*-RH-t6uHz^Bqs9ZhiyV5wCd}H{JB4Cs$W<{(yg# vaGq`saP6mZ(`yTE2p#XW@H_wK^*7>Q+?9T1vwKq7_vg~LN8Na?rJwo_Usy*@ diff --git a/src/windows/identity/ui/images/import-sm.bmp b/src/windows/identity/ui/images/import-sm.bmp index 0c9916877ce66ebd960598aee91e4b28414b3e52..bc7e4f4c91172fc161adb697e3be7a1c8eaf87f0 100644 GIT binary patch literal 822 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 MVn|$f=YNdIKMt75s{jB1 diff --git a/src/windows/identity/ui/images/tk-delete-sm.bmp b/src/windows/identity/ui/images/tk-delete-sm.bmp index 0ac2d6a8e9d6610a29b4fc04342bb094b7710b60..b9b604f83b136f3049c22941ea0e26fd4b99cbf2 100644 GIT binary patch literal 822 zcmb7?FKog<6vkQS5X8jXqN1YWM8$~{ zCr+F|R3IU#Kp;+3R7^}vkbV6Vl2x$o%j>0g?|0w5-s{V&e%mRfV|>DMUq3gUhjP7B z=c`FI&i|?9Vqx2Mnx^Ng0syRnDWzB0Iw^#}7T0w-=U*+f+wA~*s}=aHg_0xzyk4)t zpIT_U-2x870EO*aNJlZN`b4n8&T?w8Sp=`kKF4qQu zG2y;1%{Q(MH$6ROOd{J5U>pJG(U>8%3B;Wq4W`&0E|y3#^razO5zIYL`abRI0pKkA z9+`4x;j>~wBE&^l!L4Y|(cDVAdN`O0!06?pA#8VFHbiAv9ZIQVsmWa82*7z>^xauy ua1f$+Zz#`mn4C_ZMa_L`%n~>Qc0SaVzvFN?D0Ox{Wm-oBAr04GQ@}rQVK*-T literal 822 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 diff --git a/src/windows/identity/ui/images/tk-new-sm.bmp b/src/windows/identity/ui/images/tk-new-sm.bmp index f2bf279539b83605d98fb1b5faa92781b5969af4..1868eb4c99fb43390fed0f469e484ddca58f8253 100644 GIT binary patch literal 822 zcma))A#8&{6o$LZlLa+3xh#_t6_XQlvlSDFii(Pf3Pi<;2}H$21)>5`fjCitKp;*a zP9RR4XcGhifj}S-h$mk50?n2Y*6@XUdH4RG%e}jMd7EBOTBZ~qXxyB~)#SFVPtJNb z>Eh{hnp@WRZ`rbQ-Si?#DaUchYuhWv);NNys#-Jiyj?R6#@J@F+3)xC?-X*9w$RV2T&nb4>UE?<3$4?G%1M&UqRL3|v1!bvF#zpE(>jBY`7=tNL}^ywATmS~ z;6)u>pV}h)9@LjD>U#-hjSEBz(LkI5@~j|<==GarSy`5rY>Xq)PVUGL7{l=6006q6 jx~@NBSf%iq;-bWP0bWkZ0OTa-J$G7=W7gn+?{DcFYfM`k literal 822 zcma))F>b>!3`JG+0v)?~EpmXY1-f_C?4!gtQHD;sgmQq40=g8?QPlTISq+MyC?P8{ z{r)FS=k5LY7%YzLFI-RKdI-;!597Jt`2M-awr#&M`;+^>aXnqWE+6OfKZS9Pz&T}9 zz4u)5-@^DRo&}#%?bjDg7hDb?x0{n@+mk~EPL z^p5A`RX0^^Ik>s|PZ&Ndhmd+GI$$1fD0*LbtyVE7rbGh=Mwl`H2Pb1gC>V0Ut;(Ee z#v|cSdTf;?2b_0*N&t?|!R)CT^JN*?-uO=*m7H0?tL>wTwM~^hrsS?a$=SIp_(sFL yTT8{NG}{?e6E!3zaQ`tMmw;(dKG0)eQgs2DM#qM~9%#Rx=2 z1p;lW0)aq0@x;v@%1qnO&Ln@b**&?uz=L-<_q@yH{*Tp< zog?}ff5Y($j-PS-(D?~tr}I1R|EV^|aRS3%{|){ZUR~Fk&?b`)g!ZyZ*Y#8KXT8%S zG))_gMh_43<#z)L#^Z6bd^Vjn)MwuLe2#l~C`l6f2&$@rhT(7sy|dY@&HMQHsB4;O znjhhOdA2OeUaxn5e-CAC-sNJk-|x$^5Z?l8z6Y-3j7Ot4cvq{H=XsoS25e;y{7<=KB61+Uia>km-GIop%*lsquHo=Cs zeJ~8ebzQKWR5T}16rJ>v6h)q~BtfJXk+bx9y`Jj&VzFrRZnqo9andxY-+qC^;c(_9 zl2yUtI1a-mvNWl9jzm_=B}{;sZC+HuZnwh{NWKJ2fAs;Z61;I31ip`8aU`n}lXw6Q z05G%7Yuh$>!!ShsHt_3o6HL~;SX+nSX>#y9-*Z_M9!Zb$L@)uBy4h^nyf9(6vx6Xj zWMF>aw~+|qcrKi-l{W7qnoP#aAk#Z|~Y6V0Ja zRH5fshG80p@7QM(Aem?|=&zriU|O3O`#v=6T4qUVo~uHrL}OOJ;Hshn77H2suJ!!9 zT|dPKkA%QXEg2)xZLfz-L#4KPk^bDYm4K;2s#0EYJ{01vD8YV{mAtI59vXQXWl*- zG9W^XWbFyWg17He2t(chiVQoC530?ZX1Q)UeJ}2E>Pngs^@y&IVv)q6c-H~kz-Ny< zK#I22=0yYBM!Dh=N@5!4(5Rv?vO-O2e;$&e`3V0xLZ+^3sNALnwt3OKbx*+Mu2HZx?}08Og}l)?-~L73 ixoSu;p8uP;K(}g;p#ZitwCeu#A-v6dn*H}DoxcH%=obnA literal 2430 zcmcJPZA?>F7{|MBWq6G)aapqIC$nrHwhwdJmMzKhJr3 z?&&$d^FJ>+pC%Q=iFmyS`3)#*p}Y#^1<@;zMWWB)f9=X>;Ts?gKOa43F6Oo4yHtqn zU#BcTQn!B-9Tg=&j;{Y7zwo_#XF7EHGAZ%rpMK2E$yrVuK6D5iY)Rg{D?JS&ijLuC zW@PM2Plrw>lWA$@2Nq;@+H}q zty^tvNAmM7)zk>Nr%x5$Y`HNpKJMli^M3x*zh-KzoPwkX-ilQKoTdiYOs|_;L zDGE09dgImOM+>gVWkPOAadC6g^^uVgund}>o`&4t-yh|MnGo%9kD5&*BxxbZVUm1I zl7I36mA<|{x$N?B9L$q_$V(#r3 z(CLjjUB6z}r|UNAx-Emod-v{1E6aZ?I(?(LNyx2|N*n6yz#y!BNv*A|&<_EZ4I`Ef z&NSw*BY)!rK&o)&tXF$CL9W*P=s4l zRFs{a4LjMb)e5=l_B$U}X~kOnJ~jXLAQkV$@jkrXWGiR6*IAt5V<*WTMOj&u)Sa3=4N;Z75x{W!=*{01X_)6&wmBqzhMo6V6oD~2n1 zNUhPaE2bG@eB$N#g>>&?<0AbL9r$E~`oQj5HH#1WLldOI+S3`DbD=;81=w(q3kM?H zl$4ZBn>IB!H^BuJa>ZwHoEj687!1C{u%mR)%W_P8dzLXUS2Ob~D@JeU}rAqH{08fOi<%)Cq{QV?pjIyLp% z>WdeFFgG_VLo(8zZ|rLI3~& diff --git a/src/windows/identity/ui/images/tk-refresh-sm.bmp b/src/windows/identity/ui/images/tk-refresh-sm.bmp index acf33618d2e750de0358627122f6e15031e46ef8..cfee8f71b7a9e6d9db3697f8a09e9f63cbd120ad 100644 GIT binary patch literal 822 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 YVch53)i(=P7#eM>g5uh~{EyM@A3>+wGXMYp diff --git a/src/windows/identity/ui/images/vw-refresh-sm.bmp b/src/windows/identity/ui/images/vw-refresh-sm.bmp index aabd10ef575a242c200726eb6ecfad6143b86d47..e3d321ca4d7fe336614a6e6b00c56e21147f594f 100644 GIT binary patch literal 822 zcmZXSFO1?q6orbBVAJ3Q8 zkGsG1ajss}+V2OojmP8ldVOo?a=C0ao8e$kGf@~SD~h54e%|JJ7DZtcMe%Tmm1X&v z`0u@{$~cabB+0Vu`l#da$aSob?(1^7Ow;%C`Fy=zu%cM?dcAKAnWl*czXFJm=Q;f0 za8RW0`!F3#^K4AlG#w8Cf*^o_B=ghhaD7ZPgL@wyKKvl9r5(k{#!0?w=I?=@7%~VA>ox^Nrw1jV+kSMXZb4QQQ)*a zVcC<(L}7fw#Hk1|#4rr0tJ`(EFJAXWdeR?_5=yI?{eDkdD5t5_YDLe%lz3IA1ZM<@ w;Pd%>@hGZ8wU4lnj6jL>NU|2~s`u0B6j))+KZJ2`HK+Vns#ol}8nVXz0ojw=N&o-= literal 822 zcmb7BJ8r`;3{}w!WbEd(@By+0=$?_YkD}bf88Yz_&H*}VEa0Ok@A1hWG)qFz1Vz0^ zKG8qt<7WyxB7WmLwC^K*MLo599k$r@*7YfziA>4AV_enO%tm9+lmPd^Y_QADaHO9U zdnABqG7`&K*fr5H`s5(?#4r6Vn~x66K7tF^Xi!@JjzmX&bouRim5WOXh);Taa-T{C zYbwlx&WQlW)0&>vA27fF-QgAZu^?F|QrM~|_5=O(w-P)v%Arbe^dm<&^i~s zXj(_K)ltv#zeFcEj9jXsNG%PLaI@_b@@6(fQG*cSo{1+#_@zH80;4S_%mw0!$D)F= b>DPM){u&fPRAkd7S7onAP|TXh!rPDzh%PQX6`O+)1Q~wxp%Ygee>R%H%sAj^KIfR zdFGEiA9&vLyh*%cP9#3@{+lMA^8(ZNe$>GX8?H?LDc)+eQmv@N_x6)9J*$&{eKquglTtw3QfNpk9_n zqY*(w<4jPw%|=6vcDo&h$BWl5{Ux)ekVZr0-d<$C-#z}m42Q#3s|7>l5+=fdD9q7l zh;^}8EEEdNNTpKY(6-x6+%h~KS%jc+S?%|G$K#RXMh=HPnHh$WOeRw=3G3`Jolb>4 zGt~g1a{K-M*$D1&v6yGGS!m20NTisl+hR1TRRw~i{Q_OsPz_v= z`Fu{gDwnO+>-BQE%w#ecaV)qI0(#(48!C`aX9|bu;1nKKi*CD9!vLsZnAp%^bRKAx z%Mwt~G%T2_t1F@w<;!QaLCq}NX{Tr{r|nZXKRvcir_FdWHPcbs(9t*|i^W3a0+m8K zmK8M=g@YbNq#5Oc>6LSqWzS}%!LVuBB`RZ>nbvJfI-;mtGD3)23il$H%RxVjE=r;4 z8O`9((nMOTMc=%O{R}7sl}nQ$Btox9!Hst2D@>--EovG{ZoOAgEm0 zMF>!O4&l(^Lc_@YQ200gmPm!W%H3atZMh?a`I`lw z(h)`FiVH4hEJ&8087XwA)P=&9Bqv>jqH^WuF0LF72kMBw_%+~KBWys4IQ_V#)KxD3 bi+lOnOa>J3wYOqjK$)L@kLA)|Q4&7@PPaZf literal 2430 zcmcJPdrVtZ9LF)?(E^3e;VSD05(6s4nI)zK=2%3?RIg34^i(=uS7ji_C(Ha=Mk8za+x%3avbUzSpB)qsKpyu@{KA}eZFS|@t*EYwyu^>>M}Q!eNGRMGK{WB`$neUO<$r5geqQXiF(BmS=1{l^ z@$sUnfWYJMk9v&X=xx0IMc))&se#uEmg9H6r!{)VGQF0Op*9r(?pVjC65TWySoQ z7H+)RU~g{^nuCJ_kH=f@SknYYXaWzK|3Ny9M(1#x{r&yPbf-f@N!G~leL%{~|(n*uwy@BJMDKy0465rpuoVX$;rx!iq_Uv3b&}R5NFoS%?*W%j*cc@0Xm*0J;;g-Z`G#cy)GvmvwRVX^z+bP^K`R|&0_q@D5L3t z!1FB{_ib}?3l@XPK5pxL#mDD#&_!9wQKpq6i9t1x0^MwAP$`vvbahdg#(5wYz)czf-SPx3;zbEtCC<5*r#CdV715@^M~cTn(}Q_#GSXBd#qKLfxWT_as)Q z>n$lQW82`^nECqpVwv!*TaA5vy_EGfH#IdkH?`<>qpr@y#RaQC;ZPG6i*3f(bIhF` zaLmco<*>5ugX}#1!9!lC49ohJ7(onnNsR2l!9fbQv!eqgZ)m_)HiSQ%lcOW(IIwh6 zroI&W7)(1$E4(yY>wOL(r_Ly96zkDywOXZWX>JB&NTZ=}`+9rfrrWpi3Bg3wRaMzp zS?9yUPoDJu@~hy0z^?;>LU~~qQd83bQYlsVmm&tn>*?+30bz7xgu=x<#1-Y`ICC)0 z4L-_E|5jRxp~{L%;xf6sw4`Kn6f3=t|G!2vF+NV=jy-rl+~41ypO=@VS58h&?have z+cT8m;n)}qO;1l#xKmS;o4$K@@TydrmX?+-7H9me^z`(M40x;7Z&BWlLL}TwEOLfFrdd kd}(fO4xH^=JX(Fau!GUj(Wj5EkF2e&ZRe6n{>RqfFA6k6X8-^I diff --git a/src/windows/identity/ui/main.c b/src/windows/identity/ui/main.c index 4f1aa7d5d..93055d97f 100644 --- a/src/windows/identity/ui/main.c +++ b/src/windows/identity/ui/main.c @@ -24,6 +24,7 @@ /* $Id$ */ +#include #include #if DEBUG @@ -33,6 +34,7 @@ HINSTANCE khm_hInstance; const wchar_t * khm_facility = L"NetIDMgr"; int khm_nCmdShow; +khm_ui_4 khm_commctl_version = 0; khm_startup_options khm_startup; @@ -123,12 +125,16 @@ void khm_register_window_classes(void) { ICC_BAR_CLASSES | ICC_DATE_CLASSES | ICC_HOTKEY_CLASS | + ICC_LISTVIEW_CLASSES | + ICC_TAB_CLASSES | #if (_WIN32_WINNT >= 0x501) - ICC_LINK_CLASS | - ICC_STANDARD_CLASSES | + ((IS_COMMCTL6())? + ICC_LINK_CLASS | + ICC_STANDARD_CLASSES : + 0) | #endif - ICC_LISTVIEW_CLASSES | - ICC_TAB_CLASSES; + 0; + InitCommonControlsEx(&ics); khm_register_main_wnd_class(); @@ -368,6 +374,27 @@ khm_module_load_ctx_handler(enum kherr_ctx_event evt, c->serial); } +static wchar_t helpfile[MAX_PATH] = L""; + +HWND khm_html_help(HWND hwnd, UINT command, DWORD_PTR data) { + if (!*helpfile) { + DWORD dw; + wchar_t ppath[MAX_PATH]; + + dw = GetModuleFileName(NULL, ppath, ARRAYLENGTH(ppath)); + + if (dw == 0) { + StringCbCopy(helpfile, sizeof(helpfile), NIDM_HELPFILE); + } else { + PathRemoveFileSpec(ppath); + PathAppend(ppath, NIDM_HELPFILE); + StringCbCopy(helpfile, sizeof(helpfile), ppath); + } + } + + return HtmlHelp(hwnd, helpfile, command, data); +} + void khm_load_default_modules(void) { kherr_context * c; @@ -418,6 +445,10 @@ int WINAPI WinMain(HINSTANCE hInstance, processes started by plugins. */ SetEnvironmentVariable(L"KERBEROSLOGIN_NEVER_PROMPT", L"1"); + khm_version_init(); + + khm_commctl_version = khm_get_commctl_version(NULL); + /* we only open a main window if this is the only instance of the application that is running. */ kmq_init(); diff --git a/src/windows/identity/ui/mainwnd.c b/src/windows/identity/ui/mainwnd.c index 5fbd1ec9b..8f55005b3 100644 --- a/src/windows/identity/ui/mainwnd.c +++ b/src/windows/identity/ui/mainwnd.c @@ -176,24 +176,25 @@ LRESULT CALLBACK khm_main_wnd_proc( break; case KHUI_ACTION_HELP_CTX: - HtmlHelp(khm_hwnd_main, NIDM_HELPFILE, - HH_HELP_CONTEXT, IDH_WELCOME); + khm_html_help(khm_hwnd_main, HH_HELP_CONTEXT, IDH_WELCOME); break; case KHUI_ACTION_HELP_CONTENTS: - HtmlHelp(khm_hwnd_main, NIDM_HELPFILE, - HH_DISPLAY_TOC, 0); + khm_html_help(khm_hwnd_main, HH_DISPLAY_TOC, 0); break; case KHUI_ACTION_HELP_INDEX: - HtmlHelp(khm_hwnd_main, NIDM_HELPFILE, - HH_DISPLAY_INDEX, (DWORD_PTR) L""); + khm_html_help(khm_hwnd_main, HH_DISPLAY_INDEX, (DWORD_PTR) L""); break; case KHUI_ACTION_HELP_ABOUT: khm_create_about_window(); break; + case KHUI_ACTION_IMPORT: + khm_cred_import(); + break; + case KHUI_ACTION_PROPERTIES: /* properties are not handled by the main window. Just bounce it to credwnd. However, use SendMessage diff --git a/src/windows/identity/ui/notifier.c b/src/windows/identity/ui/notifier.c index c795245b1..5d62be5fc 100644 --- a/src/windows/identity/ui/notifier.c +++ b/src/windows/identity/ui/notifier.c @@ -988,10 +988,11 @@ ATOM khm_register_alerter_wnd_class(void) wcx.cbSize = sizeof(wcx); wcx.style = + CS_OWNDC | #if(_WIN32_WINNT >= 0x0501) - CS_DROPSHADOW | + ((IS_COMMCTL6())? CS_DROPSHADOW: 0) | #endif - CS_OWNDC; + 0; wcx.lpfnWndProc = alerter_wnd_proc; wcx.cbClsExtra = 0; wcx.cbWndExtra = DLGWINDOWEXTRA + sizeof(LONG_PTR); diff --git a/src/windows/identity/ui/reqdaemon.c b/src/windows/identity/ui/reqdaemon.c index 620bdc54e..9c48eed43 100644 --- a/src/windows/identity/ui/reqdaemon.c +++ b/src/windows/identity/ui/reqdaemon.c @@ -293,8 +293,9 @@ DWORD WINAPI khm_reqdaemon_thread_proc(LPVOID vparam) { BOOL rv; MSG msg; +#ifdef DEBUG DWORD dw; - +#endif khm_register_reqdaemonwnd_class(); #ifdef DEBUG diff --git a/src/windows/identity/uilib/Makefile b/src/windows/identity/uilib/Makefile index 4e6560093..1920d6aa3 100644 --- a/src/windows/identity/uilib/Makefile +++ b/src/windows/identity/uilib/Makefile @@ -36,7 +36,8 @@ UIDLLOBJFILES= \ $(OBJ)\actiondef.obj \ $(OBJ)\acceldef.obj \ $(OBJ)\configui.obj \ - $(OBJ)\trackerwnd.obj + $(OBJ)\trackerwnd.obj \ + $(OBJ)\version.obj INCFILES= \ $(INCDIR)\khuidefs.h \ diff --git a/src/windows/identity/uilib/khuidefs.h b/src/windows/identity/uilib/khuidefs.h index 50214c373..67d8db33d 100644 --- a/src/windows/identity/uilib/khuidefs.h +++ b/src/windows/identity/uilib/khuidefs.h @@ -48,11 +48,47 @@ #include +/*! \internal */ +KHMEXP void KHMAPI +khm_version_init(void); + /*! \defgroup khui User Interface Functions and data structures for interacting with the user interface. -*/ +@{*/ + +/*! \brief Get the version of the NetIDMgr library + + \param[out] libver Receives the version of the library. + + \param[out] apiver Receives the API version of the library. + Optional. Set to NULL if this value is not required. + + \note When the NetIDMgr framework loads a plugin, it checks the + version information of the plugin against the version of the + library to determine if the plugin is compatible. + */ +KHMEXP void KHMAPI +khm_get_lib_version(khm_version * libver, khm_ui_4 * apiver); + +/*! \brief Return the version of Common Control library + + Can be used to check the version of the Windows Common Control + library that is currently loaded. The return value of the + function is the packed version value obatained by the macro : + + \code + MAKELONG(vesion->dwMinorVersion, version->dwMajorVersion); + \endcode + + The \a pdvi parameter is optional. Specify NULL if this is not + required. + */ +KHMEXP khm_ui_4 KHMAPI +khm_get_commctl_version(khm_version * pdvi); + +/*!@}*/ #endif diff --git a/src/windows/identity/uilib/version.c b/src/windows/identity/uilib/version.c new file mode 100644 index 000000000..cf7f702bf --- /dev/null +++ b/src/windows/identity/uilib/version.c @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +DLLVERSIONINFO ver_commctl; + +static void +get_dll_version(wchar_t * dllname, DLLVERSIONINFO * pdvi) { + HINSTANCE hdll; + + hdll = LoadLibrary(dllname); + + ZeroMemory(pdvi, sizeof(*pdvi)); + + if(hdll) { + DLLGETVERSIONPROC pDllGetVersion; + + pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hdll, "DllGetVersion"); + if(pDllGetVersion) { + pdvi->cbSize = sizeof(*pdvi); + + (*pDllGetVersion)(pdvi); + } + FreeLibrary(hdll); + } +} + +KHMEXP void KHMAPI +khm_version_init(void) { + get_dll_version(L"comctl32.dll", &ver_commctl); +} + +KHMEXP void KHMAPI +khm_get_lib_version(khm_version * libver, khm_ui_4 * apiver) { + if (!libver) + return; + + libver->major = KH_VERSION_MAJOR; + libver->minor = KH_VERSION_MINOR; + libver->patch = KH_VERSION_PATCH; + libver->aux = KH_VERSION_AUX; + + if (apiver) + *apiver = KH_VERSION_API; +} + +KHMEXP khm_ui_4 KHMAPI +khm_get_commctl_version(khm_version * pdvi) { + if (pdvi) { + pdvi->major = (khm_ui_2) ver_commctl.dwMajorVersion; + pdvi->minor = (khm_ui_2) ver_commctl.dwMinorVersion; + pdvi->patch = (khm_ui_2) ver_commctl.dwBuildNumber; + pdvi->aux = (khm_ui_2) ver_commctl.dwPlatformID; + } + + return MAKELONG(ver_commctl.dwMinorVersion, ver_commctl.dwMajorVersion); +} -- 2.26.2