]> git.mxchange.org Git - friendica.git/commitdiff
Create new Contact\Redir module class
authorHypolite Petovan <hypolite@mrpetovan.com>
Wed, 9 Nov 2022 00:33:08 +0000 (19:33 -0500)
committerHypolite Petovan <hypolite@mrpetovan.com>
Wed, 9 Nov 2022 01:12:23 +0000 (20:12 -0500)
- Move /redir route to /contact/redir

14 files changed:
mod/photos.php
mod/redir.php
src/Content/Conversation.php
src/Content/Item.php
src/Content/Text/BBCode.php
src/Content/Text/HTML.php
src/Model/Contact.php
src/Module/Contact.php
src/Module/Contact/Hovercard.php
src/Module/Contact/Profile.php
src/Module/Contact/Redir.php [new file with mode: 0644]
src/Object/Post.php
static/routes.config.php
view/theme/frio/theme.php

index ccf0525cb00040c36ae74def0f9fd8f6d080db2c..95627b6da474653d350ac214b594c3f1661c31b1 100644 (file)
@@ -1408,7 +1408,7 @@ function photos_content(App $a)
                                        $author = ['uid' => 0, 'id' => $item['author-id'],
                                                'network' => $item['author-network'], 'url' => $item['author-link']];
                                        $profile_url = Contact::magicLinkByContact($author);
