2014-01-08 02:06:37 +04:00
< ? php
2021-05-25 14:03:29 +03:00
declare ( strict_types = 1 );
2014-01-08 02:06:37 +04:00
/**
2016-07-21 18:07:57 +03:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
*
2016-05-26 20:56:05 +03:00
* @ author Arthur Schiwon < blizzz @ arthur - schiwon . de >
2020-03-31 11:49:10 +03:00
* @ author Christoph Wurst < christoph @ winzerhof - wurst . at >
2016-07-21 18:07:57 +03:00
* @ author Joas Schilling < coding @ schilljs . com >
2015-03-26 13:44:34 +03:00
* @ author Morris Jobke < hey @ morrisjobke . de >
2017-11-06 17:56:42 +03:00
* @ author Roeland Jago Douma < roeland @ famdouma . nl >
2015-03-26 13:44:34 +03:00
* @ author Thomas Müller < thomas . mueller @ tmit . eu >
*
* @ license AGPL - 3.0
*
* This code is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License , version 3 ,
* as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License , version 3 ,
2019-12-03 21:57:53 +03:00
* along with this program . If not , see < http :// www . gnu . org / licenses />
2015-03-26 13:44:34 +03:00
*
2014-01-08 02:06:37 +04:00
*/
2015-02-26 13:37:37 +03:00
2014-01-08 02:06:37 +04:00
namespace OC\Core\Command\User ;
2021-05-25 14:03:29 +03:00
use OC\Files\View ;
2020-08-19 10:31:41 +03:00
use OCP\IConfig ;
2015-04-23 13:40:13 +03:00
use OCP\IUserManager ;
2014-01-08 02:06:37 +04:00
use Symfony\Component\Console\Command\Command ;
2016-09-06 21:35:10 +03:00
use Symfony\Component\Console\Helper\Table ;
2014-01-08 02:06:37 +04:00
use Symfony\Component\Console\Input\InputInterface ;
2021-05-25 14:03:29 +03:00
use Symfony\Component\Console\Input\InputOption ;
2014-01-08 02:06:37 +04:00
use Symfony\Component\Console\Output\OutputInterface ;
class Report extends Command {
2021-05-25 14:03:29 +03:00
public const DEFAULT_COUNT_DIRS_MAX_USERS = 500 ;
2015-04-23 13:40:13 +03:00
/** @var IUserManager */
protected $userManager ;
2020-08-19 10:31:41 +03:00
/** @var IConfig */
private $config ;
2015-04-23 13:40:13 +03:00
2021-05-25 14:03:29 +03:00
public function __construct ( IUserManager $userManager ,
IConfig $config ) {
2015-04-23 13:40:13 +03:00
$this -> userManager = $userManager ;
2020-08-19 10:31:41 +03:00
$this -> config = $config ;
2015-04-23 13:40:13 +03:00
parent :: __construct ();
}
2021-05-25 14:03:29 +03:00
protected function configure () : void {
2014-01-08 02:06:37 +04:00
$this
-> setName ( 'user:report' )
2021-05-25 14:03:29 +03:00
-> setDescription ( 'shows how many users have access' )
-> addOption (
'count-dirs' ,
null ,
InputOption :: VALUE_NONE ,
'Also count the number of user directories in the database (could time out on huge installations, therefore defaults to no with ' . self :: DEFAULT_COUNT_DIRS_MAX_USERS . '+ users)'
)
;
2014-01-08 02:06:37 +04:00
}
2020-06-26 15:54:51 +03:00
protected function execute ( InputInterface $input , OutputInterface $output ) : int {
2016-09-06 21:35:10 +03:00
$table = new Table ( $output );
2020-03-26 11:30:18 +03:00
$table -> setHeaders ([ 'User Report' , '' ]);
2014-01-08 02:06:37 +04:00
$userCountArray = $this -> countUsers ();
2021-05-25 14:03:29 +03:00
$total = 0 ;
2020-04-10 15:19:56 +03:00
if ( ! empty ( $userCountArray )) {
2020-03-26 11:30:18 +03:00
$rows = [];
2020-04-10 15:19:56 +03:00
foreach ( $userCountArray as $classname => $users ) {
2014-01-08 02:06:37 +04:00
$total += $users ;
2020-03-26 11:30:18 +03:00
$rows [] = [ $classname , $users ];
2014-01-08 02:06:37 +04:00
}
2020-03-26 11:30:18 +03:00
$rows [] = [ ' ' ];
$rows [] = [ 'total users' , $total ];
2014-01-08 02:06:37 +04:00
} else {
2020-03-26 11:30:18 +03:00
$rows [] = [ 'No backend enabled that supports user counting' , '' ];
2014-01-08 02:06:37 +04:00
}
2020-03-26 11:30:18 +03:00
$rows [] = [ ' ' ];
2021-05-25 14:03:29 +03:00
if ( $total <= self :: DEFAULT_COUNT_DIRS_MAX_USERS || $input -> getOption ( 'count-dirs' )) {
$userDirectoryCount = $this -> countUserDirectories ();
$rows [] = [ 'user directories' , $userDirectoryCount ];
}
2014-01-08 02:06:37 +04:00
2020-08-19 10:31:41 +03:00
$disabledUsers = $this -> config -> getUsersForUserValue ( 'core' , 'enabled' , 'false' );
$disabledUsersCount = count ( $disabledUsers );
$rows [] = [ 'disabled users' , $disabledUsersCount ];
2014-01-08 02:06:37 +04:00
$table -> setRows ( $rows );
2016-09-06 21:35:10 +03:00
$table -> render ();
2020-06-26 15:54:51 +03:00
return 0 ;
2014-01-08 02:06:37 +04:00
}
2021-05-25 14:03:29 +03:00
private function countUsers () : array {
2015-04-23 13:40:13 +03:00
return $this -> userManager -> countUsers ();
2014-01-08 02:06:37 +04:00
}
2021-05-25 14:03:29 +03:00
private function countUserDirectories () : int {
$dataview = new View ( '/' );
2014-01-08 02:06:37 +04:00
$userDirectories = $dataview -> getDirectoryContent ( '/' , 'httpd/unix-directory' );
return count ( $userDirectories );
}
2014-02-06 14:34:27 +04:00
}