static kim_error kim_os_preferences_set_value (kim_preference_key in_key, CFPropertyListRef in_value) { kim_error err = KIM_NO_ERROR; CFStringRef key = NULL; /* in_value may be NULL if removing the key */ if (!err) { key = kim_os_preferences_cfstring_for_key (in_key); } if (!err && key) { kim_boolean homedir_ok = kim_library_allow_home_directory_access(); CFStringRef user = homedir_ok ? kCFPreferencesCurrentUser : kCFPreferencesAnyUser; CFStringRef host = homedir_ok ? kCFPreferencesAnyHost : kCFPreferencesCurrentHost; CFPreferencesSetValue (key, in_value, KIM_PREFERENCES_FILE, user, host); if (!CFPreferencesSynchronize (KIM_PREFERENCES_FILE, user, host)) { err = check_error (KIM_PREFERENCES_WRITE_ERR); } } return check_error (err); }
kim_error kim_os_string_create_localized (kim_string *out_string, kim_string in_string) { kim_error lock_err = kim_os_library_lock_for_bundle_lookup (); kim_error err = lock_err; kim_string string = NULL; CFStringRef cfkey = NULL; if (!err && !out_string) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err && !in_string ) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { err = kim_os_string_get_cfstring (in_string, &cfkey); } if (!err && kim_library_allow_home_directory_access ()) { CFStringRef cfstring = NULL; CFBundleRef framework = CFBundleGetBundleWithIdentifier (CFSTR ("edu.mit.Kerberos")); CFBundleRef main_bundle = CFBundleGetMainBundle (); if (framework) { cfstring = CFCopyLocalizedStringFromTableInBundle (cfkey, CFSTR ("InfoPlist"), framework, ""); } if (main_bundle && !cfstring) { cfstring = CFCopyLocalizedStringFromTableInBundle (cfkey, CFSTR ("InfoPlist"), main_bundle, ""); } if (!err && cfstring) { err = kim_os_string_create_from_cfstring (&string, cfstring); } if (cfstring) { CFRelease (cfstring); } } if (!err && !string) { err = kim_string_copy (&string, in_string); } if (!err) { *out_string = string; string = NULL; } if (cfkey) { CFRelease (cfkey); } kim_string_free (&string); if (!lock_err) { kim_os_library_unlock_for_bundle_lookup (); } return check_error (err); }
static kim_error kim_os_preferences_copy_value_for_file (CFStringRef in_key, CFTypeID in_type, CFStringRef in_file, CFPropertyListRef *out_value) { kim_error err = KIM_NO_ERROR; CFPropertyListRef value = NULL; CFStringRef users[] = { kCFPreferencesCurrentUser, kCFPreferencesAnyUser, NULL }; CFStringRef hosts[] = { kCFPreferencesCurrentHost, kCFPreferencesAnyHost, NULL }; if (!err && !in_key ) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err && !in_file ) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err && !out_value) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { kim_count u, h; if (!kim_library_allow_home_directory_access()) { users[0] = kCFPreferencesAnyUser; users[1] = NULL; } for (u = 0; !value && users[u]; u++) { for (h = 0; !value && hosts[h]; h++) { value = CFPreferencesCopyValue (in_key, in_file, users[u], hosts[h]); } } if (value && CFGetTypeID (value) != in_type) { err = check_error (KIM_PREFERENCES_READ_ERR); } } if (!err) { *out_value = value; value = NULL; } if (value) { CFRelease (value); } return check_error (err); }
static kim_error kim_os_selection_hints_set_selection_hints_array (CFArrayRef in_selection_hints_array) { kim_error err = KIM_NO_ERROR; if (!err && !in_selection_hints_array) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { kim_boolean homedir_ok = kim_library_allow_home_directory_access(); CFStringRef user = homedir_ok ? kCFPreferencesCurrentUser : kCFPreferencesAnyUser; CFStringRef host = homedir_ok ? kCFPreferencesAnyHost : kCFPreferencesCurrentHost; CFPreferencesSetValue (KIM_SELECTION_HINTS_ARRAY, in_selection_hints_array, KIM_SELECTION_HINTS_FILE, user, host); if (!CFPreferencesSynchronize (KIM_SELECTION_HINTS_FILE, user, host)) { err = check_error (KIM_PREFERENCES_WRITE_ERR); } } return check_error (err); }
static kim_error kim_os_selection_hints_get_selection_hints_array (CFArrayRef *out_selection_hints_array) { kim_error err = KIM_NO_ERROR; CFPropertyListRef value = NULL; CFStringRef users[] = { kCFPreferencesCurrentUser, kCFPreferencesAnyUser, NULL }; CFStringRef hosts[] = { kCFPreferencesCurrentHost, kCFPreferencesAnyHost, NULL }; if (!err && !out_selection_hints_array) { err = check_error (KIM_NULL_PARAMETER_ERR); } if (!err) { kim_count u, h; if (!kim_library_allow_home_directory_access()) { users[0] = kCFPreferencesAnyUser; users[1] = NULL; } for (u = 0; !value && users[u]; u++) { for (h = 0; !value && hosts[h]; h++) { value = CFPreferencesCopyValue (KIM_SELECTION_HINTS_ARRAY, KIM_SELECTION_HINTS_FILE, users[u], hosts[h]); } } if (value && CFGetTypeID (value) != CFArrayGetTypeID ()) { err = check_error (KIM_PREFERENCES_READ_ERR); } } if (!err) { *out_selection_hints_array = value; value = NULL; } if (value) { CFRelease (value); } return check_error (err); }
/* This function is needed by KfM's KerberosPreferences API * because it needs to be able to specify "secure" */ krb5_error_code os_get_default_config_files(profile_filespec_t **pfiles, krb5_boolean secure) { profile_filespec_t* files; #if defined(_WIN32) krb5_error_code retval = 0; char *name = 0; if (!secure) { char *env = getenv("KRB5_CONFIG"); if (env) { name = strdup(env); if (!name) return ENOMEM; } } if (!name && !secure) { /* HKCU */ retval = get_from_registry(&name, HKEY_CURRENT_USER); if (retval) return retval; } if (!name) { /* HKLM */ retval = get_from_registry(&name, HKEY_LOCAL_MACHINE); if (retval) return retval; } if (!name && !secure) { /* module dir */ retval = get_from_module_dir(&name); if (retval) return retval; } if (!name) { /* windows dir */ retval = get_from_windows_dir(&name); } if (retval) return retval; if (!name) return KRB5_CONFIG_CANTOPEN; /* should never happen */ files = malloc(2 * sizeof(char *)); if (!files) return ENOMEM; files[0] = name; files[1] = 0; #else /* !_WIN32 */ char* filepath = 0; int n_entries, i; unsigned int ent_len; const char *s, *t; #ifdef USE_KIM /* If kim_library_allow_home_directory_access() == FALSE, we are probably * trying to authenticate to a fileserver for the user's homedir. */ if (!kim_library_allow_home_directory_access ()) secure = 1; #endif if (secure) { filepath = DEFAULT_SECURE_PROFILE_PATH; } else { filepath = getenv("KRB5_CONFIG"); if (!filepath) filepath = DEFAULT_PROFILE_PATH; } /* count the distinct filename components */ for(s = filepath, n_entries = 1; *s; s++) { if (*s == ':') n_entries++; } /* the array is NULL terminated */ files = (char**) malloc((n_entries+1) * sizeof(char*)); if (files == 0) return ENOMEM; /* measure, copy, and skip each one */ for(s = filepath, i=0; (t = strchr(s, ':')) || (t=s+strlen(s)); s=t+1, i++) { ent_len = t-s; files[i] = (char*) malloc(ent_len + 1); if (files[i] == 0) { /* if malloc fails, free the ones that worked */ while(--i >= 0) free(files[i]); free(files); return ENOMEM; } strncpy(files[i], s, ent_len); files[i][ent_len] = 0; if (*t == 0) { i++; break; } } /* cap the array */ files[i] = 0; #endif /* !_WIN32 */ *pfiles = (profile_filespec_t *)files; return 0; }