From d0587cbdd5bc5e07a6e8519deb07adaace643740 Mon Sep 17 00:00:00 2001 From: Rob Crittenden Date: Mon, 14 Sep 2009 17:04:08 -0400 Subject: Enrollment for a host in an IPA domain This will create a host service principal and may create a host entry (for admins). A keytab will be generated, by default in /etc/krb5.keytab If no kerberos credentails are available then enrollment over LDAPS is used if a password is provided. This change requires that openldap be used as our C LDAP client. It is much easier to do SSL using openldap than mozldap (no certdb required). Otherwise we'd have to write a slew of extra code to create a temporary cert database, import the CA cert, ... --- ipa-client/config.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 ipa-client/config.c (limited to 'ipa-client/config.c') diff --git a/ipa-client/config.c b/ipa-client/config.c new file mode 100644 index 000000000..81cb793db --- /dev/null +++ b/ipa-client/config.c @@ -0,0 +1,155 @@ +/* Authors: Rob Crittenden + * + * Copyright (C) 2009 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; version 2 only + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Simple and INI-style file reader. + * + * usage is: + * char * data = read_config_file("/path/to/something.conf") + * char * entry = get_config_entry(data, "section", "mykey") + * + * caller must free data and entry. + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include + +char * +read_config_file(const char *filename) +{ + int fd; + struct stat st; + char *data, *dest; + size_t left; + + fd = open(filename, O_RDONLY); + if (fd == -1) { + fprintf(stderr, "cannot open configuration file %s\n", filename); + return NULL; + } + + /* stat() the file so we know the size and can pre-allocate the right + * amount of memory. */ + if (fstat(fd, &st) == -1) { + fprintf(stderr, "cannot stat() configuration file %s\n", filename); + return NULL; + } + left = st.st_size; + data = malloc(st.st_size + 1); + dest = data; + while (left != 0) { + ssize_t res; + + res = read(fd, dest, left); + if (res == 0) + break; + if (res < 0) { + fprintf(stderr, "read error\n"); + close(fd); + free(dest); + return NULL; + } + dest += res; + left -= res; + } + close(fd); + *dest = 0; + return data; +} + +char * +get_config_entry(char * in_data, const char *section, const char *key) +{ + char *ptr, *p, *tmp; + char *line; + int in_section = 0; + char * data = strdup(in_data); + + for (line = strtok_r(data, "\n", &ptr); line != NULL; + line = strtok_r(NULL, "\n", &ptr)) { + /* Skip initial whitespace. */ + while (isspace((unsigned char)*line) && (*line != '\0')) + line++; + + /* If it's a comment, bail. */ + if (*line == '#') { + continue; + } + + /* If it's the beginning of a section, process it and clear the key + * and value values. */ + if (*line == '[') { + line++; + p = strchr(line, ']'); + if (p) { + tmp = strndup(line, p - line); + if (in_section) { + /* We exited the matching section without a match */ + free(data); + return NULL; + } + if (strcmp(section, tmp) == 0) { + free(tmp); + in_section = 1; + continue; + } + } + } /* [ */ + + p = strchr(line, '='); + if (p != NULL && in_section) { + /* Trim any trailing whitespace off the key name. */ + while (p != line && isspace((unsigned char)p[-1])) + p--; + + /* Save the key. */ + tmp = strndup(line, p - line); + if (strcmp(key, tmp) != 0) { + free(tmp); + } else { + free(tmp); + + /* Skip over any whitespace after the equal sign. */ + line = strchr(line, '='); + line++; + while (isspace((unsigned char)*line) && (*line != '\0')) + line++; + + /* Trim off any trailing whitespace. */ + p = strchr(line, '\0'); + while (p != line && isspace((unsigned char)p[-1])) + p--; + + /* Save the value. */ + tmp = strndup(line, p - line); + + free(data); + return tmp; + } + } + } + return NULL; +} -- cgit