sss_userdel.c revision 95cc95749a5e783f2b5d2124d783f85820baf937
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/*
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen SSSD
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen sss_userdel
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen Copyright (C) Jakub Hrozek <jhrozek@redhat.com> 2009
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen This program is free software; you can redistribute it and/or modify
a85473f7c11c8734bdee9c2cbe4b767f144a18aaTimo Sirainen it under the terms of the GNU General Public License as published by
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen the Free Software Foundation; either version 3 of the License, or
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen (at your option) any later version.
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen This program is distributed in the hope that it will be useful,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen GNU General Public License for more details.
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen You should have received a copy of the GNU General Public License
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen*/
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#include <stdio.h>
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#include <stdlib.h>
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#include <talloc.h>
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#include <popt.h>
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#include <sys/types.h>
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#include <sys/wait.h>
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#include "db/sysdb.h"
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#include "util/util.h"
de3175adb4094086dc8ba13132a39567f9c42e54Timo Sirainen#include "util/find_uid.h"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#include "tools/tools_util.h"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#include "tools/sss_sync_ops.h"
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#ifndef KILL_CMD
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#define KILL_CMD "killall"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#endif
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#ifndef KILL_CMD_USER_FLAG
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen#define KILL_CMD_USER_FLAG "-u"
ec047a9c54a02338e85fb1767120b0923f6d4148Timo Sirainen#endif
ec047a9c54a02338e85fb1767120b0923f6d4148Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#ifndef KILL_CMD_SIGNAL_FLAG
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#define KILL_CMD_SIGNAL_FLAG "-s"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#endif
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#ifndef KILL_CMD_SIGNAL
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#define KILL_CMD_SIGNAL "SIGKILL"
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen#endif
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainenstatic int is_logged_in(TALLOC_CTX *mem_ctx, uid_t uid)
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen{
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen int ret;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen hash_key_t key;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen hash_value_t value;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen hash_table_t *uid_table;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = get_uid_table(mem_ctx, &uid_table);
3c73d884362b72c86753939551c94f8baa5702f8Timo Sirainen if (ret == ENOSYS) return ret;
3c73d884362b72c86753939551c94f8baa5702f8Timo Sirainen if (ret != EOK) {
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen DEBUG(1, ("Cannot initialize hash table.\n"));
ce0e25f26d6e67480ee39b5ca0ad634fa60c4605Timo Sirainen return ret;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen key.type = HASH_KEY_ULONG;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen key.ul = (unsigned long) uid;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen ret = hash_lookup(uid_table, &key, &value);
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen talloc_zfree(uid_table);
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen return ret == HASH_SUCCESS ? EOK : ENOENT;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen}
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainenstatic int kick_user(struct tools_ctx *tctx)
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen{
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen int ret;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen int status;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen pid_t pid, child_pid;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen tctx->octx->lock = 1;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen ret = usermod(tctx, tctx->sysdb, tctx->octx);
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen if (ret != EOK) {
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen return ret;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen }
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen errno = 0;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen pid = fork();
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (pid == 0) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen /* child */
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen execlp(KILL_CMD, KILL_CMD,
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen KILL_CMD_USER_FLAG, tctx->octx->name,
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen KILL_CMD_SIGNAL_FLAG, KILL_CMD_SIGNAL,
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen (char *) NULL);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen exit(errno);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen } else {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen /* parent */
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (pid == -1) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(1, ("fork failed [%d]: %s\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen return errno;
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen }
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen while((child_pid = waitpid(pid, &status, 0)) > 0) {
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen if (child_pid == -1) {
c307328f59c963eba21091ecd36c9435d42b47d8Timo Sirainen DEBUG(1, ("waitpid failed\n"));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen return errno;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen if (WIFEXITED(status)) {
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen break;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen }
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen }
887a9fbbb2ca6afd53365ba2ccae0ef8728d6948Timo Sirainen }
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen return EOK;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen}
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen
887a9fbbb2ca6afd53365ba2ccae0ef8728d6948Timo Sirainenint main(int argc, const char **argv)
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen{
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen int ret = EXIT_SUCCESS;
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen struct tools_ctx *tctx = NULL;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen const char *pc_username = NULL;
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen
55d33f807765482eb47374aaaced1fe714e0b256Timo Sirainen int pc_debug = SSSDBG_DEFAULT;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen int pc_remove = 0;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen int pc_force = 0;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen int pc_kick = 0;
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen poptContext pc = NULL;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen struct poptOption long_options[] = {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen POPT_AUTOHELP
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen { "debug", '\0', POPT_ARG_INT | POPT_ARGFLAG_DOC_HIDDEN, &pc_debug,
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen 0, _("The debug level to run with"), NULL },
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen { "remove", 'r', POPT_ARG_NONE, NULL, 'r',
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen _("Remove home directory and mail spool"), NULL },
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen { "no-remove", 'R', POPT_ARG_NONE, NULL, 'R',
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen _("Do not remove home directory and mail spool"), NULL },
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen { "force", 'f', POPT_ARG_NONE, NULL, 'f',
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen _("Force removal of files not owned by the user"), NULL },
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen { "kick", 'k', POPT_ARG_NONE, NULL, 'k',
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen _("Kill users' processes before removing him"), NULL },
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen POPT_TABLEEND
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen };
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen debug_prg_name = argv[0];
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen ret = set_locale();
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen DEBUG(1, ("set_locale failed (%d): %s\n", ret, strerror(ret)));
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen ERROR("Error setting the locale\n");
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen ret = EXIT_FAILURE;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen goto fini;
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen }
33bd898e7756b289e65f43133312d9637afc1371Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen /* parse parameters */
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen pc = poptGetContext(NULL, argc, argv, long_options, 0);
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen poptSetOtherOptionHelp(pc, "USERNAME");
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen while ((ret = poptGetNextOpt(pc)) > 0) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen switch (ret) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen case 'r':
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen pc_remove = DO_REMOVE_HOME;
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen break;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen case 'R':
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen pc_remove = DO_NOT_REMOVE_HOME;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen break;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen case 'f':
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen pc_force = DO_FORCE_REMOVAL;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen break;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen case 'k':
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen pc_kick = 1;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen break;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen }
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen debug_level = debug_convert_old_level(pc_debug);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != -1) {
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen BAD_POPT_PARAMS(pc, poptStrerror(ret), ret, fini);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
c7be65f5adbc2990fbe6eeffb6df5054a8a49d9dTimo Sirainen pc_username = poptGetArg(pc);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (pc_username == NULL) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen BAD_POPT_PARAMS(pc, _("Specify user to delete\n"), ret, fini);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen CHECK_ROOT(ret, debug_prg_name);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen ret = init_sss_tools(&tctx);
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen if (ret != EOK) {
9f240e2ce97176146b63506a8ee04034f712cf45Timo Sirainen DEBUG(1, ("init_sss_tools failed (%d): %s\n", ret, strerror(ret)));
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret == ENOENT) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ERROR("Error initializing the tools - no local domain\n");
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen } else {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ERROR("Error initializing the tools\n");
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen ret = EXIT_FAILURE;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto fini;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen /* if the domain was not given as part of FQDN, default to local domain */
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = parse_name_domain(tctx, pc_username);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen if (ret != EOK) {
887a9fbbb2ca6afd53365ba2ccae0ef8728d6948Timo Sirainen ERROR("Invalid domain specified in FQDN\n");
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = EXIT_FAILURE;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto fini;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen }
36723cf206a7b64b9d972ab0719bbfaacc9316faTimo Sirainen
efeb13303798b47d2c4295468d233c1bcfd79c94Timo Sirainen /*
307ec6c2c319e3335ddb1a7aca2d2884fe17fae0Timo Sirainen * Fills in defaults for ops_ctx user did not specify.
307ec6c2c319e3335ddb1a7aca2d2884fe17fae0Timo Sirainen */
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen ret = userdel_defaults(tctx, tctx->confdb, tctx->octx, pc_remove);
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen if (ret != EOK) {
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen ERROR("Cannot set default values\n");
975a784c2e02ecdcb56efb7a1db5e4769c7756d8Timo Sirainen ret = EXIT_FAILURE;
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen goto fini;
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen }
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen
14b1d2a2634e75b988078baee1e8ad678de28a04Timo Sirainen ret = sysdb_getpwnam_sync(tctx,
14b1d2a2634e75b988078baee1e8ad678de28a04Timo Sirainen tctx->sysdb,
45af47783693b3ba2768c5ad34eeff68132382d0Timo Sirainen tctx->octx->name,
45af47783693b3ba2768c5ad34eeff68132382d0Timo Sirainen tctx->octx);
afd6d387ea65843b59fb6051fb567719d2a5279cAki Tuomi if (ret != EOK) {
afd6d387ea65843b59fb6051fb567719d2a5279cAki Tuomi /* Error message will be printed in the switch */
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
e83126866761632b437e532dfdc30be01d14039dTimo Sirainen }
70df8f39fb3db7c49b18c855178f8172176a037aTimo Sirainen
70df8f39fb3db7c49b18c855178f8172176a037aTimo Sirainen if ((tctx->octx->uid < tctx->local->id_min) ||
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen (tctx->local->id_max && tctx->octx->uid > tctx->local->id_max)) {
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen ERROR("User %1$s is outside the defined ID range for domain\n",
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen tctx->octx->name);
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen ret = EXIT_FAILURE;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto fini;
6abf66a3731d52889517bd644595c540e3a9b3ecTimo Sirainen }
3561c7bb472a78af74d755219cc0fc71c85ff5c2Timo Sirainen
ee8294dbc7bb549557f6ba1264d66b55fbef69b6Aki Tuomi if (pc_kick) {
ae949831f1f668b5501b4b125e7f7b1767fb109bTimo Sirainen ret = kick_user(tctx);
2e652d2651b2800f99a17dcb3014a009fe4660d3Timo Sirainen if (ret != EOK) {
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen tctx->error = ret;
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen
7bd5b1c64cc987715bdaf8cc4907c3c37d5d7b29Timo Sirainen goto done;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen }
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen }
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen /* userdel */
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ret = userdel(tctx, tctx->sysdb, tctx->octx);
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen if (ret != EOK) {
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen goto done;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen }
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen /* Set SELinux login context - must be done after transaction is done
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen * b/c libselinux calls getpwnam */
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ret = del_seuser(tctx->octx->name);
237a6211c7fc4d6dbb58dd0467da6dba1b8f21f6Timo Sirainen if (ret != EOK) {
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ERROR("Cannot reset SELinux login context\n");
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ret = EXIT_FAILURE;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen goto fini;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen }
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen if (!pc_kick) {
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen ret = is_logged_in(tctx, tctx->octx->uid);
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen switch(ret) {
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen case ENOENT:
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen break;
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen case EOK:
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen ERROR("WARNING: The user (uid %1$lu) was still logged in when "
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen "deleted.\n", (unsigned long) tctx->octx->uid);
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen break;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen case ENOSYS:
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ERROR("Cannot determine if the user was logged in on this "
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen "platform");
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen break;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen default:
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ERROR("Error while checking if the user was logged in\n");
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen break;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen }
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen }
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ret = run_userdel_cmd(tctx);
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen if (ret != EOK) {
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ERROR("The post-delete command failed: %1$s\n", strerror(ret));
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen goto fini;
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen }
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen if (tctx->octx->remove_homedir) {
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ret = remove_homedir(tctx,
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen tctx->octx->home,
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen tctx->octx->maildir,
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen tctx->octx->name,
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen tctx->octx->uid,
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen pc_force);
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen if (ret == EPERM) {
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ERROR("Not removing home dir - not owned by user\n");
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen } else if (ret != EOK) {
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ERROR("Cannot remove homedir: %1$s\n", strerror(ret));
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen ret = EXIT_FAILURE;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen goto fini;
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen }
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen }
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainendone:
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen if (ret) {
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen DEBUG(1, ("sysdb operation failed (%d)[%s]\n", ret, strerror(ret)));
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen switch (ret) {
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen case ENOENT:
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen ERROR("No such user in local domain. "
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen "Removing users only allowed in local domain.\n");
70058d29cf8c77501741ddbc39178cfc87ca459eTimo Sirainen break;
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen default:
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen ERROR("Internal error. Could not remove user.\n");
464e82904c6670bd6c96b8793ceb294d776d6f44Timo Sirainen break;
40440c0fee87be994ba7eb60fc3512a9355708aaTimo Sirainen }
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen ret = EXIT_FAILURE;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen goto fini;
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen }
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen
14f6fe5d6c4834f273ca573c23c0659a93123363Timo Sirainen ret = EXIT_SUCCESS;
979d89c147520f2934c14c31aeb9310fd2d62a46Timo Sirainen
d519a0449d0e536a32db93305516fdbd7db6773dTimo Sirainenfini:
d519a0449d0e536a32db93305516fdbd7db6773dTimo Sirainen talloc_free(tctx);
ee8294dbc7bb549557f6ba1264d66b55fbef69b6Aki Tuomi poptFreeContext(pc);
ee8294dbc7bb549557f6ba1264d66b55fbef69b6Aki Tuomi exit(ret);
3561c7bb472a78af74d755219cc0fc71c85ff5c2Timo Sirainen}
ae949831f1f668b5501b4b125e7f7b1767fb109bTimo Sirainen
ae949831f1f668b5501b4b125e7f7b1767fb109bTimo Sirainen