Fabiano Fidêncio 90dd145
From 601e30e9d6e7c0da2e1648dc2d9bc37bddf512d8 Mon Sep 17 00:00:00 2001
Fabiano Fidêncio 90dd145
From: Jakub Hrozek <jhrozek@redhat.com>
Fabiano Fidêncio 90dd145
Date: Tue, 17 Apr 2018 14:22:39 +0200
Fabiano Fidêncio 90dd145
Subject: [PATCH] FILES: Reduce code duplication
Fabiano Fidêncio 90dd145
MIME-Version: 1.0
Fabiano Fidêncio 90dd145
Content-Type: text/plain; charset=UTF-8
Fabiano Fidêncio 90dd145
Content-Transfer-Encoding: 8bit
Fabiano Fidêncio 90dd145
Fabiano Fidêncio 90dd145
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
Fabiano Fidêncio 90dd145
(cherry picked from commit 1f8bfb6975becda07ff29f557f82b6ac1eaa0be9)
Fabiano Fidêncio 90dd145
---
Fabiano Fidêncio 90dd145
 src/providers/files/files_ops.c | 213 +++++++++++++++-------------------------
Fabiano Fidêncio 90dd145
 1 file changed, 81 insertions(+), 132 deletions(-)
Fabiano Fidêncio 90dd145
Fabiano Fidêncio 90dd145
diff --git a/src/providers/files/files_ops.c b/src/providers/files/files_ops.c
Fabiano Fidêncio 90dd145
index 95c4d2a06..370af1274 100644
Fabiano Fidêncio 90dd145
--- a/src/providers/files/files_ops.c
Fabiano Fidêncio 90dd145
+++ b/src/providers/files/files_ops.c
Fabiano Fidêncio 90dd145
@@ -35,6 +35,10 @@
Fabiano Fidêncio 90dd145
 #define PWD_MAXSIZE         1024
Fabiano Fidêncio 90dd145
 #define GRP_MAXSIZE         2048
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
+#define SF_UPDATE_PASSWD    1<<0
Fabiano Fidêncio 90dd145
+#define SF_UPDATE_GROUP     1<<1
Fabiano Fidêncio 90dd145
+#define SF_UPDATE_BOTH      (SF_UPDATE_PASSWD | SF_UPDATE_GROUP)
Fabiano Fidêncio 90dd145
+
Fabiano Fidêncio 90dd145
 struct files_ctx {
Fabiano Fidêncio 90dd145
     struct files_ops_ctx *ops;
Fabiano Fidêncio 90dd145
 };
Fabiano Fidêncio 90dd145
@@ -708,6 +712,70 @@ done:
Fabiano Fidêncio 90dd145
     return ret;
