aboutsummaryrefslogtreecommitdiff
path: root/cli/Commands/User/UsersDelete.php
blob: 33b41c30c29498958d87a24e5391aa7fe4589d00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php

namespace Studip\Cli\Commands\User;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class UsersDelete extends Command
{
    protected static $defaultName = 'user:delete';

    protected function configure(): void
    {
        $this->setDescription('Delete users.');
        $this->setHelp('Delete multiple studip user accounts');
        $this->addArgument('range', InputArgument::REQUIRED, 'Username or path to csv-file');
        $this->addOption(
            'file_range',
            'f',
            InputOption::VALUE_OPTIONAL,
            'Set to true, if you want use a txt file with username',
            true
        );
        $this->addOption('email', 'e', InputOption::VALUE_OPTIONAL, 'Send a deletion email', true);
        $this->addOption(
            'delete_admins',
            'd',
            InputOption::VALUE_OPTIONAL,
            'Admins can also be deleted on request',
            false
        );
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $range = $input->getArgument('range');
        $file_range = $input->getOption('file_range');
        $email = $input->getOption('email');
        $delete_admins = $input->getOption('delete_admins');

        if ($email && !($MAIL_LOCALHOST && $MAIL_HOST_NAME && $ABSOLUTE_URI_STUDIP)) {
            $output->writeln(
                "<error>To use this script you MUST set correct values for $MAIL_LOCALHOST, $MAIL_HOST_NAME and $ABSOLUTE_URI_STUDIP in local.inc!</error>"
            );
        }

        if (!(bool) $file_range) {
            $usernames = [$range];
        } else {
            if (!is_file($range)) {
                $output->writeln(sprintf('<error>File not found: %s</error>', $range));
                return Command::FAILURE;
            }
            $file = fopen($range, 'r');
            $list = '';
            while (!feof($file)) {
                $list .= fgets($file, 1024);
            }
            $usernames = preg_split('/[\s,;]+/', $list, -1, PREG_SPLIT_NO_EMPTY);
            $usernames = array_unique($usernames);
        }

        $users = \User::findBySQL('username IN (?)', [$usernames]);

        if (!empty($users)) {
            foreach ($users as $user) {
                if (!$delete_admins && ($user->perms == 'admin' || $user->perms == 'root')) {
                    $output->writeln(sprintf('User: %s is %s, NOT deleted', $user->username, $user->perms));
                } else {
                    $umanager = new \UserManagement($user->id);
                    //wenn keine Email gewünscht, Adresse aus den Daten löschen
                    if (!$email) {
                        $umanager->user_data['auth_user_md5.Email'] = '';
                    }
                    if ($umanager->deleteUser()) {
                        $output->writeln(sprintf('<info>User: %s successfully deleted:</info>', $user->username));
                    } else {
                        $output->writeln(sprintf('<error>User: %s NOT deleted</error>', $user->username));
                    }
                    $output->writeln(parse_msg_to_clean_text($umanager->msg));
                }
            }
        }
        return Command::SUCCESS;
    }
}