2012-01-26 23:08:02 -05:00
< ? php
2018-01-21 13:33:59 -05:00
/**
* @ file mod / delegate . php
*/
2018-07-19 22:15:21 -04:00
2017-04-30 00:07:00 -04:00
use Friendica\App ;
2018-10-17 15:30:41 -04:00
use Friendica\BaseModule ;
2018-01-21 13:33:59 -05:00
use Friendica\Core\L10n ;
2018-08-11 16:40:44 -04:00
use Friendica\Core\Protocol ;
2017-08-26 02:04:21 -04:00
use Friendica\Core\System ;
2018-07-20 08:19:26 -04:00
use Friendica\Database\DBA ;
2018-03-11 09:12:15 -04:00
use Friendica\Model\User ;
2018-10-17 08:19:58 -04:00
use Friendica\Util\Security ;
2017-04-30 00:07:00 -04:00
2018-01-12 23:29:49 -05:00
require_once 'mod/settings.php' ;
2014-09-17 05:00:34 -04:00
2018-01-12 23:29:49 -05:00
function delegate_init ( App $a )
{
2014-09-17 05:00:34 -04:00
return settings_init ( $a );
}
2018-02-18 08:19:47 -05:00
function delegate_post ( App $a )
{
if ( ! local_user ()) {
return ;
}
if ( count ( $a -> user ) && x ( $a -> user , 'uid' ) && $a -> user [ 'uid' ] != local_user ()) {
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
return ;
}
2018-10-17 15:30:41 -04:00
BaseModule :: checkFormSecurityTokenRedirectOnError ( '/delegate' , 'delegate' );
2018-02-18 08:19:47 -05:00
$parent_uid = defaults ( $_POST , 'parent_user' , 0 );
2018-03-11 09:12:15 -04:00
$parent_password = defaults ( $_POST , 'parent_password' , '' );
2018-03-12 00:50:07 -04:00
if ( $parent_uid != 0 ) {
2018-07-20 08:19:26 -04:00
$user = DBA :: selectFirst ( 'user' , [ 'nickname' ], [ 'uid' => $parent_uid ]);
2018-07-21 08:46:04 -04:00
if ( ! DBA :: isResult ( $user )) {
2018-03-12 00:50:07 -04:00
notice ( L10n :: t ( 'Parent user not found.' ) . EOL );
return ;
}
$success = User :: authenticate ( $user [ 'nickname' ], trim ( $parent_password ));
if ( ! $success ) {
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
return ;
}
2018-03-11 09:12:15 -04:00
}
2018-02-18 08:19:47 -05:00
2018-07-20 08:19:26 -04:00
DBA :: update ( 'user' , [ 'parent-uid' => $parent_uid ], [ 'uid' => local_user ()]);
2018-02-18 08:19:47 -05:00
}
2018-01-12 23:29:49 -05:00
function delegate_content ( App $a )
{
if ( ! local_user ()) {
2018-01-21 13:33:59 -05:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2012-01-26 23:08:02 -05:00
return ;
}
2016-12-20 11:43:46 -05:00
if ( $a -> argc > 2 && $a -> argv [ 1 ] === 'add' && intval ( $a -> argv [ 2 ])) {
2012-01-26 23:08:02 -05:00
// delegated admins can view but not change delegation permissions
2018-01-12 23:29:49 -05:00
if ( x ( $_SESSION , 'submanage' )) {
2017-08-26 03:32:10 -04:00
goaway ( System :: baseUrl () . '/delegate' );
2016-12-20 04:35:28 -05:00
}
2012-01-26 23:08:02 -05:00
2018-01-12 23:29:49 -05:00
$user_id = $a -> argv [ 2 ];
2018-07-20 08:19:26 -04:00
$user = DBA :: selectFirst ( 'user' , [ 'nickname' ], [ 'uid' => $user_id ]);
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $user )) {
2018-01-12 23:29:49 -05:00
$condition = [
'uid' => local_user (),
'nurl' => normalise_link ( System :: baseUrl () . '/profile/' . $user [ 'nickname' ])
];
2018-07-20 08:19:26 -04:00
if ( DBA :: exists ( 'contact' , $condition )) {
DBA :: insert ( 'manage' , [ 'uid' => $user_id , 'mid' => local_user ()]);
2012-01-26 23:08:02 -05:00
}
}
2017-08-26 03:32:10 -04:00
goaway ( System :: baseUrl () . '/delegate' );
2012-01-26 23:08:02 -05:00
}
2016-12-20 11:43:46 -05:00
if ( $a -> argc > 2 && $a -> argv [ 1 ] === 'remove' && intval ( $a -> argv [ 2 ])) {
2012-01-26 23:08:02 -05:00
// delegated admins can view but not change delegation permissions
2018-01-12 23:29:49 -05:00
if ( x ( $_SESSION , 'submanage' )) {
2017-08-26 03:32:10 -04:00
goaway ( System :: baseUrl () . '/delegate' );
2016-12-20 04:35:28 -05:00
}
2012-01-26 23:08:02 -05:00
2018-07-20 08:19:26 -04:00
DBA :: delete ( 'manage' , [ 'uid' => $a -> argv [ 2 ], 'mid' => local_user ()]);
2017-08-26 03:32:10 -04:00
goaway ( System :: baseUrl () . '/delegate' );
2012-01-26 23:08:02 -05:00
}
// find everybody that currently has delegated management to this account/page
2018-01-12 23:29:49 -05:00
$delegates = [];
$r = q ( " SELECT * FROM `user` WHERE `uid` IN (SELECT `uid` FROM `manage` WHERE `mid` = %d) " ,
2012-01-26 23:08:02 -05:00
intval ( local_user ())
);
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $r )) {
2012-01-26 23:08:02 -05:00
$delegates = $r ;
2018-01-12 23:29:49 -05:00
}
2012-01-26 23:08:02 -05:00
2018-01-12 23:29:49 -05:00
$uids = [];
foreach ( $delegates as $rr ) {
$uids [] = $rr [ 'uid' ];
}
2012-01-26 23:08:02 -05:00
// find every contact who might be a candidate for delegation
2018-02-18 08:19:47 -05:00
$potentials = [];
2012-01-26 23:08:02 -05:00
2018-01-12 23:29:49 -05:00
$r = q ( " SELECT `nurl`
FROM `contact`
WHERE `self` = 0
AND SUBSTRING_INDEX ( `nurl` , '/' , 3 ) = '%s'
AND `uid` = % d
AND `network` = '%s' " ,
2018-07-21 09:10:13 -04:00
DBA :: escape ( normalise_link ( System :: baseUrl ())),
2012-01-26 23:08:02 -05:00
intval ( local_user ()),
2018-08-11 16:40:44 -04:00
DBA :: escape ( Protocol :: DFRN )
2017-01-09 07:12:54 -05:00
);
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $r )) {
2018-02-18 08:19:47 -05:00
$nicknames = [];
foreach ( $r as $rr ) {
2018-07-21 09:10:13 -04:00
$nicknames [] = " ' " . DBA :: escape ( basename ( $rr [ 'nurl' ])) . " ' " ;
2018-02-18 08:19:47 -05:00
}
2012-01-26 23:08:02 -05:00
2018-02-18 08:19:47 -05:00
$nicks = implode ( ',' , $nicknames );
// get user records for all potential page delegates who are not already delegates or managers
$r = q ( " SELECT `uid`, `username`, `nickname` FROM `user` WHERE `nickname` IN ( $nicks ) " );
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $r )) {
2018-02-18 08:19:47 -05:00
foreach ( $r as $rr ) {
if ( ! in_array ( $rr [ 'uid' ], $uids )) {
$potentials [] = $rr ;
}
}
}
2012-01-26 23:08:02 -05:00
}
2018-02-18 08:19:47 -05:00
settings_init ( $a );
2012-01-26 23:08:02 -05:00
2018-07-20 08:19:26 -04:00
$user = DBA :: selectFirst ( 'user' , [ 'parent-uid' , 'email' ], [ 'uid' => local_user ()]);
2012-01-26 23:08:02 -05:00
2018-02-18 08:19:47 -05:00
$parent_user = null ;
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $user )) {
2018-07-20 08:19:26 -04:00
if ( ! DBA :: exists ( 'user' , [ 'parent-uid' => local_user ()])) {
2018-02-18 08:19:47 -05:00
$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 ];
2018-07-20 08:19:26 -04:00
$parent_users = DBA :: select ( 'user' , $fields , $condition );
while ( $parent = DBA :: fetch ( $parent_users )) {
2018-02-18 08:19:47 -05:00
if ( $parent [ 'uid' ] != local_user ()) {
$parents [ $parent [ 'uid' ]] = sprintf ( '%s (%s)' , $parent [ 'username' ], $parent [ 'nickname' ]);
}
2018-01-12 23:29:49 -05:00
}
2018-02-18 08:19:47 -05:00
$parent_user = [ 'parent_user' , '' , $parent_uid , '' , $parents ];
2018-01-12 23:29:49 -05:00
}
}
2012-01-26 23:08:02 -05:00
2018-03-11 09:12:15 -04:00
if ( ! is_null ( $parent_user )) {
$parent_password = [ 'parent_password' , L10n :: t ( 'Parent Password:' ), '' , L10n :: t ( 'Please enter the password of the parent account to legitimize your request.' )];
}
2018-01-12 23:29:49 -05:00
$o = replace_macros ( get_markup_template ( 'delegate.tpl' ), [
2018-10-17 15:30:41 -04:00
'$form_security_token' => BaseModule :: getFormSecurityToken ( 'delegate' ),
2018-02-18 08:19:47 -05:00
'$parent_header' => L10n :: t ( 'Parent User' ),
'$parent_user' => $parent_user ,
2018-03-11 09:12:15 -04:00
'$parent_password' => $parent_password ,
2018-02-18 08:19:47 -05:00
'$parent_desc' => L10n :: t ( 'Parent users have total control about this account, including the account settings. Please double check whom you give this access.' ),
'$submit' => L10n :: t ( 'Save Settings' ),
2018-01-21 13:33:59 -05:00
'$header' => L10n :: t ( 'Delegate Page Management' ),
2018-02-18 08:19:47 -05:00
'$delegates_header' => L10n :: t ( 'Delegates' ),
2017-08-26 03:32:10 -04:00
'$base' => System :: baseUrl (),
2018-01-21 13:33:59 -05: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' ),
2012-01-26 23:08:02 -05:00
'$delegates' => $delegates ,
2018-01-21 13:33:59 -05:00
'$head_potentials' => L10n :: t ( 'Potential Delegates' ),
2012-01-26 23:08:02 -05:00
'$potentials' => $potentials ,
2018-01-21 13:33:59 -05:00
'$remove' => L10n :: t ( 'Remove' ),
'$add' => L10n :: t ( 'Add' ),
'$none' => L10n :: t ( 'No entries.' )
2018-01-12 23:29:49 -05:00
]);
2012-01-26 23:08:02 -05:00
return $o ;
2014-04-24 05:49:11 -04:00
}