diff --git a/mod/unfollow.php b/mod/unfollow.php index e4d456d28..c754b384d 100644 --- a/mod/unfollow.php +++ b/mod/unfollow.php @@ -131,22 +131,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 2cf260c2f..735bfdaf2 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -330,7 +330,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..b261fe757 --- /dev/null +++ b/src/Module/RemoteFollow.php @@ -0,0 +1,120 @@ +. + * + */ + +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 %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; + } +} diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 31548173b..ec857836c 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -231,6 +231,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 34f4b6d6f..489e99f48 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -279,6 +279,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 @@
+ {{$page_desc nofilter}} +
++ {{$invite_desc nofilter}} +
+{{/if}} +