mirror of https://github.com/nextcloud/server.git
LDAP User Cleanup: Port from stable7 without further adjustements
LDAP User Cleanup background job for user clean up adjust user backend for clean up register background job remove dead code dependency injection make Helper non-static for proper testing check whether it is OK to run clean up job. Do not forget to pass arguments. use correct method to get the config from server methods can be private, proper indirect testing is given no automatic user deletion make limit readable for test purposes make method less complex add first tests let preferences accept limit and offset for getUsersForValue DI via constructor does not work for background jobs after detecting, now we have retrieving deleted users and their details we need this method to be public for now finalize export method, add missing getter clean up namespaces and get rid of unnecessary files helper is not static anymore cleanup according to scrutinizer add cli tool to show deleted users uses are necessary after recent namespace change also remove user from mappings table on deletion add occ command to delete users fix use statement improve output big fixes / improvements PHP doc return true in userExists early for cleaning up deleted users bump version control state and interval with one config.php setting, now ldapUserCleanupInterval. 0 will disable it. enabled by default. improve doc rename cli method to be consistent with others introduce ldapUserCleanupInterval in sample config don't show last login as unix epoche start when no login happend less log output consistent namespace for OfflineUser rename GarbageCollector to DeletedUsersIndex and move it to user subdir fix unit tests add tests for deleteUser more test adjustements Conflicts: apps/user_ldap/ajax/clearMappings.php apps/user_ldap/appinfo/app.php apps/user_ldap/lib/access.php apps/user_ldap/lib/helper.php apps/user_ldap/tests/helper.php core/register_command.php lib/private/preferences.php lib/private/user.php add ldap:check-user to check user existance on the fly Conflicts: apps/user_ldap/lib/helper.php forgotten file PHPdoc fixes, no code change and don't forget to adjust testsremotes/origin/fix-10825
parent
8164415b45
commit
4fa39250e7
@ -1 +1 @@
|
||||
0.4.4
|
||||
0.4.5
|
||||
|
@ -0,0 +1,129 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OCA\user_ldap\Command;
|
||||
|
||||
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;
|
||||
|
||||
use OCA\user_ldap\lib\user\User;
|
||||
use OCA\User_LDAP\lib\user\Manager;
|
||||
use OCA\user_ldap\lib\Helper;
|
||||
use OCA\user_ldap\User_Proxy;
|
||||
|
||||
class CheckUser extends Command {
|
||||
/** @var \OCA\user_ldap\User_Proxy */
|
||||
protected $backend;
|
||||
|
||||
/** @var \OCA\User_LDAP\lib\Helper */
|
||||
protected $helper;
|
||||
|
||||
/** @var \OCP\IConfig */
|
||||
protected $config;
|
||||
|
||||
/**
|
||||
* @param OCA\user_ldap\User_Proxy $uBackend
|
||||
* @param OCA\User_LDAP\lib\Helper $helper
|
||||
* @param OCP\IConfig $config
|
||||
*/
|
||||
public function __construct(User_Proxy $uBackend, Helper $helper, \OCP\IConfig $config) {
|
||||
$this->backend = $uBackend;
|
||||
$this->helper = $helper;
|
||||
$this->config = $config;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
protected function configure() {
|
||||
$this
|
||||
->setName('ldap:check-user')
|
||||
->setDescription('checks whether a user exists on LDAP.')
|
||||
->addArgument(
|
||||
'ocName',
|
||||
InputArgument::REQUIRED,
|
||||
'the user name as used in ownCloud'
|
||||
)
|
||||
->addOption(
|
||||
'force',
|
||||
null,
|
||||
InputOption::VALUE_NONE,
|
||||
'ignores disabled LDAP configuration'
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output) {
|
||||
try {
|
||||
$uid = $input->getArgument('ocName');
|
||||
$this->isAllowed($input->getOption('force'));
|
||||
$this->confirmUserIsMapped($uid);
|
||||
$exists = $this->backend->userExistsOnLDAP($uid);
|
||||
if($exists === true) {
|
||||
$output->writeln('The user is still available on LDAP.');
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO FIXME consolidate next line in DeletedUsersIndex
|
||||
// (impractical now, because of class dependencies)
|
||||
$this->config->setUserValue($uid, 'user_ldap', 'isDeleted', '1');
|
||||
|
||||
$output->writeln('The user does not exists on LDAP anymore.');
|
||||
$output->writeln('Clean up the user\'s remnants by: ./occ user:delete "'
|
||||
. $uid . '"');
|
||||
} catch (\Exception $e) {
|
||||
$output->writeln('<error>' . $e->getMessage(). '</error>');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* checks whether a user is actually mapped
|
||||
* @param string $ocName the username as used in ownCloud
|
||||
* @throws \Exception
|
||||
* @return bool
|
||||
*/
|
||||
protected function confirmUserIsMapped($ocName) {
|
||||
//TODO FIXME this should go to Mappings in OC 8
|
||||
$db = \OC::$server->getDatabaseConnection();
|
||||
$query = $db->prepare('
|
||||
SELECT
|
||||
`ldap_dn` AS `dn`
|
||||
FROM `*PREFIX*ldap_user_mapping`
|
||||
WHERE `owncloud_name` = ?'
|
||||
);
|
||||
|
||||
$query->execute(array($ocName));
|
||||
$result = $query->fetchColumn();
|
||||
|
||||
if($result === false) {
|
||||
throw new \Exception('The given user is not a recognized LDAP user.');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks whether the setup allows reliable checking of LDAP user existance
|
||||
* @throws \Exception
|
||||
* @return bool
|
||||
*/
|
||||
protected function isAllowed($force) {
|
||||
if($this->helper->haveDisabledConfigurations() && !$force) {
|
||||
throw new \Exception('Cannot check user existance, because '
|
||||
. 'disabled LDAP configurations are present.');
|
||||
}
|
||||
|
||||
// we don't check ldapUserCleanupInterval from config.php because this
|
||||
// action is triggered manually, while the setting only controls the
|
||||
// background job.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OCA\user_ldap\Command;
|
||||
|
||||
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;
|
||||
|
||||
use OCA\user_ldap\lib\user\DeletedUsersIndex;
|
||||
use OCA\User_LDAP\lib\Connection;
|
||||
use OCA\User_LDAP\lib\Access;
|
||||
|
||||
class ShowRemnants extends Command {
|
||||
|
||||
protected function configure() {
|
||||
$this
|
||||
->setName('ldap:show-remnants')
|
||||
->setDescription('shows which users are not available on LDAP anymore, but have remnants in ownCloud.')
|
||||
;
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output) {
|
||||
$dui = new DeletedUsersIndex(
|
||||
new \OC\Preferences(\OC_DB::getConnection()),
|
||||
\OC::$server->getDatabaseConnection(),
|
||||
$this->getAccess()
|
||||
);
|
||||
|
||||
/** @var \Symfony\Component\Console\Helper\Table $table */
|
||||
$table = $this->getHelperSet()->get('table');
|
||||
$table->setHeaders(array(
|
||||
'ownCloud name', 'Display Name', 'LDAP UID', 'LDAP DN', 'Last Login',
|
||||
'Dir', 'Sharer'));
|
||||
$rows = array();
|
||||
$offset = 0;
|
||||
do {
|
||||
$resultSet = $dui->getUsers($offset);
|
||||
$offset += count($resultSet);
|
||||
foreach($resultSet as $user) {
|
||||
$hAS = $user->getHasActiveShares() ? 'Y' : 'N';
|
||||
$lastLogin = ($user->getLastLogin() > 0) ?
|
||||
\OCP\Util::formatDate($user->getLastLogin()) : '-';
|
||||
$rows[] = array(
|
||||
$user->getOCName(),
|
||||
$user->getDisplayName(),
|
||||
$user->getUid(),
|
||||
$user->getDN(),
|
||||
$lastLogin,
|
||||
$user->getHomePath(),
|
||||
$hAS
|
||||
);
|
||||
}
|
||||
} while (count($resultSet) === 10);
|
||||
|
||||
$table->setRows($rows);
|
||||
$table->render($output);
|
||||
}
|
||||
|
||||
protected function getAccess() {
|
||||
$ldap = new \OCA\user_ldap\lib\LDAP();
|
||||
$dummyConnection = new Connection($ldap, '', null);
|
||||
$userManager = new \OCA\user_ldap\lib\user\Manager(
|
||||
\OC::$server->getConfig(),
|
||||
new \OCA\user_ldap\lib\FilesystemHelper(),
|
||||
new \OCA\user_ldap\lib\LogWrapper(),
|
||||
\OC::$server->getAvatarManager(),
|
||||
new \OCP\Image()
|
||||
);
|
||||
$access = new Access($dummyConnection, $ldap, $userManager);
|
||||
return $access;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,227 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OCA\User_LDAP\Jobs;
|
||||
|
||||
use \OCA\user_ldap\User_Proxy;
|
||||
use \OCA\user_ldap\lib\Helper;
|
||||
use \OCA\user_ldap\lib\LDAP;
|
||||
|
||||
/**
|
||||
* Class CleanUp
|
||||
*
|
||||
* a Background job to clean up deleted users
|
||||
*
|
||||
* @package OCA\user_ldap\lib;
|
||||
*/
|
||||
class CleanUp extends \OC\BackgroundJob\TimedJob {
|
||||
/**
|
||||
* @var int $limit amount of users that should be checked per run
|
||||
*/
|
||||
protected $limit = 50;
|
||||
|
||||
/**
|
||||
* @var \OCP\UserInterface $userBackend
|
||||
*/
|
||||
protected $userBackend;
|
||||
|
||||
/**
|
||||
* @var \OCP\IConfig $ocConfig
|
||||
*/
|
||||
protected $ocConfig;
|
||||
|
||||
/**
|
||||
* @var \OCP\IDBConnection $db
|
||||
*/
|
||||
protected $db;
|
||||
|
||||
/**
|
||||
* @var Helper $ldapHelper
|
||||
*/
|
||||
protected $ldapHelper;
|
||||
|
||||
/**
|
||||
* @var int $defaultIntervalMin default interval in minutes
|
||||
*/
|
||||
protected $defaultIntervalMin = 51;
|
||||
|
||||
public function __construct() {
|
||||
$minutes = \OC::$server->getConfig()->getSystemValue(
|
||||
'ldapUserCleanupInterval', strval($this->defaultIntervalMin));
|
||||
$this->setInterval(intval($minutes) * 60);
|
||||
}
|
||||
|
||||
/**
|
||||
* assigns the instances passed to run() to the class properties
|
||||
* @param array $arguments
|
||||
*/
|
||||
public function setArguments($arguments) {
|
||||
//Dependency Injection is not possible, because the constructor will
|
||||
//only get values that are serialized to JSON. I.e. whatever we would
|
||||
//pass in app.php we do add here, except something else is passed e.g.
|
||||
//in tests.
|
||||
|
||||
if(isset($arguments['helper'])) {
|
||||
$this->ldapHelper = $arguments['helper'];
|
||||
} else {
|
||||
$this->ldapHelper = new Helper();
|
||||
}
|
||||
|
||||
if(isset($arguments['userBackend'])) {
|
||||
$this->userBackend = $arguments['userBackend'];
|
||||
} else {
|
||||
$this->userBackend = new User_Proxy(
|
||||
$this->ldapHelper->getServerConfigurationPrefixes(true),
|
||||
new LDAP()
|
||||
);
|
||||
}
|
||||
|
||||
if(isset($arguments['ocConfig'])) {
|
||||
$this->ocConfig = $arguments['ocConfig'];
|
||||
} else {
|
||||
$this->ocConfig = \OC::$server->getConfig();
|
||||
}
|
||||
|
||||
if(isset($arguments['db'])) {
|
||||
$this->db = $arguments['db'];
|
||||
} else {
|
||||
$this->db = \OC::$server->getDatabaseConnection();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* makes the background job do its work
|
||||
* @param array $argument
|
||||
*/
|
||||
public function run($argument) {
|
||||
$this->setArguments($argument);
|
||||
|
||||
if(!$this->isCleanUpAllowed()) {
|
||||
return;
|
||||
}
|
||||
$users = $this->getMappedUsers($this->limit, $this->getOffset());
|
||||
if(!is_array($users)) {
|
||||
//something wrong? Let's start from the beginning next time and
|
||||
//abort
|
||||
$this->setOffset(true);
|
||||
return;
|
||||
}
|
||||
$resetOffset = $this->isOffsetResetNecessary(count($users));
|
||||
$this->checkUsers($users);
|
||||
$this->setOffset($resetOffset);
|
||||
}
|
||||
|
||||
/**
|
||||
* checks whether next run should start at 0 again
|
||||
* @param int $resultCount
|
||||
* @return bool
|
||||
*/
|
||||
public function isOffsetResetNecessary($resultCount) {
|
||||
return ($resultCount < $this->limit) ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks whether cleaning up LDAP users is allowed
|
||||
* @return bool
|
||||
*/
|
||||
public function isCleanUpAllowed() {
|
||||
try {
|
||||
if($this->ldapHelper->haveDisabledConfigurations()) {
|
||||
return false;
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$enabled = $this->isCleanUpEnabled();
|
||||
|
||||
return $enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks whether clean up is enabled by configuration
|
||||
* @return bool
|
||||
*/
|
||||
private function isCleanUpEnabled() {
|
||||
return (bool)$this->ocConfig->getSystemValue(
|
||||
'ldapUserCleanupInterval', strval($this->defaultIntervalMin));
|
||||
}
|
||||
|
||||
/**
|
||||
* checks users whether they are still existing
|
||||
* @param array $users result from getMappedUsers()
|
||||
*/
|
||||
private function checkUsers($users) {
|
||||
foreach($users as $user) {
|
||||
$this->checkUser($user);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* checks whether a user is still existing in LDAP
|
||||
* @param string[] $user
|
||||
*/
|
||||
private function checkUser($user) {
|
||||
if($this->userBackend->userExistsOnLDAP($user['name'])) {
|
||||
//still available, all good
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO FIXME consolidate next line in DeletedUsersIndex
|
||||
// (impractical now, because of class dependencies)
|
||||
$this->ocConfig->setUserValue($user['name'], 'user_ldap', 'isDeleted', '1');
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a batch of users from the mappings table
|
||||
* @param int $limit
|
||||
* @param int $offset
|
||||
* @return array
|
||||
*/
|
||||
public function getMappedUsers($limit, $offset) {
|
||||
$query = $this->db->prepare('
|
||||
SELECT
|
||||
`ldap_dn` AS `dn`,
|
||||
`owncloud_name` AS `name`,
|
||||
`directory_uuid` AS `uuid`
|
||||
FROM `*PREFIX*ldap_user_mapping`',
|
||||
$limit,
|
||||
$offset
|
||||
);
|
||||
|
||||
$query->execute();
|
||||
return $query->fetchAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the offset to fetch users from the mappings table
|
||||
* @return int
|
||||
*/
|
||||
private function getOffset() {
|
||||
return $this->ocConfig->getAppValue('user_ldap', 'cleanUpJobOffset', 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* sets the new offset for the next run
|
||||
* @param bool $reset whether the offset should be set to 0
|
||||
*/
|
||||
public function setOffset($reset = false) {
|
||||
$newOffset = $reset ? 0 :
|
||||
$this->getOffset() + $this->limit;
|
||||
$this->ocConfig->setAppValue('user_ldap', 'cleanUpJobOffset', $newOffset);
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the chunk size (limit in DB speak)
|
||||
* @return int
|
||||
*/
|
||||
public function getChunkSize() {
|
||||
return $this->limit;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,155 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OCA\user_ldap\tests;
|
||||
|
||||
class Test_CleanUp extends \PHPUnit_Framework_TestCase {
|
||||
public function getMocks() {
|
||||
$mocks = array();
|
||||
$mocks['userBackend'] =
|
||||
$this->getMockBuilder('\OCA\user_ldap\User_Proxy')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$mocks['ocConfig'] = $this->getMock('\OCP\IConfig');
|
||||
$mocks['db'] = $this->getMock('\OCP\IDBConnection');
|
||||
$mocks['helper'] = $this->getMock('\OCA\user_ldap\lib\Helper');
|
||||
|
||||
return $mocks;
|
||||
}
|
||||
|
||||
/**
|
||||
* clean up job must not run when there are disabled configurations
|
||||
*/
|
||||
public function test_runNotAllowedByDisabledConfigurations() {
|
||||
$args = $this->getMocks();
|
||||
$args['helper']->expects($this->once())
|
||||
->method('haveDisabledConfigurations')
|
||||
->will($this->returnValue(true) );
|
||||
|
||||
$args['ocConfig']->expects($this->never())
|
||||
->method('getSystemValue');
|
||||
|
||||
$bgJob = new \OCA\User_LDAP\Jobs\CleanUp();
|
||||
$bgJob->setArguments($args);
|
||||
|
||||
$result = $bgJob->isCleanUpAllowed();
|
||||
$this->assertSame(false, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* clean up job must not run when LDAP Helper is broken i.e.
|
||||
* returning unexpected results
|
||||
*/
|
||||
public function test_runNotAllowedByBrokenHelper() {
|
||||
$args = $this->getMocks();
|
||||
$args['helper']->expects($this->once())
|
||||
->method('haveDisabledConfigurations')
|
||||
->will($this->throwException(new \Exception()));
|
||||
|
||||
$args['ocConfig']->expects($this->never())
|
||||
->method('getSystemValue');
|
||||
|
||||
$bgJob = new \OCA\User_LDAP\Jobs\CleanUp();
|
||||
$bgJob->setArguments($args);
|
||||
|
||||
$result = $bgJob->isCleanUpAllowed();
|
||||
$this->assertSame(false, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* clean up job must not run when it is not enabled
|
||||
*/
|
||||
public function test_runNotAllowedBySysConfig() {
|
||||
$args = $this->getMocks();
|
||||
$args['helper']->expects($this->once())
|
||||
->method('haveDisabledConfigurations')
|
||||
->will($this->returnValue(false));
|
||||
|
||||
$args['ocConfig']->expects($this->once())
|
||||
->method('getSystemValue')
|
||||
->will($this->returnValue(false));
|
||||
|
||||
$bgJob = new \OCA\User_LDAP\Jobs\CleanUp();
|
||||
$bgJob->setArguments($args);
|
||||
|
||||
$result = $bgJob->isCleanUpAllowed();
|
||||
$this->assertSame(false, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* clean up job is allowed to run
|
||||
*/
|
||||
public function test_runIsAllowed() {
|
||||
$args = $this->getMocks();
|
||||
$args['helper']->expects($this->once())
|
||||
->method('haveDisabledConfigurations')
|
||||
->will($this->returnValue(false));
|
||||
|
||||
$args['ocConfig']->expects($this->once())
|
||||
->method('getSystemValue')
|
||||
->will($this->returnValue(true));
|
||||
|
||||
$bgJob = new \OCA\User_LDAP\Jobs\CleanUp();
|
||||
$bgJob->setArguments($args);
|
||||
|
||||
$result = $bgJob->isCleanUpAllowed();
|
||||
$this->assertSame(true, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* test whether sql is OK
|
||||
*/
|
||||
public function test_getMappedUsers() {
|
||||
$args = $this->getMocks();
|
||||
|
||||
$bgJob = new \OCA\User_LDAP\Jobs\CleanUp();
|
||||
$bgJob->setArguments($args);
|
||||
|
||||
if(version_compare(\PHPUnit_Runner_Version::id(), '3.8', '<')) {
|
||||
//otherwise we run into
|
||||
//https://github.com/sebastianbergmann/phpunit-mock-objects/issues/103
|
||||
$this->markTestIncomplete();
|
||||
}
|
||||
|
||||
$stmt = $this->getMock('\Doctrine\DBAL\Driver\Statement');
|
||||
|
||||
$args['db']->expects($this->once())
|
||||
->method('prepare')
|
||||
->will($this->returnValue($stmt));
|
||||
|
||||
$bgJob->getMappedUsers(0, $bgJob->getChunkSize());
|
||||
}
|
||||
|
||||
/**
|
||||
* check whether offset will be reset when it needs to
|
||||
*/
|
||||
public function test_OffsetResetIsNecessary() {
|
||||
$args = $this->getMocks();
|
||||
|
||||
$bgJob = new \OCA\User_LDAP\Jobs\CleanUp();
|
||||
$bgJob->setArguments($args);
|
||||
|
||||
$result = $bgJob->isOffsetResetNecessary($bgJob->getChunkSize() - 1);
|
||||
$this->assertSame(true, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* make sure offset is not reset when it is not due
|
||||
*/
|
||||
public function test_OffsetResetIsNotNecessary() {
|
||||
$args = $this->getMocks();
|
||||
|
||||
$bgJob = new \OCA\User_LDAP\Jobs\CleanUp();
|
||||
$bgJob->setArguments($args);
|
||||
|
||||
$result = $bgJob->isOffsetResetNecessary($bgJob->getChunkSize());
|
||||
$this->assertSame(false, $result);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,36 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\Core\Command\User;
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class Delete extends Command {
|
||||
protected function configure() {
|
||||
$this
|
||||
->setName('user:delete')
|
||||
->setDescription('deletes the specified user')
|
||||
->addArgument(
|
||||
'uid',
|
||||
InputArgument::REQUIRED,
|
||||
'the username'
|
||||
);
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output) {
|
||||
$wasSuccessful = \OC_User::deleteUser($input->getArgument('uid'));
|
||||
if($wasSuccessful === true) {
|
||||
$output->writeln('The specified user was deleted');
|
||||
return;
|
||||
}
|
||||
$output->writeln('<error>The specified could not be deleted. Please check the logs.</error>');
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue