2020-02-09 17:04:35 +00:00
< ? php
2020-02-09 23:12:00 +01:00
/**
2022-01-02 08:27:47 +01:00
* @ copyright Copyright ( C ) 2010 - 2022 , the Friendica project
2020-02-09 23:12:00 +01: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 />.
*
*/
2020-02-09 17:04:35 +00:00
2022-10-30 15:50:39 -04:00
namespace Friendica\Module\Profile ;
2020-02-09 17:04:35 +00:00
2021-11-20 15:38:03 +01:00
use Friendica\App ;
2021-11-19 20:18:48 +01:00
use Friendica\App\Page ;
2020-02-09 17:04:35 +00:00
use Friendica\BaseModule ;
2021-07-24 10:09:39 +00:00
use Friendica\Content\Widget ;
2021-11-19 20:18:48 +01:00
use Friendica\Core\L10n ;
2020-02-09 17:04:35 +00:00
use Friendica\Core\Logger ;
use Friendica\Core\Protocol ;
use Friendica\Core\Renderer ;
use Friendica\Core\Search ;
2022-10-30 15:50:39 -04:00
use Friendica\Core\Session\Capability\IHandleUserSessions ;
2020-02-09 17:04:35 +00:00
use Friendica\Core\System ;
2022-10-17 18:55:22 +00:00
use Friendica\DI ;
2020-07-16 10:22:14 +00:00
use Friendica\Model\Contact ;
2020-02-09 17:04:35 +00:00
use Friendica\Model\Profile ;
2021-07-24 10:09:39 +00:00
use Friendica\Model\User ;
2022-10-30 15:50:39 -04:00
use Friendica\Module\Response ;
use Friendica\Navigation\SystemMessages ;
2021-08-17 09:38:35 -04:00
use Friendica\Network\HTTPException ;
2020-02-09 17:04:35 +00:00
use Friendica\Network\Probe ;
2021-11-20 15:38:03 +01:00
use Friendica\Util\Profiler ;
use Psr\Log\LoggerInterface ;
2020-02-09 17:04:35 +00:00
/**
* Remotely follow the account on this system by the provided account
*/
class RemoteFollow extends BaseModule
{
2022-10-30 15:50:39 -04:00
/** @var SystemMessages */
private $systemMessages ;
2021-11-19 20:18:48 +01:00
/** @var Page */
protected $page ;
2022-10-30 15:50:39 -04:00
/** @var IHandleUserSessions */
private $userSession ;
2021-07-24 10:09:39 +00:00
2022-10-30 15:50:39 -04:00
/** @var array */
protected $owner ;
public function __construct ( IHandleUserSessions $userSession , SystemMessages $systemMessages , L10n $l10n , App\BaseURL $baseUrl , App\Arguments $args , App\Page $page , LoggerInterface $logger , Profiler $profiler , Response $response , array $server , array $parameters = [])
2020-02-09 17:04:35 +00:00
{
2021-11-21 20:06:36 +01:00
parent :: __construct ( $l10n , $baseUrl , $args , $logger , $profiler , $response , $server , $parameters );
2021-11-19 20:18:48 +01:00
2022-10-30 15:50:39 -04:00
$this -> systemMessages = $systemMessages ;
$this -> page = $page ;
$this -> userSession = $userSession ;
$this -> owner = User :: getOwnerDataByNick ( $this -> parameters [ 'nickname' ]);
2021-11-19 20:18:48 +01:00
if ( ! $this -> owner ) {
throw new HTTPException\NotFoundException ( $this -> t ( 'User not found.' ));
2021-08-17 09:38:35 -04:00
}
2020-02-09 17:04:35 +00:00
}
2021-11-28 13:44:42 +01:00
protected function post ( array $request = [])
2020-02-09 17:04:35 +00:00
{
2022-10-30 15:50:39 -04:00
if ( ! empty ( $request [ 'cancel' ]) || empty ( $request [ 'dfrn_url' ])) {
$this -> baseUrl -> redirect ( 'profile/' . $this -> parameters [ 'nickname' ]);
2020-02-09 17:04:35 +00:00
}
2021-11-19 20:18:48 +01:00
if ( empty ( $this -> owner )) {
2022-10-30 15:50:39 -04:00
$this -> systemMessages -> addNotice ( $this -> t ( 'Profile unavailable.' ));
2020-02-09 17:04:35 +00:00
return ;
}
2022-10-30 15:50:39 -04:00
$url = Probe :: cleanURI ( $request [ 'dfrn_url' ]);
2020-02-09 17:04:35 +00:00
if ( ! strlen ( $url )) {
2022-10-30 15:50:39 -04:00
$this -> systemMessages -> addNotice ( $this -> t ( 'Invalid locator' ));
2020-02-09 17:04:35 +00:00
return ;
}
// Detect the network, make sure the provided URL is valid
2020-07-16 10:22:14 +00:00
$data = Contact :: getByURL ( $url );
if ( ! $data ) {
2022-10-30 15:50:39 -04:00
$this -> systemMessages -> addNotice ( $this -> t ( " The provided profile link doesn't seem to be valid " ));
2020-02-09 17:04:35 +00:00
return ;
}
2020-06-01 21:52:31 +00:00
if ( empty ( $data [ 'subscribe' ])) {
2022-10-30 15:50:39 -04:00
$this -> systemMessages -> addNotice ( $this -> t ( " Remote subscription can't be done for your network. Please subscribe directly on your system. " ));
2020-02-09 17:04:35 +00:00
return ;
}
2022-10-30 15:50:39 -04:00
$this -> logger -> notice ( 'Remote request' , [ 'url' => $url , 'follow' => $this -> owner [ 'url' ], 'remote' => $data [ 'subscribe' ]]);
2020-06-01 21:52:31 +00:00
// Substitute our user's feed URL into $data['subscribe']
2020-02-09 17:04:35 +00:00
// Send the subscriber home to subscribe
// Diaspora needs the uri in the format user@domain.tld
if ( $data [ 'network' ] == Protocol :: DIASPORA ) {
2021-11-19 20:18:48 +01:00
$uri = urlencode ( $this -> owner [ 'addr' ]);
2020-02-09 17:04:35 +00:00
} else {
2021-11-19 20:18:48 +01:00
$uri = urlencode ( $this -> owner [ 'url' ]);
2020-02-09 17:04:35 +00:00
}
2022-10-30 15:50:39 -04:00
2020-06-01 21:52:31 +00:00
$follow_link = str_replace ( '{uri}' , $uri , $data [ 'subscribe' ]);
2020-02-09 17:04:35 +00:00
System :: externalRedirect ( $follow_link );
}
2021-11-20 15:38:03 +01:00
protected function content ( array $request = []) : string
2020-02-09 17:04:35 +00:00
{
2021-11-19 20:18:48 +01:00
$this -> page [ 'aside' ] = Widget\VCard :: getHTML ( $this -> owner );
$target_addr = $this -> owner [ 'addr' ];
2022-10-30 15:50:39 -04:00
$target_url = $this -> owner [ 'url' ];
2020-02-09 17:04:35 +00:00
$tpl = Renderer :: getMarkupTemplate ( 'auto_request.tpl' );
2022-10-30 15:50:39 -04:00
return Renderer :: replaceMacros ( $tpl , [
2021-11-19 20:18:48 +01:00
'$header' => $this -> t ( 'Friend/Connection Request' ),
'$page_desc' => $this -> t ( 'Enter your Webfinger address (user@domain.tld) or profile URL here. If this isn\'t supported by your system, you have to subscribe to <strong>%s</strong> or <strong>%s</strong> directly on your system.' , $target_addr , $target_url ),
'$invite_desc' => $this -> t ( 'If you are not yet a member of the free social web, <a href="%s">follow this link to find a public Friendica node and join us today</a>.' , Search :: getGlobalDirectory () . '/servers' ),
'$your_address' => $this -> t ( 'Your Webfinger address or profile URL:' ),
'$pls_answer' => $this -> t ( 'Please answer the following:' ),
'$submit' => $this -> t ( 'Submit Request' ),
'$cancel' => $this -> t ( 'Cancel' ),
2020-02-09 17:04:35 +00:00
2022-10-30 15:50:39 -04:00
'$action' => 'profile/' . $this -> parameters [ 'nickname' ] . '/remote_follow' ,
2021-11-19 20:18:48 +01:00
'$name' => $this -> owner [ 'name' ],
2022-10-30 15:50:39 -04:00
'$myaddr' => $this -> userSession -> getMyUrl (),
2020-02-09 17:04:35 +00:00
]);
}
2020-02-09 22:08:59 +00:00
}