]> git.mxchange.org Git - friendica.git/commitdiff
New page for remote follow requests
authorMichael <heluecht@pirati.ca>
Sun, 9 Feb 2020 17:04:35 +0000 (17:04 +0000)
committerMichael <heluecht@pirati.ca>
Sun, 9 Feb 2020 17:04:35 +0000 (17:04 +0000)
mod/unfollow.php
src/Model/Profile.php
src/Module/RemoteFollow.php [new file with mode: 0644]
src/Network/Probe.php
static/routes.config.php
view/templates/auto_request.tpl
view/theme/frio/templates/auto_request.tpl

index 0d13c73afc03c380f88108d3d145aaacd348972e..91097fb98f226187d43292d1feca4fe2157fdd30 100644 (file)
@@ -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'),
index 28491fb5f04ad1e3170c68a63521cc52e82c800e..bcf57d5244722e087034346ae7edcb0dd0961594 100644 (file)
@@ -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 (file)
index 0000000..2a4d6bc
--- /dev/null
@@ -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;
+       }
+}
\ No newline at end of file
index 91d894d2ee9ede193683747adaad0196f34a98a8..ca33676120354b8e2434cff3b842923ea28b769e 100644 (file)
@@ -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
         *
index dd757b518ec78c75889a4e34765b3d2368281b0d..37b91d5010d256f2a4381de71274408fc3b62c2a 100644 (file)
@@ -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]],
index 0f960a4a2ef3595009672ed43986b82dc9502fce..a3bd9c2cda1fce45f1879b467d4028b90ad6e13c 100644 (file)
@@ -1,19 +1,36 @@
 <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">
+{{if $url}}
        <dl>
                <dt>{{$url_label}}</dt>
                <dd><a target="blank" href="{{$zrl}}">{{$url}}</a></dd>
+       </dl>
+{{/if}}
 {{if $keywords}}
+       <dl>
                <dt>{{$keywords_label}}</dt>
                <dd>{{$keywords}}</dd>
-{{/if}}
        </dl>
+{{/if}}
 
        <div id="dfrn-request-url-wrapper">
                <label id="dfrn-url-label" for="dfrn-url">{{$your_address}}</label>
+{{if $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}}">
                <div id="dfrn-request-url-end"></div>
        </div>
index c803c3d8aee1c5ed2e379ae1d45fb2b9d0cae943..a6f148723fc9bfbd02eef7ea6511e0c70f62d613 100644 (file)
@@ -1,20 +1,36 @@
 <div class="generic-page-wrapper">
        <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">
+{{if $url}}
                <dl>
                        <dt>{{$url_label}}</dt>
                        <dd><a target="blank" href="{{$zrl}}">{{$url}}</a></dd>
+               </dl>
+{{/if}}
 {{if $keywords}}
+               <dl>
                        <dt>{{$keywords_label}}</dt>
                        <dd>{{$keywords}}</dd>
-{{/if}}
                </dl>
-
+{{/if}}
                <div id="dfrn-request-url-wrapper">
                        <label id="dfrn-url-label" for="dfrn-url">{{$your_address}}</label>
-                       {{$myaddr}}
-                       <input type="hidden" name="dfrn_url" id="dfrn-url" value="{{$myaddr}}">
+                       {{if $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}}">
                        <div id="dfrn-request-url-end"></div>
                </div>