2019-10-11 18:37:24 +02:00
< ? php
2020-02-09 15:45:36 +01: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-10-11 18:37:24 +02: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 22:34:11 +01:00
use Friendica\DI ;
2019-10-11 18:37:24 +02:00
use Friendica\Model\Contact ;
2021-01-23 10:53:44 +01:00
use Friendica\Model\Notification ;
2019-10-11 18:37:24 +02:00
use Friendica\Model\User ;
use Friendica\Network\HTTPException\ForbiddenException ;
/**
* Switches current user between delegates / parent user
*/
class Delegation extends BaseModule
{
2019-11-05 22:48:54 +01:00
public static function post ( array $parameters = [])
2019-10-11 18:37:24 +02:00
{
if ( ! local_user ()) {
return ;
}
$uid = local_user ();
2019-12-15 22:34:11 +01:00
$orig_record = DI :: app () -> user ;
2019-10-11 18:37:24 +02: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 23:28:01 +01:00
DI :: auth () -> setForUser ( DI :: app (), $user , true , true );
2019-10-11 18:37:24 +02:00
if ( $limited_id ) {
Session :: set ( 'submanage' , $original_id );
}
$ret = [];
Hook :: callAll ( 'home_init' , $ret );
2019-12-16 00:28:31 +01:00
DI :: baseUrl () -> redirect ( 'profile/' . DI :: app () -> user [ 'nickname' ]);
2019-10-11 18:37:24 +02:00
// NOTREACHED
}
2019-11-05 22:48:54 +01:00
public static function content ( array $parameters = [])
2019-10-11 18:37:24 +02:00
{
if ( ! local_user ()) {
2020-01-18 20:52:34 +01:00
throw new ForbiddenException ( DI :: l10n () -> t ( 'Permission denied.' ));
2019-10-11 18:37:24 +02:00
}
2019-12-15 22:34:11 +01:00
$identities = DI :: app () -> identities ;
2019-10-11 18:37:24 +02:00
//getting additinal information for each identity
foreach ( $identities as $key => $identity ) {
$thumb = Contact :: selectFirst ([ 'thumb' ], [ 'uid' => $identity [ 'uid' ], 'self' => true ]);
if ( ! DBA :: isResult ( $thumb )) {
continue ;
}
$identities [ $key ][ 'thumb' ] = $thumb [ 'thumb' ];
2019-12-15 22:34:11 +01:00
$identities [ $key ][ 'selected' ] = ( $identity [ 'nickname' ] === DI :: app () -> user [ 'nickname' ]);
2019-10-11 18:37:24 +02:00
2021-01-23 10:53:44 +01:00
$condition = [ " `uid` = ? AND `msg` != '' AND NOT (`type` IN (?, ?)) AND NOT `seen` " , $identity [ 'uid' ], Notification\Type :: INTRO , Notification\Type :: MAIL ];
2019-10-11 18:37:24 +02:00
$params = [ 'distinct' => true , 'expression' => 'parent' ];
$notifications = DBA :: count ( 'notify' , $condition , $params );
$params = [ 'distinct' => true , 'expression' => 'convid' ];
$notifications += DBA :: count ( 'mail' , [ 'uid' => $identity [ 'uid' ], 'seen' => false ], $params );
$notifications += DBA :: count ( 'intro' , [ 'blocked' => false , 'ignore' => false , 'uid' => $identity [ 'uid' ]]);
$identities [ $key ][ 'notifications' ] = $notifications ;
}
$o = Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( 'delegation.tpl' ), [
2020-11-08 08:26:52 +01:00
'$title' => DI :: l10n () -> t ( 'Switch between your accounts' ),
'$settings_label' => DI :: l10n () -> t ( 'Manage your accounts' ),
2020-01-18 20:52:34 +01: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 18:37:24 +02:00
'$identities' => $identities ,
2020-01-18 20:52:34 +01:00
'$submit' => DI :: l10n () -> t ( 'Submit' ),
2019-10-11 18:37:24 +02:00
]);
return $o ;
}
}