Fabiano Fidêncio 90dd145
 }
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
+static errno_t sf_enum_files(struct files_id_ctx *id_ctx,
Fabiano Fidêncio 90dd145
+                             uint8_t flags)
Fabiano Fidêncio 90dd145
+{
Fabiano Fidêncio 90dd145
+    errno_t ret;
Fabiano Fidêncio 90dd145
+    errno_t tret;
Fabiano Fidêncio 90dd145
+    bool in_transaction = false;
Fabiano Fidêncio 90dd145
+
Fabiano Fidêncio 90dd145
+    ret = sysdb_transaction_start(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
+    if (ret != EOK) {
Fabiano Fidêncio 90dd145
+        goto done;
Fabiano Fidêncio 90dd145
+    }
Fabiano Fidêncio 90dd145
+    in_transaction = true;
Fabiano Fidêncio 90dd145
+
Fabiano Fidêncio 90dd145
+    if (flags & SF_UPDATE_PASSWD) {
Fabiano Fidêncio 90dd145
+        ret = delete_all_users(id_ctx->domain);
Fabiano Fidêncio 90dd145
+        if (ret != EOK) {
Fabiano Fidêncio 90dd145
+            goto done;
Fabiano Fidêncio 90dd145
+        }
Fabiano Fidêncio 90dd145
+
Fabiano Fidêncio 90dd145
+        /* All users were deleted, therefore we need to enumerate each file again */
Fabiano Fidêncio 90dd145
+        for (size_t i = 0; id_ctx->passwd_files[i] != NULL; i++) {
Fabiano Fidêncio 90dd145
+            ret = sf_enum_users(id_ctx, id_ctx->passwd_files[i]);
Fabiano Fidêncio 90dd145
+            if (ret != EOK) {
Fabiano Fidêncio 90dd145
+                DEBUG(SSSDBG_OP_FAILURE, "Cannot enumerate users\n");
Fabiano Fidêncio 90dd145
+                goto done;
Fabiano Fidêncio 90dd145
+            }
Fabiano Fidêncio 90dd145
+        }
Fabiano Fidêncio 90dd145
+    }
Fabiano Fidêncio 90dd145
+
Fabiano Fidêncio 90dd145
+    if (flags & SF_UPDATE_GROUP) {
Fabiano Fidêncio 90dd145
+        ret = delete_all_groups(id_ctx->domain);
Fabiano Fidêncio 90dd145
+        if (ret != EOK) {
Fabiano Fidêncio 90dd145
+            goto done;
Fabiano Fidêncio 90dd145
+        }
Fabiano Fidêncio 90dd145
+
Fabiano Fidêncio 90dd145
+        /* All groups were deleted, therefore we need to enumerate each file again */
Fabiano Fidêncio 90dd145
+        for (size_t i = 0; id_ctx->group_files[i] != NULL; i++) {
Fabiano Fidêncio 90dd145
+            ret = sf_enum_groups(id_ctx, id_ctx->group_files[i]);
Fabiano Fidêncio 90dd145
+            if (ret != EOK) {
Fabiano Fidêncio 90dd145
+                DEBUG(SSSDBG_OP_FAILURE, "Cannot enumerate groups\n");
Fabiano Fidêncio 90dd145
+                goto done;
Fabiano Fidêncio 90dd145
+            }
Fabiano Fidêncio 90dd145
+        }
Fabiano Fidêncio 90dd145
+    }
Fabiano Fidêncio 90dd145
+
Fabiano Fidêncio 90dd145
+    ret = sysdb_transaction_commit(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
+    if (ret != EOK) {
Fabiano Fidêncio 90dd145
+        goto done;
Fabiano Fidêncio 90dd145
+    }
Fabiano Fidêncio 90dd145
+    in_transaction = false;
Fabiano Fidêncio 90dd145
+
Fabiano Fidêncio 90dd145
+    ret = EOK;
Fabiano Fidêncio 90dd145
+done:
Fabiano Fidêncio 90dd145
+    if (in_transaction) {
Fabiano Fidêncio 90dd145
+        tret = sysdb_transaction_cancel(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
+        if (tret != EOK) {
Fabiano Fidêncio 90dd145
+            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 90dd145
+                  "Cannot cancel transaction: %d\n", ret);
Fabiano Fidêncio 90dd145
+        }
Fabiano Fidêncio 90dd145
+    }
Fabiano Fidêncio 90dd145
+
Fabiano Fidêncio 90dd145
+    return ret;
Fabiano Fidêncio 90dd145
+}
Fabiano Fidêncio 90dd145
+
Fabiano Fidêncio 90dd145
 static void sf_cb_done(struct files_id_ctx *id_ctx)
Fabiano Fidêncio 90dd145
 {
Fabiano Fidêncio 90dd145
     /* Only activate a domain when both callbacks are done */
Fabiano Fidêncio 90dd145
@@ -722,8 +790,6 @@ static int sf_passwd_cb(const char *filename, uint32_t flags, void *pvt)
Fabiano Fidêncio 90dd145
 {
Fabiano Fidêncio 90dd145
     struct files_id_ctx *id_ctx;
Fabiano Fidêncio 90dd145
     errno_t ret;
Fabiano Fidêncio 90dd145
-    errno_t tret;
Fabiano Fidêncio 90dd145
-    bool in_transaction = false;
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
     id_ctx = talloc_get_type(pvt, struct files_id_ctx);
Fabiano Fidêncio 90dd145
     if (id_ctx == NULL) {
Fabiano Fidêncio 90dd145
@@ -740,49 +806,17 @@ static int sf_passwd_cb(const char *filename, uint32_t flags, void *pvt)
Fabiano Fidêncio 90dd145
     dp_sbus_reset_users_memcache(id_ctx->be->provider);
Fabiano Fidêncio 90dd145
     dp_sbus_reset_initgr_memcache(id_ctx->be->provider);
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
-    ret = sysdb_transaction_start(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
-    if (ret != EOK) {
Fabiano Fidêncio 90dd145
-        goto done;
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-    in_transaction = true;
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    ret = delete_all_users(id_ctx->domain);
Fabiano Fidêncio 90dd145
-    if (ret != EOK) {
Fabiano Fidêncio 90dd145
-        goto done;
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    /* All users were deleted, therefore we need to enumerate each file again */
Fabiano Fidêncio 90dd145
-    for (size_t i = 0; id_ctx->passwd_files[i] != NULL; i++) {
Fabiano Fidêncio 90dd145
-        ret = sf_enum_users(id_ctx, id_ctx->passwd_files[i]);
Fabiano Fidêncio 90dd145
-        if (ret != EOK) {
Fabiano Fidêncio 90dd145
-            DEBUG(SSSDBG_OP_FAILURE, "Cannot enumerate users\n");
Fabiano Fidêncio 90dd145
-            goto done;
Fabiano Fidêncio 90dd145
-        }
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    /* Covers the case when someone edits /etc/group, adds a group member and
Fabiano Fidêncio 90dd145
+    /* Using SF_UDPATE_BOTH here the case when someone edits /etc/group, adds a group member and
Fabiano Fidêncio 90dd145
      * only then edits passwd and adds the user. The reverse is not needed,
Fabiano Fidêncio 90dd145
      * because member/memberof links are established when groups are saved.
Fabiano Fidêncio 90dd145
      */
Fabiano Fidêncio 90dd145
-    ret = delete_all_groups(id_ctx->domain);
Fabiano Fidêncio 90dd145
-    if (ret != EOK) {
Fabiano Fidêncio 90dd145
-        goto done;
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    /* All groups were deleted, therefore we need to enumerate each file again */
Fabiano Fidêncio 90dd145
-    for (size_t i = 0; id_ctx->group_files[i] != NULL; i++) {
Fabiano Fidêncio 90dd145
-        ret = sf_enum_groups(id_ctx, id_ctx->group_files[i]);
Fabiano Fidêncio 90dd145
-        if (ret != EOK) {
Fabiano Fidêncio 90dd145
-            DEBUG(SSSDBG_OP_FAILURE, "Cannot enumerate groups\n");
Fabiano Fidêncio 90dd145
-            goto done;
Fabiano Fidêncio 90dd145
-        }
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    ret = sysdb_transaction_commit(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
+    ret = sf_enum_files(id_ctx, SF_UPDATE_BOTH);
Fabiano Fidêncio 90dd145
     if (ret != EOK) {
Fabiano Fidêncio 90dd145
+        DEBUG(SSSDBG_OP_FAILURE,
Fabiano Fidêncio 90dd145
+              "Could not update files: [%d]: %s\n",
Fabiano Fidêncio 90dd145
+              ret, sss_strerror(ret));
Fabiano Fidêncio 90dd145
         goto done;
Fabiano Fidêncio 90dd145
     }
Fabiano Fidêncio 90dd145
-    in_transaction = false;
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
     id_ctx->updating_passwd = false;
Fabiano Fidêncio 90dd145
     sf_cb_done(id_ctx);
Fabiano Fidêncio 90dd145
@@ -790,14 +824,6 @@ static int sf_passwd_cb(const char *filename, uint32_t flags, void *pvt)
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
     ret = EOK;
Fabiano Fidêncio 90dd145
 done:
Fabiano Fidêncio 90dd145
-    if (in_transaction) {
Fabiano Fidêncio 90dd145
-        tret = sysdb_transaction_cancel(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
-        if (tret != EOK) {
Fabiano Fidêncio 90dd145
-            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 90dd145
-                  "Cannot cancel transaction: %d\n", ret);
Fabiano Fidêncio 90dd145
-        }
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
     return ret;
Fabiano Fidêncio 90dd145
 }
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
@@ -805,8 +831,6 @@ static int sf_group_cb(const char *filename, uint32_t flags, void *pvt)
Fabiano Fidêncio 90dd145
 {
Fabiano Fidêncio 90dd145
     struct files_id_ctx *id_ctx;
Fabiano Fidêncio 90dd145
     errno_t ret;
Fabiano Fidêncio 90dd145
-    errno_t tret;
Fabiano Fidêncio 90dd145
-    bool in_transaction = false;
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
     id_ctx = talloc_get_type(pvt, struct files_id_ctx);
Fabiano Fidêncio 90dd145
     if (id_ctx == NULL) {
Fabiano Fidêncio 90dd145
@@ -823,47 +847,20 @@ static int sf_group_cb(const char *filename, uint32_t flags, void *pvt)
Fabiano Fidêncio 90dd145
     dp_sbus_reset_groups_memcache(id_ctx->be->provider);
Fabiano Fidêncio 90dd145
     dp_sbus_reset_initgr_memcache(id_ctx->be->provider);
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
-    ret = sysdb_transaction_start(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
-    if (ret != EOK) {
Fabiano Fidêncio 90dd145
-        goto done;
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-    in_transaction = true;
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    ret = delete_all_groups(id_ctx->domain);
Fabiano Fidêncio 90dd145
-    if (ret != EOK) {
Fabiano Fidêncio 90dd145
-        goto done;
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    /* All groups were deleted, therefore we need to enumerate each file again */
Fabiano Fidêncio 90dd145
-    for (size_t i = 0; id_ctx->group_files[i] != NULL; i++) {
Fabiano Fidêncio 90dd145
-        ret = sf_enum_groups(id_ctx, id_ctx->group_files[i]);
Fabiano Fidêncio 90dd145
-        if (ret != EOK) {
Fabiano Fidêncio 90dd145
-            DEBUG(SSSDBG_OP_FAILURE, "Cannot enumerate groups\n");
Fabiano Fidêncio 90dd145
-            goto done;
Fabiano Fidêncio 90dd145
-        }
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    ret = sysdb_transaction_commit(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
+    ret = sf_enum_files(id_ctx, SF_UPDATE_GROUP);
Fabiano Fidêncio 90dd145
     if (ret != EOK) {
Fabiano Fidêncio 90dd145
+        DEBUG(SSSDBG_OP_FAILURE,
Fabiano Fidêncio 90dd145
+              "Could not update files: [%d]: %s\n",
Fabiano Fidêncio 90dd145
+              ret, sss_strerror(ret));
Fabiano Fidêncio 90dd145
         goto done;
Fabiano Fidêncio 90dd145
     }
Fabiano Fidêncio 90dd145
-    in_transaction = false;
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
     id_ctx->updating_groups = false;
Fabiano Fidêncio 90dd145
     sf_cb_done(id_ctx);
Fabiano Fidêncio 90dd145
     files_account_info_finished(id_ctx, BE_REQ_GROUP, ret);
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
     ret = EOK;
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
 done:
Fabiano Fidêncio 90dd145
-    if (in_transaction) {
Fabiano Fidêncio 90dd145
-        tret = sysdb_transaction_cancel(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
-        if (tret != EOK) {
Fabiano Fidêncio 90dd145
-            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 90dd145
-                  "Cannot cancel transaction: %d\n", ret);
Fabiano Fidêncio 90dd145
-        }
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
     return ret;
Fabiano Fidêncio 90dd145
 }
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
@@ -873,62 +870,14 @@ static void startup_enum_files(struct tevent_context *ev,
Fabiano Fidêncio 90dd145
 {
Fabiano Fidêncio 90dd145
     struct files_id_ctx *id_ctx = talloc_get_type(pvt, struct files_id_ctx);
Fabiano Fidêncio 90dd145
     errno_t ret;
Fabiano Fidêncio 90dd145
-    errno_t tret;
Fabiano Fidêncio 90dd145
-    bool in_transaction = false;
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
     talloc_zfree(imm);
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
-    ret = sysdb_transaction_start(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
-    if (ret != EOK) {
Fabiano Fidêncio 90dd145
-        goto done;
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-    in_transaction = true;
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    ret = delete_all_users(id_ctx->domain);
Fabiano Fidêncio 90dd145
-    if (ret != EOK) {
Fabiano Fidêncio 90dd145
-        goto done;
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    ret = delete_all_groups(id_ctx->domain);
Fabiano Fidêncio 90dd145
+    ret = sf_enum_files(id_ctx, SF_UPDATE_BOTH);
Fabiano Fidêncio 90dd145
     if (ret != EOK) {
Fabiano Fidêncio 90dd145
-        goto done;
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    for (size_t i = 0; id_ctx->passwd_files[i] != NULL; i++) {
Fabiano Fidêncio 90dd145
-        DEBUG(SSSDBG_TRACE_FUNC,
Fabiano Fidêncio 90dd145
-              "Startup user enumeration of [%s]\n", id_ctx->passwd_files[i]);
Fabiano Fidêncio 90dd145
-        ret = sf_enum_users(id_ctx, id_ctx->passwd_files[i]);
Fabiano Fidêncio 90dd145
-        if (ret != EOK) {
Fabiano Fidêncio 90dd145
-            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 90dd145
-                  "Enumerating users failed, data might be inconsistent!\n");
Fabiano Fidêncio 90dd145
-            goto done;
Fabiano Fidêncio 90dd145
-        }
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    for (size_t i = 0; id_ctx->group_files[i] != NULL; i++) {
Fabiano Fidêncio 90dd145
-        DEBUG(SSSDBG_TRACE_FUNC,
Fabiano Fidêncio 90dd145
-              "Startup group enumeration of [%s]\n", id_ctx->group_files[i]);
Fabiano Fidêncio 90dd145
-        ret = sf_enum_groups(id_ctx, id_ctx->group_files[i]);
Fabiano Fidêncio 90dd145
-        if (ret != EOK) {
Fabiano Fidêncio 90dd145
-            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 90dd145
-                  "Enumerating groups failed, data might be inconsistent!\n");
Fabiano Fidêncio 90dd145
-            goto done;
Fabiano Fidêncio 90dd145
-        }
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-    ret = sysdb_transaction_commit(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
-    if (ret != EOK) {
Fabiano Fidêncio 90dd145
-        goto done;
Fabiano Fidêncio 90dd145
-    }
Fabiano Fidêncio 90dd145
-    in_transaction = false;
Fabiano Fidêncio 90dd145
-
Fabiano Fidêncio 90dd145
-done:
Fabiano Fidêncio 90dd145
-    if (in_transaction) {
Fabiano Fidêncio 90dd145
-        tret = sysdb_transaction_cancel(id_ctx->domain->sysdb);
Fabiano Fidêncio 90dd145
-        if (tret != EOK) {
Fabiano Fidêncio 90dd145
-            DEBUG(SSSDBG_CRIT_FAILURE,
Fabiano Fidêncio 90dd145
-                  "Cannot cancel transaction: %d\n", ret);
Fabiano Fidêncio 90dd145
-        }
Fabiano Fidêncio 90dd145
+        DEBUG(SSSDBG_OP_FAILURE,
Fabiano Fidêncio 90dd145
+              "Could not update files after startup: [%d]: %s\n",
Fabiano Fidêncio 90dd145
+              ret, sss_strerror(ret));
Fabiano Fidêncio 90dd145
     }
Fabiano Fidêncio 90dd145
 }
Fabiano Fidêncio 90dd145
 
Fabiano Fidêncio 90dd145
-- 
Fabiano Fidêncio 90dd145
2.14.3
Fabiano Fidêncio 90dd145