}
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);
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);
}
/**
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']]);
+ }
}
/**
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);
}
}
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;
// 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')) {
new Uri($this->baseUrl->get(true) . '/moderation/users/pending')
);
}
- } elseif (count($registrations) > 1) {
+ } else {
$navNotifications[] = $this->formattedNavNotification->createFromParams(
$registrations[0]['name'],
$registrations[0]['url'],
{
$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)) {
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;
* @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
{
* @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
{
);
}
+ /**
+ * @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']) {
*/
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']);