-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Before a deletion, search the sysdb for the entity and error
out if it cannot be found.

Fixes: RHBZ #513247, RHBZ #513250

        Jakub


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iEYEARECAAYFAkpxz1cACgkQHsardTLnvCUDKgCgzysB1MIWtWcfeGSK+T0ZFIh5
jZAAnAk1YmPZx/WT3ry4ilzKqHZZLFUm
=LShj
-----END PGP SIGNATURE-----
>From e86f98b85f64b4d79ef0af386be91b0ee85df7dd Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhro...@redhat.com>
Date: Thu, 30 Jul 2009 11:40:08 +0200
Subject: [PATCH] Notify user when deleting nonexistent user or group

Before a deletion, search the sysdb for the entity and error
out if it cannot be found.

Fixes: RHBZ #513247, RHBZ #513250
---
 server/tools/sss_groupdel.c |   42 ++++++++++++++++++++++++++++++++++-----
 server/tools/sss_userdel.c  |   45 +++++++++++++++++++++++++++++++++++-------
 server/tools/tools_util.h   |    1 +
 3 files changed, 74 insertions(+), 14 deletions(-)

diff --git a/server/tools/sss_groupdel.c b/server/tools/sss_groupdel.c
index 98d73c3..be35053 100644
--- a/server/tools/sss_groupdel.c
+++ b/server/tools/sss_groupdel.c
@@ -77,12 +77,12 @@ fail:
 }
 
 static void group_del_done(struct tevent_req *subreq);
+static void group_search_done(struct tevent_req *subreq);
 
 static void group_del(struct tevent_req *req)
 {
     struct ops_ctx *data = tevent_req_callback_data(req, struct ops_ctx);
     struct tevent_req *subreq;
-    struct ldb_dn *group_dn;
     int ret;
 
     ret = sysdb_transaction_recv(req, data, &data->handle);
@@ -90,18 +90,40 @@ static void group_del(struct tevent_req *req)
         return groupdel_done(data, ret, NULL);
     }
 
-    group_dn = sysdb_group_dn(data->ctx->sysdb, data,
+    data->dn = sysdb_group_dn(data->ctx->sysdb, data,
                               data->domain->name, data->name);
-    if (group_dn == NULL) {
+    if (data->dn == NULL) {
         DEBUG(1, ("Could not construct a group DN\n"));
         return groupdel_done(data, ENOMEM, NULL);
     }
 
-    subreq = sysdb_delete_entry_send(data, data->ev, data->handle, group_dn);
+    subreq = sysdb_search_entry_send(data, data->ev, data->handle,
+                                     data->dn, LDB_SCOPE_BASE, NULL, NULL);
     if (!subreq)
+        return groupdel_done(data, ENOMEM, NULL);
+
+    tevent_req_set_callback(subreq, group_search_done, req);
+}
+
+static void group_search_done(struct tevent_req *subreq)
+{
+    struct tevent_req *req = tevent_req_callback_data(subreq,
+                                                      struct tevent_req);
+    struct ops_ctx *data = tevent_req_callback_data(req, struct ops_ctx);
+    int ret;
+    struct ldb_message *msg;
+    struct tevent_req *delreq;
+
+    ret = sysdb_search_entry_recv(subreq, data, &msg);
+    if (ret) {
         return groupdel_done(data, ret, NULL);
+    }
 
-    tevent_req_set_callback(subreq, group_del_done, data);
+    delreq = sysdb_delete_entry_send(data, data->ev, data->handle, data->dn);
+    if (!delreq)
+        return groupdel_done(data, ENOMEM, NULL);
+
+    tevent_req_set_callback(delreq, group_del_done, data);
 }
 
 static void group_del_done(struct tevent_req *subreq)
@@ -255,7 +277,15 @@ int main(int argc, const char **argv)
     if (data->error) {
         ret = data->error;
         DEBUG(1, ("sysdb operation failed (%d)[%s]\n", ret, strerror(ret)));
-        ERROR("Transaction error. Could not remove group.\n");
+        switch (ret) {
+            case ENOENT:
+                ERROR("No such group\n");
+                break;
+
+            default:
+                ERROR("Internal error. Could not remove group.\n");
+                break;
+        }
         ret = EXIT_FAILURE;
         goto fini;
     }
diff --git a/server/tools/sss_userdel.c b/server/tools/sss_userdel.c
index f70482c..b8b466a 100644
--- a/server/tools/sss_userdel.c
+++ b/server/tools/sss_userdel.c
@@ -76,12 +76,12 @@ fail:
 }
 
 static void user_del_done(struct tevent_req *subreq);