-                                       if (strpos($profile_url, 'redir/') === 0) {
+                                       if (strpos($profile_url, 'contact/redir/') === 0) {
                                                $sparkle = ' sparkle';
                                        } else {
                                                $sparkle = '';
index 903c6b2a354f074b7f5de0caa039c167b14f2e22..5f5c97ae5d80bdf92a32822566d7316458a9ca42 100644 (file)
@@ -29,149 +29,3 @@ use Friendica\Model\Profile;
 use Friendica\Network\HTTPClient\Client\HttpClientAccept;
 use Friendica\Network\HTTPClient\Client\HttpClientOptions;
 use Friendica\Util\Strings;
-
-function redir_init(App $a) {
-       if (!DI::userSession()->isAuthenticated()) {
-               throw new \Friendica\Network\HTTPException\ForbiddenException(DI::l10n()->t('Access denied.'));
-       }
-
-       $url = $_GET['url'] ?? '';
-
-       if (DI::args()->getArgc() > 1 && intval(DI::args()->getArgv()[1])) {
-               $cid = intval(DI::args()->getArgv()[1]);
-       } else {
-               $cid = 0;
-       }
-
-       // Try magic auth before the legacy stuff
-       redir_magic($a, $cid, $url);
-
-       if (empty($cid)) {
-               throw new \Friendica\Network\HTTPException\BadRequestException(DI::l10n()->t('Bad Request.'));
-       }
-
-       $fields = ['id', 'uid', 'nurl', 'url', 'addr', 'name'];
-       $contact = DBA::selectFirst('contact', $fields, ['id' => $cid, 'uid' => [0, DI::userSession()->getLocalUserId()]]);
-       if (!DBA::isResult($contact)) {
-               throw new \Friendica\Network\HTTPException\NotFoundException(DI::l10n()->t('Contact not found.'));
-       }
-
-       $contact_url = $contact['url'];
-
-       if (!empty($a->getContactId()) && $a->getContactId() == $cid) {
-               // Local user is already authenticated.
-               redir_check_url($contact_url, $url);
-               $a->redirect($url ?: $contact_url);
-       }
-
-       if ($contact['uid'] == 0 && DI::userSession()->getLocalUserId()) {
-               // Let's have a look if there is an established connection
-               // between the public contact we have found and the local user.
-               $contact = DBA::selectFirst('contact', $fields, ['nurl' => $contact['nurl'], 'uid' => DI::userSession()->getLocalUserId()]);
-
-               if (DBA::isResult($contact)) {
-                       $cid = $contact['id'];
-               }
-
-               if (!empty($a->getContactId()) && $a->getContactId() == $cid) {
-                       // Local user is already authenticated.
-                       redir_check_url($contact_url, $url);
-                       $target_url = $url ?: $contact_url;
-                       Logger::info($contact['name'] . " is already authenticated. Redirecting to " . $target_url);
-                       $a->redirect($target_url);
-               }
-       }
-
-       if (DI::userSession()->getRemoteUserId()) {
-               $host = substr(DI::baseUrl()->getUrlPath() . (DI::baseUrl()->getUrlPath() ? '/' . DI::baseUrl()->getUrlPath() : ''), strpos(DI::baseUrl()->getUrlPath(), '://') + 3);
-               $remotehost = substr($contact['addr'], strpos($contact['addr'], '@') + 1);
-
-               // On a local instance we have to check if the local user has already authenticated
-               // with the local contact. Otherwise the local user would ask the local contact
-               // for authentification everytime he/she is visiting a profile page of the local
-               // contact.
-               if (($host == $remotehost) && (DI::userSession()->getRemoteContactID(DI::session()->get('visitor_visiting')) == DI::session()->get('visitor_id'))) {
-                       // Remote user is already authenticated.
-                       redir_check_url($contact_url, $url);
-                       $target_url = $url ?: $contact_url;
-                       Logger::info($contact['name'] . " is already authenticated. Redirecting to " . $target_url);
-                       $a->redirect($target_url);
-               }
-       }
-
-       if (empty($url)) {
-               throw new \Friendica\Network\HTTPException\BadRequestException(DI::l10n()->t('Bad Request.'));
-       }
-
-       // If we don't have a connected contact, redirect with
-       // the 'zrl' parameter.
-       $my_profile = Profile::getMyURL();
-
-       if (!empty($my_profile) && !Strings::compareLink($my_profile, $url)) {
-               $separator = strpos($url, '?') ? '&' : '?';
-
-               $url .= $separator . 'zrl=' . urlencode($my_profile);
-       }
-
-       Logger::info('redirecting to ' . $url);
-       $a->redirect($url);
-}
-
-function redir_magic($a, $cid, $url)
-{
-       $visitor = Profile::getMyURL();
-       if (!empty($visitor)) {
-               Logger::info('Got my url', ['visitor' => $visitor]);
-       }
-
-       $contact = DBA::selectFirst('contact', ['url'], ['id' => $cid]);
-       if (!DBA::isResult($contact)) {
-               Logger::info('Contact not found', ['id' => $cid]);
-               throw new \Friendica\Network\HTTPException\NotFoundException(DI::l10n()->t('Contact not found.'));
-       } else {
-               $contact_url = $contact['url'];
-               redir_check_url($contact_url, $url);
-               $target_url = $url ?: $contact_url;
-       }
-
-       $basepath = Contact::getBasepath($contact_url);
-
-       // We don't use magic auth when there is no visitor, we are on the same system or we visit our own stuff
-       if (empty($visitor) || Strings::compareLink($basepath, DI::baseUrl()) || Strings::compareLink($contact_url, $visitor)) {
-               Logger::info('Redirecting without magic', ['target' => $target_url, 'visitor' => $visitor, 'contact' => $contact_url]);
-               DI::app()->redirect($target_url);
-       }
-
-       // Test for magic auth on the target system
-       $serverret = DI::httpClient()->head($basepath . '/magic', [HttpClientOptions::ACCEPT_CONTENT => HttpClientAccept::HTML]);
-       if ($serverret->isSuccess()) {
-               $separator = strpos($target_url, '?') ? '&' : '?';
-               $target_url .= $separator . 'zrl=' . urlencode($visitor) . '&addr=' . urlencode($contact_url);
-
-               Logger::info('Redirecting with magic', ['target' => $target_url, 'visitor' => $visitor, 'contact' => $contact_url]);
-               System::externalRedirect($target_url);
-       } else {
-               Logger::info('No magic for contact', ['contact' => $contact_url]);
-       }
-}
-
-function redir_check_url(string $contact_url, string $url)
-{
-       if (empty($contact_url) || empty($url)) {
-               return;
-       }
-
-       $url_host = parse_url($url, PHP_URL_HOST);
-       if (empty($url_host)) {
-               $url_host = parse_url(DI::baseUrl(), PHP_URL_HOST);
-       }
-
-       $contact_url_host = parse_url($contact_url, PHP_URL_HOST);
-
-       if ($url_host == $contact_url_host) {
-               return;
-       }
-
-       Logger::error('URL check host mismatch', ['contact' => $contact_url, 'url' => $url]);
-       throw new \Friendica\Network\HTTPException\ForbiddenException(DI::l10n()->t('Access denied.'));
-}
index 7773cdd508ea258dc31f7806db3adb27c8c26da7..522de7b5730c30b85a045affdf498b73d557107f 100644 (file)
@@ -146,7 +146,7 @@ class Conversation
                                        'url'     => $activity['author-link']
                                ];
                                $url = Contact::magicLinkByContact($author);
-                               if (strpos($url, 'redir/') === 0) {
+                               if (strpos($url, 'contact/redir/') === 0) {
                                        $sparkle = ' class="sparkle" ';
                                }
 
@@ -612,7 +612,7 @@ class Conversation
                                        $profile_link = Contact::magicLinkByContact($author);
 
                                        $sparkle = '';
-                                       if (strpos($profile_link, 'redir/') === 0) {
+                                       if (strpos($profile_link, 'contact/redir/') === 0) {
                                                $sparkle = ' sparkle';
                                        }
 
index 5321cf14646ce39b69a0b6b658928a693289087b..0d4c3c180b3a08c2277b627aa7a814a7360cf4e0 100644 (file)
@@ -345,7 +345,7 @@ class Item
                        'url' => $item['author-link'],
                ];
                $profile_link = Contact::magicLinkByContact($author, $item['author-link']);
-               $sparkle = (strpos($profile_link, 'redir/') === 0);
+               $sparkle = (strpos($profile_link, 'contact/redir/') === 0);
 
                $cid = 0;
                $pcid = $item['author-id'];
index 9a13e3f0975ba3399715715b9b36bd5dba6d8e13..69389cc5ff8e9576b462d9ed73480881f400a810 100644 (file)
@@ -2090,7 +2090,7 @@ class BBCode
                                $text = preg_replace('/\<([^>]*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism', '<$1$2=$3&$4>', $text);
 
                                // sanitizes src attributes (http and redir URLs for displaying in a web page, cid used for inline images in emails)
-                               $allowed_src_protocols = ['//', 'http://', 'https://', 'redir/', 'cid:'];
+                               $allowed_src_protocols = ['//', 'http://', 'https://', 'contact/redir/', 'cid:'];
 
                                array_walk($allowed_src_protocols, function(&$value) { $value = preg_quote($value, '#');});
 
@@ -2105,7 +2105,7 @@ class BBCode
                                $allowed_link_protocols[] = '//';
                                $allowed_link_protocols[] = 'http://';
                                $allowed_link_protocols[] = 'https://';
-                               $allowed_link_protocols[] = 'redir/';
+                               $allowed_link_protocols[] = 'contact/redir/';
 
                                array_walk($allowed_link_protocols, function(&$value) { $value = preg_quote($value, '#');});
 
index 93afeac4d056b9d0db38d7218f4d0973b51df846..2e55c71d2021759c2c875b8c5c702471c258d3b9 100644 (file)
@@ -840,7 +840,7 @@ class HTML
 
                if ($redirect) {
                        $url = Contact::magicLinkByContact($contact);
-                       if (strpos($url, 'redir/') === 0) {
+                       if (strpos($url, 'contact/redir/') === 0) {
                                $sparkle = ' sparkle';
                        }
                }
index 64ce451e46cac6b84b11c54683d578e30cc811cc..ee74cb1574bc313e0c5ab768c584f2fd380ece51 100644 (file)
@@ -1149,7 +1149,7 @@ class Contact
                $sparkle = false;
                if (($contact['network'] === Protocol::DFRN) && !$contact['self'] && empty($contact['pending'])) {
                        $sparkle = true;
-                       $profile_link = 'redir/' . $contact['id'];
+                       $profile_link = 'contact/redir/' . $contact['id'];
                } else {
                        $profile_link = $contact['url'];
                }
@@ -3324,7 +3324,7 @@ class Contact
                        return $destination;
                }
 
-               $redirect = 'redir/' . $contact['id'];
+               $redirect = 'contact/redir/' . $contact['id'];
 
                if (($url != '') && !Strings::compareLink($contact['url'], $url)) {
                        $redirect .= '?url=' . $url;
index 13f48f350f0726239f20ab1e531361b82fa5736a..9ed25017718cd148eacd2504d5c769a811eb8e42 100644 (file)
@@ -529,7 +529,7 @@ class Contact extends BaseModule
 
                $url = Model\Contact::magicLinkByContact($contact);
 
-               if (strpos($url, 'redir/') === 0) {
+               if (strpos($url, 'contact/redir/') === 0) {
                        $sparkle = ' class="sparkle" ';
                } else {
                        $sparkle = '';
index 7f12bf5cb5975daedd5151f0e4efd4c1604e5713..620b96095a4077d3307e6d03b6f9c6ce89080c73 100644 (file)
@@ -44,14 +44,12 @@ class Hovercard extends BaseModule
                        throw new HTTPException\ForbiddenException();
                }
 
-               // If a contact is connected the url is internally changed to 'redir/CID'. We need the pure url to search for
+               // If a contact is connected the url is internally changed to 'contact/redir/CID'. We need the pure url to search for
                // the contact. So we strip out the contact id from the internal url and look in the contact table for
                // the real url (nurl)
-               if (strpos($contact_url, 'redir/') === 0) {
+               if (strpos($contact_url, 'contact/redir/') === 0) {
                        $cid = intval(substr($contact_url, 6));
-               }
-
-               if (strpos($contact_url, 'contact/') === 0) {
+               } elseif (strpos($contact_url, 'contact/') === 0) {
                        $cid = intval(substr($contact_url, 8));
                }
 
index eaf9993fc1704f97a688addcca7945eba207c01a..ecb25dd60701e33e95c356f83044274d21a7d39a 100644 (file)
@@ -239,7 +239,7 @@ class Profile extends BaseModule
                }
 
                $url = Contact::magicLinkByContact($contact);
-               if (strpos($url, 'redir/') === 0) {
+               if (strpos($url, 'contact/redir/') === 0) {
                        $sparkle = ' class="sparkle" ';
                } else {
                        $sparkle = '';
diff --git a/src/Module/Contact/Redir.php b/src/Module/Contact/Redir.php
new file mode 100644 (file)
index 0000000..4b7360e
--- /dev/null
@@ -0,0 +1,224 @@
+<?php
+/**
+ * @copyright Copyright (C) 2010-2022, the Friendica project
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Module\Contact;
+
+use Friendica\Core\L10n;
+use Friendica\App;
+use Friendica\Core\Session\Capability\IHandleUserSessions;
+use Friendica\Database\Database;
+use Friendica\Model\Contact;
+use Friendica\Module\Response;
+use Friendica\Network\HTTPClient\Capability\ICanSendHttpRequests;
+use Friendica\Network\HTTPClient\Client\HttpClientAccept;
+use Friendica\Network\HTTPClient\Client\HttpClientOptions;
+use Friendica\Network\HTTPException;
+use Friendica\Util\Profiler;
+use Friendica\Util\Strings;
+use Psr\Log\LoggerInterface;
+
+class Redir extends \Friendica\BaseModule
+{
+       /** @var IHandleUserSessions */
+       private $session;
+       /** @var Database */
+       private $database;
+       /** @var App */
+       private $app;
+       /** @var ICanSendHttpRequests */
+       private $httpClient;
+
+       public function __construct(ICanSendHttpRequests $httpClient, App $app, Database $database, IHandleUserSessions $session, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
+       {
+               parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
+
+               $this->session    = $session;
+               $this->database   = $database;
+               $this->app        = $app;
+               $this->httpClient = $httpClient;
+       }
+
+       protected function rawContent(array $request = [])
+       {
+               if (!$this->session->isAuthenticated()) {
+                       throw new HTTPException\ForbiddenException($this->t('Access denied.'));
+               }
+
+               $url = $request['url'] ?? '';
+
+               $cid = $this->parameters['id'] ?? 0;
+
+               // Try magic auth before the legacy stuff
+               $this->magic($cid, $url);
+
+               $this->legacy($cid, $url);
+       }
+
+       /**
+        * @param int    $cid
+        * @param string $url
+        * @return void
+        * @throws HTTPException\ForbiddenException
+        * @throws HTTPException\InternalServerErrorException
+        * @throws HTTPException\NotFoundException
+        * @throws \ImagickException
+        */
+       private function magic(int $cid, string $url)
+       {
+               $visitor = $this->session->getMyUrl();
+               if (!empty($visitor)) {
+                       $this->logger->info('Got my url', ['visitor' => $visitor]);
+               }
+
+               $contact = $this->database->selectFirst('contact', ['url'], ['id' => $cid]);
+               if (!$contact) {
+                       $this->logger->info('Contact not found', ['id' => $cid]);
+                       throw new HTTPException\NotFoundException($this->t('Contact not found.'));
+               } else {
+                       $contact_url = $contact['url'];
+                       $this->checkUrl($contact_url, $url);
+                       $target_url = $url ?: $contact_url;
+               }
+
+               $basepath = Contact::getBasepath($contact_url);
+
+               // We don't use magic auth when there is no visitor, we are on the same system, or we visit our own stuff
+               if (empty($visitor) || Strings::compareLink($basepath, $this->baseUrl) || Strings::compareLink($contact_url, $visitor)) {
+                       $this->logger->info('Redirecting without magic', ['target' => $target_url, 'visitor' => $visitor, 'contact' => $contact_url]);
+                       $this->app->redirect($target_url);
+               }
+
+               // Test for magic auth on the target system
+               $response = $this->httpClient->head($basepath . '/magic', [HttpClientOptions::ACCEPT_CONTENT => HttpClientAccept::HTML]);
+               if ($response->isSuccess()) {
+                       $separator = strpos($target_url, '?') ? '&' : '?';
+                       $target_url .= $separator . 'zrl=' . urlencode($visitor) . '&addr=' . urlencode($contact_url);
+
+                       $this->logger->info('Redirecting with magic', ['target' => $target_url, 'visitor' => $visitor, 'contact' => $contact_url]);
+                       $this->app->redirect($target_url);
+               } else {
+                       $this->logger->info('No magic for contact', ['contact' => $contact_url]);
+               }
+       }
+
+       /**
+        * @param int    $cid
+        * @param string $url
+        * @return void
+        * @throws HTTPException\BadRequestException
+        * @throws HTTPException\ForbiddenException
+        * @throws HTTPException\InternalServerErrorException
+        * @throws HTTPException\NotFoundException
+        */
+       private function legacy(int $cid, string $url): void
+       {
+               if (empty($cid)) {
+                       throw new HTTPException\BadRequestException($this->t('Bad Request.'));
+               }
+
+               $fields  = ['id', 'uid', 'nurl', 'url', 'addr', 'name'];
+               $contact = $this->database->selectFirst('contact', $fields, ['id' => $cid, 'uid' => [0, $this->session->getLocalUserId()]]);
+               if (!$contact) {
+                       throw new HTTPException\NotFoundException($this->t('Contact not found.'));
+               }
+
+               $contact_url = $contact['url'];
+
+               if (!empty($this->app->getContactId()) && $this->app->getContactId() == $cid) {
+                       // Local user is already authenticated.
+                       $this->checkUrl($contact_url, $url);
+                       $this->app->redirect($url ?: $contact_url);
+               }
+
+               if ($contact['uid'] == 0 && $this->session->getLocalUserId()) {
+                       // Let's have a look if there is an established connection
+                       // between the public contact we have found and the local user.
+                       $contact = $this->database->selectFirst('contact', $fields, ['nurl' => $contact['nurl'], 'uid' => $this->session->getLocalUserId()]);
+                       if ($contact) {
+                               $cid = $contact['id'];
+                       }
+
+                       if (!empty($this->app->getContactId()) && $this->app->getContactId() == $cid) {
+                               // Local user is already authenticated.
+                               $this->checkUrl($contact_url, $url);
+                               $target_url = $url ?: $contact_url;
+                               $this->logger->info($contact['name'] . " is already authenticated. Redirecting to " . $target_url);
+                               $this->app->redirect($target_url);
+                       }
+               }
+
+               if ($this->session->getRemoteUserId()) {
+                       $host       = substr($this->baseUrl->getUrlPath() . ($this->baseUrl->getUrlPath() ? '/' . $this->baseUrl->getUrlPath() : ''), strpos($this->baseUrl->getUrlPath(), '://') + 3);
+                       $remotehost = substr($contact['addr'], strpos($contact['addr'], '@') + 1);
+
+                       // On a local instance we have to check if the local user has already authenticated
+                       // with the local contact. Otherwise, the local user would ask the local contact
+                       // for authentification everytime he/she is visiting a profile page of the local
+                       // contact.
+                       if (($host == $remotehost) && ($this->session->getRemoteContactID($this->session->get('visitor_visiting')) == $this->session->get('visitor_id'))) {
+                               // Remote user is already authenticated.
+                               $this->checkUrl($contact_url, $url);
+                               $target_url = $url ?: $contact_url;
+                               $this->logger->info($contact['name'] . " is already authenticated. Redirecting to " . $target_url);
+                               $this->app->redirect($target_url);
+                       }
+               }
+
+               if (empty($url)) {
+                       throw new HTTPException\BadRequestException($this->t('Bad Request.'));
+               }
+
+               // If we don't have a connected contact, redirect with
+               // the 'zrl' parameter.
+               $my_profile = $this->session->getMyUrl();
+
+               if (!empty($my_profile) && !Strings::compareLink($my_profile, $url)) {
+                       $separator = strpos($url, '?') ? '&' : '?';
+
+                       $url .= $separator . 'zrl=' . urlencode($my_profile);
+               }
+
+               $this->logger->info('redirecting to ' . $url);
+               $this->app->redirect($url);
+       }
+
+
+       private function checkUrl(string $contact_url, string $url)
+       {
+               if (empty($contact_url) || empty($url)) {
+                       return;
+               }
+
+               $url_host = parse_url($url, PHP_URL_HOST);
+               if (empty($url_host)) {
+                       $url_host = parse_url($this->baseUrl, PHP_URL_HOST);
+               }
+
+               $contact_url_host = parse_url($contact_url, PHP_URL_HOST);
+
+               if ($url_host == $contact_url_host) {
+                       return;
+               }
+
+               $this->logger->error('URL check host mismatch', ['contact' => $contact_url, 'url' => $url]);
+               throw new HTTPException\ForbiddenException($this->t('Access denied.'));
+       }
+}
index 459405cdbfac5c85425958ef636b4b54c24c1c48..87951c19ccf52d4c5f69e6fd3ce4ee7066c9a4f2 100644 (file)
@@ -280,7 +280,7 @@ class Post
                        $profile_link = $item['author-link'];
                }
 
-               if (strpos($profile_link, 'redir/') === 0) {
+               if (strpos($profile_link, 'contact/redir/') === 0) {
                        $sparkle = ' sparkle';
                }
 
index 12d68f40163bc815159e6c19857de8468f98091c..d281f252b95da05c253d2534bc083184b8846ca1 100644 (file)
@@ -385,6 +385,7 @@ return [
                '/hovercard'                  => [Module\Contact\Hovercard::class,     [R::GET]],
                '/ignored'                    => [Module\Contact::class,               [R::GET]],
                '/pending'                    => [Module\Contact::class,               [R::GET]],
+               '/redir/{id:\d+}'             => [Module\Contact\Redir::class,         [R::GET]],
                '/suggestions'                => [Module\Contact\Suggestions::class,   [R::GET]],
                '/unfollow'                   => [Module\Contact\Unfollow::class,      [R::GET, R::POST]],
        ],
index f4daed4d6c1cb2f698f2a6afdb322be078a9b298..1079a08c86b42a0456a50559ca8362b8898d0357 100644 (file)
@@ -107,7 +107,7 @@ function frio_item_photo_links(App $a, &$body_info)
                        $newlink = str_replace($matches[0], "/photo/{$matches[1]}", $link);
 
                        // Add a "quiet" parameter to any redir links to prevent the "XX welcomes YY" info boxes
-                       $newlink = preg_replace('/href="([^"]+)\/redir\/([^"]+)&url=([^"]+)"/', 'href="$1/redir/$2&quiet=1&url=$3"', $newlink);
+                       $newlink = preg_replace('#href="([^"]+)/contact/redir/(\d+)&url=([^"]+)"#', 'href="$1/contact/redir/$2&quiet=1&url=$3"', $newlink);
 
                        // Having any arguments to the link for Colorbox causes it to fetch base64 code instead of the image
                        $newlink = preg_replace('/\/[?&]zrl=([^&"]+)/', '', $newlink);