Merge pull request #8263 from annando/remote-follow
New page for remote follow requests
This commit is contained in:
commit
2ec3a97393
7 changed files with 182 additions and 17 deletions
|
@ -131,22 +131,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'),
|
||||||
|
|
|
@ -330,7 +330,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) {
|
||||||
|
|
120
src/Module/RemoteFollow.php
Normal file
120
src/Module/RemoteFollow.php
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @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/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
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 = [])
|
||||||
|
{
|
||||||
|
Profile::load(DI::app(), $parameters['profile']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function post(array $parameters = [])
|
||||||
|
{
|
||||||
|
$a = DI::app();
|
||||||
|
|
||||||
|
if (!empty($_POST['cancel']) || empty($_POST['dfrn_url'])) {
|
||||||
|
DI::baseUrl()->redirect();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($a->profile['uid'])) {
|
||||||
|
notice(DI::l10n()->t('Profile unavailable.'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$url = trim($_POST['dfrn_url']);
|
||||||
|
if (!strlen($url)) {
|
||||||
|
notice(DI::l10n()->t("Invalid locator"));
|
||||||
|
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($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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -231,6 +231,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
|
||||||
*
|
*
|
||||||
|
|
|
@ -279,6 +279,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]],
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue