From fb04b2de30a3d3556a15b5abb01856a749a0f7f3 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Sat, 11 May 2013 10:53:12 +0200 Subject: Allow flat name in the FQname format https://fedorahosted.org/sssd/ticket/1648 Adds another expansion in the printf format that allows the user to use the domain flat name in the format. --- src/util/usertools.c | 56 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 11 deletions(-) (limited to 'src/util/usertools.c') diff --git a/src/util/usertools.c b/src/util/usertools.c index 835b9e346..991975cbb 100644 --- a/src/util/usertools.c +++ b/src/util/usertools.c @@ -140,12 +140,14 @@ static errno_t sss_fqnames_init(struct sss_names_ctx *nctx, const char *fq_fmt) struct pattern_desc { const char *pattern; const char *desc; + int flag; }; struct pattern_desc fqname_patterns[] = { - { "%1$s", "user name" }, - { "%2$s", "domain name" }, - { NULL, NULL } + { "%1$s", "user name", FQ_FMT_NAME }, + { "%2$s", "domain name", FQ_FMT_DOMAIN }, + { "%3$s", "domain flat name", FQ_FMT_FLAT_NAME }, + { NULL, NULL, 0 } }; nctx->fq_fmt = talloc_strdup(nctx, fq_fmt); @@ -163,12 +165,24 @@ static errno_t sss_fqnames_init(struct sss_names_ctx *nctx, const char *fq_fmt) ("Username pattern not found in [%s]\n", nctx->fq_fmt)); return ENOENT; } + nctx->fq_flags = FQ_FMT_NAME; + + for (int i = 1; fqname_patterns[i].pattern; i++) { + char *s; + s = strstr(fq_fmt, fqname_patterns[i].pattern); + if (s == NULL) { + /* Append the format specifier */ + nctx->fq_fmt = talloc_strdup_append(nctx->fq_fmt, + fqname_patterns[i].pattern); + if (nctx->fq_fmt == NULL) { + return ENOMEM; + } + continue; + } - if (strstr(fq_fmt, fqname_patterns[1].pattern) == NULL) { - DEBUG(SSSDBG_MINOR_FAILURE, - ("The pattern for %s was not found, fully-qualified names " - "might not work as expected\n", fqname_patterns[1].desc)); - /* Ignore this error */ + DEBUG(SSSDBG_CONF_SETTINGS, + ("Found the pattern for %s\n", fqname_patterns[i].desc)); + nctx->fq_flags |= fqname_patterns[i].flag; } return EOK; @@ -551,17 +565,34 @@ sss_get_cased_name_list(TALLOC_CTX *mem_ctx, const char * const *orig, static inline const char * safe_fq_str(struct sss_names_ctx *nctx, uint8_t part, const char *str) { - return nctx->fq_flags & part ? str : ""; } +static inline const char * +safe_flat_name(struct sss_names_ctx *nctx, struct sss_domain_info *domain) +{ + const char *s; + + s = safe_fq_str(nctx, FQ_FMT_FLAT_NAME, domain->flat_name); + if (s == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("Flat name requested but domain has no" + "flat name set, falling back to domain name\n")); + s = domain->name; + } + + return s; +} + char * sss_tc_fqname(TALLOC_CTX *mem_ctx, struct sss_names_ctx *nctx, struct sss_domain_info *domain, const char *name) { if (domain == NULL || nctx == NULL) return NULL; - return talloc_asprintf(mem_ctx, nctx->fq_fmt, name, domain->name); + return talloc_asprintf(mem_ctx, nctx->fq_fmt, + safe_fq_str(nctx, FQ_FMT_NAME, name), + safe_fq_str(nctx, FQ_FMT_DOMAIN, domain->name), + safe_flat_name(nctx, domain)); } int @@ -570,5 +601,8 @@ sss_fqname(char *str, size_t size, struct sss_names_ctx *nctx, { if (domain == NULL || nctx == NULL) return -EINVAL; - return snprintf(str, size, nctx->fq_fmt, name, domain->name); + return snprintf(str, size, nctx->fq_fmt, + safe_fq_str(nctx, FQ_FMT_NAME, name), + safe_fq_str(nctx, FQ_FMT_DOMAIN, domain->name), + safe_flat_name(nctx, domain)); } -- cgit