[!!!][FEATURE] Introduce single _cli_ user for all CLI calls 89/51089/6
authorBenni Mack <benni@typo3.org>
Sun, 1 Jan 2017 20:32:54 +0000 (21:32 +0100)
committerSusanne Moog <susanne.moog@typo3.org>
Tue, 10 Jan 2017 12:44:32 +0000 (13:44 +0100)
The command line users prefixing with _CLI_scheduler etc. is flawed,
however a single user is needed for doing e.g. DataHandler calls.

This patch adds a new CommandLineUserAuthentication class, which extends
the regular $BE_USER object to only allow a user called "_cli_" and which
is created automatically if it does not exist, so the _cli_ user always
exists.

Additionally, the _cli_ user is now an admin user so access settings
on command line are obsolete and crucial stuff like the DataHandler can
be used without restrictions.

* Adapt Extbase Bootstrap
* Make sure to have an API to "opt-in" for the need for a user
* Adapt documentation (e.g. in scheduler) because a new user is not needed.

Resolves: #79240
Releases: master
Change-Id: I5a6277fa2252ce6c61f57bbfa26e8be9dc47bbab
Reviewed-on: https://review.typo3.org/51089
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Susanne Moog <susanne.moog@typo3.org>
Tested-by: Susanne Moog <susanne.moog@typo3.org>
typo3/sysext/backend/Classes/Console/CliRequestHandler.php
typo3/sysext/core/Classes/Authentication/BackendUserAuthentication.php
typo3/sysext/core/Classes/Authentication/CommandLineUserAuthentication.php [new file with mode: 0644]
typo3/sysext/core/Classes/Console/CommandRequestHandler.php
typo3/sysext/core/Classes/Core/Bootstrap.php
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/core/Documentation/Changelog/master/Feature-79240-SingleCliUserForCliCommands.rst [new file with mode: 0644]
typo3/sysext/extbase/ext_localconf.php
typo3/sysext/lowlevel/Configuration/Commands.php
typo3/sysext/lowlevel/ext_localconf.php
typo3/sysext/scheduler/ext_localconf.php

