summaryrefslogtreecommitdiff
path: root/src/util/usertools.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/usertools.c')
-rw-r--r--src/util/usertools.c107
1 files changed, 66 insertions, 41 deletions
diff --git a/src/util/usertools.c b/src/util/usertools.c
index 7323d9f8..91110f26 100644
--- a/src/util/usertools.c
+++ b/src/util/usertools.c
@@ -135,13 +135,11 @@ done:
#endif
}
-int sss_names_init(TALLOC_CTX *mem_ctx, struct confdb_ctx *cdb,
- const char *domain, struct sss_names_ctx **out)
+int sss_names_init_from_args(TALLOC_CTX *mem_ctx, const char *re_pattern,
+ const char *fq_fmt, struct sss_names_ctx **out)
{
struct sss_names_ctx *ctx;
- TALLOC_CTX *tmpctx = NULL;
const char *errstr;
- char *conf_path;
int errval;
int errpos;
int ret;
@@ -150,6 +148,49 @@ int sss_names_init(TALLOC_CTX *mem_ctx, struct confdb_ctx *cdb,
if (!ctx) return ENOMEM;
talloc_set_destructor(ctx, sss_names_ctx_destructor);
+ ctx->re_pattern = talloc_strdup(ctx, re_pattern);
+ if (ctx->re_pattern == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ DEBUG(SSSDBG_CONF_SETTINGS, ("Using re [%s].\n", ctx->re_pattern));
+
+ ctx->fq_fmt = talloc_strdup(ctx, fq_fmt);
+ if (ctx->fq_fmt == NULL) {
+ ret = ENOMEM;
+ goto done;
+ }
+
+ ctx->re = pcre_compile2(ctx->re_pattern,
+ NAME_DOMAIN_PATTERN_OPTIONS,
+ &errval, &errstr, &errpos, NULL);
+ if (!ctx->re) {
+ DEBUG(1, ("Invalid Regular Expression pattern at position %d."
+ " (Error: %d [%s])\n", errpos, errval, errstr));
+ ret = EFAULT;
+ goto done;
+ }
+
+ *out = ctx;
+ ret = EOK;
+
+done:
+ if (ret != EOK) {
+ talloc_free(ctx);
+ }
+ return ret;
+}
+
+int sss_names_init(TALLOC_CTX *mem_ctx, struct confdb_ctx *cdb,
+ const char *domain, struct sss_names_ctx **out)
+{
+ TALLOC_CTX *tmpctx = NULL;
+ char *conf_path;
+ char *re_pattern;
+ char *fq_fmt;
+ int ret;
+
tmpctx = talloc_new(NULL);
if (tmpctx == NULL) {
ret = ENOMEM;
@@ -162,19 +203,19 @@ int sss_names_init(TALLOC_CTX *mem_ctx, struct confdb_ctx *cdb,
goto done;
}
- ret = confdb_get_string(cdb, ctx, conf_path,
- CONFDB_NAME_REGEX, NULL, &ctx->re_pattern);
+ ret = confdb_get_string(cdb, tmpctx, conf_path,
+ CONFDB_NAME_REGEX, NULL, &re_pattern);
if (ret != EOK) goto done;
/* If not found in the domain, look in globals */
- if (ctx->re_pattern == NULL) {
- ret = confdb_get_string(cdb, ctx, CONFDB_MONITOR_CONF_ENTRY,
- CONFDB_NAME_REGEX, NULL, &ctx->re_pattern);
+ if (re_pattern == NULL) {
+ ret = confdb_get_string(cdb, tmpctx, CONFDB_MONITOR_CONF_ENTRY,
+ CONFDB_NAME_REGEX, NULL, &re_pattern);
if (ret != EOK) goto done;
}
- if (ctx->re_pattern == NULL) {
- ret = get_id_provider_default_re(ctx, cdb, conf_path, &ctx->re_pattern);
+ if (re_pattern == NULL) {
+ ret = get_id_provider_default_re(tmpctx, cdb, conf_path, &re_pattern);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE, ("Failed to get provider default regular " \
"expression for domain [%s].\n", domain));
@@ -182,10 +223,10 @@ int sss_names_init(TALLOC_CTX *mem_ctx, struct confdb_ctx *cdb,
}
}
- if (!ctx->re_pattern) {
- ctx->re_pattern = talloc_strdup(ctx,
- "(?P<name>[^@]+)@?(?P<domain>[^@]*$)");
- if (!ctx->re_pattern) {
+ if (!re_pattern) {
+ re_pattern = talloc_strdup(tmpctx,
+ "(?P<name>[^@]+)@?(?P<domain>[^@]*$)");
+ if (!re_pattern) {
ret = ENOMEM;
goto done;
}
@@ -195,49 +236,33 @@ int sss_names_init(TALLOC_CTX *mem_ctx, struct confdb_ctx *cdb,
"not support non-unique named subpatterns.\n"));
DEBUG(2, ("Please make sure that your pattern [%s] only contains "
"subpatterns with a unique name and uses "
- "the Python syntax (?P<name>).\n", ctx->re_pattern));
+ "the Python syntax (?P<name>).\n", re_pattern));
#endif
}
- DEBUG(SSSDBG_CONF_SETTINGS, ("Using re [%s].\n", ctx->re_pattern));
-
- ret = confdb_get_string(cdb, ctx, conf_path,
- CONFDB_FULL_NAME_FORMAT, NULL, &ctx->fq_fmt);
+ ret = confdb_get_string(cdb, tmpctx, conf_path,
+ CONFDB_FULL_NAME_FORMAT, NULL, &fq_fmt);
if (ret != EOK) goto done;
/* If not found in the domain, look in globals */
- if (ctx->fq_fmt == NULL) {
- ret = confdb_get_string(cdb, ctx, CONFDB_MONITOR_CONF_ENTRY,
- CONFDB_FULL_NAME_FORMAT, NULL, &ctx->fq_fmt);
+ if (fq_fmt == NULL) {
+ ret = confdb_get_string(cdb, tmpctx, CONFDB_MONITOR_CONF_ENTRY,
+ CONFDB_FULL_NAME_FORMAT, NULL, &fq_fmt);
if (ret != EOK) goto done;
}
- if (!ctx->fq_fmt) {
- ctx->fq_fmt = talloc_strdup(ctx, "%1$s@%2$s");
- if (!ctx->fq_fmt) {
+ if (!fq_fmt) {
+ fq_fmt = talloc_strdup(tmpctx, "%1$s@%2$s");
+ if (!fq_fmt) {
ret = ENOMEM;
goto done;
}
}
- ctx->re = pcre_compile2(ctx->re_pattern,
- NAME_DOMAIN_PATTERN_OPTIONS,
- &errval, &errstr, &errpos, NULL);
- if (!ctx->re) {
- DEBUG(1, ("Invalid Regular Expression pattern at position %d."
- " (Error: %d [%s])\n", errpos, errval, errstr));
- ret = EFAULT;
- goto done;
- }
-
- *out = ctx;
- ret = EOK;
+ ret = sss_names_init_from_args(mem_ctx, re_pattern, fq_fmt, out);
done:
talloc_free(tmpctx);
- if (ret != EOK) {
- talloc_free(ctx);
- }
return ret;
}