Fabiano Fidêncio 9709b73
From 2eb09d21d486e83a3a844fda0a504bbc479c9b3a Mon Sep 17 00:00:00 2001
Fabiano Fidêncio 9709b73
From: Justin Stephenson <jstephen@redhat.com>
Fabiano Fidêncio 9709b73
Date: Mon, 17 Jul 2017 15:01:36 -0400
Fabiano Fidêncio 9709b73
Subject: [PATCH] FILES: Handle files provider sources
Fabiano Fidêncio 9709b73
MIME-Version: 1.0
Fabiano Fidêncio 9709b73
Content-Type: text/plain; charset=UTF-8
Fabiano Fidêncio 9709b73
Content-Transfer-Encoding: 8bit
Fabiano Fidêncio 9709b73
Fabiano Fidêncio 9709b73
Setup watches on passwd and group files provided with the files provider
Fabiano Fidêncio 9709b73
options passwd_files and group_files lists
Fabiano Fidêncio 9709b73
Fabiano Fidêncio 9709b73
Resolves:
Fabiano Fidêncio 9709b73
https://pagure.io/SSSD/sssd/issue/3402
Fabiano Fidêncio 9709b73
Fabiano Fidêncio 9709b73
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
Fabiano Fidêncio 9709b73
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Fabiano Fidêncio 9709b73
(cherry picked from commit 0d6d493f68bb83a046d351cb3035b08ef5456b50)
Fabiano Fidêncio 9709b73
---
Fabiano Fidêncio 9709b73
 src/providers/files/files_init.c    | 161 +++++++++++++++++---
Fabiano Fidêncio 9709b73
 src/providers/files/files_ops.c     | 285 ++++++++++++++++++++++--------------
Fabiano Fidêncio 9709b73
 src/providers/files/files_private.h |   8 +-
Fabiano Fidêncio 9709b73
 3 files changed, 327 insertions(+), 127 deletions(-)
Fabiano Fidêncio 9709b73
Fabiano Fidêncio 9709b73
diff --git a/src/providers/files/files_init.c b/src/providers/files/files_init.c
Fabiano Fidêncio 9709b73
index b8a051c34..746c04af1 100644
Fabiano Fidêncio 9709b73
--- a/src/providers/files/files_init.c
Fabiano Fidêncio 9709b73
+++ b/src/providers/files/files_init.c
Fabiano Fidêncio 9709b73
@@ -23,6 +23,138 @@
Fabiano Fidêncio 9709b73
 #include "providers/files/files_private.h"
