2019-10-11 16:37:24 +00:00
< ? php
2020-02-09 14:45:36 +00:00
/**
2023-01-01 14:36:24 +00:00
* @ copyright Copyright ( C ) 2010 - 2023 , the Friendica project
2020-02-09 14:45:36 +00:00
*
* @ 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-10-11 16:37:24 +00:00
namespace Friendica\Module ;
use Friendica\BaseModule ;
use Friendica\Core\Hook ;
use Friendica\Core\Renderer ;
use Friendica\Database\DBA ;
2019-12-15 21:34:11 +00:00
use Friendica\DI ;
2021-01-23 09:53:44 +00:00
use Friendica\Model\Notification ;
2019-10-11 16:37:24 +00:00
use Friendica\Model\User ;
use Friendica\Network\HTTPException\ForbiddenException ;
2021-08-02 22:28:42 +00:00
use Friendica\Util\Proxy ;
2019-10-11 16:37:24 +00:00
/**
* Switches current user between delegates / parent user
*/
class Delegation extends BaseModule
{
2021-11-28 12:44:42 +00:00
protected function post ( array $request = [])
2019-10-11 16:37:24 +00:00
{
2022-10-20 20:59:12 +00:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2019-10-11 16:37:24 +00:00
return ;
}
2022-10-20 20:59:12 +00:00
$uid = DI :: userSession () -> getLocalUserId ();
2021-08-09 20:33:46 +00:00
$orig_record = User :: getById ( DI :: app () -> getLoggedInUserId ());
2019-10-11 16:37:24 +00:00
2022-10-21 17:33:28 +00:00
if ( DI :: userSession () -> getSubManagedUserId ()) {
$user = User :: getById ( DI :: userSession () -> getSubManagedUserId ());
2019-10-11 16:37:24 +00:00
if ( DBA :: isResult ( $user )) {
$uid = intval ( $user [ 'uid' ]);
$orig_record = $user ;
}
}
2023-05-27 22:19:02 +00:00
$identity = intval ( $request [ 'identity' ] ? ? 0 );
2019-10-11 16:37:24 +00:00
if ( ! $identity ) {
return ;
}
$limited_id = 0 ;
$original_id = $uid ;
$manages = DBA :: selectToArray ( 'manage' , [ 'mid' ], [ 'uid' => $uid ]);
foreach ( $manages as $manage ) {
if ( $identity == $manage [ 'mid' ]) {
$limited_id = $manage [ 'mid' ];
break ;
}
}
if ( $limited_id ) {
$user = User :: getById ( $limited_id );
} else {
// Check if the target user is one of our children
$user = DBA :: selectFirst ( 'user' , [], [ 'uid' => $identity , 'parent-uid' => $orig_record [ 'uid' ]]);
// Check if the target user is one of our siblings
2023-05-27 22:19:02 +00:00
if ( ! DBA :: isResult ( $user ) && $orig_record [ 'parent-uid' ]) {
2019-10-11 16:37:24 +00:00
$user = DBA :: selectFirst ( 'user' , [], [ 'uid' => $identity , 'parent-uid' => $orig_record [ 'parent-uid' ]]);
}
// Check if it's our parent or our own user
if ( ! DBA :: isResult ( $user )
&& (
2023-05-27 22:19:02 +00:00
$orig_record [ 'parent-uid' ] && $orig_record [ 'parent-uid' ] === $identity
2019-10-11 16:37:24 +00:00
||
2023-05-27 22:19:02 +00:00
$orig_record [ 'uid' ] && $orig_record [ 'uid' ] === $identity
2019-10-11 16:37:24 +00:00
)
) {
$user = User :: getById ( $identity );
}
}
if ( ! DBA :: isResult ( $user )) {
return ;
}
2022-10-18 19:13:58 +00:00
DI :: session () -> clear ();
2019-10-11 16:37:24 +00:00
2019-12-15 22:28:01 +00:00
DI :: auth () -> setForUser ( DI :: app (), $user , true , true );
2019-10-11 16:37:24 +00:00
if ( $limited_id ) {
2022-10-21 17:33:28 +00:00
DI :: userSession () -> setSubManagedUserId ( $original_id );
2019-10-11 16:37:24 +00:00
}
$ret = [];
Hook :: callAll ( 'home_init' , $ret );
2022-10-17 11:27:32 +00:00
DI :: sysmsg () -> addNotice ( $this -> t ( 'You are now logged in as %s' , $user [ 'username' ]));
2021-12-12 12:54:18 +00:00
DI :: baseUrl () -> redirect ( 'network' );
2019-10-11 16:37:24 +00:00
}
2021-11-20 14:38:03 +00:00
protected function content ( array $request = []) : string
2019-10-11 16:37:24 +00:00
{
2022-10-20 20:59:12 +00:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2020-01-18 19:52:34 +00:00
throw new ForbiddenException ( DI :: l10n () -> t ( 'Permission denied.' ));
2019-10-11 16:37:24 +00:00
}
2022-10-21 17:33:28 +00:00
$identities = User :: identities ( DI :: userSession () -> getSubManagedUserId () ? : DI :: userSession () -> getLocalUserId ());
2019-10-11 16:37:24 +00:00
2023-03-22 03:16:43 +00:00
//getting additional information for each identity
2019-10-11 16:37:24 +00:00
foreach ( $identities as $key => $identity ) {
2021-10-02 21:28:29 +00:00
$identities [ $key ][ 'thumb' ] = User :: getAvatarUrl ( $identity , Proxy :: SIZE_THUMB );
2019-10-11 16:37:24 +00:00
2021-08-09 19:48:39 +00:00
$identities [ $key ][ 'selected' ] = ( $identity [ 'nickname' ] === DI :: app () -> getLoggedInUserNickname ());
2019-10-11 16:37:24 +00:00
2021-09-18 05:08:29 +00:00
$condition = [ " `msg` != '' AND NOT (`type` IN (?, ?)) AND NOT `seen` " , Notification\Type :: INTRO , Notification\Type :: MAIL ];
2019-10-11 16:37:24 +00:00
$params = [ 'distinct' => true , 'expression' => 'parent' ];
2021-09-18 05:08:29 +00:00
$notifications = DI :: notify () -> countForUser ( $identity [ 'uid' ], $condition , $params );
2019-10-11 16:37:24 +00:00
$params = [ 'distinct' => true , 'expression' => 'convid' ];
$notifications += DBA :: count ( 'mail' , [ 'uid' => $identity [ 'uid' ], 'seen' => false ], $params );
2021-10-18 20:49:25 +00:00
$notifications += DI :: intro () -> countActiveForUser ( $identity [ 'uid' ]);
2019-10-11 16:37:24 +00:00
$identities [ $key ][ 'notifications' ] = $notifications ;
}
$o = Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( 'delegation.tpl' ), [
2020-11-08 07:26:52 +00:00
'$title' => DI :: l10n () -> t ( 'Switch between your accounts' ),
'$settings_label' => DI :: l10n () -> t ( 'Manage your accounts' ),
2020-01-18 19:52:34 +00:00
'$desc' => DI :: l10n () -> t ( 'Toggle between different identities or community/group pages which share your account details or which you have been granted "manage" permissions' ),
'$choose' => DI :: l10n () -> t ( 'Select an identity to manage: ' ),
2019-10-11 16:37:24 +00:00
'$identities' => $identities ,
2020-01-18 19:52:34 +00:00
'$submit' => DI :: l10n () -> t ( 'Submit' ),
2019-10-11 16:37:24 +00:00
]);
return $o ;
}
}