sinnykumari / rpms / sssd

Forked from rpms/sssd 5 years ago
Clone
Blob Blame History Raw
From f54b271376b23cb968eafb9ffd5100c6dadad2a7 Mon Sep 17 00:00:00 2001
From: Jan Cholasta <jcholast@redhat.com>
Date: Fri, 26 Apr 2013 09:40:53 +0200
Subject: [PATCH 3/6] UTIL: Add function sss_names_init_from_args

This function allows initializing sss_names_ctx using a regular expression and
fully qualified format string specified in its arguments.
---
 src/util/usertools.c | 107 +++++++++++++++++++++++++++++++--------------------
 src/util/util.h      |   7 ++++
 2 files changed, 73 insertions(+), 41 deletions(-)

diff --git a/src/util/usertools.c b/src/util/usertools.c
index 7323d9f8260580f32b4ab55c8c2db5bd7eec20ed..91110f263657de9ba53ed305e7c4710eb006bec6 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;
 }
 
diff --git a/src/util/util.h b/src/util/util.h
index 33725f63591a4d165a084c1fd361f9651e80e50b..49dc850c36cedd83755034367357fab41bd32ec6 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -401,6 +401,13 @@ struct sss_names_ctx {
     pcre *re;
 };
 
+/* initialize sss_names_ctx directly from arguments */
+int sss_names_init_from_args(TALLOC_CTX *mem_ctx,
+                             const char *re_pattern,
+                             const char *fq_fmt,
+                             struct sss_names_ctx **out);
+
+/* initialize sss_names_ctx from domain configuration */
 int sss_names_init(TALLOC_CTX *mem_ctx,
                    struct confdb_ctx *cdb,
                    const char *domain,
-- 
1.8.2.1