Fabiano Fidêncio 9709b73
 #include "util/util.h"
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
+#define DEFAULT_PASSWD_FILE "/etc/passwd"
Fabiano Fidêncio 9709b73
+#define DEFAULT_GROUP_FILE "/etc/group"
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+static errno_t files_init_file_sources(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 9709b73
+                                       struct be_ctx *be_ctx,
Fabiano Fidêncio 9709b73
+                                       const char ***_passwd_files,
Fabiano Fidêncio 9709b73
+                                       const char ***_group_files)
Fabiano Fidêncio 9709b73
+{
Fabiano Fidêncio 9709b73
+    TALLOC_CTX *tmp_ctx = NULL;
Fabiano Fidêncio 9709b73
+    char *conf_passwd_files;
Fabiano Fidêncio 9709b73
+    char *conf_group_files;
Fabiano Fidêncio 9709b73
+    char **passwd_list = NULL;
Fabiano Fidêncio 9709b73
+    char **group_list = NULL;
Fabiano Fidêncio 9709b73
+    int num_passwd_files = 0;
Fabiano Fidêncio 9709b73
+    int num_group_files = 0;
Fabiano Fidêncio 9709b73
+    const char **passwd_files = NULL;
Fabiano Fidêncio 9709b73
+    const char **group_files = NULL;
Fabiano Fidêncio 9709b73
+    const char *dfl_passwd_files = NULL;
Fabiano Fidêncio 9709b73
+    const char *env_group_files = NULL;
Fabiano Fidêncio 9709b73
+    int i;
Fabiano Fidêncio 9709b73
+    errno_t ret;
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    tmp_ctx = talloc_new(NULL);
Fabiano Fidêncio 9709b73
+    if (tmp_ctx == NULL) {
Fabiano Fidêncio 9709b73
+        ret = ENOMEM;
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    dfl_passwd_files = getenv("SSS_FILES_PASSWD");
Fabiano Fidêncio 9709b73
+    if (dfl_passwd_files) {
Fabiano Fidêncio 9709b73
+        sss_log(SSS_LOG_ALERT,
Fabiano Fidêncio 9709b73
+                "Defaulting to %s for the passwd file, "
Fabiano Fidêncio 9709b73
+                "this should only be used for testing!\n",
Fabiano Fidêncio 9709b73
+                dfl_passwd_files);
Fabiano Fidêncio 9709b73
+    } else {
Fabiano Fidêncio 9709b73
+        dfl_passwd_files = DEFAULT_PASSWD_FILE;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+    DEBUG(SSSDBG_TRACE_FUNC,
Fabiano Fidêncio 9709b73
+          "Using default passwd file: [%s].\n", dfl_passwd_files);
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    env_group_files = getenv("SSS_FILES_GROUP");
Fabiano Fidêncio 9709b73
+    if (env_group_files) {
Fabiano Fidêncio 9709b73
+        sss_log(SSS_LOG_ALERT,
Fabiano Fidêncio 9709b73
+                "Defaulting to %s for the group file, "
Fabiano Fidêncio 9709b73
+                "this should only be used for testing!\n",
Fabiano Fidêncio 9709b73
+                env_group_files);
Fabiano Fidêncio 9709b73
+    } else {
Fabiano Fidêncio 9709b73
+        env_group_files = DEFAULT_GROUP_FILE;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+    DEBUG(SSSDBG_TRACE_FUNC,
Fabiano Fidêncio 9709b73
+          "Using default group file: [%s].\n", DEFAULT_GROUP_FILE);
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = confdb_get_string(be_ctx->cdb, tmp_ctx, be_ctx->conf_path,
Fabiano Fidêncio 9709b73
+                            CONFDB_FILES_PASSWD, dfl_passwd_files,
Fabiano Fidêncio 9709b73
+                            &conf_passwd_files);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_CRIT_FAILURE, "Failed to retrieve confdb passwd files!\n");
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = confdb_get_string(be_ctx->cdb, tmp_ctx, be_ctx->conf_path,
Fabiano Fidêncio 9709b73
+                            CONFDB_FILES_GROUP, env_group_files,
Fabiano Fidêncio 9709b73
+                            &conf_group_files);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_CRIT_FAILURE, "Failed to retrieve confdb group files!\n");
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = split_on_separator(tmp_ctx, conf_passwd_files, ',', true, true,
Fabiano Fidêncio 9709b73
+                             &passwd_list, &num_passwd_files);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
+                "Failed to parse passwd list!\n");
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    passwd_files = talloc_zero_array(tmp_ctx, const char *,
Fabiano Fidêncio 9709b73
+                                     num_passwd_files + 1);
Fabiano Fidêncio 9709b73
+    if (passwd_files == NULL) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero_array() failed\n");
Fabiano Fidêncio 9709b73
+        ret = ENOMEM;
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    for (i = 0; i < num_passwd_files; i++) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_TRACE_FUNC,
Fabiano Fidêncio 9709b73
+              "Using passwd file: [%s].\n", passwd_list[i]);
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+        passwd_files[i] = talloc_strdup(passwd_files, passwd_list[i]);
Fabiano Fidêncio 9709b73
+        if (passwd_files[i] == NULL) {
Fabiano Fidêncio 9709b73
+            ret = ENOMEM;
Fabiano Fidêncio 9709b73
+            goto done;
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    /* Retrieve list of group files */
Fabiano Fidêncio 9709b73
+    ret = split_on_separator(tmp_ctx, conf_group_files, ',', true, true,
Fabiano Fidêncio 9709b73
+                             &group_list, &num_group_files);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
+                "Failed to parse group files!\n");
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    group_files = talloc_zero_array(tmp_ctx, const char *,
Fabiano Fidêncio 9709b73
+                                    num_group_files + 1);
Fabiano Fidêncio 9709b73
+    if (group_files == NULL) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero_array() failed\n");
Fabiano Fidêncio 9709b73
+        ret = ENOMEM;
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    for (i = 0; i < num_group_files; i++) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_TRACE_FUNC,
Fabiano Fidêncio 9709b73
+              "Using group file: [%s].\n", group_list[i]);
Fabiano Fidêncio 9709b73
+        group_files[i] = talloc_strdup(group_files, group_list[i]);
Fabiano Fidêncio 9709b73
+        if (group_files[i] == NULL) {
Fabiano Fidêncio 9709b73
+            ret = ENOMEM;
Fabiano Fidêncio 9709b73
+            goto done;
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    *_passwd_files = talloc_steal(mem_ctx, passwd_files);
Fabiano Fidêncio 9709b73
+    *_group_files = talloc_steal(mem_ctx, group_files);
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = EOK;
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+done:
Fabiano Fidêncio 9709b73
+    talloc_free(tmp_ctx);
Fabiano Fidêncio 9709b73
+    return ret;
Fabiano Fidêncio 9709b73
+}
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
 int sssm_files_init(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 9709b73
                     struct be_ctx *be_ctx,
Fabiano Fidêncio 9709b73
                     struct data_provider *provider,
Fabiano Fidêncio 9709b73
@@ -30,32 +162,27 @@ int sssm_files_init(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 9709b73
                     void **_module_data)
Fabiano Fidêncio 9709b73
 {
Fabiano Fidêncio 9709b73
     struct files_id_ctx *ctx;
Fabiano Fidêncio 9709b73
-    int ret;
Fabiano Fidêncio 9709b73
-    const char *passwd_file = NULL;
Fabiano Fidêncio 9709b73
-    const char *group_file = NULL;
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
-    /* So far this is mostly useful for tests */
Fabiano Fidêncio 9709b73
-    passwd_file = getenv("SSS_FILES_PASSWD");
Fabiano Fidêncio 9709b73
-    if (passwd_file == NULL) {
Fabiano Fidêncio 9709b73
-        passwd_file = "/etc/passwd";
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
-    group_file = getenv("SSS_FILES_GROUP");
Fabiano Fidêncio 9709b73
-    if (group_file == NULL) {
Fabiano Fidêncio 9709b73
-        group_file = "/etc/group";
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
+    errno_t ret;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     ctx = talloc_zero(mem_ctx, struct files_id_ctx);
Fabiano Fidêncio 9709b73
     if (ctx == NULL) {
Fabiano Fidêncio 9709b73
         return ENOMEM;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
     ctx->be = be_ctx;
Fabiano Fidêncio 9709b73
     ctx->domain = be_ctx->domain;
Fabiano Fidêncio 9709b73
-    ctx->passwd_file = passwd_file;
Fabiano Fidêncio 9709b73
-    ctx->group_file = group_file;
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = files_init_file_sources(ctx, be_ctx,
Fabiano Fidêncio 9709b73
+                                  &ctx->passwd_files,
Fabiano Fidêncio 9709b73
+                                  &ctx->group_files);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_CRIT_FAILURE, "Cannot initialize the passwd/group source files\n");
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     ctx->fctx = sf_init(ctx, be_ctx->ev,
Fabiano Fidêncio 9709b73
-                        ctx->passwd_file, ctx->group_file,
Fabiano Fidêncio 9709b73
+                        ctx->passwd_files,
Fabiano Fidêncio 9709b73
+                        ctx->group_files,
Fabiano Fidêncio 9709b73
                         ctx);
Fabiano Fidêncio 9709b73
     if (ctx->fctx == NULL) {
Fabiano Fidêncio 9709b73
         ret = ENOMEM;
Fabiano Fidêncio 9709b73
diff --git a/src/providers/files/files_ops.c b/src/providers/files/files_ops.c
Fabiano Fidêncio 9709b73
index b59a94252..a2a2798d3 100644
Fabiano Fidêncio 9709b73
--- a/src/providers/files/files_ops.c
Fabiano Fidêncio 9709b73
+++ b/src/providers/files/files_ops.c
Fabiano Fidêncio 9709b73
@@ -44,6 +44,7 @@ struct files_ctx {
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
 static errno_t enum_files_users(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 9709b73
                                 struct files_id_ctx *id_ctx,
Fabiano Fidêncio 9709b73
+                                const char *passwd_file,
Fabiano Fidêncio 9709b73
                                 struct passwd ***_users)
Fabiano Fidêncio 9709b73
 {
Fabiano Fidêncio 9709b73
     errno_t ret, close_ret;
Fabiano Fidêncio 9709b73
@@ -53,12 +54,12 @@ static errno_t enum_files_users(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 9709b73
     FILE *pwd_handle = NULL;
Fabiano Fidêncio 9709b73
     size_t n_users = 0;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    pwd_handle = fopen(id_ctx->passwd_file, "r");
Fabiano Fidêncio 9709b73
+    pwd_handle = fopen(passwd_file, "r");
Fabiano Fidêncio 9709b73
     if (pwd_handle == NULL) {
Fabiano Fidêncio 9709b73
         ret = errno;
Fabiano Fidêncio 9709b73
         DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
               "Cannot open passwd file %s [%d]\n",
Fabiano Fidêncio 9709b73
-              id_ctx->passwd_file, ret);
Fabiano Fidêncio 9709b73
+              passwd_file, ret);
Fabiano Fidêncio 9709b73
         goto done;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
@@ -133,7 +134,7 @@ done:
Fabiano Fidêncio 9709b73
             close_ret = errno;
Fabiano Fidêncio 9709b73
             DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
                   "Cannot close passwd file %s [%d]\n",
Fabiano Fidêncio 9709b73
-                  id_ctx->passwd_file, close_ret);
Fabiano Fidêncio 9709b73
+                  passwd_file, close_ret);
Fabiano Fidêncio 9709b73
         }
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
     return ret;
Fabiano Fidêncio 9709b73
@@ -141,6 +142,7 @@ done:
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
 static errno_t enum_files_groups(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 9709b73
                                  struct files_id_ctx *id_ctx,
Fabiano Fidêncio 9709b73
+                                 const char *group_file,
Fabiano Fidêncio 9709b73
                                  struct group ***_groups)
Fabiano Fidêncio 9709b73
 {
Fabiano Fidêncio 9709b73
     errno_t ret, close_ret;
Fabiano Fidêncio 9709b73
@@ -150,12 +152,12 @@ static errno_t enum_files_groups(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 9709b73
     size_t n_groups = 0;
Fabiano Fidêncio 9709b73
     FILE *grp_handle = NULL;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    grp_handle = fopen(id_ctx->group_file, "r");
Fabiano Fidêncio 9709b73
+    grp_handle = fopen(group_file, "r");
Fabiano Fidêncio 9709b73
     if (grp_handle == NULL) {
Fabiano Fidêncio 9709b73
         ret = errno;
Fabiano Fidêncio 9709b73
         DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
               "Cannot open group file %s [%d]\n",
Fabiano Fidêncio 9709b73
-              id_ctx->group_file, ret);
Fabiano Fidêncio 9709b73
+              group_file, ret);
Fabiano Fidêncio 9709b73
         goto done;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
@@ -237,7 +239,7 @@ done:
Fabiano Fidêncio 9709b73
             close_ret = errno;
Fabiano Fidêncio 9709b73
             DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
                   "Cannot close group file %s [%d]\n",
Fabiano Fidêncio 9709b73
-                  id_ctx->group_file, close_ret);
Fabiano Fidêncio 9709b73
+                  group_file, close_ret);
Fabiano Fidêncio 9709b73
         }
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
     return ret;
Fabiano Fidêncio 9709b73
@@ -446,35 +448,23 @@ done:
Fabiano Fidêncio 9709b73
     return ret;
Fabiano Fidêncio 9709b73
 }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-static errno_t sf_enum_groups(struct files_id_ctx *id_ctx);
Fabiano Fidêncio 9709b73
+static errno_t sf_enum_groups(struct files_id_ctx *id_ctx,
Fabiano Fidêncio 9709b73
+                              const char *group_file);
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-errno_t sf_enum_users(struct files_id_ctx *id_ctx)
Fabiano Fidêncio 9709b73
+errno_t sf_enum_users(struct files_id_ctx *id_ctx,
Fabiano Fidêncio 9709b73
+                      const char *passwd_file)
Fabiano Fidêncio 9709b73
 {
Fabiano Fidêncio 9709b73
     errno_t ret;
Fabiano Fidêncio 9709b73
-    errno_t tret;
Fabiano Fidêncio 9709b73
     TALLOC_CTX *tmp_ctx = NULL;
Fabiano Fidêncio 9709b73
     struct passwd **users = NULL;
Fabiano Fidêncio 9709b73
-    bool in_transaction = false;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     tmp_ctx = talloc_new(NULL);
Fabiano Fidêncio 9709b73
     if (tmp_ctx == NULL) {
Fabiano Fidêncio 9709b73
         return ENOMEM;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    ret = enum_files_users(tmp_ctx, id_ctx, &users);
Fabiano Fidêncio 9709b73
-    if (ret != EOK) {
Fabiano Fidêncio 9709b73
-        goto done;
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
-    ret = sysdb_transaction_start(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
-    if (ret != EOK) {
Fabiano Fidêncio 9709b73
-        goto done;
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
-    in_transaction = true;
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
-    /* remove previous cache contents */
Fabiano Fidêncio 9709b73
-    /* FIXME - this is terribly inefficient */
Fabiano Fidêncio 9709b73
-    ret = delete_all_users(id_ctx->domain);
Fabiano Fidêncio 9709b73
+    ret = enum_files_users(tmp_ctx, id_ctx, passwd_file,
Fabiano Fidêncio 9709b73
+                           &users);
Fabiano Fidêncio 9709b73
     if (ret != EOK) {
Fabiano Fidêncio 9709b73
         goto done;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
@@ -496,31 +486,8 @@ errno_t sf_enum_users(struct files_id_ctx *id_ctx)
Fabiano Fidêncio 9709b73
               "override values might not be available.\n");
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    ret = sysdb_transaction_commit(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
-    if (ret != EOK) {
Fabiano Fidêncio 9709b73
-        goto done;
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
-    in_transaction = false;
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
-    /* Covers the case when someone edits /etc/group, adds a group member and
Fabiano Fidêncio 9709b73
-     * only then edits passwd and adds the user. The reverse is not needed,
Fabiano Fidêncio 9709b73
-     * because member/memberof links are established when groups are saved.
Fabiano Fidêncio 9709b73
-     */
Fabiano Fidêncio 9709b73
-    ret = sf_enum_groups(id_ctx);
Fabiano Fidêncio 9709b73
-    if (ret != EOK) {
Fabiano Fidêncio 9709b73
-        DEBUG(SSSDBG_OP_FAILURE, "Cannot refresh groups\n");
Fabiano Fidêncio 9709b73
-        goto done;
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
     ret = EOK;
Fabiano Fidêncio 9709b73
 done:
Fabiano Fidêncio 9709b73
-    if (in_transaction) {
Fabiano Fidêncio 9709b73
-        tret = sysdb_transaction_cancel(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
-        if (tret != EOK) {
Fabiano Fidêncio 9709b73
-            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
-                  "Cannot cancel transaction: %d\n", ret);
Fabiano Fidêncio 9709b73
-        }
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
     talloc_free(tmp_ctx);
Fabiano Fidêncio 9709b73
     return ret;
Fabiano Fidêncio 9709b73
 }
Fabiano Fidêncio 9709b73
@@ -698,13 +665,12 @@ done:
Fabiano Fidêncio 9709b73
     return ret;
Fabiano Fidêncio 9709b73
 }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-static errno_t sf_enum_groups(struct files_id_ctx *id_ctx)
Fabiano Fidêncio 9709b73
+static errno_t sf_enum_groups(struct files_id_ctx *id_ctx,
Fabiano Fidêncio 9709b73
+                              const char *group_file)
Fabiano Fidêncio 9709b73
 {
Fabiano Fidêncio 9709b73
     errno_t ret;
Fabiano Fidêncio 9709b73
-    errno_t tret;
Fabiano Fidêncio 9709b73
     TALLOC_CTX *tmp_ctx = NULL;
Fabiano Fidêncio 9709b73
     struct group **groups = NULL;
Fabiano Fidêncio 9709b73
-    bool in_transaction = false;
Fabiano Fidêncio 9709b73
     const char **cached_users = NULL;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     tmp_ctx = talloc_new(NULL);
Fabiano Fidêncio 9709b73
@@ -712,7 +678,8 @@ static errno_t sf_enum_groups(struct files_id_ctx *id_ctx)
Fabiano Fidêncio 9709b73
         return ENOMEM;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    ret = enum_files_groups(tmp_ctx, id_ctx, &groups);
Fabiano Fidêncio 9709b73
+    ret = enum_files_groups(tmp_ctx, id_ctx, group_file,
Fabiano Fidêncio 9709b73
+                            &groups);
Fabiano Fidêncio 9709b73
     if (ret != EOK) {
Fabiano Fidêncio 9709b73
         goto done;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
@@ -722,18 +689,6 @@ static errno_t sf_enum_groups(struct files_id_ctx *id_ctx)
Fabiano Fidêncio 9709b73
         goto done;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    ret = sysdb_transaction_start(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
-    if (ret != EOK) {
Fabiano Fidêncio 9709b73
-        goto done;
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
-    in_transaction = true;
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
-    /* remove previous cache contents */
Fabiano Fidêncio 9709b73
-    ret = delete_all_groups(id_ctx->domain);
Fabiano Fidêncio 9709b73
-    if (ret != EOK) {
Fabiano Fidêncio 9709b73
-        goto done;
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
     for (size_t i = 0; groups[i]; i++) {
Fabiano Fidêncio 9709b73
         ret = save_file_group(id_ctx, groups[i], cached_users);
Fabiano Fidêncio 9709b73
         if (ret != EOK) {
Fabiano Fidêncio 9709b73
@@ -750,21 +705,8 @@ static errno_t sf_enum_groups(struct files_id_ctx *id_ctx)
Fabiano Fidêncio 9709b73
               "override values might not be available.\n");
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    ret = sysdb_transaction_commit(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
-    if (ret != EOK) {
Fabiano Fidêncio 9709b73
-        goto done;
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
-    in_transaction = false;
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
     ret = EOK;
Fabiano Fidêncio 9709b73
 done:
Fabiano Fidêncio 9709b73
-    if (in_transaction) {
Fabiano Fidêncio 9709b73
-        tret = sysdb_transaction_cancel(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
-        if (tret != EOK) {
Fabiano Fidêncio 9709b73
-            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
-                  "Cannot cancel transaction: %d\n", ret);
Fabiano Fidêncio 9709b73
-        }
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
     talloc_free(tmp_ctx);
Fabiano Fidêncio 9709b73
     return ret;
Fabiano Fidêncio 9709b73
 }
Fabiano Fidêncio 9709b73
@@ -783,21 +725,17 @@ static int sf_passwd_cb(const char *filename, uint32_t flags, void *pvt)
Fabiano Fidêncio 9709b73
 {
Fabiano Fidêncio 9709b73
     struct files_id_ctx *id_ctx;
Fabiano Fidêncio 9709b73
     errno_t ret;
Fabiano Fidêncio 9709b73
+    errno_t tret;
Fabiano Fidêncio 9709b73
+    bool in_transaction = false;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     id_ctx = talloc_get_type(pvt, struct files_id_ctx);
Fabiano Fidêncio 9709b73
     if (id_ctx == NULL) {
Fabiano Fidêncio 9709b73
-        return EINVAL;
Fabiano Fidêncio 9709b73
+        ret = EINVAL;
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     DEBUG(SSSDBG_TRACE_FUNC, "passwd notification\n");
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    if (strcmp(filename, id_ctx->passwd_file) != 0) {
Fabiano Fidêncio 9709b73
-        DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
-              "Wrong file, expected %s, got %s\n",
Fabiano Fidêncio 9709b73
-              id_ctx->passwd_file, filename);
Fabiano Fidêncio 9709b73
-        return EINVAL;
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
     id_ctx->updating_passwd = true;
Fabiano Fidêncio 9709b73
     dp_sbus_domain_inconsistent(id_ctx->be->provider, id_ctx->domain);
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
@@ -805,11 +743,64 @@ static int sf_passwd_cb(const char *filename, uint32_t flags, void *pvt)
Fabiano Fidêncio 9709b73
     dp_sbus_reset_users_memcache(id_ctx->be->provider);
Fabiano Fidêncio 9709b73
     dp_sbus_reset_initgr_memcache(id_ctx->be->provider);
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    ret = sf_enum_users(id_ctx);
Fabiano Fidêncio 9709b73
+    ret = sysdb_transaction_start(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+    in_transaction = true;
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = delete_all_users(id_ctx->domain);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    /* All users were deleted, therefore we need to enumerate each file again */
Fabiano Fidêncio 9709b73
+    for (size_t i = 0; id_ctx->passwd_files[i] != NULL; i++) {
Fabiano Fidêncio 9709b73
+        ret = sf_enum_users(id_ctx, id_ctx->passwd_files[i]);
Fabiano Fidêncio 9709b73
+        if (ret != EOK) {
Fabiano Fidêncio 9709b73
+            DEBUG(SSSDBG_OP_FAILURE, "Cannot enumerate users\n");
Fabiano Fidêncio 9709b73
+            goto done;
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    /* Covers the case when someone edits /etc/group, adds a group member and
Fabiano Fidêncio 9709b73
+     * only then edits passwd and adds the user. The reverse is not needed,
Fabiano Fidêncio 9709b73
+     * because member/memberof links are established when groups are saved.
Fabiano Fidêncio 9709b73
+     */
Fabiano Fidêncio 9709b73
+    ret = delete_all_groups(id_ctx->domain);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    /* All groups were deleted, therefore we need to enumerate each file again */
Fabiano Fidêncio 9709b73
+    for (size_t i = 0; id_ctx->group_files[i] != NULL; i++) {
Fabiano Fidêncio 9709b73
+        ret = sf_enum_groups(id_ctx, id_ctx->group_files[i]);
Fabiano Fidêncio 9709b73
+        if (ret != EOK) {
Fabiano Fidêncio 9709b73
+            DEBUG(SSSDBG_OP_FAILURE, "Cannot enumerate groups\n");
Fabiano Fidêncio 9709b73
+            goto done;
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = sysdb_transaction_commit(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+    in_transaction = false;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     id_ctx->updating_passwd = false;
Fabiano Fidêncio 9709b73
     sf_cb_done(id_ctx);
Fabiano Fidêncio 9709b73
     files_account_info_finished(id_ctx, BE_REQ_USER, ret);
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = EOK;
Fabiano Fidêncio 9709b73
+done:
Fabiano Fidêncio 9709b73
+    if (in_transaction) {
Fabiano Fidêncio 9709b73
+        tret = sysdb_transaction_cancel(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
+        if (tret != EOK) {
Fabiano Fidêncio 9709b73
+            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
+                  "Cannot cancel transaction: %d\n", ret);
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
     return ret;
Fabiano Fidêncio 9709b73
 }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
@@ -817,21 +808,17 @@ static int sf_group_cb(const char *filename, uint32_t flags, void *pvt)
Fabiano Fidêncio 9709b73
 {
Fabiano Fidêncio 9709b73
     struct files_id_ctx *id_ctx;
Fabiano Fidêncio 9709b73
     errno_t ret;
Fabiano Fidêncio 9709b73
+    errno_t tret;
Fabiano Fidêncio 9709b73
+    bool in_transaction = false;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     id_ctx = talloc_get_type(pvt, struct files_id_ctx);
Fabiano Fidêncio 9709b73
     if (id_ctx == NULL) {
Fabiano Fidêncio 9709b73
-        return EINVAL;
Fabiano Fidêncio 9709b73
+        ret = EINVAL;
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     DEBUG(SSSDBG_TRACE_FUNC, "group notification\n");
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    if (strcmp(filename, id_ctx->group_file) != 0) {
Fabiano Fidêncio 9709b73
-        DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
-              "Wrong file, expected %s, got %s\n",
Fabiano Fidêncio 9709b73
-              id_ctx->group_file, filename);
Fabiano Fidêncio 9709b73
-        return EINVAL;
Fabiano Fidêncio 9709b73
-    }
Fabiano Fidêncio 9709b73
-
Fabiano Fidêncio 9709b73
     id_ctx->updating_groups = true;
Fabiano Fidêncio 9709b73
     dp_sbus_domain_inconsistent(id_ctx->be->provider, id_ctx->domain);
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
@@ -839,11 +826,47 @@ static int sf_group_cb(const char *filename, uint32_t flags, void *pvt)
Fabiano Fidêncio 9709b73
     dp_sbus_reset_groups_memcache(id_ctx->be->provider);
Fabiano Fidêncio 9709b73
     dp_sbus_reset_initgr_memcache(id_ctx->be->provider);
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    ret = sf_enum_groups(id_ctx);
Fabiano Fidêncio 9709b73
+    ret = sysdb_transaction_start(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+    in_transaction = true;
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = delete_all_groups(id_ctx->domain);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    /* All groups were deleted, therefore we need to enumerate each file again */
Fabiano Fidêncio 9709b73
+    for (size_t i = 0; id_ctx->group_files[i] != NULL; i++) {
Fabiano Fidêncio 9709b73
+        ret = sf_enum_groups(id_ctx, id_ctx->group_files[i]);
Fabiano Fidêncio 9709b73
+        if (ret != EOK) {
Fabiano Fidêncio 9709b73
+            DEBUG(SSSDBG_OP_FAILURE, "Cannot enumerate groups\n");
Fabiano Fidêncio 9709b73
+            goto done;
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = sysdb_transaction_commit(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+    in_transaction = false;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     id_ctx->updating_groups = false;
Fabiano Fidêncio 9709b73
     sf_cb_done(id_ctx);
Fabiano Fidêncio 9709b73
     files_account_info_finished(id_ctx, BE_REQ_GROUP, ret);
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = EOK;
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+done:
Fabiano Fidêncio 9709b73
+    if (in_transaction) {
Fabiano Fidêncio 9709b73
+        tret = sysdb_transaction_cancel(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
+        if (tret != EOK) {
Fabiano Fidêncio 9709b73
+            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
+                  "Cannot cancel transaction: %d\n", ret);
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
     return ret;
Fabiano Fidêncio 9709b73
 }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
@@ -853,19 +876,62 @@ static void startup_enum_files(struct tevent_context *ev,
Fabiano Fidêncio 9709b73
 {
Fabiano Fidêncio 9709b73
     struct files_id_ctx *id_ctx = talloc_get_type(pvt, struct files_id_ctx);
Fabiano Fidêncio 9709b73
     errno_t ret;
Fabiano Fidêncio 9709b73
+    errno_t tret;
Fabiano Fidêncio 9709b73
+    bool in_transaction = false;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     talloc_zfree(imm);
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    ret = sf_enum_users(id_ctx);
Fabiano Fidêncio 9709b73
+    ret = sysdb_transaction_start(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
     if (ret != EOK) {
Fabiano Fidêncio 9709b73
-        DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
-              "Enumerating users failed, data might be inconsistent!\n");
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
+    in_transaction = true;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    ret = sf_enum_groups(id_ctx);
Fabiano Fidêncio 9709b73
+    ret = delete_all_users(id_ctx->domain);
Fabiano Fidêncio 9709b73
     if (ret != EOK) {
Fabiano Fidêncio 9709b73
-        DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
-              "Enumerating groups failed, data might be inconsistent!\n");
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = delete_all_groups(id_ctx->domain);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    for (size_t i = 0; id_ctx->passwd_files[i] != NULL; i++) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_TRACE_FUNC,
Fabiano Fidêncio 9709b73
+              "Startup user enumeration of [%s]\n", id_ctx->passwd_files[i]);
Fabiano Fidêncio 9709b73
+        ret = sf_enum_users(id_ctx, id_ctx->passwd_files[i]);
Fabiano Fidêncio 9709b73
+        if (ret != EOK) {
Fabiano Fidêncio 9709b73
+            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
+                  "Enumerating users failed, data might be inconsistent!\n");
Fabiano Fidêncio 9709b73
+            goto done;
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    for (size_t i = 0; id_ctx->group_files[i] != NULL; i++) {
Fabiano Fidêncio 9709b73
+        DEBUG(SSSDBG_TRACE_FUNC,
Fabiano Fidêncio 9709b73
+              "Startup group enumeration of [%s]\n", id_ctx->group_files[i]);
Fabiano Fidêncio 9709b73
+        ret = sf_enum_groups(id_ctx, id_ctx->group_files[i]);
Fabiano Fidêncio 9709b73
+        if (ret != EOK) {
Fabiano Fidêncio 9709b73
+            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
+                  "Enumerating groups failed, data might be inconsistent!\n");
Fabiano Fidêncio 9709b73
+            goto done;
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    ret = sysdb_transaction_commit(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
+    if (ret != EOK) {
Fabiano Fidêncio 9709b73
+        goto done;
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+    in_transaction = false;
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+done:
Fabiano Fidêncio 9709b73
+    if (in_transaction) {
Fabiano Fidêncio 9709b73
+        tret = sysdb_transaction_cancel(id_ctx->domain->sysdb);
Fabiano Fidêncio 9709b73
+        if (tret != EOK) {
Fabiano Fidêncio 9709b73
+            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 9709b73
+                  "Cannot cancel transaction: %d\n", ret);
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
@@ -884,22 +950,29 @@ static struct snotify_ctx *sf_setup_watch(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
 struct files_ctx *sf_init(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 9709b73
                           struct tevent_context *ev,
Fabiano Fidêncio 9709b73
-                          const char *passwd_file,
Fabiano Fidêncio 9709b73
-                          const char *group_file,
Fabiano Fidêncio 9709b73
+                          const char **passwd_files,
Fabiano Fidêncio 9709b73
+                          const char **group_files,
Fabiano Fidêncio 9709b73
                           struct files_id_ctx *id_ctx)
Fabiano Fidêncio 9709b73
 {
Fabiano Fidêncio 9709b73
     struct files_ctx *fctx;
Fabiano Fidêncio 9709b73
     struct tevent_immediate *imm;
Fabiano Fidêncio 9709b73
+    int i;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     fctx = talloc(mem_ctx, struct files_ctx);
Fabiano Fidêncio 9709b73
     if (fctx == NULL) {
Fabiano Fidêncio 9709b73
         return NULL;
Fabiano Fidêncio 9709b73
     }
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    fctx->pwd_watch = sf_setup_watch(fctx, ev, passwd_file,
Fabiano Fidêncio 9709b73
-                                     sf_passwd_cb, id_ctx);
Fabiano Fidêncio 9709b73
-    fctx->grp_watch = sf_setup_watch(fctx, ev, group_file,
Fabiano Fidêncio 9709b73
-                                     sf_group_cb, id_ctx);
Fabiano Fidêncio 9709b73
+    for (i = 0; passwd_files[i]; i++) {
Fabiano Fidêncio 9709b73
+        fctx->pwd_watch = sf_setup_watch(fctx, ev, passwd_files[i],
Fabiano Fidêncio 9709b73
+                                         sf_passwd_cb, id_ctx);
Fabiano Fidêncio 9709b73
+        }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
+    for (i = 0; group_files[i]; i++) {
Fabiano Fidêncio 9709b73
+        fctx->grp_watch = sf_setup_watch(fctx, ev, group_files[i],
Fabiano Fidêncio 9709b73
+                                         sf_group_cb, id_ctx);
Fabiano Fidêncio 9709b73
+    }
Fabiano Fidêncio 9709b73
+
Fabiano Fidêncio 9709b73
     if (fctx->pwd_watch == NULL || fctx->grp_watch == NULL) {
Fabiano Fidêncio 9709b73
         talloc_free(fctx);
Fabiano Fidêncio 9709b73
         return NULL;
Fabiano Fidêncio 9709b73
diff --git a/src/providers/files/files_private.h b/src/providers/files/files_private.h
Fabiano Fidêncio 9709b73
index a7d195c90..f44e6d458 100644
Fabiano Fidêncio 9709b73
--- a/src/providers/files/files_private.h
Fabiano Fidêncio 9709b73
+++ b/src/providers/files/files_private.h
Fabiano Fidêncio 9709b73
@@ -39,8 +39,8 @@ struct files_id_ctx {
Fabiano Fidêncio 9709b73
     struct sss_domain_info *domain;
Fabiano Fidêncio 9709b73
     struct files_ctx *fctx;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
-    const char *passwd_file;
Fabiano Fidêncio 9709b73
-    const char *group_file;
Fabiano Fidêncio 9709b73
+    const char **passwd_files;
Fabiano Fidêncio 9709b73
+    const char **group_files;
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
     bool updating_passwd;
Fabiano Fidêncio 9709b73
     bool updating_groups;
Fabiano Fidêncio 9709b73
@@ -53,8 +53,8 @@ struct files_id_ctx {
Fabiano Fidêncio 9709b73
 /* files_ops.c */
Fabiano Fidêncio 9709b73
 struct files_ctx *sf_init(TALLOC_CTX *mem_ctx,
Fabiano Fidêncio 9709b73
                           struct tevent_context *ev,
Fabiano Fidêncio 9709b73
-                          const char *passwd_file,
Fabiano Fidêncio 9709b73
-                          const char *group_file,
Fabiano Fidêncio 9709b73
+                          const char **passwd_files,
Fabiano Fidêncio 9709b73
+                          const char **group_files,
Fabiano Fidêncio 9709b73
                           struct files_id_ctx *id_ctx);
Fabiano Fidêncio 9709b73
 
Fabiano Fidêncio 9709b73
 /* files_id.c */
Fabiano Fidêncio 9709b73
-- 
Fabiano Fidêncio 9709b73
2.14.3
Fabiano Fidêncio 9709b73