index c2986ce..2e21379 100644 (file)
@@ -16,6 +16,7 @@ namespace TYPO3\CMS\Backend\Console;
 
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\ConsoleOutput;
+use TYPO3\CMS\Core\Authentication\CommandLineUserAuthentication;
 use TYPO3\CMS\Core\Console\RequestHandlerInterface;
 use TYPO3\CMS\Core\Core\Bootstrap;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -59,10 +60,9 @@ class CliRequestHandler implements RequestHandlerInterface
         try {
             $command = $this->validateCommandLineKeyFromInput($input);
 
-            // try and look up if the CLI command user exists, throws an exception if the CLI
-            // user cannot be found
-            list($commandLineScript, $commandLineName) = $this->getIncludeScriptByCommandLineKey($command);
-            $this->boot($commandLineName);
+            // try and look up if the CLI command exists
+            $commandLineScript = $this->getIncludeScriptByCommandLineKey($command);
+            $this->boot();
 
             if (is_callable($commandLineScript)) {
                 call_user_func($commandLineScript);
@@ -97,17 +97,16 @@ class CliRequestHandler implements RequestHandlerInterface
      *
      * @throws \RuntimeException when the _CLI_ user cannot be authenticated properly
      */
-    protected function boot($commandLineName)
+    protected function boot()
     {
         $this->bootstrap
             ->loadExtensionTables()
-            ->initializeBackendUser();
+            ->initializeBackendUser(CommandLineUserAuthentication::class);
 
-        // Checks for a user called starting with _CLI_ e.g. "_CLI_lowlevel"
-        $this->loadCommandLineBackendUser($commandLineName);
+        // Checks for a user _CLI_, if non exists, will create one
+        $this->loadCommandLineBackendUser();
 
         $this->bootstrap
-            ->initializeBackendAuthentication()
             ->initializeLanguageObject()
             // Make sure output is not buffered, so command-line output and interaction can take place
             ->endOutputBufferingAndCleanPreviousOutput();
@@ -134,15 +133,14 @@ class CliRequestHandler implements RequestHandlerInterface
     }
 
     /**
-     * Define cli-related parameters and return the include script as well as the command line name. Used for
-     * authentication against the backend user in the "loadCommandLineBackendUser()" action.
+     * Define cli-related parameters and return the include script.
      *
      * @param string $cliKey the CLI key
-     * @return array the absolute path to the include script and the command line name
+     * @return string the absolute path to the include script
      */
     protected function getIncludeScriptByCommandLineKey($cliKey)
     {
-        list($commandLineScript, $commandLineName) = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'][$cliKey];
+        $commandLineScript = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'][$cliKey][0];
         if (!is_callable($commandLineScript)) {
             $commandLineScript = GeneralUtility::getFileAbsFileName($commandLineScript);
         }
@@ -151,31 +149,20 @@ class CliRequestHandler implements RequestHandlerInterface
         $cliScriptPath = array_shift($_SERVER['argv']);
         array_shift($_SERVER['argv']);
         array_unshift($_SERVER['argv'], $cliScriptPath);
-        return [$commandLineScript, $commandLineName];
+        return $commandLineScript;
     }
 
     /**
-     * If the backend script is in CLI mode, it will try to load a backend user named by the CLI module name (in lowercase)
+     * If the backend script is in CLI mode, it will try to load a backend user named _cli_
      *
-     * @param string $commandLineName the name of the module registered inside $TYPO3_CONF_VARS[SC_OPTIONS][GLOBAL][cliKeys] as second parameter
      * @throws \RuntimeException if a non-admin Backend user could not be loaded
      */
-    protected function loadCommandLineBackendUser($commandLineName)
+    protected function loadCommandLineBackendUser()
     {
         if ($GLOBALS['BE_USER']->user['uid']) {
             throw new \RuntimeException('Another user was already loaded which is impossible in CLI mode!', 1476107444);
         }
-        if (strpos($commandLineName, '_CLI_') !== 0) {
-            throw new \RuntimeException('Module name, "' . $commandLineName . '", was not prefixed with "_CLI_"', 1476107445);
-        }
-        $userName = strtolower($commandLineName);
-        $GLOBALS['BE_USER']->setBeUserByName($userName);
-        if (!$GLOBALS['BE_USER']->user['uid']) {
-            throw new \RuntimeException('No backend user named "' . $userName . '" was found!', 1476107195);
-        }
-        if ($GLOBALS['BE_USER']->isAdmin()) {
-            throw new \RuntimeException('CLI backend user "' . $userName . '" was ADMIN which is not allowed!', 1476107446);
-        }
+        $GLOBALS['BE_USER']->authenticate();
     }
 
     /**
index 464bf85..5d91ca9 100644 (file)
@@ -306,9 +306,6 @@ class BackendUserAuthentication extends \TYPO3\CMS\Core\Authentication\AbstractU
         $this->warningEmail = $GLOBALS['TYPO3_CONF_VARS']['BE']['warning_email_addr'];
         $this->lockIP = $GLOBALS['TYPO3_CONF_VARS']['BE']['lockIP'];
         $this->sessionTimeout = (int)$GLOBALS['TYPO3_CONF_VARS']['BE']['sessionTimeout'];
-        if (TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_CLI) {
-            $this->dontSetCookie = true;
-        }
     }
 
     /**
@@ -2664,7 +2661,7 @@ This is a dump of the failures:
      * The conditions are:
      * + backend user is a regular user and adminOnly is not defined
      * + backend user is an admin user
-     * + backend user is used in CLI context and adminOnly is explicitly set to "2"
+     * + backend user is used in CLI context and adminOnly is explicitly set to "2" (see CommandLineUserAuthentication)
      * + backend user is being controlled by an admin user
      *
      * @return bool Whether a backend user is allowed to access the backend
@@ -2672,12 +2669,10 @@ This is a dump of the failures:
     protected function isUserAllowedToLogin()
     {
         $isUserAllowedToLogin = false;
-        $adminOnlyMode = $GLOBALS['TYPO3_CONF_VARS']['BE']['adminOnly'];
+        $adminOnlyMode = (int)$GLOBALS['TYPO3_CONF_VARS']['BE']['adminOnly'];
         // Backend user is allowed if adminOnly is not set or user is an admin:
         if (!$adminOnlyMode || $this->isAdmin()) {
             $isUserAllowedToLogin = true;
-        } elseif ($adminOnlyMode == 2 && TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_CLI) {
-            $isUserAllowedToLogin = true;
         } elseif ($this->user['ses_backuserid']) {
             $backendUserId = (int)$this->user['ses_backuserid'];
             $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('be_users');
diff --git a/typo3/sysext/core/Classes/Authentication/CommandLineUserAuthentication.php b/typo3/sysext/core/Classes/Authentication/CommandLineUserAuthentication.php
new file mode 100644 (file)
index 0000000..d0e2530
--- /dev/null
@@ -0,0 +1,154 @@
+<?php
+namespace TYPO3\CMS\Core\Authentication;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Core\Crypto\Random;
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Saltedpasswords\Salt\SaltFactory;
+
+/**
+ * TYPO3 backend user authentication on a CLI level
+ * Auto-logs in, only allowed on CLI
+ */
+class CommandLineUserAuthentication extends BackendUserAuthentication
+{
+
+    /**
+     * The username of the CLI user (there is only one)
+     * @var string
+     */
+    protected $username = '_cli_';
+
+    /**
+     * Constructor, only allowed in CLI mode
+     */
+    public function __construct()
+    {
+        if (!(TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_CLI)) {
+            throw new \RuntimeException('Creating a CLI-based user object on non-CLI level is not allowed', 1483971165);
+        }
+        $this->dontSetCookie = true;
+        parent::__construct();
+    }
+
+    /**
+     * Logs-in the _CLI_ user. It does not need to check for credentials.
+     *
+     * @throws \RuntimeException when the user could not log in or it is an admin
+     */
+    public function authenticate()
+    {
+        // check if a _CLI_ user exists, if not, create one
+        $this->setBeUserByName($this->username);
+        if (!$this->user['uid']) {
+            // create a new BE user in the database
+            if (!$this->checkCliUserExists()) {
+                $this->createCliUser();
+            } else {
+                throw new \RuntimeException('No backend user named "_cli_" could be authenticated, maybe this user is "hidden"?', 1484050401);
+            }
+            $this->setBeUserByName($this->username);
+        }
+        if (!$this->user['uid']) {
+            throw new \RuntimeException('No backend user named "_cli_" could be created.', 1476107195);
+        }
+        // The groups are fetched and ready for permission checking in this initialization.
+        $this->fetchGroupData();
+        if (!$this->isUserAllowedToLogin()) {
+            throw new \RuntimeException('Login Error: TYPO3 is in maintenance mode at the moment. Only administrators are allowed access.', 1483971855);
+        }
+        $this->backendSetUC();
+    }
+
+    /**
+     * Check if user is logged in and if so, call ->fetchGroupData() to load group information and
+     * access lists of all kind, further check IP, set the ->uc array and send login-notification email if required.
+     * If no user is logged in the default behaviour is to exit with an error message.
+     * This function is called right after ->start() in fx. the TYPO3 Bootstrap.
+     *
+     * @param bool $proceedIfNoUserIsLoggedIn if this option is set, then there won't be a redirect to the login screen of the Backend - used for areas in the backend which do not need user rights like the login page.
+     * @throws \RuntimeException
+     * @return void
+     */
+    public function backendCheckLogin($proceedIfNoUserIsLoggedIn = false)
+    {
+        $this->authenticate();
+    }
+
+    /**
+     * Determines whether a CLI backend user is allowed to access TYPO3.
+     * Only when adminOnly is off (=0), and only allowed for admins and CLI users (=2)
+     *
+     * @return bool Whether the CLI user is allowed to access TYPO3
+     */
+    protected function isUserAllowedToLogin()
+    {
+        return in_array((int)$GLOBALS['TYPO3_CONF_VARS']['BE']['adminOnly'], [0, 2], true);
+    }
+
+    /**
+     * Check if a user with username "_cli_" exists. Deleted users are left out
+     * but hidden and start / endtime restricted users are considered.
+     */
+    protected function checkCliUserExists()
+    {
+        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('be_users');
+        $queryBuilder->getRestrictions()
+            ->removeAll()
+            ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
+        $count = $queryBuilder
+            ->count('*')
+            ->from('be_users')
+            ->where($queryBuilder->expr()->eq('username', $queryBuilder->createNamedParameter('_cli_')))
+            ->execute()
+            ->fetchColumn(0);
+        return (bool)$count;
+    }
+
+    /**
+     * Create a record in the DB table be_users called "_cli_" with no other information
+     *
+     * @return void
+     */
+    protected function createCliUser()
+    {
+        $userFields = [
+            'username' => $this->username,
+            'password' => $this->generateHashedPassword(),
+            'admin'    => 1,
+            'tstamp'   => $GLOBALS['EXEC_TIME'],
+            'crdate'   => $GLOBALS['EXEC_TIME']
+        ];
+
+        $databaseConnection = GeneralUtility::makeInstance(ConnectionPool::class)
+            ->getConnectionForTable('be_users');
+        $databaseConnection->insert('be_users', $userFields);
+    }
+
+    /**
+     * This function returns a salted hashed key.
+     *
+     * @return string a random password
+     */
+    protected function generateHashedPassword()
+    {
+        $cryptoService = GeneralUtility::makeInstance(Random::class);
+        $password = $cryptoService->generateRandomBytes(20);
+        $saltFactory = SaltFactory::getSaltingInstance(null, 'BE');
+        return $saltFactory->getHashedPassword($password);
+    }
+}
index fecfa98..d3d9f37 100644 (file)
@@ -18,6 +18,7 @@ use Symfony\Component\Console\Application;
 use Symfony\Component\Console\Command\Command;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\ConsoleOutput;
+use TYPO3\CMS\Core\Authentication\CommandLineUserAuthentication;
 use TYPO3\CMS\Core\Core\Bootstrap;
 use TYPO3\CMS\Core\Package\PackageManager;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -74,7 +75,7 @@ class CommandRequestHandler implements RequestHandlerInterface
                 continue;
             }
             if (isset($data['user'])) {
-                $this->initializeBackendUser($data['user']);
+                $this->initializeBackendUser();
             }
         }
 
