From 2eebeeaa329584244e414eaa41fc6ac9ed3e1cac Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 9 Feb 2020 17:04:35 +0000 Subject: [PATCH 1/3] New page for remote follow requests --- mod/unfollow.php | 11 --- src/Model/Profile.php | 2 +- src/Module/RemoteFollow.php | 105 +++++++++++++++++++++ src/Network/Probe.php | 22 +++++ static/routes.config.php | 1 + view/templates/auto_request.tpl | 19 +++- view/theme/frio/templates/auto_request.tpl | 24 ++++- 7 files changed, 167 insertions(+), 17 deletions(-) create mode 100644 src/Module/RemoteFollow.php diff --git a/mod/unfollow.php b/mod/unfollow.php index 0d13c73af..91097fb98 100644 --- a/mod/unfollow.php +++ b/mod/unfollow.php @@ -115,22 +115,11 @@ function unfollow_content(App $a) $o = Renderer::replaceMacros($tpl, [ '$header' => DI::l10n()->t('Disconnect/Unfollow'), - '$desc' => '', - '$pls_answer' => '', - '$does_know_you' => '', - '$add_note' => '', '$page_desc' => '', - '$friendica' => '', - '$statusnet' => '', - '$diaspora' => '', - '$diasnote' => '', '$your_address' => DI::l10n()->t('Your Identity Address:'), '$invite_desc' => '', - '$emailnet' => '', '$submit' => DI::l10n()->t('Submit Request'), '$cancel' => DI::l10n()->t('Cancel'), - '$nickname' => '', - '$name' => $contact['name'], '$url' => $contact['url'], '$zrl' => Contact::magicLink($contact['url']), '$url_label' => DI::l10n()->t('Profile URL'), diff --git a/src/Model/Profile.php b/src/Model/Profile.php index 28491fb5f..bcf57d524 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -313,7 +313,7 @@ class Profile if (!$local_user_is_self && $show_connect) { if (!$visitor_is_authenticated) { if (!empty($profile['nickname'])) { - $follow_link = 'dfrn_request/' . $profile['nickname']; + $follow_link = 'remote_follow/' . $profile['nickname']; } } elseif ($profile_is_native) { if ($visitor_is_following) { diff --git a/src/Module/RemoteFollow.php b/src/Module/RemoteFollow.php new file mode 100644 index 000000000..2a4d6bc1e --- /dev/null +++ b/src/Module/RemoteFollow.php @@ -0,0 +1,105 @@ +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 %s or %s 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, follow this link to find a public Friendica node and join us today.', 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; + } +} \ No newline at end of file diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 91d894d2e..ca3367612 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -220,6 +220,28 @@ class Probe 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 * diff --git a/static/routes.config.php b/static/routes.config.php index dd757b518..37b91d501 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -261,6 +261,7 @@ return [ '/randprof' => [Module\RandomProfile::class, [R::GET]], '/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]], '/rsd.xml' => [Module\ReallySimpleDiscovery::class, [R::GET]], '/smilies[/json]' => [Module\Smilies::class, [R::GET]], diff --git a/view/templates/auto_request.tpl b/view/templates/auto_request.tpl index 0f960a4a2..a3bd9c2cd 100644 --- a/view/templates/auto_request.tpl +++ b/view/templates/auto_request.tpl @@ -1,19 +1,36 @@

{{$header}}

+{{if !$myaddr}} +

+ {{$page_desc nofilter}} +

+

+ {{$invite_desc nofilter}} +

+{{/if}} +
+{{if $url}}
{{$url_label}}
{{$url}}
+
+{{/if}} {{if $keywords}} +
{{$keywords_label}}
{{$keywords}}
-{{/if}}
+{{/if}}
+{{if $myaddr}} {{$myaddr}} +{{else}} + +{{/if}}
diff --git a/view/theme/frio/templates/auto_request.tpl b/view/theme/frio/templates/auto_request.tpl index c803c3d8a..a6f148723 100644 --- a/view/theme/frio/templates/auto_request.tpl +++ b/view/theme/frio/templates/auto_request.tpl @@ -1,20 +1,36 @@

{{$header}}

+{{if !$myaddr}} +

+ {{$page_desc nofilter}} +

+

+ {{$invite_desc nofilter}} +

+{{/if}} + +{{if $url}}
{{$url_label}}
{{$url}}
+
+{{/if}} {{if $keywords}} +
{{$keywords_label}}
{{$keywords}}
-{{/if}}
- +{{/if}}
- {{$myaddr}} - + {{if $myaddr}} + {{$myaddr}} + + {{else}} + + {{/if}}
From e628d2726bcde7dd6240f2bb773690bf921ec087 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 9 Feb 2020 22:08:59 +0000 Subject: [PATCH 2/3] Removed unneeded stuff --- src/Module/RemoteFollow.php | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Module/RemoteFollow.php b/src/Module/RemoteFollow.php index 2a4d6bc1e..d0a6c5711 100644 --- a/src/Module/RemoteFollow.php +++ b/src/Module/RemoteFollow.php @@ -19,10 +19,6 @@ class RemoteFollow extends BaseModule { public static function init(array $parameters = []) { - if (empty($parameters['profile'])) { - return; - } - Profile::load(DI::app(), $parameters['profile']); } @@ -30,18 +26,18 @@ class RemoteFollow extends BaseModule { $a = DI::app(); - if (empty($parameters['profile']) || !empty($_POST['cancel']) || empty($_POST['dfrn_url'])) { + if (!empty($_POST['cancel']) || empty($_POST['dfrn_url'])) { DI::baseUrl()->redirect(); } if (empty($a->profile['uid'])) { - notice(DI::l10n()->t('Profile unavailable.') . EOL); + notice(DI::l10n()->t('Profile unavailable.')); return; } $url = trim($_POST['dfrn_url']); if (!strlen($url)) { - notice(DI::l10n()->t("Invalid locator") . EOL); + notice(DI::l10n()->t("Invalid locator")); return; } @@ -79,7 +75,7 @@ class RemoteFollow extends BaseModule { $a = DI::app(); - if (empty($parameters['profile']) || empty($a->profile)) { + if (empty($a->profile)) { return ''; } @@ -98,8 +94,8 @@ class RemoteFollow extends BaseModule '$request' => 'remote_follow/' . $parameters['profile'], '$name' => $a->profile['name'], - '$myaddr' => '', //Profile::getMyURL(), + '$myaddr' => Profile::getMyURL(), ]); return $o; } -} \ No newline at end of file +} From 5ad3a406477d770bc6a8e151667091b57ba951fa Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 9 Feb 2020 23:12:00 +0100 Subject: [PATCH 3/3] Update src/Module/RemoteFollow.php Co-Authored-By: Philipp --- src/Module/RemoteFollow.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/Module/RemoteFollow.php b/src/Module/RemoteFollow.php index d0a6c5711..b261fe757 100644 --- a/src/Module/RemoteFollow.php +++ b/src/Module/RemoteFollow.php @@ -1,4 +1,23 @@ . + * + */ namespace Friendica\Module;