From: Philipp Date: Mon, 31 Oct 2022 11:51:51 +0000 (+0100) Subject: Move Follow to Contact namespace X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=437472d0a6914d7c01887f2f6c840bbba2193cc1;p=friendica.git Move Follow to Contact namespace --- diff --git a/src/Module/Contact/Follow.php b/src/Module/Contact/Follow.php new file mode 100644 index 0000000000..08585d26f9 --- /dev/null +++ b/src/Module/Contact/Follow.php @@ -0,0 +1,241 @@ +. + * + */ + +namespace Friendica\Module\Contact; + +use Friendica\App; +use Friendica\BaseModule; +use Friendica\Content\Widget\VCard; +use Friendica\Core\Config\Capability\IManageConfigValues; +use Friendica\Core\L10n; +use Friendica\Core\Protocol; +use Friendica\Core\Renderer; +use Friendica\Core\Session\Capability\IHandleUserSessions; +use Friendica\Model\Contact; +use Friendica\Model\Item; +use Friendica\Model\Post; +use Friendica\Model\Profile; +use Friendica\Model\User; +use Friendica\Module\Response; +use Friendica\Navigation\SystemMessages; +use Friendica\Network\HTTPException\ForbiddenException; +use Friendica\Network\Probe; +use Friendica\Util\Profiler; +use Friendica\Util\Strings; +use Psr\Log\LoggerInterface; + +class Follow extends BaseModule +{ + /** @var IHandleUserSessions */ + protected $session; + /** @var SystemMessages */ + protected $sysMessages; + /** @var App */ + protected $app; + /** @var IManageConfigValues */ + protected $config; + /** @var App\Page */ + protected $page; + + public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IHandleUserSessions $session, SystemMessages $sysMessages, App $app, IManageConfigValues $config, App\Page $page, array $server, array $parameters = []) + { + parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); + + $this->session = $session; + $this->sysMessages = $sysMessages; + $this->app = $app; + $this->config = $config; + $this->page = $page; + } + + protected function post(array $request = []) + { + parent::post($request); + + if (!$this->session->getLocalUserId()) { + throw new ForbiddenException($this->t('Access denied.')); + } + + if (!empty($request['url'])) { + $this->baseUrl->redirect($request['url']); + } + + $url = Probe::cleanURI($this->session->get('url')); + } + + protected function content(array $request = []): string + { + $returnPath = 'contact'; + + if (!$this->session->getLocalUserId()) { + $this->sysMessages->addNotice($this->t('Permission denied.')); + $this->baseUrl->redirect($returnPath); + } + + $uid = $this->session->getLocalUserId(); + $url = Probe::cleanURI(trim($request['url'] ?? '')); + + // Issue 6874: Allow remote following from Peertube + if (strpos($url, 'acct:') === 0) { + $url = str_replace('acct:', '', $url); + } + + if (empty($url)) { + $this->baseUrl->redirect($returnPath); + } + + $submit = $this->t('Submit Request'); + + // 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, Contact::FOLLOWER, Protocol::DFRN, + Strings::normaliseLink($url), + Strings::normaliseLink($url), $url, + Protocol::STATUSNET]); + + if (!empty($userContact['pending'])) { + $this->sysMessages->addNotice($this->t('You already added this contact.')); + $submit = ''; + } + + $contact = Contact::getByURL($url, true); + + // Possibly it is a mail contact + if (empty($contact)) { + $contact = Probe::uri($url, Protocol::MAIL, $uid); + } + + if (empty($contact) || ($contact['network'] == Protocol::PHANTOM)) { + // Possibly it is a remote item and not an account + $this->followRemoteItem($url); + + $this->sysMessages->addNotice($this->t('The network type couldn\'t be detected. Contact can\'t be added.')); + $submit = ''; + $contact = ['url' => $url, 'network' => Protocol::PHANTOM, 'name' => $url, 'keywords' => '']; + } + + $protocol = Contact::getProtocol($contact['url'], $contact['network']); + + if (($protocol == Protocol::DIASPORA) && !$this->config->get('system', 'diaspora_enabled')) { + $this->sysMessages->addNotice($this->t('Diaspora support isn\'t enabled. Contact can\'t be added.')); + $submit = ''; + } + + if (($protocol == Protocol::OSTATUS) && $this->config->get('system', 'ostatus_disabled')) { + $this->sysMessages->addNotice($this->t("OStatus support is disabled. Contact can't be added.")); + $submit = ''; + } + + if ($protocol == Protocol::MAIL) { + $contact['url'] = $contact['addr']; + } + + if (!empty($request['auto'])) { + $this->process($contact['url']); + } + + $request = $this->baseUrl . '/follow'; + $tpl = Renderer::getMarkupTemplate('auto_request.tpl'); + + $owner = User::getOwnerDataById($uid); + if (empty($owner)) { + $this->sysMessages->addNotice($this->t('Permission denied.')); + $this->baseUrl->redirect($returnPath); + } + + $myaddr = $owner['url']; + + $output = Renderer::replaceMacros($tpl, [ + '$header' => $this->t('Connect/Follow'), + '$pls_answer' => $this->t('Please answer the following:'), + '$your_address' => $this->t('Your Identity Address:'), + '$url_label' => $this->t('Profile URL'), + '$keywords_label' => $this->t('Tags:'), + '$submit' => $submit, + '$cancel' => $this->t('Cancel'), + + '$request' => $request, + '$name' => $contact['name'], + '$url' => $contact['url'], + '$zrl' => Profile::zrl($contact['url']), + '$myaddr' => $myaddr, + '$keywords' => $contact['keywords'], + + '$does_know_you' => ['knowyou', $this->t('%s knows you', $contact['name'])], + '$addnote_field' => ['dfrn-request-message', $this->t('Add a personal note:')], + ]); + + $this['aside'] = ''; + + if (!in_array($protocol, [Protocol::PHANTOM, Protocol::MAIL])) { + $this['aside'] = VCard::getHTML($contact); + + $output .= Renderer::replaceMacros(Renderer::getMarkupTemplate('section_title.tpl'), + ['$title' => $this->t('Status Messages and Posts')] + ); + + // Show last public posts + $output .= Contact::getPostsFromUrl($contact['url']); + } + + return $output; + } + + protected function process(string $url) + { + $returnPath = 'follow?rul=' . urlencode($url); + + $result = Contact::createFromProbeForUser($this->app->getLoggedInUserId(), $url); + + if (!$result['success']) { + // Possibly it is a remote item and not an account + $this->followRemoteItem($url); + + if (!empty($result['message'])) { + $this->sysMessages->addNotice($result['message']); + } + + $this->baseUrl->redirect($returnPath); + } elseif (!empty($result['cid'])) { + $this->baseUrl->redirect('contact/' . $result['cid']); + } + + $this->sysMessages->addNotice($this->t('The contact could not be added.')); + $this->baseUrl->redirect($returnPath); + } + + 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); + } + + if (!empty($itemId)) { + $item = Post::selectFirst(['guid'], ['id' => $itemId]); + if (!empty($item['guid'])) { + $this->baseUrl->redirect('display/' . $item['guid']); + } + } + } +} diff --git a/src/Module/Follow.php b/src/Module/Follow.php deleted file mode 100644 index 95ad2c9ae7..0000000000 --- a/src/Module/Follow.php +++ /dev/null @@ -1,240 +0,0 @@ -. - * - */ - -namespace Friendica\Module; - -use Friendica\App; -use Friendica\BaseModule; -use Friendica\Content\Widget\VCard; -use Friendica\Core\Config\Capability\IManageConfigValues; -use Friendica\Core\L10n; -use Friendica\Core\Protocol; -use Friendica\Core\Renderer; -use Friendica\Core\Session\Capability\IHandleUserSessions; -use Friendica\Model\Contact; -use Friendica\Model\Item; -use Friendica\Model\Post; -use Friendica\Model\Profile; -use Friendica\Model\User; -use Friendica\Navigation\SystemMessages; -use Friendica\Network\HTTPException\ForbiddenException; -use Friendica\Network\Probe; -use Friendica\Util\Profiler; -use Friendica\Util\Strings; -use Psr\Log\LoggerInterface; - -class Follow extends BaseModule -{ - /** @var IHandleUserSessions */ - protected $session; - /** @var SystemMessages */ - protected $sysMessages; - /** @var App */ - protected $app; - /** @var IManageConfigValues */ - protected $config; - /** @var App\Page */ - protected $page; - - public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IHandleUserSessions $session, SystemMessages $sysMessages, App $app, IManageConfigValues $config, App\Page $page, array $server, array $parameters = []) - { - parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); - - $this->session = $session; - $this->sysMessages = $sysMessages; - $this->app = $app; - $this->config = $config; - $this->page = $page; - } - - protected function post(array $request = []) - { - parent::post($request); - - if (!$this->session->getLocalUserId()) { - throw new ForbiddenException($this->t('Access denied.')); - } - - if (!empty($request['url'])) { - $this->baseUrl->redirect($request['url']); - } - - $url = Probe::cleanURI($this->session->get('url')); - } - - protected function content(array $request = []): string - { - $returnPath = 'contact'; - - if (!$this->session->getLocalUserId()) { - $this->sysMessages->addNotice($this->t('Permission denied.')); - $this->baseUrl->redirect($returnPath); - } - - $uid = $this->session->getLocalUserId(); - $url = Probe::cleanURI(trim($request['url'] ?? '')); - - // Issue 6874: Allow remote following from Peertube - if (strpos($url, 'acct:') === 0) { - $url = str_replace('acct:', '', $url); - } - - if (empty($url)) { - $this->baseUrl->redirect($returnPath); - } - - $submit = $this->t('Submit Request'); - - // 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, Contact::FOLLOWER, Protocol::DFRN, - Strings::normaliseLink($url), - Strings::normaliseLink($url), $url, - Protocol::STATUSNET]); - - if (!empty($userContact['pending'])) { - $this->sysMessages->addNotice($this->t('You already added this contact.')); - $submit = ''; - } - - $contact = Contact::getByURL($url, true); - - // Possibly it is a mail contact - if (empty($contact)) { - $contact = Probe::uri($url, Protocol::MAIL, $uid); - } - - if (empty($contact) || ($contact['network'] == Protocol::PHANTOM)) { - // Possibly it is a remote item and not an account - $this->followRemoteItem($url); - - $this->sysMessages->addNotice($this->t('The network type couldn\'t be detected. Contact can\'t be added.')); - $submit = ''; - $contact = ['url' => $url, 'network' => Protocol::PHANTOM, 'name' => $url, 'keywords' => '']; - } - - $protocol = Contact::getProtocol($contact['url'], $contact['network']); - - if (($protocol == Protocol::DIASPORA) && !$this->config->get('system', 'diaspora_enabled')) { - $this->sysMessages->addNotice($this->t('Diaspora support isn\'t enabled. Contact can\'t be added.')); - $submit = ''; - } - - if (($protocol == Protocol::OSTATUS) && $this->config->get('system', 'ostatus_disabled')) { - $this->sysMessages->addNotice($this->t("OStatus support is disabled. Contact can't be added.")); - $submit = ''; - } - - if ($protocol == Protocol::MAIL) { - $contact['url'] = $contact['addr']; - } - - if (!empty($request['auto'])) { - $this->process($contact['url']); - } - - $request = $this->baseUrl . '/follow'; - $tpl = Renderer::getMarkupTemplate('auto_request.tpl'); - - $owner = User::getOwnerDataById($uid); - if (empty($owner)) { - $this->sysMessages->addNotice($this->t('Permission denied.')); - $this->baseUrl->redirect($returnPath); - } - - $myaddr = $owner['url']; - - $output = Renderer::replaceMacros($tpl, [ - '$header' => $this->t('Connect/Follow'), - '$pls_answer' => $this->t('Please answer the following:'), - '$your_address' => $this->t('Your Identity Address:'), - '$url_label' => $this->t('Profile URL'), - '$keywords_label' => $this->t('Tags:'), - '$submit' => $submit, - '$cancel' => $this->t('Cancel'), - - '$request' => $request, - '$name' => $contact['name'], - '$url' => $contact['url'], - '$zrl' => Profile::zrl($contact['url']), - '$myaddr' => $myaddr, - '$keywords' => $contact['keywords'], - - '$does_know_you' => ['knowyou', $this->t('%s knows you', $contact['name'])], - '$addnote_field' => ['dfrn-request-message', $this->t('Add a personal note:')], - ]); - - $this['aside'] = ''; - - if (!in_array($protocol, [Protocol::PHANTOM, Protocol::MAIL])) { - $this['aside'] = VCard::getHTML($contact); - - $output .= Renderer::replaceMacros(Renderer::getMarkupTemplate('section_title.tpl'), - ['$title' => $this->t('Status Messages and Posts')] - ); - - // Show last public posts - $output .= Contact::getPostsFromUrl($contact['url']); - } - - return $output; - } - - protected function process(string $url) - { - $returnPath = 'follow?rul=' . urlencode($url); - - $result = Contact::createFromProbeForUser($this->app->getLoggedInUserId(), $url); - - if (!$result['success']) { - // Possibly it is a remote item and not an account - $this->followRemoteItem($url); - - if (!empty($result['message'])) { - $this->sysMessages->addNotice($result['message']); - } - - $this->baseUrl->redirect($returnPath); - } elseif (!empty($result['cid'])) { - $this->baseUrl->redirect('contact/' . $result['cid']); - } - - $this->sysMessages->addNotice($this->t('The contact could not be added.')); - $this->baseUrl->redirect($returnPath); - } - - 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); - } - - if (!empty($itemId)) { - $item = Post::selectFirst(['guid'], ['id' => $itemId]); - if (!empty($item['guid'])) { - $this->baseUrl->redirect('display/' . $item['guid']); - } - } - } -} diff --git a/static/routes.config.php b/static/routes.config.php index a478ff05bb..072ee93878 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -418,7 +418,7 @@ return [ '/filed' => [Module\Search\Filed::class, [R::GET]], '/filer[/{id:\d+}]' => [Module\Filer\SaveTag::class, [R::GET]], '/filerm/{id:\d+}' => [Module\Filer\RemoveTag::class, [R::GET, R::POST]], - '/follow[/{url}]' => [Module\Follow::class, [R::GET, R::POST]], + '/follow[/{url}]' => [Module\Contact\Follow::class, [R::GET, R::POST]], '/follow_confirm' => [Module\FollowConfirm::class, [R::GET, R::POST]], '/followers/{nickname}' => [Module\ActivityPub\Followers::class, [R::GET]], '/following/{nickname}' => [Module\ActivityPub\Following::class, [R::GET]],