2019-10-10 04:17:09 +02:00
< ? php
namespace Friendica\Module\Settings ;
use Friendica\App\Arguments ;
use Friendica\BaseModule ;
use Friendica\Core\L10n ;
use Friendica\Core\Protocol ;
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-10 04:17:09 +02:00
use Friendica\Model\User ;
use Friendica\Module\BaseSettingsModule ;
use Friendica\Network\HTTPException ;
use Friendica\Util\Strings ;
2019-10-10 10:17:37 +02:00
/**
* Account delegation settings module
*/
2019-10-10 04:17:09 +02:00
class Delegation extends BaseSettingsModule
{
2019-11-05 22:48:54 +01:00
public static function post ( array $parameters = [])
2019-10-10 04:17:09 +02:00
{
2019-12-15 22:34:11 +01:00
if ( ! local_user () || ! empty ( DI :: app () -> user [ 'uid' ]) && DI :: app () -> user [ 'uid' ] != local_user ()) {
2019-10-10 04:17:09 +02:00
throw new HTTPException\ForbiddenException ( L10n :: t ( 'Permission denied.' ));
}
BaseModule :: checkFormSecurityTokenRedirectOnError ( 'settings/delegation' , 'delegate' );
2020-01-16 21:58:33 +01:00
$parent_uid = ( int ) $_POST [ 'parent_user' ] ? ? 0 ;
2019-10-10 04:17:09 +02:00
$parent_password = $_POST [ 'parent_password' ] ? ? '' ;
if ( $parent_uid != 0 ) {
try {
2019-10-10 10:10:29 +02:00
User :: getIdFromPasswordAuthentication ( $parent_uid , $parent_password );
2019-10-10 04:17:09 +02:00
info ( L10n :: t ( 'Delegation successfully granted.' ));
2019-10-10 10:10:29 +02:00
} catch ( \Exception $ex ) {
notice ( L10n :: t ( 'Parent user not found, unavailable or password doesn\'t match.' ));
2019-10-10 04:17:09 +02:00
return ;
}
} else {
info ( L10n :: t ( 'Delegation successfully revoked.' ));
}
DBA :: update ( 'user' , [ 'parent-uid' => $parent_uid ], [ 'uid' => local_user ()]);
}
2019-11-05 22:48:54 +01:00
public static function content ( array $parameters = [])
2019-10-10 04:17:09 +02:00
{
2019-11-05 21:22:54 +01:00
parent :: content ( $parameters );
2019-10-10 04:17:09 +02:00
if ( ! local_user ()) {
throw new HTTPException\ForbiddenException ( L10n :: t ( 'Permission denied.' ));
}
2019-12-15 23:28:01 +01:00
$args = DI :: args ();
2019-10-10 04:17:09 +02:00
2019-10-10 10:17:37 +02:00
// @TODO Replace with router-provided arguments
2019-10-10 04:17:09 +02:00
$action = $args -> get ( 2 );
$user_id = $args -> get ( 3 );
2019-10-10 10:17:37 +02:00
2019-10-10 04:17:09 +02:00
if ( $action === 'add' && $user_id ) {
if ( Session :: get ( 'submanage' )) {
notice ( L10n :: t ( 'Delegated administrators can view but not change delegation permissions.' ));
2019-12-16 00:28:31 +01:00
DI :: baseUrl () -> redirect ( 'settings/delegation' );
2019-10-10 04:17:09 +02:00
}
2019-10-10 10:10:57 +02:00
$user = User :: getById ( $user_id , [ 'nickname' ]);
2019-10-10 04:17:09 +02:00
if ( DBA :: isResult ( $user )) {
$condition = [
'uid' => local_user (),
2019-12-30 23:00:08 +01:00
'nurl' => Strings :: normaliseLink ( DI :: baseUrl () . '/profile/' . $user [ 'nickname' ])
2019-10-10 04:17:09 +02:00
];
if ( DBA :: exists ( 'contact' , $condition )) {
DBA :: insert ( 'manage' , [ 'uid' => $user_id , 'mid' => local_user ()]);
}
} else {
notice ( L10n :: t ( 'Delegate user not found.' ));
}
2019-12-16 00:28:31 +01:00
DI :: baseUrl () -> redirect ( 'settings/delegation' );
2019-10-10 04:17:09 +02:00
}
if ( $action === 'remove' && $user_id ) {
if ( Session :: get ( 'submanage' )) {
notice ( L10n :: t ( 'Delegated administrators can view but not change delegation permissions.' ));
2019-12-16 00:28:31 +01:00
DI :: baseUrl () -> redirect ( 'settings/delegation' );
2019-10-10 04:17:09 +02:00
}
DBA :: delete ( 'manage' , [ 'uid' => $user_id , 'mid' => local_user ()]);
2019-12-16 00:28:31 +01:00
DI :: baseUrl () -> redirect ( 'settings/delegation' );
2019-10-10 04:17:09 +02:00
}
// find everybody that currently has delegated management to this account/page
$delegates = DBA :: selectToArray ( 'user' , [], [ '`uid` IN (SELECT `uid` FROM `manage` WHERE `mid` = ?)' , local_user ()]);
$uids = [];
foreach ( $delegates as $user ) {
$uids [] = $user [ 'uid' ];
}
// find every contact who might be a candidate for delegation
$potentials = [];
2020-01-10 09:04:48 +01:00
$nicknames = [];
2019-10-10 04:17:09 +02:00
2020-01-10 09:04:48 +01:00
$condition = [ 'baseurl' => DI :: baseUrl (), 'self' => false , 'uid' => local_user (), 'blocked' => false ];
$contacts = DBA :: select ( 'contact' , [ 'nick' ], $condition );
while ( $contact = DBA :: fetch ( $contacts )) {
$nicknames [] = $contact [ 'nick' ];
}
2019-10-10 04:17:09 +02:00
2020-01-10 09:04:48 +01:00
// get user records for all potential page delegates who are not already delegates or managers
$potentialDelegateUsers = DBA :: selectToArray ( 'user' , [ 'uid' , 'username' , 'nickname' ], [ 'nickname' => $nicknames ]);
foreach ( $potentialDelegateUsers as $user ) {
if ( ! in_array ( $user [ 'uid' ], $uids )) {
$potentials [] = $user ;
2019-10-10 04:17:09 +02:00
}
}
$parent_user = null ;
$parent_password = null ;
2019-10-10 10:10:57 +02:00
$user = User :: getById ( local_user (), [ 'parent-uid' , 'email' ]);
2019-10-10 04:17:09 +02:00
if ( DBA :: isResult ( $user ) && ! DBA :: exists ( 'user' , [ 'parent-uid' => local_user ()])) {
$parent_uid = $user [ 'parent-uid' ];
$parents = [ 0 => L10n :: t ( 'No parent user' )];
$fields = [ 'uid' , 'username' , 'nickname' ];
$condition = [ 'email' => $user [ 'email' ], 'verified' => true , 'blocked' => false , 'parent-uid' => 0 ];
$parent_users = DBA :: selectToArray ( 'user' , $fields , $condition );
foreach ( $parent_users as $parent ) {
if ( $parent [ 'uid' ] != local_user ()) {
$parents [ $parent [ 'uid' ]] = sprintf ( '%s (%s)' , $parent [ 'username' ], $parent [ 'nickname' ]);
}
}
$parent_user = [ 'parent_user' , '' , $parent_uid , '' , $parents ];
$parent_password = [ 'parent_password' , L10n :: t ( 'Parent Password:' ), '' , L10n :: t ( 'Please enter the password of the parent account to legitimize your request.' )];
}
2020-01-18 19:40:48 +01:00
$is_child_user = ! empty ( $user [ 'parent-uid' ]);
2019-10-10 04:17:09 +02:00
$o = Renderer :: replaceMacros ( Renderer :: getMarkupTemplate ( 'settings/delegation.tpl' ), [
'$form_security_token' => BaseModule :: getFormSecurityToken ( 'delegate' ),
2020-01-17 13:44:26 +01:00
'$account_header' => L10n :: t ( 'Additional Accounts' ),
'$account_desc' => L10n :: t ( 'Register additional accounts that are automatically connected to your existing account so you can manage it from this account.' ),
'$add_account' => L10n :: t ( 'Register an additional account' ),
2019-10-10 04:17:09 +02:00
'$parent_header' => L10n :: t ( 'Parent User' ),
'$parent_user' => $parent_user ,
'$parent_password' => $parent_password ,
'$parent_desc' => L10n :: t ( 'Parent users have total control about this account, including the account settings. Please double check whom you give this access.' ),
2020-01-18 19:40:48 +01:00
'$is_child_user' => $is_child_user ,
2019-10-10 04:17:09 +02:00
'$submit' => L10n :: t ( 'Save Settings' ),
2020-01-17 13:44:26 +01:00
'$header' => L10n :: t ( 'Manage Accounts' ),
2019-10-10 04:17:09 +02:00
'$delegates_header' => L10n :: t ( 'Delegates' ),
2019-12-30 23:00:08 +01:00
'$base' => DI :: baseUrl (),
2019-10-10 04:17:09 +02:00
'$desc' => L10n :: t ( 'Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely.' ),
'$head_delegates' => L10n :: t ( 'Existing Page Delegates' ),
'$delegates' => $delegates ,
'$head_potentials' => L10n :: t ( 'Potential Delegates' ),
'$potentials' => $potentials ,
'$remove' => L10n :: t ( 'Remove' ),
'$add' => L10n :: t ( 'Add' ),
'$none' => L10n :: t ( 'No entries.' )
]);
return $o ;
}
}