@@ -98,22 +99,19 @@ class CommandRequestHandler implements RequestHandlerInterface
     }
 
     /**
-     * If the backend script is in CLI mode, it will try to load a backend user named by the CLI module name (in lowercase)
+     * Logs in the user _cli_ to the system
      *
-     * @param string $userName the name of the module registered inside $TYPO3_CONF_VARS[SC_OPTIONS][GLOBAL][cliKeys] as second parameter
      * @throws \RuntimeException if a non-admin Backend user could not be loaded
      */
-    protected function initializeBackendUser($userName)
+    protected function initializeBackendUser()
     {
-        $this->bootstrap->initializeBackendUser();
-
-        $GLOBALS['BE_USER']->setBeUserByName($userName);
-        if (!$GLOBALS['BE_USER']->user['uid']) {
-            throw new \RuntimeException('No backend user named "' . $userName . '" was found!', 1476107260);
-        }
-
+        // create the BE_USER object
+        $this->bootstrap->initializeBackendUser(CommandLineUserAuthentication::class);
+        // log-in the _cli_ user, create the record if it does not exist
+        /** @var CommandLineUserAuthentication $backendUser */
+        $backendUser = $GLOBALS['BE_USER'];
+        $backendUser->authenticate();
         $this->bootstrap
-            ->initializeBackendAuthentication()
             ->initializeLanguageObject();
     }
 
