summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--src/responder/nss/nsssrv_cmd.c109
-rw-r--r--src/util/sss_nss.c136
-rw-r--r--src/util/sss_nss.h31
4 files changed, 170 insertions, 108 deletions
diff --git a/Makefile.am b/Makefile.am
index 671496358..00f466c66 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 da3fa6fd8..1c94ff78a 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 000000000..ceccda38f
--- /dev/null
+++ b/src/util/sss_nss.c
@@ -0,0 +1,136 @@
+/*
+ SSSD
+
+ Utility functions related to ID information
+
+ Copyright (C) Jan Zeleny <jzeleny@redhat.com> 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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 000000000..55e2b7f6b
--- /dev/null
+++ b/src/util/sss_nss.h
@@ -0,0 +1,31 @@
+/*
+ SSSD
+
+ Utility functions related to ID information
+
+ Copyright (C) Jan Zeleny <jzeleny@redhat.com> 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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __SSS_NSS_H__
+#define __SSS_NSS_H__
+
+#include <sys/types.h>
+#include <talloc.h>
+
+char *expand_homedir_template(TALLOC_CTX *mem_ctx, const char *template,
+ const char *username, uint32_t uid,
+ const char *domain);
+#endif