From d87585477cb5c68d24442fb329581f88c1dfe8e9 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 8 Dec 2022 09:24:06 -0500 Subject: [PATCH 1/4] Delete introductions when referenced contact id doesn't exist anymore in Ping module - Address part of https://github.com/friendica/friendica/issues/11993#issuecomment-1338134893 --- src/Module/Notifications/Ping.php | 9 +++++-- .../Factory/FormattedNavNotification.php | 24 +++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/Module/Notifications/Ping.php b/src/Module/Notifications/Ping.php index 76cdd9f77..df75c047a 100644 --- a/src/Module/Notifications/Ping.php +++ b/src/Module/Notifications/Ping.php @@ -48,6 +48,7 @@ use Friendica\Navigation\Notifications\Factory; use Friendica\Navigation\Notifications\Repository; use Friendica\Navigation\Notifications\ValueObject; use Friendica\Navigation\SystemMessages; +use Friendica\Network\HTTPException; use Friendica\Protocol\Activity; use Friendica\Util\DateTimeFormat; use Friendica\Util\Profiler; @@ -229,7 +230,11 @@ class Ping extends BaseModule // merge all notification types in one array foreach ($intros as $intro) { - $navNotifications[] = $this->formattedNavNotification->createFromIntro($intro); + try { + $navNotifications[] = $this->formattedNavNotification->createFromIntro($intro); + } catch (HTTPException\NotFoundException $e) { + $this->introductionRepo->delete($intro); + } } if (count($registrations) <= 1 || $this->pconfig->get($this->session->getLocalUserId(), 'system', 'detailed_notif')) { @@ -242,7 +247,7 @@ class Ping extends BaseModule new Uri($this->baseUrl->get(true) . '/moderation/users/pending') ); } - } elseif (count($registrations) > 1) { + } else { $navNotifications[] = $this->formattedNavNotification->createFromParams( $registrations[0]['name'], $registrations[0]['url'], diff --git a/src/Navigation/Notifications/Factory/FormattedNavNotification.php b/src/Navigation/Notifications/Factory/FormattedNavNotification.php index 2b1360eaa..9813fbf85 100644 --- a/src/Navigation/Notifications/Factory/FormattedNavNotification.php +++ b/src/Navigation/Notifications/Factory/FormattedNavNotification.php @@ -28,7 +28,7 @@ use Friendica\Model\Contact; use Friendica\Navigation\Notifications\Entity; use Friendica\Navigation\Notifications\Exception\NoMessageException; use Friendica\Navigation\Notifications\ValueObject; -use Friendica\Network\HTTPException\ServiceUnavailableException; +use Friendica\Network\HTTPException; use Friendica\Util\DateTimeFormat; use Friendica\Util\Proxy; use Friendica\Util\Temporal; @@ -73,7 +73,7 @@ class FormattedNavNotification extends BaseFactory * @param Uri $href * @param bool $seen * @return ValueObject\FormattedNavNotification - * @throws ServiceUnavailableException + * @throws HTTPException\ServiceUnavailableException */ public function createFromParams(string $contact_name, string $contact_url, string $message, \DateTime $date, Uri $href, bool $seen = false): ValueObject\FormattedNavNotification { @@ -115,9 +115,9 @@ class FormattedNavNotification extends BaseFactory * @param Entity\Notification $notification * @return ValueObject\FormattedNavNotification * @throws NoMessageException - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - * @throws \Friendica\Network\HTTPException\NotFoundException - * @throws \Friendica\Network\HTTPException\ServiceUnavailableException + * @throws HTTPException\InternalServerErrorException + * @throws HTTPException\NotFoundException + * @throws HTTPException\ServiceUnavailableException */ public function createFromNotification(Entity\Notification $notification): ValueObject\FormattedNavNotification { @@ -141,10 +141,20 @@ class FormattedNavNotification extends BaseFactory ); } + /** + * @param \Friendica\Contact\Introduction\Entity\Introduction $intro + * @return ValueObject\FormattedNavNotification + * @throws HTTPException\NotFoundException when the contact record couldn't be located + * @throws HTTPException\ServiceUnavailableException + */ public function createFromIntro(\Friendica\Contact\Introduction\Entity\Introduction $intro): ValueObject\FormattedNavNotification { - if (!isset(self::$contacts[$intro->cid])) { - self::$contacts[$intro->cid] = Contact::getById($intro->cid, ['name', 'url', 'pending']); + if (empty(self::$contacts[$intro->cid])) { + if ($contact = Contact::getById($intro->cid, ['name', 'url', 'pending'])) { + self::$contacts[$intro->cid] = $contact; + } else { + throw new HTTPException\NotFoundException('Contact not found with id' . $intro->cid); + } } if (self::$contacts[$intro->cid]['pending']) { From e78471c847a1c590439012639a9200aea1c622c6 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 8 Dec 2022 09:40:35 -0500 Subject: [PATCH 2/4] Throw exception when a few keys are missing from probe data array in Repository\DiasporaContact - Address part of https://github.com/friendica/friendica/issues/11993#issuecomment-1338134893 --- src/Model/Contact.php | 32 ++++++++++++++----- .../Diaspora/Repository/DiasporaContact.php | 12 +++++++ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 873de0890..79ddae713 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -1395,9 +1395,17 @@ class Contact } if ($data['network'] == Protocol::DIASPORA) { - DI::dsprContact()->updateFromProbeArray($data); + try { + DI::dsprContact()->updateFromProbeArray($data); + } catch (\InvalidArgumentException $e) { + Logger::error($e->getMessage(), ['url' => $url, 'data' => $data]); + } } elseif (!empty($data['networks'][Protocol::DIASPORA])) { - DI::dsprContact()->updateFromProbeArray($data['networks'][Protocol::DIASPORA]); + try { + DI::dsprContact()->updateFromProbeArray($data['networks'][Protocol::DIASPORA]); + } catch (\InvalidArgumentException $e) { + Logger::error($e->getMessage(), ['url' => $url, 'data' => $data['networks'][Protocol::DIASPORA]]); + } } self::updateFromProbeArray($contact_id, $data); @@ -2485,15 +2493,23 @@ class Contact return false; } - $ret = Probe::uri($contact['url'], $network, $contact['uid']); + $data = Probe::uri($contact['url'], $network, $contact['uid']); - if ($ret['network'] == Protocol::DIASPORA) { - DI::dsprContact()->updateFromProbeArray($ret); - } elseif (!empty($ret['networks'][Protocol::DIASPORA])) { - DI::dsprContact()->updateFromProbeArray($ret['networks'][Protocol::DIASPORA]); + if ($data['network'] == Protocol::DIASPORA) { + try { + DI::dsprContact()->updateFromProbeArray($data); + } catch (\InvalidArgumentException $e) { + Logger::error($e->getMessage(), ['id' => $id, 'network' => $network, 'contact' => $contact, 'data' => $data]); + } + } elseif (!empty($data['networks'][Protocol::DIASPORA])) { + try { + DI::dsprContact()->updateFromProbeArray($data['networks'][Protocol::DIASPORA]); + } catch (\InvalidArgumentException $e) { + Logger::error($e->getMessage(), ['id' => $id, 'network' => $network, 'contact' => $contact, 'data' => $data]); + } } - return self::updateFromProbeArray($id, $ret); + return self::updateFromProbeArray($id, $data); } /** diff --git a/src/Protocol/Diaspora/Repository/DiasporaContact.php b/src/Protocol/Diaspora/Repository/DiasporaContact.php index ac8d200aa..1669707b9 100644 --- a/src/Protocol/Diaspora/Repository/DiasporaContact.php +++ b/src/Protocol/Diaspora/Repository/DiasporaContact.php @@ -234,6 +234,18 @@ class DiasporaContact extends BaseRepository */ public function updateFromProbeArray(array $data): Entity\DiasporaContact { + if (empty($data['url'])) { + throw new \InvalidArgumentException('Missing url key in Diaspora probe data array'); + } + + if (empty($data['guid'])) { + throw new \InvalidArgumentException('Missing guid key in Diaspora probe data array'); + } + + if (empty($data['pubkey'])) { + throw new \InvalidArgumentException('Missing pubkey key in Diaspora probe data array'); + } + $uriId = ItemURI::insert(['uri' => $data['url'], 'guid' => $data['guid']]); $contact = Contact::getByUriId($uriId, ['id', 'created']); From a71fb8d7f3a8cab8dd16be142ce271256ecf99cc Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 8 Dec 2022 09:41:08 -0500 Subject: [PATCH 3/4] Check for existence of a public contact id before deleting related notifications in Model\Contact - Address part of https://github.com/friendica/friendica/issues/11993#issuecomment-1338134893 --- src/Model/Contact.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 79ddae713..d3ff4a2ef 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -3209,8 +3209,9 @@ class Contact self::clearFollowerFollowingEndpointCache($contact['uid']); $cdata = self::getPublicAndUserContactID($contact['id'], $contact['uid']); - - DI::notification()->deleteForUserByVerb($contact['uid'], Activity::FOLLOW, ['actor-id' => $cdata['public']]); + if (!empty($cdata['public'])) { + DI::notification()->deleteForUserByVerb($contact['uid'], Activity::FOLLOW, ['actor-id' => $cdata['public']]); + } } /** From 71a7f2d5034211a3e640c24663e0bad7a24c466a Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 8 Dec 2022 09:45:33 -0500 Subject: [PATCH 4/4] Remove parameter-less call of OStatus\Salmon module in DFRN\Notify - Address https://github.com/friendica/friendica/issues/11993#issuecomment-1342615279 --- src/Module/DFRN/Notify.php | 14 ++------------ src/Module/OStatus/Salmon.php | 9 +++++---- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/Module/DFRN/Notify.php b/src/Module/DFRN/Notify.php index 34cf21f11..14b121e81 100644 --- a/src/Module/DFRN/Notify.php +++ b/src/Module/DFRN/Notify.php @@ -70,18 +70,8 @@ class Notify extends BaseModule throw new \Friendica\Network\HTTPException\InternalServerErrorException(); } $this->dispatchPrivate($user, $postdata); - } elseif (!$this->dispatchPublic($postdata)) { - (new Salmon( - $this->database, - $this->l10n, - $this->baseUrl, - $this->args, - $this->logger, - $this->profiler, - $this->response, - $this->server, - $this->parameters - ))->rawContent($request); + } else { + $this->dispatchPublic($postdata); } } diff --git a/src/Module/OStatus/Salmon.php b/src/Module/OStatus/Salmon.php index 0d393afcc..f928e308d 100644 --- a/src/Module/OStatus/Salmon.php +++ b/src/Module/OStatus/Salmon.php @@ -66,11 +66,12 @@ class Salmon extends \Friendica\BaseModule { $xml = Network::postdata(); - $this->logger->debug('New Salmon', ['nickname' => $this->parameters['nickname'], 'xml' => $xml]); - - // Despite having a route with a mandatory nickname parameter, this method can also be called from - // \Friendica\Module\DFRN\Notify->post where the same parameter is optional 🤷‍ $nickname = $this->parameters['nickname'] ?? ''; + if (empty($nickname)) { + throw new HTTPException\BadRequestException('nickname parameter is mandatory'); + } + + $this->logger->debug('New Salmon', ['nickname' => $nickname, 'xml' => $xml]); $importer = $this->database->selectFirst('user', [], ['nickname' => $nickname, 'account_expired' => false, 'account_removed' => false]); if (!$this->database->isResult($importer)) {