159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * COPYRIGHT (C) 2006,2007
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * THE REGENTS OF THE UNIVERSITY OF MICHIGAN
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * ALL RIGHTS RESERVED
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * Permission is granted to use, copy, create derivative works
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * and redistribute this software and such derivative works
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * for any purpose, so long as the name of The University of
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * Michigan is not used in any advertising or publicity
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * pertaining to the use of distribution of this software
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * without specific, written prior authorization. If the
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * above copyright notice or any other identification of the
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * University of Michigan is included in any copy of any
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * portion of this software, then the disclaimer below must
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * also be included.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * FROM THE UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * PURPOSE, AND WITHOUT WARRANTY BY THE UNIVERSITY OF
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * MICHIGAN OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * WITHOUT LIMITATION THE IMPLIED WARRANTIES OF
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * FOR ANY DAMAGES, INCLUDING SPECIAL, INDIRECT, INCIDENTAL, OR
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM ARISING
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * SUCH DAMAGES.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#include <stdio.h>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#include <stdlib.h>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#include <errno.h>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#include <string.h>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#include "k5-int.h"
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#include "pkinit.h"
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * Routines for handling profile [config file] options
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/* Forward prototypes */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic int _krb5_conf_boolean(const char *s);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * XXX
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * The following is duplicated verbatim from src/lib/krb5/krb/get_in_tkt.c,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * which is duplicated from somewhere else. :-/
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * XXX
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic const char *const conf_yes[] = {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan "y", "yes", "true", "t", "1", "on",
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan 0,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan};
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic const char *const conf_no[] = {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan "n", "no", "false", "nil", "0", "off",
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan 0,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan};
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstatic int
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan_krb5_conf_boolean(const char *s)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *const *p;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan for(p=conf_yes; *p; p++) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (strcasecmp(*p,s) == 0)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return 1;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan for(p=conf_no; *p; p++) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (strcasecmp(*p,s) == 0)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /* Default to "no" */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * XXX
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * End duplicated code from src/lib/krb5/krb/get_in_tkt.c
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * XXX
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * The following are based on krb5_libdefault_* functions in
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * src/lib/krb5/krb/get_in_tkt.c
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * N.B. This assumes that context->default_realm has
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * already been established.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_error_code
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanpkinit_kdcdefault_strings(krb5_context context, const char *realmname,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *option, char ***ret_value)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan profile_t profile = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *names[5];
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char **values = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (context == NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return KV5M_CONTEXT;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan profile = context->profile;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (realmname != NULL) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * Try number one:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * [realms]
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * REALM = {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * option = <value>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[0] = "realms";
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[1] = realmname;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[2] = option;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[3] = 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = profile_get_values(profile, names, &values);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval == 0 && values != NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan goto goodbye;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * Try number two:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * [kdcdefaults]
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * option = <value>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[0] = "kdcdefaults";
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[1] = option;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[2] = 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = profile_get_values(profile, names, &values);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval == 0 && values != NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan goto goodbye;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalangoodbye:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (values == NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = ENOENT;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = values;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_error_code
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanpkinit_kdcdefault_string(krb5_context context, const char *realmname,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *option, char **ret_value)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char **values = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = pkinit_kdcdefault_strings(context, realmname, option, &values);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (values[0] == NULL) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = ENOENT;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan } else {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = malloc(strlen(values[0]) + 1);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /* Solaris Kerberos */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (*ret_value == NULL) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan pkiDebug(error_message(ENOMEM));
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = ENOMEM;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan else /* Solaris Kerberos */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan (void) strlcpy(*ret_value, values[0], strlen(values[0]) + 1);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan profile_free_list(values);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_error_code
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanpkinit_kdcdefault_boolean(krb5_context context, const char *realmname,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *option, int default_value, int *ret_value)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char *string = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = pkinit_kdcdefault_string(context, realmname, option, &string);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval == 0) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = _krb5_conf_boolean(string);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan free(string);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan } else
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = default_value;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_error_code
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanpkinit_kdcdefault_integer(krb5_context context, const char *realmname,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *option, int default_value, int *ret_value)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char *string = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = pkinit_kdcdefault_string(context, realmname, option, &string);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval == 0) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char *endptr;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan long l;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan l = strtol(string, &endptr, 0);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (endptr == string)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = default_value;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan else
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = l;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan free(string);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan } else
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = default_value;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * krb5_libdefault_string() is defined as static in
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * src/lib/krb5/krb/get_in_tkt.c. Create local versions of
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * krb5_libdefault_* functions here. We need a libdefaults_strings()
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * function which is not currently supported there anyway. Also,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * add the ability to supply a default value for the boolean and
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * integer functions.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_error_code
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanpkinit_libdefault_strings(krb5_context context, const krb5_data *realm,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *option, char ***ret_value)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan profile_t profile;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *names[5];
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char **values = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char realmstr[1024];
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (realm != NULL && realm->length > sizeof(realmstr)-1)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return EINVAL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (realm != NULL) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /* Solaris Kerberos */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan (void) strlcpy(realmstr, realm->data, realm->length + 1);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan realmstr[realm->length] = '\0';
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (!context || (context->magic != KV5M_CONTEXT))
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return KV5M_CONTEXT;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan profile = context->profile;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (realm != NULL) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * Try number one:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * [libdefaults]
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * REALM = {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * option = <value>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[0] = "libdefaults";
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[1] = realmstr;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[2] = option;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[3] = 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = profile_get_values(profile, names, &values);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval == 0 && values != NULL && values[0] != NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan goto goodbye;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * Try number two:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * [realms]
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * REALM = {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * option = <value>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[0] = "realms";
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[1] = realmstr;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[2] = option;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[3] = 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = profile_get_values(profile, names, &values);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval == 0 && values != NULL && values[0] != NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan goto goodbye;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * Try number three:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * [libdefaults]
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * option = <value>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[0] = "libdefaults";
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[1] = option;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan names[2] = 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = profile_get_values(profile, names, &values);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval == 0 && values != NULL && values[0] != NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan goto goodbye;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalangoodbye:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (values == NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return ENOENT;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = values;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_error_code
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanpkinit_libdefault_string(krb5_context context, const krb5_data *realm,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *option, char **ret_value)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char **values = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = pkinit_libdefault_strings(context, realm, option, &values);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (values[0] == NULL) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = ENOENT;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan } else {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = malloc(strlen(values[0]) + 1);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (*ret_value == NULL)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = ENOMEM;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan else /* Solaris Kerberos */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan (void) strlcpy(*ret_value, values[0], strlen(values[0]) + 1);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan profile_free_list(values);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_error_code
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanpkinit_libdefault_boolean(krb5_context context, const krb5_data *realm,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *option, int default_value,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan int *ret_value)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char *string = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = pkinit_libdefault_string(context, realm, option, &string);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval == 0) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = _krb5_conf_boolean(string);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan free(string);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan } else
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = default_value;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return 0;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalankrb5_error_code
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanpkinit_libdefault_integer(krb5_context context, const krb5_data *realm,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *option, int default_value,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan int *ret_value)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan{
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char *string = NULL;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan krb5_error_code retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan retval = pkinit_libdefault_string(context, realm, option, &string);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (retval == 0) {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char *endptr;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan long l;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan l = strtol(string, &endptr, 0);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan if (endptr == string)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = default_value;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan else
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *ret_value = l;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan free(string);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan }
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan return retval;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}