Beispiel #1
0
krb5_error_code KRB5_LIB_FUNCTION
krb5_config_parse_file_multi (krb5_context context,
			      const char *fname,
			      krb5_config_section **res)
{
    const char *str;
    unsigned lineno = 0;
    krb5_error_code ret;
    struct fileptr f;
    f.f = fopen(fname, "r");
    f.s = NULL;
    if(f.f == NULL) {
	ret = errno;
	krb5_set_error_string (context, "open %s: %s", fname, strerror(ret));
	return ret;
    }

    ret = krb5_config_parse_debug (&f, res, &lineno, &str);
    fclose(f.f);
    if (ret) {
	krb5_set_error_string (context, "%s:%u: %s", fname, lineno, str);
	return ret;
    }
    return 0;
}
Beispiel #2
0
krb5_error_code KRB5_LIB_FUNCTION
krb5_config_parse_string_multi(krb5_context context,
			       const char *string,
			       krb5_config_section **res)
{
    const char *str;
    unsigned lineno = 0;
    krb5_error_code ret;
    struct fileptr f;
    f.f = NULL;
    f.s = string;

    ret = krb5_config_parse_debug (&f, res, &lineno, &str);
    if (ret) {
	krb5_set_error_string (context, "%s:%u: %s", "<constant>", lineno, str);
	return ret;
    }
    return 0;
}
Beispiel #3
0
krb5_error_code KRB5_LIB_FUNCTION
krb5_config_parse_file_multi (krb5_context context,
			      const char *fname,
			      krb5_config_section **res)
{
    const char *str;
    char *newfname = NULL;
    unsigned lineno = 0;
    krb5_error_code ret;
    struct fileptr f;

    /**
     * If the fname starts with "~/" parse configuration file in the
     * current users home directory. The behavior can be disabled and
     * enabled by calling krb5_set_home_dir_access().
     */
    if (_krb5_homedir_access(context) && fname[0] == '~' && fname[1] == '/') {
	const char *home = NULL;

	if(!issuid())
	    home = getenv("HOME");

	if (home == NULL) {
	    struct passwd *pw = getpwuid(getuid());	
	    if(pw != NULL)
		home = pw->pw_dir;
	}
	if (home) {
	    asprintf(&newfname, "%s%s", home, &fname[1]);
	    if (newfname == NULL) {
		krb5_set_error_message(context, ENOMEM,
				       N_("malloc: out of memory", ""));
		return ENOMEM;
	    }
	    fname = newfname;
	}
    }

    f.f = fopen(fname, "r");
    f.s = NULL;
    if(f.f == NULL) {
	ret = errno;
	krb5_set_error_message (context, ret, "open %s: %s",
				fname, strerror(ret));
	if (newfname)
	    free(newfname);
	return ret;
    }

    ret = krb5_config_parse_debug (&f, res, &lineno, &str);
    fclose(f.f);
    if (ret) {
	krb5_set_error_message (context, ret, "%s:%u: %s", fname, lineno, str);
	if (newfname)
	    free(newfname);
	return ret;
    }
    if (newfname)
	free(newfname);
    return 0;
}
Beispiel #4
0
KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_config_parse_file_multi (krb5_context context,
                              const char *fname,
                              krb5_config_section **res)
{
    const char *str;
    char *newfname = NULL;
    unsigned lineno = 0;
    krb5_error_code ret;
    struct fileptr f;

    /**
     * If the fname starts with "~/" parse configuration file in the
     * current users home directory. The behavior can be disabled and
     * enabled by calling krb5_set_home_dir_access().
     */
    if (fname[0] == '~' && fname[1] == '/') {
#ifndef KRB5_USE_PATH_TOKENS
        const char *home = NULL;

        if (!_krb5_homedir_access(context)) {
            krb5_set_error_message(context, EPERM,
                                   "Access to home directory not allowed");
            return EPERM;
        }

        if(!issuid())
            home = getenv("HOME");

        if (home == NULL) {
            struct passwd *pw = getpwuid(getuid());
            if(pw != NULL)
                home = pw->pw_dir;
        }
        if (home) {
            asprintf(&newfname, "%s%s", home, &fname[1]);
            if (newfname == NULL) {
                krb5_set_error_message(context, ENOMEM,
                                       N_("malloc: out of memory", ""));
                return ENOMEM;
            }
            fname = newfname;
        }
#else  /* KRB5_USE_PATH_TOKENS */
        if (asprintf(&newfname, "%%{USERCONFIG}%s", &fname[1]) < 0 ||
                newfname == NULL)
        {
            krb5_set_error_message(context, ENOMEM,
                                   N_("malloc: out of memory", ""));
            return ENOMEM;
        }
        fname = newfname;
#endif
    }

    if (is_plist_file(fname)) {
#ifdef __APPLE__
        ret = parse_plist_config(context, fname, res);
        if (ret) {
            krb5_set_error_message(context, ret,
                                   "Failed to parse plist %s", fname);
            if (newfname)
                free(newfname);
            return ret;
        }
#else
        krb5_set_error_message(context, ENOENT,
                               "no support for plist configuration files");
        return ENOENT;
#endif
    } else {
#ifdef KRB5_USE_PATH_TOKENS
        char * exp_fname = NULL;

        ret = _krb5_expand_path_tokens(context, fname, &exp_fname);
        if (ret) {
            if (newfname)
                free(newfname);
            return ret;
        }

        if (newfname)
            free(newfname);
        fname = newfname = exp_fname;
#endif

        f.f = fopen(fname, "r");
        f.s = NULL;
        if(f.f == NULL) {
            ret = errno;
            krb5_set_error_message (context, ret, "open %s: %s",
                                    fname, strerror(ret));
            if (newfname)
                free(newfname);
            return ret;
        }

        ret = krb5_config_parse_debug (&f, res, &lineno, &str);
        fclose(f.f);
        if (ret) {
            krb5_set_error_message (context, ret, "%s:%u: %s",
                                    fname, lineno, str);
            if (newfname)
                free(newfname);
            return ret;
        }
    }
    return 0;
}