+static void user_search_done(struct tevent_req *subreq);
 
 static void user_del(struct tevent_req *req)
 {
     struct ops_ctx *data;
     struct tevent_req *subreq;
-    struct ldb_dn *user_dn;
     int ret;
 
     data = tevent_req_callback_data(req, struct ops_ctx);
@@ -91,18 +91,40 @@ static void user_del(struct tevent_req *req)
         return userdel_done(data, ret, NULL);
     }
 
-    user_dn = sysdb_user_dn(data->ctx->sysdb, data,
-                            data->domain->name, data->name);
-    if (!user_dn) {
+    data->dn = sysdb_user_dn(data->ctx->sysdb, data,
+                             data->domain->name, data->name);
+    if (!data->dn) {
         DEBUG(1, ("Could not construct a user DN\n"));
         return userdel_done(data, ENOMEM, NULL);
     }
 
-    subreq = sysdb_delete_entry_send(data, data->ev, data->handle, user_dn);
+    subreq = sysdb_search_entry_send(data, data->ev, data->handle,
+                                     data->dn, LDB_SCOPE_BASE, NULL, NULL);
     if (!subreq)
+        return userdel_done(data, ENOMEM, NULL);
+
+    tevent_req_set_callback(subreq, user_search_done, req);
+}
+
+static void user_search_done(struct tevent_req *subreq)
+{
+    struct tevent_req *req = tevent_req_callback_data(subreq,
+                                                      struct tevent_req);
+    struct ops_ctx *data = tevent_req_callback_data(req, struct ops_ctx);
+    int ret;
+    struct ldb_message *msg;
+    struct tevent_req *delreq;
+
+    ret = sysdb_search_entry_recv(subreq, data, &msg);
+    if (ret) {
         return userdel_done(data, ret, NULL);
+    }
 
-    tevent_req_set_callback(subreq, user_del_done, data);
+    delreq = sysdb_delete_entry_send(data, data->ev, data->handle, data->dn);
+    if (!delreq)
+        return userdel_done(data, ENOMEM, NULL);
+
+    tevent_req_set_callback(delreq, user_del_done, data);
 }
 
 static void user_del_done(struct tevent_req *subreq)
@@ -115,7 +137,6 @@ static void user_del_done(struct tevent_req *subreq)
     return userdel_done(data, ret, NULL);
 }
 
-
 static int userdel_legacy(struct ops_ctx *ctx)
 {
     int ret = EOK;
@@ -257,7 +278,15 @@ int main(int argc, const char **argv)
     if (data->error) {
         ret = data->error;
         DEBUG(1, ("sysdb operation failed (%d)[%s]\n", ret, strerror(ret)));
-        ERROR("Internal error. Could not remove user.\n");
+        switch (ret) {
+            case ENOENT:
+                ERROR("No such user\n");
+                break;
+
+            default:
+                ERROR("Internal error. Could not remove user.\n");
+                break;
+        }
         ret = EXIT_FAILURE;
         goto fini;
     }
diff --git a/server/tools/tools_util.h b/server/tools/tools_util.h
index 5bf3b38..008ee8a 100644
--- a/server/tools/tools_util.h
+++ b/server/tools/tools_util.h
@@ -69,6 +69,7 @@ struct ops_ctx {
     struct sysdb_handle *handle;
     int error;
     bool done;
+    struct ldb_dn *dn;
 };
 
 int init_sss_tools(struct tools_ctx **ctx);
-- 
1.6.2.5



_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to