kim_error kim_options_create (kim_options *out_options) { kim_error err = KIM_NO_ERROR; kim_preferences preferences = NULL; kim_options options = KIM_OPTIONS_DEFAULT; if (!err && !out_options) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { err = kim_preferences_create (&preferences); } if (!err) { err = kim_preferences_get_options (preferences, &options); } if (!err && !options) { err = kim_options_allocate (&options); } if (!err) { *out_options = options; options = NULL; /* caller takes ownership */ } kim_options_free (&options); kim_preferences_free (&preferences); return check_error (err); }
kim_error kim_ui_cli_select_identity (kim_ui_context *in_context, kim_selection_hints io_hints, kim_identity *out_identity, kim_boolean *out_change_password) { kim_error err = KIM_NO_ERROR; kim_options options = NULL; if (!err && !io_hints ) { 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_selection_hints_get_options (io_hints, &options); } if (!err) { err = kim_ui_cli_enter_identity (in_context, options, out_identity, out_change_password); } if (!err) { err = kim_selection_hints_set_options (io_hints, options); } kim_options_free (&options); return check_error (err); }
kim_error kim_options_create_from_stream (kim_options *out_options, k5_ipc_stream io_stream) { kim_error err = KIM_NO_ERROR; kim_options options = NULL; if (!err && !out_options) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err && !io_stream ) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { err = kim_options_allocate (&options); } if (!err) { kim_options_read_from_stream (options, io_stream); } if (!err) { *out_options = options; options = NULL; } kim_options_free (&options); return check_error (err); }
kim_error kim_options_write_to_stream (kim_options in_options, k5_ipc_stream io_stream) { kim_error err = KIM_NO_ERROR; kim_options options = in_options; if (!err && !io_stream ) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err && !in_options) { err = kim_options_create (&options); } if (!err) { err = k5_ipc_stream_write_int64 (io_stream, options->start_time); } if (!err) { err = k5_ipc_stream_write_int64 (io_stream, options->lifetime); } if (!err) { err = k5_ipc_stream_write_int32 (io_stream, options->renewable); } if (!err) { err = k5_ipc_stream_write_int64 (io_stream, options->renewal_lifetime); } if (!err) { err = k5_ipc_stream_write_int32 (io_stream, options->forwardable); } if (!err) { err = k5_ipc_stream_write_int32 (io_stream, options->proxiable); } if (!err) { err = k5_ipc_stream_write_int32 (io_stream, options->addressless); } if (!err) { err = k5_ipc_stream_write_string (io_stream, options->service_name); } if (options != in_options) { kim_options_free (&options); } return check_error (err); }
static inline kim_error kim_options_allocate (kim_options *out_options) { kim_error err = kim_library_init (); kim_options options = NULL; if (!err && !out_options) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { options = malloc (sizeof (*options)); if (!options) { err = KIM_OUT_OF_MEMORY_ERR; } } if (!err) { *options = kim_options_initializer; *out_options = options; options = NULL; } kim_options_free (&options); return check_error (err); }
kim_error kim_options_copy (kim_options *out_options, kim_options in_options) { kim_error err = KIM_NO_ERROR; kim_options options = KIM_OPTIONS_DEFAULT; if (!err && !out_options) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err && in_options != KIM_OPTIONS_DEFAULT) { err = kim_options_allocate (&options); if (!err) { options->start_time = in_options->start_time; options->lifetime = in_options->lifetime; options->renewable = in_options->renewable; options->renewal_lifetime = in_options->renewal_lifetime; options->forwardable = in_options->forwardable; options->proxiable = in_options->proxiable; options->addressless = in_options->addressless; if (in_options->service_name) { err = kim_string_copy (&options->service_name, in_options->service_name); } } } if (!err) { *out_options = options; options = NULL; } kim_options_free (&options); return check_error (err); }
/* ------------------------------------------------------------------------ */ kim_error kim_os_preferences_set_favorites_for_key (kim_preference_key in_key, kim_favorites in_favorites) { kim_error err = KIM_NO_ERROR; kim_count count = 0; CFMutableArrayRef array = NULL; if (!err && !in_favorites) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { err = kim_favorites_get_number_of_identities (in_favorites, &count); } if (!err) { array = CFArrayCreateMutable (kCFAllocatorDefault, count, &kCFTypeArrayCallBacks); if (!array) { err = KIM_OUT_OF_MEMORY_ERR; } } if (!err) { kim_count i; for (i = 0; !err && i < count; i++) { kim_identity identity = NULL; kim_options options = NULL; kim_string string = NULL; CFStringRef cfstring = NULL; CFMutableDictionaryRef dictionary = NULL; err = kim_favorites_get_identity_at_index (in_favorites, i, &identity, &options); if (!err) { err = kim_identity_get_string (identity, &string); } if (!err) { err = kim_os_string_get_cfstring (string, &cfstring); } if (!err) { dictionary = CFDictionaryCreateMutable (kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); if (!dictionary) { err = check_error (KIM_OUT_OF_MEMORY_ERR); } } if (!err) { err = kim_os_preferences_set_value_for_dict_key (dictionary, kim_preference_key_client_identity, cfstring); } if (!err && options) { err = kim_os_preferences_options_to_dictionary (options, dictionary); } if (!err) { CFArrayAppendValue (array, dictionary); } if (dictionary) { CFRelease (dictionary); } if (cfstring ) { CFRelease (cfstring); } kim_string_free (&string); kim_options_free (&options); kim_identity_free (&identity); } } if (!err) { err = kim_os_preferences_set_value (in_key, array); } if (array) { CFRelease (array); } return check_error (err); }
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); }
static kim_error kim_os_preferences_get_options_compat (kim_options *out_options) { kim_error err = KIM_NO_ERROR; kim_options options = KIM_OPTIONS_DEFAULT; kim_boolean found_options = 0; if (!err && !out_options) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { err = kim_options_create_empty (&options); } if (!err) { CFNumberRef value = NULL; SInt32 lifetime; // CFNumbers are signed so we need to cast err = kim_os_preferences_copy_value_compat (kim_preference_key_lifetime, CFNumberGetTypeID (), (CFPropertyListRef *) &value); if (!err && value && CFNumberGetValue (value, kCFNumberSInt32Type, &lifetime)) { found_options = 1; err = kim_options_set_lifetime (options, lifetime); } if (value) { CFRelease (value); } } if (!err) { CFBooleanRef value = NULL; err = kim_os_preferences_copy_value_compat (kim_preference_key_renewable, CFBooleanGetTypeID (), (CFPropertyListRef *) &value); if (!err && value) { found_options = 1; err = kim_options_set_renewable (options, CFBooleanGetValue (value)); } if (value) { CFRelease (value); } } if (!err) { CFNumberRef value = NULL; SInt32 lifetime; // CFNumbers are signed so we need to cast err = kim_os_preferences_copy_value_compat (kim_preference_key_renewal_lifetime, CFNumberGetTypeID (), (CFPropertyListRef *) &value); if (!err && value && CFNumberGetValue (value, kCFNumberSInt32Type, &lifetime)) { found_options = 1; err = kim_options_set_renewal_lifetime (options, lifetime); } if (value) { CFRelease (value); } } if (!err) { CFBooleanRef value = NULL; err = kim_os_preferences_copy_value_compat (kim_preference_key_forwardable, CFBooleanGetTypeID (), (CFPropertyListRef *) &value); if (!err && value) { found_options = 1; err = kim_options_set_forwardable (options, CFBooleanGetValue (value)); } if (value) { CFRelease (value); } } if (!err) { CFBooleanRef value = NULL; err = kim_os_preferences_copy_value_compat (kim_preference_key_proxiable, CFBooleanGetTypeID (), (CFPropertyListRef *) &value); if (!err && value) { found_options = 1; err = kim_options_set_proxiable (options, CFBooleanGetValue (value)); } if (value) { CFRelease (value); } } if (!err) { CFBooleanRef value = NULL; err = kim_os_preferences_copy_value_compat (kim_preference_key_addressless, CFBooleanGetTypeID (), (CFPropertyListRef *) &value); if (!err && value) { found_options = 1; err = kim_options_set_addressless (options, CFBooleanGetValue (value)); } if (value) { CFRelease (value); } } if (!err && !found_options) { kim_options_free (&options); options = KIM_OPTIONS_DEFAULT; } if (!err) { *out_options = options; } return check_error (err); }