static kim_error kim_os_selection_hints_get_dictionary_identity (CFDictionaryRef in_dictionary, kim_identity *out_identity) { kim_error err = KIM_NO_ERROR; CFStringRef identity_cfstr = NULL; kim_string identity_string = NULL; identity_cfstr = CFDictionaryGetValue (in_dictionary, KIM_IDENTITY_HINT); if (!identity_cfstr || CFGetTypeID (identity_cfstr) != CFStringGetTypeID ()) { kim_debug_printf ("%s: Malformed hints dictionary (invalid identity).", __FUNCTION__); err = check_error (KIM_PREFERENCES_READ_ERR); } if (!err) { err = kim_os_string_create_from_cfstring (&identity_string, identity_cfstr); } if (!err) { err = kim_identity_create_from_string (out_identity, identity_string); } kim_string_free (&identity_string); return check_error (err); }
kim_error kim_os_preferences_get_identity_for_key (kim_preference_key in_key, kim_identity in_hardcoded_default, kim_identity *out_identity) { kim_error err = KIM_NO_ERROR; kim_string string = NULL; CFStringRef value = NULL; if (!err && !out_identity) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { err = kim_os_preferences_copy_value (in_key, CFStringGetTypeID (), (CFPropertyListRef *) &value); } if (!err && !value) { err = kim_os_preferences_copy_value_compat (in_key, CFStringGetTypeID (), (CFPropertyListRef *) &value); } if (!err) { if (value) { err = kim_os_string_create_from_cfstring (&string, value); if (!err) { if (!strcmp (kim_os_preference_any_identity, string)) { *out_identity = KIM_IDENTITY_ANY; } else { err = kim_identity_create_from_string (out_identity, string); } } } else { err = kim_identity_copy (out_identity, in_hardcoded_default); } } kim_string_free (&string); if (value) { CFRelease (value); } return check_error (err); }
kim_error kim_ui_cli_enter_identity (kim_ui_context *in_context, kim_options io_options, kim_identity *out_identity, kim_boolean *out_change_password) { kim_error err = KIM_NO_ERROR; kim_string enter_identity_string = NULL; kim_string identity_string = NULL; if (!err && !io_options ) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err && !out_identity ) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err && !out_change_password) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { err = kim_os_string_create_localized (&enter_identity_string, "Please enter your Kerberos identity"); } if (!err) { err = kim_ui_cli_read_string (&identity_string, 0, enter_identity_string); } if (!err) { err = kim_identity_create_from_string (out_identity, identity_string); } if (!err) { *out_change_password = 0; } kim_string_free (&identity_string); kim_string_free (&enter_identity_string); return check_error (err); }
static int destroy_tickets (void) { krb5_error_code err = 0; if (cache_name) { kim_ccache ccache = NULL; err = kim_ccache_create_from_display_name (&ccache, cache_name); printiferr (err, "while locating credentials cache '%s'", cache_name); if (!err) { err = kim_ccache_destroy (&ccache); printiferr (err, "while destroying credentials cache '%s'", cache_name); } } else if (all) { /* Destroy all ticket caches */ kim_ccache_iterator iterator = NULL; err = kim_ccache_iterator_create (&iterator); while (!err) { kim_ccache ccache = NULL; err = kim_ccache_iterator_next (iterator, &ccache); if (!err) { if (ccache) { err = kim_ccache_destroy (&ccache); } else { break; /* no more ccaches */ } } } kim_ccache_iterator_free (&iterator); } else { /* Destroy the tickets by the principal or the default tickets */ kim_identity identity = KIM_IDENTITY_ANY; kim_ccache ccache = NULL; if (principal_name) { err = kim_identity_create_from_string (&identity, principal_name); printiferr (err, "while creating identity for '%s'", principal_name); } if (!err) { kim_ccache_create_from_client_identity (&ccache, identity); if (identity) { printiferr (err, "while getting ccache for '%s'", principal_name); } else { printiferr (err, "while getting default ccache"); } } if (!err) { err = kim_ccache_destroy (&ccache); printiferr (err, "while destroying tickets"); } kim_identity_free (&identity); } return err ? 1 : 0; }
kim_error kim_os_preferences_get_favorites_for_key (kim_preference_key in_key, kim_favorites io_favorites) { kim_error err = KIM_NO_ERROR; CFArrayRef value = NULL; if (!err && !io_favorites) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { err = kim_os_preferences_copy_value (in_key, CFArrayGetTypeID (), (CFPropertyListRef *) &value); } if (!err && value) { if (!value || CFArrayGetCount (value) < 1) { err = kim_favorites_remove_all_identities (io_favorites); } else { CFIndex count = CFArrayGetCount (value); CFIndex i; for (i = 0; !err && i < count; i++) { CFDictionaryRef dictionary = NULL; CFStringRef cfstring = NULL; dictionary = (CFDictionaryRef) CFArrayGetValueAtIndex (value, i); if (!dictionary || CFGetTypeID (dictionary) != CFDictionaryGetTypeID ()) { err = check_error (KIM_PREFERENCES_READ_ERR); } if (!err) { err = kim_os_preferences_copy_value_for_dict_key (dictionary, kim_preference_key_client_identity, CFStringGetTypeID (), (CFPropertyListRef *) &cfstring); } if (!err && cfstring) { kim_string string = NULL; kim_identity identity = NULL; kim_options options = KIM_OPTIONS_DEFAULT; err = kim_os_string_create_from_cfstring (&string, cfstring); if (!err) { err = kim_identity_create_from_string (&identity, string); } if (!err && (CFDictionaryGetCount (dictionary) > 1)) { err = kim_os_preferences_dictionary_to_options (dictionary, &options); } if (!err) { err = kim_favorites_add_identity (io_favorites, identity, options); } kim_string_free (&string); kim_options_free (&options); kim_identity_free (&identity); } } if (err) { kim_favorites_remove_all_identities (io_favorites); } } } if (value) { CFRelease (value); } return check_error (err); }