. /** * This script allows you to view and change the emailstop flag of any user. * * @package core * @subpackage cli * @copyright 2023 Stephan Robotta (stephan.robotta@bfh.ch) * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ define('CLI_SCRIPT', true); require(__DIR__.'/../../config.php'); require_once($CFG->libdir.'/clilib.php'); // Define the input options. $longparams = [ 'email' => '', 'help' => false, 'id' => '', 'quiet' => false, 'stop' => '', 'username' => '', ]; $shortparams = [ 'e' => 'email', 'h' => 'help', 'i' => 'id', 'q' => 'quiet', 's' => 'stop', 'u' => 'username', ]; // Define exit codes. $exitsuccess = 0; $exitunknownoption = 1; $exitmissinguserarg = 2; $exittoomanyuserarg = 3; $exitnosearchargs = 4; $exitnousersfound = 5; $exitinvalidstopflag = 6; $exiterrordb = 7; // Now get cli options that are set by the caller. list($options, $unrecognized) = cli_get_params($longparams, $shortparams); $verbose = empty($options['quiet']); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); if ($verbose) { cli_error(get_string('cliunknowoption', 'admin', $unrecognized), $exitunknownoption); } exit($exitunknownoption); } if ($options['help']) { $help = "Set/unset or show status of emailstop flag for a user, identified by username or email. There are no security checks here because anybody who is able to execute this file may execute any PHP too. Options: -h, --help Print out this help -e, --email=email Specify user by email, separate many users by comma -i, --id=id Specify user by id, separate many users by comma -q, --quiet No output to stdout -s, --stop=0|1|off|on Set new value for emailstop flag -u, --username=username Specify user by username, separate many users by comma Example: \$sudo -u www-data /usr/bin/php admin/cli/emailstop.php --email=student1@example.com --stop=1 \$sudo -u www-data /usr/bin/php admin/cli/emailstop.php --email=student1@example.com,student2@example.com \$sudo -u www-data /usr/bin/php admin/cli/emailstop.php --u=student1,student2 -s=on "; echo $help; exit($exitsuccess); } $cntempty = 0; $cntfilled = 0; $searchargs = []; // Try to find out which option is used to fetch the users from. Also do sanitize etc. foreach (['email', 'username', 'id'] as $option) { if (empty($options[$option])) { $cntempty++; } else { $cntfilled++; $argname = $option; // The search args must be: split by the comma, trimmed, and empty elements filtered out. $searchargs = array_flip(array_filter( array_map( function ($item) { return trim($item); }, explode(',', $options[$option]) ), function ($item) { return $item !== ''; } )); } } if ($cntempty === 3) { if ($verbose) { cli_error('One of username, email, or id must be set.', $exitmissinguserarg); } exit($exitmissinguserarg); } if ($cntfilled > 1) { if ($verbose) { cli_error('Only one of email, username, or id can be set to identify a user.', $exittoomanyuserarg); } exit($exittoomanyuserarg); } if (empty($searchargs)) { if ($verbose) { cli_error('No values are provided for users.', $exitnosearchargs); } exit($exitnosearchargs); } try { $users = $DB->get_records_list('user', $argname, array_keys($searchargs)); } catch (Exception $e) { if ($verbose) { cli_error("Could not fetch data from db by {$argname}: '{$options[$argname]}'.", $exiterrordb); } exit($exiterrordb); } if (empty($users)) { if ($verbose) { cli_error("Can not find any user by {$argname}: '{$options[$argname]}'.", $exitnousersfound); } exit($exitnousersfound); } // No stop flag set, then just print the user and the current emailstop flag state. if ($options['stop'] === '') { foreach ($users as $user) { if ($verbose) { echo 'user=' . $user->{$argname} . ' - emailstop=' . (int)$user->emailstop . PHP_EOL; unset($searchargs[$user->{$argname}]); } } if ($verbose) { foreach (array_keys($searchargs) as $arg) { echo 'user=' . $arg . ' - not found' . PHP_EOL; } } exit($exitsuccess); } // Allowed values for the stop flag enabled are 1 and on, for disabled are 0 and off. $validvalues = ['0', '1', 'off', 'on']; $stopflag = strtolower($options['stop']); if (!in_array($stopflag, $validvalues)) { if ($verbose) { cli_error('Value for the emailstop flag must be one of: ' . implode(', ', $validvalues) . '.', $exitinvalidstopflag); } exit($exitinvalidstopflag); } foreach ($validvalues as $value) { if ($value === $stopflag) { $stopflag = ($value === '1' || $value === 'on') ? 1 : 0; break; } } // Update each user with the stop flag to be set if it is necessary. foreach ($users as $user) { $line = 'Update user ' . $user->{$argname} . ($argname !== 'id' ? ' (' . $user->id . ')' : '') . ' - '; if ((int)$user->emailstop !== $stopflag) { $DB->set_field('user', 'emailstop', $stopflag, ['id' => $user->id]); $line .= 'ok'; } else { $line .= 'already done'; } if ($verbose) { echo $line . PHP_EOL; unset($searchargs[$user->{$argname}]); } } if ($verbose) { foreach (array_keys($searchargs) as $arg) { echo 'user=' . $arg . ' - not found' . PHP_EOL; } } exit($exitsuccess);