New page for remote follow requests

This commit is contained in:
Michael 2020-02-09 17:04:35 +00:00
parent 16acf1db95
commit 2eebeeaa32
7 changed files with 167 additions and 17 deletions

View file

@ -115,22 +115,11 @@ function unfollow_content(App $a)
$o = Renderer::replaceMacros($tpl, [ $o = Renderer::replaceMacros($tpl, [
'$header' => DI::l10n()->t('Disconnect/Unfollow'), '$header' => DI::l10n()->t('Disconnect/Unfollow'),
'$desc' => '',
'$pls_answer' => '',
'$does_know_you' => '',
'$add_note' => '',
'$page_desc' => '', '$page_desc' => '',
'$friendica' => '',
'$statusnet' => '',
'$diaspora' => '',
'$diasnote' => '',
'$your_address' => DI::l10n()->t('Your Identity Address:'), '$your_address' => DI::l10n()->t('Your Identity Address:'),
'$invite_desc' => '', '$invite_desc' => '',
'$emailnet' => '',
'$submit' => DI::l10n()->t('Submit Request'), '$submit' => DI::l10n()->t('Submit Request'),
'$cancel' => DI::l10n()->t('Cancel'), '$cancel' => DI::l10n()->t('Cancel'),
'$nickname' => '',
'$name' => $contact['name'],
'$url' => $contact['url'], '$url' => $contact['url'],
'$zrl' => Contact::magicLink($contact['url']), '$zrl' => Contact::magicLink($contact['url']),
'$url_label' => DI::l10n()->t('Profile URL'), '$url_label' => DI::l10n()->t('Profile URL'),

View file

@ -313,7 +313,7 @@ class Profile
if (!$local_user_is_self && $show_connect) { if (!$local_user_is_self && $show_connect) {
if (!$visitor_is_authenticated) { if (!$visitor_is_authenticated) {
if (!empty($profile['nickname'])) { if (!empty($profile['nickname'])) {
$follow_link = 'dfrn_request/' . $profile['nickname']; $follow_link = 'remote_follow/' . $profile['nickname'];
} }
} elseif ($profile_is_native) { } elseif ($profile_is_native) {
if ($visitor_is_following) { if ($visitor_is_following) {

105
src/Module/RemoteFollow.php Normal file
View file

@ -0,0 +1,105 @@
<?php
namespace Friendica\Module;
use Friendica\BaseModule;
use Friendica\DI;
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
use Friendica\Core\Renderer;
use Friendica\Core\Search;
use Friendica\Core\System;
use Friendica\Model\Profile;
use Friendica\Network\Probe;
/**
* Remotely follow the account on this system by the provided account
*/
class RemoteFollow extends BaseModule
{
public static function init(array $parameters = [])
{
if (empty($parameters['profile'])) {
return;
}
Profile::load(DI::app(), $parameters['profile']);
}
public static function post(array $parameters = [])
{
$a = DI::app();
if (empty($parameters['profile']) || !empty($_POST['cancel']) || empty($_POST['dfrn_url'])) {
DI::baseUrl()->redirect();
}
if (empty($a->profile['uid'])) {
notice(DI::l10n()->t('Profile unavailable.') . EOL);
return;
}
$url = trim($_POST['dfrn_url']);
if (!strlen($url)) {
notice(DI::l10n()->t("Invalid locator") . EOL);
return;
}
// Detect the network, make sure the provided URL is valid
$data = Probe::uri($url);
if ($data['network'] == Protocol::PHANTOM) {
notice(DI::l10n()->t("The provided profile link doesn't seem to be valid"));
return;
}
// Fetch link for the "remote follow" functionality of the given profile
$follow_link_template = Probe::getRemoteFollowLink($url);
if (empty($follow_link_template)) {
notice(DI::l10n()->t("Remote subscription can't be done for your network. Please subscribe directly on your system."));
return;
}
Logger::notice('Remote request', ['url' => $url, 'follow' => $a->profile['url'], 'remote' => $follow_link_template]);
// Substitute our user's feed URL into $follow_link_template
// Send the subscriber home to subscribe
// Diaspora needs the uri in the format user@domain.tld
if ($data['network'] == Protocol::DIASPORA) {
$uri = urlencode($a->profile['addr']);
} else {
$uri = urlencode($a->profile['url']);
}
$follow_link = str_replace('{uri}', $uri, $follow_link_template);
System::externalRedirect($follow_link);
}
public static function content(array $parameters = [])
{
$a = DI::app();
if (empty($parameters['profile']) || empty($a->profile)) {
return '';
}
$target_addr = $a->profile['addr'];
$target_url = $a->profile['url'];
$tpl = Renderer::getMarkupTemplate('auto_request.tpl');
$o = Renderer::replaceMacros($tpl, [
'$header' => DI::l10n()->t('Friend/Connection Request'),
'$page_desc' => DI::l10n()->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' => DI::l10n()->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' => DI::l10n()->t('Your Webfinger address or profile URL:'),
'$pls_answer' => DI::l10n()->t('Please answer the following:'),
'$submit' => DI::l10n()->t('Submit Request'),
'$cancel' => DI::l10n()->t('Cancel'),
'$request' => 'remote_follow/' . $parameters['profile'],
'$name' => $a->profile['name'],
'$myaddr' => '', //Profile::getMyURL(),
]);
return $o;
}
}

View file

@ -220,6 +220,28 @@ class Probe
return $profile_link; return $profile_link;
} }
/**
* Get the link for the remote follow page for a given profile link
*
* @param sting $profile
* @return string Remote follow page link
*/
public static function getRemoteFollowLink(string $profile)
{
$follow_link = '';
$links = self::lrdd($profile);
if (!empty($links) && is_array($links)) {
foreach ($links as $link) {
if ($link['@attributes']['rel'] === ActivityNamespace::OSTATUSSUB) {
$follow_link = $link['@attributes']['template'];
}
}
}
return $follow_link;
}
/** /**
* Check an URI for LRDD data * Check an URI for LRDD data
* *

View file

@ -261,6 +261,7 @@ return [
'/randprof' => [Module\RandomProfile::class, [R::GET]], '/randprof' => [Module\RandomProfile::class, [R::GET]],
'/register' => [Module\Register::class, [R::GET, R::POST]], '/register' => [Module\Register::class, [R::GET, R::POST]],
'/remote_follow/{profile}' => [Module\RemoteFollow::class, [R::GET, R::POST]],
'/robots.txt' => [Module\RobotsTxt::class, [R::GET]], '/robots.txt' => [Module\RobotsTxt::class, [R::GET]],
'/rsd.xml' => [Module\ReallySimpleDiscovery::class, [R::GET]], '/rsd.xml' => [Module\ReallySimpleDiscovery::class, [R::GET]],
'/smilies[/json]' => [Module\Smilies::class, [R::GET]], '/smilies[/json]' => [Module\Smilies::class, [R::GET]],

View file

@ -1,19 +1,36 @@
<h1>{{$header}}</h1> <h1>{{$header}}</h1>
{{if !$myaddr}}
<p id="dfrn-request-intro">
{{$page_desc nofilter}}
</p>
<p>
{{$invite_desc nofilter}}
</p>
{{/if}}
<form action="{{$request}}" method="post"> <form action="{{$request}}" method="post">
{{if $url}}
<dl> <dl>
<dt>{{$url_label}}</dt> <dt>{{$url_label}}</dt>
<dd><a target="blank" href="{{$zrl}}">{{$url}}</a></dd> <dd><a target="blank" href="{{$zrl}}">{{$url}}</a></dd>
</dl>
{{/if}}
{{if $keywords}} {{if $keywords}}
<dl>
<dt>{{$keywords_label}}</dt> <dt>{{$keywords_label}}</dt>
<dd>{{$keywords}}</dd> <dd>{{$keywords}}</dd>
{{/if}}
</dl> </dl>
{{/if}}
<div id="dfrn-request-url-wrapper"> <div id="dfrn-request-url-wrapper">
<label id="dfrn-url-label" for="dfrn-url">{{$your_address}}</label> <label id="dfrn-url-label" for="dfrn-url">{{$your_address}}</label>
{{if $myaddr}}
{{$myaddr}} {{$myaddr}}
<input type="hidden" name="dfrn_url" id="dfrn-url" value="{{$myaddr}}"> <input type="hidden" name="dfrn_url" id="dfrn-url" value="{{$myaddr}}">
{{else}}
<input type="text" name="dfrn_url" id="dfrn-url" size="32" value="{{$myaddr}}">
{{/if}}
<input type="hidden" name="url" id="url" value="{{$url}}"> <input type="hidden" name="url" id="url" value="{{$url}}">
<div id="dfrn-request-url-end"></div> <div id="dfrn-request-url-end"></div>
</div> </div>

View file

@ -1,20 +1,36 @@
<div class="generic-page-wrapper"> <div class="generic-page-wrapper">
<h1>{{$header}}</h1> <h1>{{$header}}</h1>
{{if !$myaddr}}
<p id="dfrn-request-intro">
{{$page_desc nofilter}}
</p>
<p>
{{$invite_desc nofilter}}
</p>
{{/if}}
<form action="{{$request}}" method="post"> <form action="{{$request}}" method="post">
{{if $url}}
<dl> <dl>
<dt>{{$url_label}}</dt> <dt>{{$url_label}}</dt>
<dd><a target="blank" href="{{$zrl}}">{{$url}}</a></dd> <dd><a target="blank" href="{{$zrl}}">{{$url}}</a></dd>
</dl>
{{/if}}
{{if $keywords}} {{if $keywords}}
<dl>
<dt>{{$keywords_label}}</dt> <dt>{{$keywords_label}}</dt>
<dd>{{$keywords}}</dd> <dd>{{$keywords}}</dd>
{{/if}}
</dl> </dl>
{{/if}}
<div id="dfrn-request-url-wrapper"> <div id="dfrn-request-url-wrapper">
<label id="dfrn-url-label" for="dfrn-url">{{$your_address}}</label> <label id="dfrn-url-label" for="dfrn-url">{{$your_address}}</label>
{{$myaddr}} {{if $myaddr}}
<input type="hidden" name="dfrn_url" id="dfrn-url" value="{{$myaddr}}"> {{$myaddr}}
<input type="hidden" name="dfrn_url" id="dfrn-url" value="{{$myaddr}}" />
{{else}}
<input type="text" name="dfrn_url" id="dfrn-url" size="32" value="{{$myaddr}}">
{{/if}}
<input type="hidden" name="url" id="url" value="{{$url}}"> <input type="hidden" name="url" id="url" value="{{$url}}">
<div id="dfrn-request-url-end"></div> <div id="dfrn-request-url-end"></div>
</div> </div>