2019-10-11 12:37:24 -04:00
< ? php
2020-02-09 09:45:36 -05:00
/**
2022-01-02 02:27:47 -05:00
* @ copyright Copyright ( C ) 2010 - 2022 , the Friendica project
2020-02-09 09:45:36 -05: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 12:37:24 -04:00
namespace Friendica\Module ;
use Friendica\BaseModule ;
use Friendica\Core\Hook ;
use Friendica\Core\Renderer ;
use Friendica\Core\Session ;
use Friendica\Database\DBA ;
2019-12-15 16:34:11 -05:00
use Friendica\DI ;
2021-01-23 04:53:44 -05:00
use Friendica\Model\Notification ;
2019-10-11 12:37:24 -04:00
use Friendica\Model\User ;
use Friendica\Network\HTTPException\ForbiddenException ;
2021-08-02 18:28:42 -04:00
use Friendica\Util\Proxy ;
2019-10-11 12:37:24 -04:00
/**
* Switches current user between delegates / parent user
*/
class Delegation extends BaseModule
{
2021-11-28 07:44:42 -05:00
protected function post ( array $request = [])
2019-10-11 12:37:24 -04:00
{
if ( ! local_user ()) {
return ;
}
$uid = local_user ();
2021-08-09 16:33:46 -04:00
$orig_record = User :: getById ( DI :: app () -> getLoggedInUserId ());
2019-10-11 12:37:24 -04:00
if ( Session :: get ( 'submanage' )) {
$user = User :: getById ( Session :: get ( 'submanage' ));
if ( DBA :: isResult ( $user )) {
$uid = intval ( $user [ 'uid' ]);
$orig_record = $user ;
}
}
$identity = intval ( $_POST [ 'identity' ] ? ? 0 );
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
if ( ! DBA :: isResult ( $user ) && ( $orig_record [ 'parent-uid' ] != 0 )) {
$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 )
&& (
$orig_record [ 'parent-uid' ] != 0 && $orig_record [ 'parent-uid' ] == $identity
||
$orig_record [ 'uid' ] != 0 && $orig_record [ 'uid' ] == $identity
)
) {
$user = User :: getById ( $identity );
}
}
if ( ! DBA :: isResult ( $user )) {
return ;
}
Session :: clear ();
2019-12-15 17:28:01 -05:00
DI :: auth () -> setForUser ( DI :: app (), $user , true , true );
2019-10-11 12:37:24 -04:00
if ( $limited_id ) {
Session :: set ( 'submanage' , $original_id );
}
$ret = [];
Hook :: callAll ( 'home_init' , $ret );
2021-12-12 07:54:18 -05:00
notice ( $this -> t ( 'You are now logged in as %s' , $user [ 'username' ]));
DI :: baseUrl () -> redirect ( 'network' );
2019-10-11 12:37:24 -04:00
}
2021-11-20 09:38:03 -05:00
protected function content ( array $request = []) : string
2019-10-11 12:37:24 -04:00
{
if ( ! local_user ()) {
2020-01-18 14:52:34 -05:00
throw new ForbiddenException ( DI :: l10n () -> t ( 'Permission denied.' ));
2019-10-11 12:37:24 -04:00
}
2021-07-25 01:04:48 -04:00
$identities = User :: identities ( DI :: session () -> get ( 'submanage' , local_user ()));
2019-10-11 12:37:24 -04:00
//getting additinal information for each identity
foreach ( $identities as $key => $identity ) {
2021-10-02 17:28:29 -04:00
$identities [ $key ][ 'thumb' ] = User :: getAvatarUrl ( $identity , Proxy :: SIZE_THUMB );
2019-10-11 12:37:24 -04:00
2021-08-09 15:48:39 -04:00
$identities [ $key ][ 'selected' ] = ( $identity [ 'nickname' ] === DI :: app () -> getLoggedInUserNickname ());
2019-10-11 12:37:24 -04:00
2021-09-18 01:08:29 -04:00
$condition = [ " `msg` != '' AND NOT (`type` IN (?, ?)) AND NOT `seen` " , Notification\Type :: INTRO , Notification\Type :: MAIL ];
2019-10-11 12:37:24 -04:00
$params = [ 'distinct' => true , 'expression' => 'parent' ];
2021-09-18 01:08:29 -04:00
$notifications = DI :: notify () -> countForUser ( $identity [ 'uid' ], $condition , $params );
2019-10-11 12:37:24 -04:00
$params = [ 'distinct' => true , 'expression' => 'convid' ];
$notifications += DBA :: count ( 'mail' , [ 'uid' => $identity [ 'uid' ], 'seen' => false ], $params );
2021-10-18 16:49:25 -04:00
$notifications += DI :: intro () -> countActiveForUser ( $identity [ 'uid' ]);
2019-10-11 12:37:24 -04:00
$identities [ $key ][ 'notifications' ] = $notifications ;
}
$o = Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( 'delegation.tpl' ), [
2020-11-08 02:26:52 -05:00
'$title' => DI :: l10n () -> t ( 'Switch between your accounts' ),
'$settings_label' => DI :: l10n () -> t ( 'Manage your accounts' ),
2020-01-18 14:52:34 -05: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 12:37:24 -04:00
'$identities' => $identities ,
2020-01-18 14:52:34 -05:00
'$submit' => DI :: l10n () -> t ( 'Submit' ),
2019-10-11 12:37:24 -04:00
]);
return $o ;
}
}