<?php
/**
- * @copyright Copyright (C) 2010-2022, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
use Friendica\Network\Probe;
use Friendica\Util\Profiler;
use Friendica\Util\Strings;
+use GuzzleHttp\Psr7\Uri;
use Psr\Log\LoggerInterface;
class Follow extends BaseModule
throw new ForbiddenException($this->t('Access denied.'));
}
- if (!empty($request['url'])) {
- $this->baseUrl->redirect($request['url']);
+ if (isset($request['cancel']) || empty($request['url'])) {
+ $this->baseUrl->redirect('contact');
}
$url = Probe::cleanURI($request['url']);
}
$uid = $this->session->getLocalUserId();
- $url = Probe::cleanURI(trim($request['url'] ?? ''));
+
+ // uri is used by the /authorize_interaction Mastodon route
+ $url = Probe::cleanURI(trim($request['uri'] ?? $request['url'] ?? ''));
// Issue 6874: Allow remote following from Peertube
if (strpos($url, 'acct:') === 0) {
// Don't try to add a pending contact
$userContact = Contact::selectFirst(['pending'], [
- "`uid` = ? AND ((`rel` != ?) OR (`network` = ?)) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?) AND `network` != ?",
+ "`uid` = ? AND ((`rel` != ?) OR (`network` = ?)) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)",
$uid, Contact::FOLLOWER, Protocol::DFRN,
Strings::normaliseLink($url),
- Strings::normaliseLink($url), $url,
- Protocol::STATUSNET]);
+ Strings::normaliseLink($url), $url]);
if (!empty($userContact['pending'])) {
$this->sysMessages->addNotice($this->t('You already added this contact.'));
$this->process($contact['url']);
}
- $request = $this->baseUrl . '/follow';
- $tpl = Renderer::getMarkupTemplate('auto_request.tpl');
+ $requestUrl = $this->baseUrl . '/contact/follow';
+ $tpl = Renderer::getMarkupTemplate('auto_request.tpl');
$owner = User::getOwnerDataById($uid);
if (empty($owner)) {
'$submit' => $submit,
'$cancel' => $this->t('Cancel'),
- '$request' => $request,
+ '$action' => $requestUrl,
'$name' => $contact['name'],
'$url' => $contact['url'],
'$zrl' => Profile::zrl($contact['url']),
'$addnote_field' => ['dfrn-request-message', $this->t('Add a personal note:')],
]);
- $this['aside'] = '';
+ $this->page['aside'] = '';
if (!in_array($protocol, [Protocol::PHANTOM, Protocol::MAIL])) {
- $this['aside'] = VCard::getHTML($contact);
+ $this->page['aside'] = VCard::getHTML($contact);
$output .= Renderer::replaceMacros(Renderer::getMarkupTemplate('section_title.tpl'),
- ['$title' => $this->t('Status Messages and Posts')]
+ ['$title' => $this->t('Posts and Replies')]
);
// Show last public posts
protected function followRemoteItem(string $url)
{
- $itemId = Item::fetchByLink($url, $this->session->getLocalUserId());
- if (!$itemId) {
- // If the user-specific search failed, we search and probe a public post
- $itemId = Item::fetchByLink($url);
- }
+ try {
+ $uri = new Uri($url);
+ if (!$uri->getScheme()) {
+ return;
+ }
+
+ $itemId = Item::fetchByLink($url, $this->session->getLocalUserId());
+ if (!$itemId) {
+ // If the user-specific search failed, we search and probe a public post
+ $itemId = Item::fetchByLink($url);
+ }
- if (!empty($itemId)) {
- $item = Post::selectFirst(['guid'], ['id' => $itemId]);
- if (!empty($item['guid'])) {
- $this->baseUrl->redirect('display/' . $item['guid']);
+ if (!empty($itemId)) {
+ $item = Post::selectFirst(['guid'], ['id' => $itemId]);
+ if (!empty($item['guid'])) {
+ $this->baseUrl->redirect('display/' . $item['guid']);
+ }
}
+ } catch (\InvalidArgumentException $e) {
+ return;
}
}
}