From 777374243e15c53e7b0a7345e190c1018920be18 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 | 77 ++++++++++++++++++++++++++++++++++++++++++++-------- src/util/util.h | 9 ++++++ 2 files changed, 75 insertions(+), 11 deletions(-) (limited to 'src/util') diff --git a/src/util/usertools.c b/src/util/usertools.c index 835b9e346..cc8f583b9 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,46 @@ 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; +} + +static inline size_t +fq_part_len(struct sss_names_ctx *nctx, struct sss_domain_info *dom, + uint8_t part, const char *str) +{ + const char *s = str; + + if (part == FQ_FMT_FLAT_NAME) { + s = safe_flat_name(nctx, dom); + } + return nctx->fq_flags & part ? strlen(s) : 0; +} + 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 +613,17 @@ 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)); +} + +size_t +sss_fqdom_len(struct sss_names_ctx *nctx, + struct sss_domain_info *domain) +{ + size_t len = fq_part_len(nctx, domain, FQ_FMT_DOMAIN, domain->name); + len += fq_part_len(nctx, domain, FQ_FMT_FLAT_NAME, domain->flat_name); + return len; } diff --git a/src/util/util.h b/src/util/util.h index 2f65fa201..87a4061e6 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -335,9 +335,14 @@ char *get_username_from_uid(TALLOC_CTX *mem_ctx, uid_t uid); char *get_uppercase_realm(TALLOC_CTX *memctx, const char *name); +#define FQ_FMT_NAME 0x01 +#define FQ_FMT_DOMAIN 0x02 +#define FQ_FMT_FLAT_NAME 0x04 + struct sss_names_ctx { char *re_pattern; char *fq_fmt; + uint8_t fq_flags; pcre *re; }; @@ -381,6 +386,10 @@ int sss_fqname(char *str, size_t size, struct sss_names_ctx *nctx, struct sss_domain_info *domain, const char *name); +size_t +sss_fqdom_len(struct sss_names_ctx *nctx, + struct sss_domain_info *domain); + /* from backup-file.c */ int backup_file(const char *src, int dbglvl); -- cgit