index defcbd5..4b95514 100644 (file)
@@ -1012,13 +1012,14 @@ class Bootstrap
     /**
      * Initialize backend user object in globals
      *
+     * @param string $className usually \TYPO3\CMS\Core\Authentication\BackendUserAuthentication::class but can be used for CLI
      * @return Bootstrap
      * @internal This is not a public API method, do not use in own extensions
      */
-    public function initializeBackendUser()
+    public function initializeBackendUser($className = \TYPO3\CMS\Core\Authentication\BackendUserAuthentication::class)
     {
         /** @var $backendUser \TYPO3\CMS\Core\Authentication\BackendUserAuthentication */
-        $backendUser = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Authentication\BackendUserAuthentication::class);
+        $backendUser = GeneralUtility::makeInstance($className);
         // The global must be available very early, because methods below
         // might trigger code which relies on it. See: #45625
         $GLOBALS['BE_USER'] = $backendUser;
index ef6c310..7eb8664 100644 (file)
@@ -750,7 +750,7 @@ return [
         'cookieName' => 'be_typo_user',                    // String: Set the name for the cookie used for the back-end user session
         'loginSecurityLevel' => '',                        // String: Keywords that determines the security level of login to the backend. "normal" means the password from the login form is sent in clear-text, "rsa" uses RSA password encryption (only if the rsaauth extension is installed).
         'showRefreshLoginPopup' => false,                // Boolean: If set, the Ajax relogin will show a real popup window for relogin after the count down. Some auth services need this as they add custom validation to the login form. If it's not set, the Ajax relogin will show an inline relogin window.
-        'adminOnly' => 0,                                // <p>Integer (-1, 0, 1, 2)</p><dl><dt>-1</dt><dd>total shutdown for maintenance purposes</dd><dt>0</dt><dd>normal operation, everyone can login (default)</dd><dt>1</dt><dd>only admins can login</dd><dt>2</dt><dd>only admins and regular CLI users can login</dd></dl>
+        'adminOnly' => 0,                                // <p>Integer (-1, 0, 1, 2)</p><dl><dt>-1</dt><dd>total shutdown for maintenance purposes</dd><dt>0</dt><dd>normal operation, everyone can login (default)</dd><dt>1</dt><dd>only admins can login (no CLI)</dd><dt>2</dt><dd>only admins and regular CLI users can login</dd></dl>
         'disable_exec_function' => false,                // Boolean: Don't use exec() function (except for ImageMagick which is disabled by <a href="#GFX-im">[GFX][im]</a>=0). If set, all fileoperations are done by the default PHP-functions. This is necessary under Windows! On Unix the system commands by exec() can be used, unless this is disabled.
         'compressionLevel' => 0,                        // Determines output compression of BE output. Makes output smaller but slows down the page generation depending on the compression level. Requires a) zlib in your PHP installation and b) special rewrite rules for .css.gzip and .js.gzip (please see _.htacces for an example). Range 1-9, where 1 is least compression and 9 is greatest compression. 'true' as value will set the compression based on the PHP default settings (usually 5). Suggested and most optimal value is 5.
         'installToolPassword' => '',                    // String: This is the md5-hashed, salted password for the Install Tool. Set this to '' and access will be totally denied. You may consider to externally protect the typo3/sysext/install/ folder, eg. with a .htaccess file.
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-79240-SingleCliUserForCliCommands.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-79240-SingleCliUserForCliCommands.rst
new file mode 100644 (file)
index 0000000..54cab1a
--- /dev/null
@@ -0,0 +1,24 @@
+.. include:: ../../Includes.txt
+
+==================================================
+Feature: #79240 - Single cli user for cli commands
+==================================================
+
+See :issue:`79240`
+
+Description
+===========
+
+Accessing TYPO3 functionality from the command line has been simplified. Single commands no longer require single
+users in the database, instead all cli command use the username `_cli_`.
+This user is created on demand by the framework if it does not exist at the first command line call.
+The `_cli_` user has admin rights and no longer needs specific access rights assigned to perform specific
+tasks like manipulating database content using the :php:`DataHandler`.
+
+
+Impact
+======
+
+Creating and managing command line tasks has been simplified, all existing `_cli_*` users can be deleted.
+
+.. index:: CLI, PHP-API
\ No newline at end of file
index 7134ad5..70b69a9 100644 (file)
@@ -37,8 +37,7 @@ if (TYPO3_MODE === 'BE') {
         function () {
             $bootstrap = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Core\Bootstrap::class);
             echo $bootstrap->run('', []);
-        },
-        '_CLI_lowlevel'
+        }
     ];
     // register help command
     $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = \TYPO3\CMS\Extbase\Command\HelpCommandController::class;
