summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2009-03-07 00:33:10 +0100
committerStephen Gallagher <sgallagh@redhat.com>2009-03-07 09:08:15 -0500
commit1beae32fc6232ceab2d426e189fa6a3f91a721fa (patch)
tree463474567d2fde25f62ede51d5f42d4725b098e2
parentecb8965f030eeb0cadf18394bccf8e760831e400 (diff)
downloadsssd-1beae32fc6232ceab2d426e189fa6a3f91a721fa.tar.gz
sssd-1beae32fc6232ceab2d426e189fa6a3f91a721fa.tar.bz2
sssd-1beae32fc6232ceab2d426e189fa6a3f91a721fa.zip
sss_groupdel, delete by DN in sss_userdel
Don't convert username->uid in userdel, use DN
-rw-r--r--server/Makefile.in2
-rw-r--r--server/server.mk3
-rw-r--r--server/tools/sss_groupdel.c167
-rw-r--r--server/tools/sss_userdel.c83
-rw-r--r--sssd.spec1
5 files changed, 182 insertions, 74 deletions
diff --git a/server/Makefile.in b/server/Makefile.in
index f450af1b..b71d4ccd 100644
--- a/server/Makefile.in
+++ b/server/Makefile.in
@@ -118,7 +118,7 @@ endif
ifneq (x$(HAVE_POLICYKIT), x)
LIBEXECBINS += sbin/sssd_pk
endif
-TOOLSBINS = sbin/sss_useradd sbin/sss_userdel sbin/sss_groupadd
+TOOLSBINS = sbin/sss_useradd sbin/sss_userdel sbin/sss_groupadd sbin/sss_groupdel
BINS = sbin/sssd $(LIBEXECBINS) $(TOOLSBINS)
ifneq (x$(HAVE_TESTS), x)
diff --git a/server/server.mk b/server/server.mk
index 59ca5d41..b0040f39 100644
--- a/server/server.mk
+++ b/server/server.mk
@@ -139,3 +139,6 @@ sbin/sss_userdel: $(USERDEL_OBJ) $(TOOLS_OBJ) $(UTIL_OBJ)
sbin/sss_groupadd: $(GROUPADD_OBJ) $(TOOLS_OBJ) $(UTIL_OBJ)
$(CC) -o sbin/sss_groupadd $(GROUPADD_OBJ) $(TOOLS_OBJ) $(UTIL_OBJ) $(LDFLAGS) $(LIBS)
+
+sbin/sss_groupdel: $(GROUPDEL_OBJ) $(TOOLS_OBJ) $(UTIL_OBJ)
+ $(CC) -o sbin/sss_groupdel $(GROUPDEL_OBJ) $(TOOLS_OBJ) $(UTIL_OBJ) $(LDFLAGS) $(LIBS)
diff --git a/server/tools/sss_groupdel.c b/server/tools/sss_groupdel.c
new file mode 100644
index 00000000..1950aaef
--- /dev/null
+++ b/server/tools/sss_groupdel.c
@@ -0,0 +1,167 @@
+/*
+ SSSD
+
+ sss_groupdel
+
+ Copyright (C) Jakub Hrozek <jhrozek@redhat.com> 2009
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <talloc.h>
+#include <popt.h>
+#include <sys/types.h>
+
+#include "db/sysdb.h"
+#include "util/util.h"
+#include "tools/tools_util.h"
+
+struct group_del_ctx {
+ struct sysdb_req *sysreq;
+ sysdb_callback_t next_fn;
+
+ const char *groupname;
+ struct ldb_dn *group_dn;
+
+ struct sss_domain_info *domain;
+ struct tools_ctx *ctx;
+
+ int error;
+ bool done;
+};
+
+/* sysdb callback */
+static void groupdel_done(void *pvt, int error, struct ldb_result *ignore)
+{
+ struct group_del_ctx *data = talloc_get_type(pvt, struct group_del_ctx);
+
+ data->done = true;
+
+ sysdb_transaction_done(data->sysreq, error);
+
+ if (error)
+ data->error = error;
+}
+
+/* sysdb_req_fn_t */
+static void group_del(struct sysdb_req *req, void *pvt)
+{
+ struct group_del_ctx *group_ctx;
+ int ret;
+
+ group_ctx = talloc_get_type(pvt, struct group_del_ctx);
+ group_ctx->sysreq = req;
+
+ ret = sysdb_delete_entry(req,
+ group_ctx->group_dn,
+ groupdel_done,
+ group_ctx);
+
+ if(ret != EOK)
+ groupdel_done(group_ctx, ret, NULL);
+}
+
+int main(int argc, const char **argv)
+{
+ int ret = EXIT_SUCCESS;
+ struct group_del_ctx *group_ctx = NULL;
+ struct tools_ctx *ctx = NULL;
+
+
+ poptContext pc;
+ struct poptOption long_options[] = {
+ POPT_AUTOHELP
+ POPT_TABLEEND
+ };
+
+ debug_prg_name = argv[0];
+
+ ret = setup_db(&ctx);
+ if(ret != EOK) {
+ DEBUG(0, ("Could not set up database\n"));
+ ret = EXIT_FAILURE;
+ goto fini;
+ }
+
+ group_ctx = talloc_zero(NULL, struct group_del_ctx);
+ if (group_ctx == NULL) {
+ DEBUG(0, ("Could not allocate memory for group_ctx context\n"));
+ return ENOMEM;
+ }
+ group_ctx->ctx = ctx;
+
+ /* parse group_ctx */
+ pc = poptGetContext(NULL, argc, argv, long_options, 0);
+ poptSetOtherOptionHelp(pc, "USERNAME");
+ if((ret = poptGetNextOpt(pc)) < -1) {
+ usage(pc, poptStrerror(ret));
+ ret = EXIT_FAILURE;
+ goto fini;
+ }
+
+ group_ctx->groupname = poptGetArg(pc);
+ if(group_ctx->groupname == NULL) {
+ usage(pc, "Specify group to delete\n");
+ ret = EXIT_FAILURE;
+ goto fini;
+ }
+
+ /* arguments processed, go on to actual work */
+
+ group_ctx->domain = btreemap_get_value(ctx->domains, "LOCAL");
+ if (group_ctx->domain == NULL) {
+ DEBUG(0, ("Could not set default values\n"));
+ ret = EXIT_FAILURE;
+ goto fini;
+ }
+
+ group_ctx->group_dn = sysdb_group_dn(ctx->sysdb, ctx,
+ group_ctx->domain->name,
+ group_ctx->groupname);
+ if(group_ctx->group_dn == NULL) {
+ DEBUG(0, ("Could not construct a group DN\n"));
+ ret = EXIT_FAILURE;
+ goto fini;
+ }
+
+ /* groupdel */
+ ret = sysdb_transaction(ctx, ctx->sysdb, group_del, group_ctx);
+ if(ret != EOK) {
+ DEBUG(1, ("Could not start transaction (%d)[%s]\n", ret, strerror(ret)));
+ ret = EXIT_FAILURE;
+ goto fini;
+ }
+
+ while (!group_ctx->done) {
+ tevent_loop_once(ctx->ev);
+ }
+
+ if (group_ctx->error) {
+ ret = group_ctx->error;
+ DEBUG(0, ("Operation failed (%d)[%s]\n", ret, strerror(ret)));
+ ret = EXIT_FAILURE;
+ goto fini;
+ }
+
+ ret = EXIT_SUCCESS;
+
+fini:
+ talloc_free(ctx);
+ talloc_free(group_ctx);
+ poptFreeContext(pc);
+ exit(ret);
+}
+
diff --git a/server/tools/sss_userdel.c b/server/tools/sss_userdel.c
index 1fa00fb3..e0f6300e 100644
--- a/server/tools/sss_userdel.c
+++ b/server/tools/sss_userdel.c
@@ -33,7 +33,7 @@ struct user_del_ctx {
sysdb_callback_t next_fn;
const char *username;
- uid_t uid;
+ struct ldb_dn *user_dn;
struct sss_domain_info *domain;
struct tools_ctx *ctx;
@@ -42,38 +42,6 @@ struct user_del_ctx {
bool done;
};
-struct fetch_user {
- uid_t uid;
- int error;
- bool done;
-};
-
-static void getpwnam_callback(void *ptr, int error, struct ldb_result *res)
-{
- struct fetch_user *data = talloc_get_type(ptr, struct fetch_user);
-
- data->done = true;
-
- if (error) {
- data->error = error;
- return;
- }
-
- switch (res->count) {
- case 0:
- data->error = ENOENT;
- break;
-
- case 1:
- data->uid = ldb_msg_find_attr_as_uint(res->msgs[0], SYSDB_UIDNUM, 0);
- break;
-
- default:
- data->error = EFAULT;
- break;
- }
-}
-
/* sysdb callback */
static void userdel_done(void *pvt, int error, struct ldb_result *ignore)
{
@@ -96,10 +64,10 @@ static void user_del(struct sysdb_req *req, void *pvt)
user_ctx = talloc_get_type(pvt, struct user_del_ctx);
user_ctx->sysreq = req;
- ret = sysdb_delete_user_by_uid(req, "LOCAL",
- user_ctx->uid,
- userdel_done,
- user_ctx);
+ ret = sysdb_delete_entry(req,
+ user_ctx->user_dn,
+ userdel_done,
+ user_ctx);
if(ret != EOK)
userdel_done(user_ctx, ret, NULL);
@@ -110,7 +78,6 @@ int main(int argc, const char **argv)
int ret = EXIT_SUCCESS;
struct user_del_ctx *user_ctx = NULL;
struct tools_ctx *ctx = NULL;
- struct fetch_user *fetch_ctx = NULL;
poptContext pc;
@@ -135,12 +102,6 @@ int main(int argc, const char **argv)
}
user_ctx->ctx = ctx;
- fetch_ctx = talloc_zero(ctx, struct fetch_user);
- if (fetch_ctx == NULL) {
- DEBUG(0, ("Could not allocate memory for fetch_user context\n"));
- return ENOMEM;
- }
-
/* parse user_ctx */
pc = poptGetContext(NULL, argc, argv, long_options, 0);
poptSetOtherOptionHelp(pc, "USERNAME");
@@ -166,39 +127,15 @@ int main(int argc, const char **argv)
goto fini;
}
- /* Look up uid for given username */
- ret = sysdb_getpwnam(fetch_ctx, ctx->sysdb,
- "LOCAL",
- user_ctx->username,
- false,
- getpwnam_callback,
- fetch_ctx);
- if(ret != EOK) {
- DEBUG(1, ("sysdb_getpwnam failed: %d\n", ret));
+ user_ctx->user_dn = sysdb_user_dn(ctx->sysdb, ctx,
+ user_ctx->domain->name,
+ user_ctx->username);
+ if(user_ctx->user_dn == NULL) {
+ DEBUG(0, ("Could not construct an user DN\n"));
ret = EXIT_FAILURE;
goto fini;
}
- while (!fetch_ctx->done) {
- tevent_loop_once(ctx->ev);
- }
-
- if(fetch_ctx->error) {
- ret = fetch_ctx->error;
- switch(ret) {
- case ENOENT:
- DEBUG(0, ("No such user: %s\n", user_ctx->username));
- break;
-
- default:
- DEBUG(0, ("sysdb_getpwnam failed: (%d) [%s]\n",
- ret, strerror(ret)));
- break;
- }
- goto fini;
- }
-
- user_ctx->uid = fetch_ctx->uid;
/* userdel */
ret = sysdb_transaction(ctx, ctx->sysdb, user_del, user_ctx);
diff --git a/sssd.spec b/sssd.spec
index 0082bd26..923bf31f 100644
--- a/sssd.spec
+++ b/sssd.spec
@@ -90,6 +90,7 @@ rm -rf $RPM_BUILD_ROOT
%{_sbindir}/sss_useradd
%{_sbindir}/sss_userdel
%{_sbindir}/sss_groupadd
+%{_sbindir}/sss_groupdel
%{_libexecdir}/%{servicename}/
%{_libdir}/%{name}/
%{_libdir}/ldb/memberof.so*