-----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