index c1f8573..0f39cdd 100644 (file)
@@ -3,52 +3,37 @@
  * Commands to be executed by typo3, where the key of the array
  * is the name of the command (to be called as the first argument after typo3).
  * Required parameter is the "class" of the command which needs to be a subclass
- * of Symfony/Console/Command. An optional parameter is "user" that logs in
- * a Backend user via CLI.
+ * of Symfony/Console/Command.
  */
 return [
     'syslog:list' => [
         'class' => \TYPO3\CMS\Lowlevel\Command\ListSysLogCommand::class
     ],
     'cleanup:missingfiles' => [
-        'class' => \TYPO3\CMS\Lowlevel\Command\MissingFilesCommand::class,
-        // needed for updating the reference index (optional)
-        'user' => '_cli_lowlevel'
+        'class' => \TYPO3\CMS\Lowlevel\Command\MissingFilesCommand::class
     ],
     'cleanup:lostfiles' => [
-        'class' => \TYPO3\CMS\Lowlevel\Command\LostFilesCommand::class,
-        // needed for updating the reference index (optional)
-        'user' => '_cli_lowlevel'
+        'class' => \TYPO3\CMS\Lowlevel\Command\LostFilesCommand::class
     ],
     'cleanup:multiplereferencedfiles' => [
-        'class' => \TYPO3\CMS\Lowlevel\Command\FilesWithMultipleReferencesCommand::class,
-        // needed for updating the reference index (optional)
-        'user' => '_cli_lowlevel'
+        'class' => \TYPO3\CMS\Lowlevel\Command\FilesWithMultipleReferencesCommand::class
     ],
     'cleanup:rteimages' => [
-        'class' => \TYPO3\CMS\Lowlevel\Command\RteImagesCommand::class,
-        // needed for updating the reference index (optional)
-        'user' => '_cli_lowlevel'
+        'class' => \TYPO3\CMS\Lowlevel\Command\RteImagesCommand::class
     ],
     'cleanup:missingrelations' => [
-        'class' => \TYPO3\CMS\Lowlevel\Command\MissingRelationsCommand::class,
-        // needed for updating the reference index (optional)
-        'user' => '_cli_lowlevel'
+        'class' => \TYPO3\CMS\Lowlevel\Command\MissingRelationsCommand::class
     ],
     'cleanup:deletedrecords' => [
-        'class' => \TYPO3\CMS\Lowlevel\Command\DeletedRecordsCommand::class,
-        'user' => '_cli_lowlevel'
+        'class' => \TYPO3\CMS\Lowlevel\Command\DeletedRecordsCommand::class
     ],
     'cleanup:orphanrecords' => [
-        'class' => \TYPO3\CMS\Lowlevel\Command\OrphanRecordsCommand::class,
-        'user' => '_cli_lowlevel'
+        'class' => \TYPO3\CMS\Lowlevel\Command\OrphanRecordsCommand::class
     ],
     'cleanup:flexforms' => [
         'class' => \TYPO3\CMS\Lowlevel\Command\CleanFlexFormsCommand::class,
-        'user' => '_cli_lowlevel'
     ],
     'cleanup:versions' => [
         'class' => \TYPO3\CMS\Lowlevel\Command\WorkspaceVersionRecordsCommand::class,
-        'user' => '_cli_lowlevel'
     ]
 ];
index 83f5420..8f892b0 100644 (file)
@@ -7,7 +7,6 @@ if (TYPO3_MODE === 'BE') {
         function () {
             $cleanerObj = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Lowlevel\CleanerCommand::class);
             $cleanerObj->cli_main($_SERVER['argv']);
-        },
-        '_CLI_lowlevel'
+        }
     ];
 }
index bd292f0..31d3f99 100644 (file)
@@ -6,9 +6,9 @@ $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys']['scheduler'] = [
     function () {
         $schedulerCliController = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Scheduler\Controller\SchedulerCliController::class);
         $schedulerCliController->run();
-    },
-    '_CLI_scheduler'
+    }
 ];
+
 // Get the extensions's configuration
 $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['scheduler'], ['allowed_classes' => false]);
 // If sample tasks should be shown,