From e78471c847a1c590439012639a9200aea1c622c6 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <hypolite@mrpetovan.com>
Date: Thu, 8 Dec 2022 09:40:35 -0500
Subject: [PATCH] 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 873de08906..79ddae713a 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 ac8d200aa8..1669707b92 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']);
-- 
2.39.5