2019-05-02 00:01:43 -04:00
< ? php
2020-02-09 09:45:36 -05:00
/**
* @ copyright Copyright ( C ) 2020 , Friendica
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* 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
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
*/
2019-05-02 00:01:43 -04:00
namespace Friendica\Module\Admin ;
use Friendica\Content\Pager ;
use Friendica\Core\Renderer ;
use Friendica\Database\DBA ;
2019-12-15 16:34:11 -05:00
use Friendica\DI ;
2019-05-02 00:01:43 -04:00
use Friendica\Model\Register ;
use Friendica\Model\User ;
2020-01-22 23:14:14 -05:00
use Friendica\Module\BaseAdmin ;
2019-05-02 00:01:43 -04:00
use Friendica\Util\Temporal ;
2020-01-22 23:14:14 -05:00
class Users extends BaseAdmin
2019-05-02 00:01:43 -04:00
{
2019-11-05 16:48:54 -05:00
public static function post ( array $parameters = [])
2019-05-02 00:01:43 -04:00
{
2020-09-08 10:44:27 -04:00
self :: checkAdminAccess ();
2019-05-02 00:01:43 -04:00
2020-09-08 10:42:25 -04:00
self :: checkFormSecurityTokenRedirectOnError ( '/admin/users' , 'admin_users' );
2019-05-02 00:01:43 -04:00
2019-10-15 09:20:32 -04:00
$pending = $_POST [ 'pending' ] ? ? [];
$users = $_POST [ 'user' ] ? ? [];
$nu_name = $_POST [ 'new_user_name' ] ? ? '' ;
$nu_nickname = $_POST [ 'new_user_nickname' ] ? ? '' ;
$nu_email = $_POST [ 'new_user_email' ] ? ? '' ;
2020-01-19 15:21:13 -05:00
$nu_language = DI :: config () -> get ( 'system' , 'language' );
2019-05-02 00:01:43 -04:00
if ( $nu_name !== '' && $nu_email !== '' && $nu_nickname !== '' ) {
try {
2020-02-21 17:43:52 -05:00
User :: createMinimal ( $nu_name , $nu_email , $nu_nickname , $nu_language );
2019-05-02 00:01:43 -04:00
} catch ( \Exception $ex ) {
notice ( $ex -> getMessage ());
return ;
}
}
if ( ! empty ( $_POST [ 'page_users_block' ])) {
2020-02-21 17:43:52 -05:00
foreach ( $users as $uid ) {
2020-02-21 17:50:17 -05:00
User :: block ( $uid );
2020-02-20 17:43:52 -05:00
}
2020-09-07 06:17:42 -04:00
info ( DI :: l10n () -> tt ( '%s user blocked' , '%s users blocked' , count ( $users )));
2019-05-02 00:01:43 -04:00
}
if ( ! empty ( $_POST [ 'page_users_unblock' ])) {
2020-02-21 17:43:52 -05:00
foreach ( $users as $uid ) {
2020-02-21 17:50:17 -05:00
User :: block ( $uid , false );
2020-02-20 17:43:52 -05:00
}
2020-09-07 06:17:42 -04:00
info ( DI :: l10n () -> tt ( '%s user unblocked' , '%s users unblocked' , count ( $users )));
2019-05-02 00:01:43 -04:00
}
if ( ! empty ( $_POST [ 'page_users_delete' ])) {
foreach ( $users as $uid ) {
if ( local_user () != $uid ) {
User :: remove ( $uid );
} else {
2020-01-18 14:52:34 -05:00
notice ( DI :: l10n () -> t ( 'You can\'t remove yourself' ));
2019-05-02 00:01:43 -04:00
}
}
2020-09-07 06:17:42 -04:00
info ( DI :: l10n () -> tt ( '%s user deleted' , '%s users deleted' , count ( $users )));
2019-05-02 00:01:43 -04:00
}
if ( ! empty ( $_POST [ 'page_users_approve' ])) {
foreach ( $pending as $hash ) {
2020-02-21 17:50:17 -05:00
User :: allow ( $hash );
2019-05-02 00:01:43 -04:00
}
2020-09-07 06:17:42 -04:00
info ( DI :: l10n () -> tt ( '%s user approved' , '%s users approved' , count ( $pending )));
2019-05-02 00:01:43 -04:00
}
if ( ! empty ( $_POST [ 'page_users_deny' ])) {
foreach ( $pending as $hash ) {
2020-02-21 17:50:17 -05:00
User :: deny ( $hash );
2019-05-02 00:01:43 -04:00
}
2020-09-07 06:17:42 -04:00
info ( DI :: l10n () -> tt ( '%s registration revoked' , '%s registrations revoked' , count ( $pending )));
2019-05-02 00:01:43 -04:00
}
2019-12-15 18:28:31 -05:00
DI :: baseUrl () -> redirect ( 'admin/users' );
2019-05-02 00:01:43 -04:00
}
2019-11-05 16:48:54 -05:00
public static function content ( array $parameters = [])
2019-05-02 00:01:43 -04:00
{
2019-11-05 15:22:54 -05:00
parent :: content ( $parameters );
2019-05-02 00:01:43 -04:00
2020-09-08 10:38:35 -04:00
$action = $parameters [ 'action' ] ? ? '' ;
$uid = $parameters [ 'uid' ] ? ? 0 ;
2019-05-02 00:01:43 -04:00
2020-09-08 10:38:35 -04:00
if ( $uid ) {
2019-05-02 10:20:02 -04:00
$user = User :: getById ( $uid , [ 'username' , 'blocked' ]);
2019-05-02 00:01:43 -04:00
if ( ! DBA :: isResult ( $user )) {
2020-07-23 02:25:01 -04:00
notice ( DI :: l10n () -> t ( 'User not found' ));
2019-12-15 18:28:31 -05:00
DI :: baseUrl () -> redirect ( 'admin/users' );
2019-05-02 00:01:43 -04:00
return '' ; // NOTREACHED
}
2020-09-08 10:38:35 -04:00
}
2019-05-02 00:01:43 -04:00
2020-09-08 10:38:35 -04:00
switch ( $action ) {
case 'delete' :
if ( local_user () != $uid ) {
self :: checkFormSecurityTokenRedirectOnError ( '/admin/users' , 'admin_users' , 't' );
// delete user
User :: remove ( $uid );
2019-05-02 00:01:43 -04:00
2020-09-08 10:38:35 -04:00
notice ( DI :: l10n () -> t ( 'User "%s" deleted' , $user [ 'username' ]));
} else {
notice ( DI :: l10n () -> t ( 'You can\'t remove yourself' ));
}
break ;
case 'block' :
self :: checkFormSecurityTokenRedirectOnError ( '/admin/users' , 'admin_users' , 't' );
User :: block ( $uid );
notice ( DI :: l10n () -> t ( 'User "%s" blocked' , $user [ 'username' ]));
break ;
case 'unblock' :
self :: checkFormSecurityTokenRedirectOnError ( '/admin/users' , 'admin_users' , 't' );
User :: block ( $uid , false );
notice ( DI :: l10n () -> t ( 'User "%s" unblocked' , $user [ 'username' ]));
break ;
case 'allow' :
self :: checkFormSecurityTokenRedirectOnError ( '/admin/users' , 'admin_users' , 't' );
User :: allow ( Register :: getPendingForUser ( $uid )[ 'hash' ] ? ? '' );
notice ( DI :: l10n () -> t ( 'Account approved.' ));
break ;
case 'deny' :
self :: checkFormSecurityTokenRedirectOnError ( '/admin/users' , 'admin_users' , 't' );
User :: deny ( Register :: getPendingForUser ( $uid )[ 'hash' ] ? ? '' );
notice ( DI :: l10n () -> t ( 'Registration revoked' ));
break ;
default :
/* get pending */
$pending = Register :: getPending ();
$pager = new Pager ( DI :: l10n (), DI :: args () -> getQueryString (), 100 );
$valid_orders = [
'name' ,
'email' ,
'register_date' ,
'login_date' ,
'last-item' ,
'page-flags'
];
$order = 'name' ;
$order_direction = '+' ;
if ( ! empty ( $_GET [ 'o' ])) {
$new_order = $_GET [ 'o' ];
if ( $new_order [ 0 ] === '-' ) {
$order_direction = '-' ;
$new_order = substr ( $new_order , 1 );
2019-05-02 00:01:43 -04:00
}
2020-09-08 10:38:35 -04:00
if ( in_array ( $new_order , $valid_orders )) {
$order = $new_order ;
}
}
2019-05-02 00:01:43 -04:00
2020-09-08 10:38:35 -04:00
$users = User :: getList ( $pager -> getStart (), $pager -> getItemsPerPage (), 'all' , $order , ( $order_direction == '-' ));
$adminlist = explode ( ',' , str_replace ( ' ' , '' , DI :: config () -> get ( 'config' , 'admin_email' )));
$_setup_users = function ( $e ) use ( $adminlist ) {
$page_types = [
User :: PAGE_FLAGS_NORMAL => DI :: l10n () -> t ( 'Normal Account Page' ),
User :: PAGE_FLAGS_SOAPBOX => DI :: l10n () -> t ( 'Soapbox Page' ),
User :: PAGE_FLAGS_COMMUNITY => DI :: l10n () -> t ( 'Public Forum' ),
User :: PAGE_FLAGS_FREELOVE => DI :: l10n () -> t ( 'Automatic Friend Page' ),
User :: PAGE_FLAGS_PRVGROUP => DI :: l10n () -> t ( 'Private Forum' )
];
$account_types = [
User :: ACCOUNT_TYPE_PERSON => DI :: l10n () -> t ( 'Personal Page' ),
User :: ACCOUNT_TYPE_ORGANISATION => DI :: l10n () -> t ( 'Organisation Page' ),
User :: ACCOUNT_TYPE_NEWS => DI :: l10n () -> t ( 'News Page' ),
User :: ACCOUNT_TYPE_COMMUNITY => DI :: l10n () -> t ( 'Community Forum' ),
User :: ACCOUNT_TYPE_RELAY => DI :: l10n () -> t ( 'Relay' ),
];
$e [ 'page_flags_raw' ] = $e [ 'page-flags' ];
$e [ 'page-flags' ] = $page_types [ $e [ 'page-flags' ]];
$e [ 'account_type_raw' ] = ( $e [ 'page_flags_raw' ] == 0 ) ? $e [ 'account-type' ] : - 1 ;
$e [ 'account-type' ] = ( $e [ 'page_flags_raw' ] == 0 ) ? $account_types [ $e [ 'account-type' ]] : '' ;
$e [ 'register_date' ] = Temporal :: getRelativeDate ( $e [ 'register_date' ]);
$e [ 'login_date' ] = Temporal :: getRelativeDate ( $e [ 'login_date' ]);
$e [ 'lastitem_date' ] = Temporal :: getRelativeDate ( $e [ 'last-item' ]);
$e [ 'is_admin' ] = in_array ( $e [ 'email' ], $adminlist );
$e [ 'is_deletable' ] = ( intval ( $e [ 'uid' ]) != local_user ());
$e [ 'deleted' ] = ( $e [ 'account_removed' ] ? Temporal :: getRelativeDate ( $e [ 'account_expires_on' ]) : False );
return $e ;
};
$tmp_users = array_map ( $_setup_users , $users );
// Get rid of dashes in key names, Smarty3 can't handle them
// and extracting deleted users
$deleted = [];
$users = [];
foreach ( $tmp_users as $user ) {
foreach ( $user as $k => $v ) {
$newkey = str_replace ( '-' , '_' , $k );
$user [ $newkey ] = $v ;
}
2020-02-25 16:16:27 -05:00
2020-09-08 10:38:35 -04:00
if ( $user [ 'deleted' ]) {
$deleted [] = $user ;
} else {
$users [] = $user ;
}
}
2019-05-02 00:01:43 -04:00
2020-09-08 10:38:35 -04:00
$th_users = array_map ( null , [ DI :: l10n () -> t ( 'Name' ), DI :: l10n () -> t ( 'Email' ), DI :: l10n () -> t ( 'Register date' ), DI :: l10n () -> t ( 'Last login' ), DI :: l10n () -> t ( 'Last public item' ), DI :: l10n () -> t ( 'Type' )], $valid_orders );
$t = Renderer :: getMarkupTemplate ( 'admin/users.tpl' );
$o = Renderer :: replaceMacros ( $t , [
// strings //
'$title' => DI :: l10n () -> t ( 'Administration' ),
'$page' => DI :: l10n () -> t ( 'Users' ),
'$submit' => DI :: l10n () -> t ( 'Add User' ),
'$select_all' => DI :: l10n () -> t ( 'select all' ),
'$h_pending' => DI :: l10n () -> t ( 'User registrations waiting for confirm' ),
'$h_deleted' => DI :: l10n () -> t ( 'User waiting for permanent deletion' ),
'$th_pending' => [ DI :: l10n () -> t ( 'Request date' ), DI :: l10n () -> t ( 'Name' ), DI :: l10n () -> t ( 'Email' )],
'$no_pending' => DI :: l10n () -> t ( 'No registrations.' ),
'$pendingnotetext' => DI :: l10n () -> t ( 'Note from the user' ),
'$approve' => DI :: l10n () -> t ( 'Approve' ),
'$deny' => DI :: l10n () -> t ( 'Deny' ),
'$delete' => DI :: l10n () -> t ( 'Delete' ),
'$block' => DI :: l10n () -> t ( 'Block' ),
'$blocked' => DI :: l10n () -> t ( 'User blocked' ),
'$unblock' => DI :: l10n () -> t ( 'Unblock' ),
'$siteadmin' => DI :: l10n () -> t ( 'Site admin' ),
'$accountexpired' => DI :: l10n () -> t ( 'Account expired' ),
'$h_users' => DI :: l10n () -> t ( 'Users' ),
'$h_newuser' => DI :: l10n () -> t ( 'New User' ),
'$th_deleted' => [ DI :: l10n () -> t ( 'Name' ), DI :: l10n () -> t ( 'Email' ), DI :: l10n () -> t ( 'Register date' ), DI :: l10n () -> t ( 'Last login' ), DI :: l10n () -> t ( 'Last public item' ), DI :: l10n () -> t ( 'Permanent deletion' )],
'$th_users' => $th_users ,
'$order_users' => $order ,
'$order_direction_users' => $order_direction ,
'$confirm_delete_multi' => DI :: l10n () -> t ( 'Selected users will be deleted!\n\nEverything these users had posted on this site will be permanently deleted!\n\nAre you sure?' ),
'$confirm_delete' => DI :: l10n () -> t ( 'The user {0} will be deleted!\n\nEverything this user has posted on this site will be permanently deleted!\n\nAre you sure?' ),
'$form_security_token' => self :: getFormSecurityToken ( 'admin_users' ),
// values //
'$baseurl' => DI :: baseUrl () -> get ( true ),
'$pending' => $pending ,
'deleted' => $deleted ,
'$users' => $users ,
'$newusername' => [ 'new_user_name' , DI :: l10n () -> t ( 'Name' ), '' , DI :: l10n () -> t ( 'Name of the new user.' )],
'$newusernickname' => [ 'new_user_nickname' , DI :: l10n () -> t ( 'Nickname' ), '' , DI :: l10n () -> t ( 'Nickname of the new user.' )],
'$newuseremail' => [ 'new_user_email' , DI :: l10n () -> t ( 'Email' ), '' , DI :: l10n () -> t ( 'Email address of the new user.' ), '' , '' , 'email' ],
]);
$o .= $pager -> renderFull ( DBA :: count ( 'user' ));
return $o ;
2019-05-02 00:01:43 -04:00
}
2020-09-08 10:38:35 -04:00
DI :: baseUrl () -> redirect ( 'admin/users' );
return '' ;
2019-05-02 00:01:43 -04:00
}
}