From 29be7d76c949b82350c7603cfd362a1fcb47eb1b Mon Sep 17 00:00:00 2001 From: Jan Zeleny Date: Wed, 14 Mar 2012 06:09:03 -0400 Subject: Moved expand_homedir_template() from NSS responder to utility code --- Makefile.am | 2 + src/responder/nss/nsssrv_cmd.c | 109 +-------------------------------- src/util/sss_nss.c | 136 +++++++++++++++++++++++++++++++++++++++++ src/util/sss_nss.h | 31 ++++++++++ 4 files changed, 170 insertions(+), 108 deletions(-) create mode 100644 src/util/sss_nss.c create mode 100644 src/util/sss_nss.h diff --git a/Makefile.am b/Makefile.am index 67149635..00f466c6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -322,6 +322,7 @@ dist_noinst_HEADERS = \ src/util/dlinklist.h \ src/util/util.h \ src/util/strtonum.h \ + src/util/sss_nss.h \ src/util/sss_ldap.h \ src/util/sss_python.h \ src/util/sss_krb5.h \ @@ -458,6 +459,7 @@ libsss_util_la_SOURCES = \ src/util/strtonum.c \ src/util/check_and_open.c \ src/util/refcount.c \ + src/util/sss_nss.c \ src/util/sss_utf8.c \ src/util/sss_tc_utf8.c \ src/util/murmurhash3.c \ diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c index da3fa6fd..1c94ff78 100644 --- a/src/responder/nss/nsssrv_cmd.c +++ b/src/responder/nss/nsssrv_cmd.c @@ -20,6 +20,7 @@ */ #include "util/util.h" +#include "util/sss_nss.h" #include "responder/nss/nsssrv.h" #include "responder/nss/nsssrv_private.h" #include "responder/nss/nsssrv_netgroup.h" @@ -105,114 +106,6 @@ struct setent_ctx { /**************************************************************************** * PASSWD db related functions ***************************************************************************/ -char *expand_homedir_template(TALLOC_CTX *mem_ctx, const char *template, - const char *username, uint32_t uid, - const char *domain) -{ - char *copy; - char *p; - char *n; - char *result = NULL; - char *res = NULL; - TALLOC_CTX *tmp_ctx = NULL; - - if (template == NULL) { - DEBUG(1, ("Missing template.\n")); - return NULL; - } - - tmp_ctx = talloc_new(NULL); - if (!tmp_ctx) return NULL; - - copy = talloc_strdup(tmp_ctx, template); - if (copy == NULL) { - DEBUG(1, ("talloc_strdup failed.\n")); - goto done; - } - - result = talloc_strdup(tmp_ctx, ""); - if (result == NULL) { - DEBUG(1, ("talloc_strdup failed.\n")); - goto done; - } - - p = copy; - while ( (n = strchr(p, '%')) != NULL) { - *n = '\0'; - n++; - if ( *n == '\0' ) { - DEBUG(1, ("format error, single %% at the end of the template.\n")); - goto done; - } - switch( *n ) { - case 'u': - if (username == NULL) { - DEBUG(1, ("Cannot expand user name template " - "because user name is empty.\n")); - goto done; - } - result = talloc_asprintf_append(result, "%s%s", p, - username); - break; - - case 'U': - if (uid == 0) { - DEBUG(1, ("Cannot expand uid template " - "because uid is invalid.\n")); - goto done; - } - result = talloc_asprintf_append(result, "%s%d", p, - uid); - break; - - case 'd': - if (domain == NULL) { - DEBUG(1, ("Cannot expand domain name template " - "because domain name is empty.\n")); - goto done; - } - result = talloc_asprintf_append(result, "%s%s", p, - domain); - break; - - case 'f': - if (domain == NULL || username == NULL) { - DEBUG(1, ("Cannot expand fully qualified name template " - "because domain or user name is empty.\n")); - goto done; - } - result = talloc_asprintf_append(result, "%s%s@%s", p, - username, domain); - break; - - case '%': - result = talloc_asprintf_append(result, "%s%%", p); - break; - - default: - DEBUG(1, ("format error, unknown template [%%%c].\n", *n)); - goto done; - } - - if (result == NULL) { - DEBUG(1, ("talloc_asprintf_append failed.\n")); - goto done; - } - - p = n + 1; - } - - result = talloc_asprintf_append(result, "%s", p); - if (result == NULL) { - DEBUG(1, ("talloc_asprintf_append failed.\n")); - goto done; - } - - res = talloc_move(mem_ctx, &result); -done: - talloc_zfree(tmp_ctx); - return res; -} static gid_t get_gid_override(struct ldb_message *msg, struct sss_domain_info *dom) diff --git a/src/util/sss_nss.c b/src/util/sss_nss.c new file mode 100644 index 00000000..ceccda38 --- /dev/null +++ b/src/util/sss_nss.c @@ -0,0 +1,136 @@ +/* + SSSD + + Utility functions related to ID information + + Copyright (C) Jan Zeleny 2012 + + 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; either version 3 of the License, or + (at your option) any later version. + + 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, see . +*/ + +#include "util/util.h" +#include "util/sss_nss.h" + +char *expand_homedir_template(TALLOC_CTX *mem_ctx, const char *template, + const char *username, uint32_t uid, + const char *domain) +{ + char *copy; + char *p; + char *n; + char *result = NULL; + char *res = NULL; + TALLOC_CTX *tmp_ctx = NULL; + + if (template == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("Missing template.\n")); + return NULL; + } + + tmp_ctx = talloc_new(NULL); + if (!tmp_ctx) return NULL; + + copy = talloc_strdup(tmp_ctx, template); + if (copy == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("talloc_strdup failed.\n")); + goto done; + } + + result = talloc_strdup(tmp_ctx, ""); + if (result == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("talloc_strdup failed.\n")); + goto done; + } + + p = copy; + while ( (n = strchr(p, '%')) != NULL) { + *n = '\0'; + n++; + if ( *n == '\0' ) { + DEBUG(SSSDBG_CRIT_FAILURE, ("format error, single %% at the end of " + "the template.\n")); + goto done; + } + switch( *n ) { + case 'u': + if (username == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot expand user name template " + "because user name is empty.\n")); + goto done; + } + result = talloc_asprintf_append(result, "%s%s", p, + username); + break; + + case 'U': + if (uid == 0) { + DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot expand uid template " + "because uid is invalid.\n")); + goto done; + } + result = talloc_asprintf_append(result, "%s%d", p, + uid); + break; + + case 'd': + if (domain == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot expand domain name " + "template because domain name " + "is empty.\n")); + goto done; + } + result = talloc_asprintf_append(result, "%s%s", p, + domain); + break; + + case 'f': + if (domain == NULL || username == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("Cannot expand fully qualified " + "name template because domain " + "or user name is empty.\n")); + goto done; + } + result = talloc_asprintf_append(result, "%s%s@%s", p, + username, domain); + break; + + case '%': + result = talloc_asprintf_append(result, "%s%%", p); + break; + + default: + DEBUG(SSSDBG_CRIT_FAILURE, ("format error, unknown template " + "[%%%c].\n", *n)); + goto done; + } + + if (result == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("talloc_asprintf_append failed.\n")); + goto done; + } + + p = n + 1; + } + + result = talloc_asprintf_append(result, "%s", p); + if (result == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("talloc_asprintf_append failed.\n")); + goto done; + } + + res = talloc_move(mem_ctx, &result); +done: + talloc_zfree(tmp_ctx); + return res; +} diff --git a/src/util/sss_nss.h b/src/util/sss_nss.h new file mode 100644 index 00000000..55e2b7f6 --- /dev/null +++ b/src/util/sss_nss.h @@ -0,0 +1,31 @@ +/* + SSSD + + Utility functions related to ID information + + Copyright (C) Jan Zeleny 2012 + + 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; either version 3 of the License, or + (at your option) any later version. + + 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, see . +*/ + +#ifndef __SSS_NSS_H__ +#define __SSS_NSS_H__ + +#include +#include + +char *expand_homedir_template(TALLOC_CTX *mem_ctx, const char *template, + const char *username, uint32_t uid, + const char *domain); +#endif -- cgit