New page for remote follow requests
This commit is contained in:
		
					parent
					
						
							
								16acf1db95
							
						
					
				
			
			
				commit
				
					
						2eebeeaa32
					
				
			
		
					 7 changed files with 167 additions and 17 deletions
				
			
		| 
						 | 
				
			
			@ -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'),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										105
									
								
								src/Module/RemoteFollow.php
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								src/Module/RemoteFollow.php
									
										
									
									
									
										Normal 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;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
	 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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]],
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue