/** * A webmention to our profile page means someone mentioned us. */ function webmentionContent($source, $target, $source_response, $source_mf2) { Idno::site()->logging()->info("received user mention from {$source} to {$target}"); if (empty($this->arguments)) { Idno::site()->logging()->debug("could not process user mention, no pagehandler arguments"); return false; } $user = User::getByHandle($this->arguments[0]); if (empty($user)) { Idno::site()->logging()->debug('could not process user mention, no user for handle ' . $this->arguments[0]); return false; } Idno::site()->logging()->debug("found target user {$user->getHandle()}"); // if this is anything other than a normal mention (e.g. a delete), accept the wm, but do nothing if ($source_response['response'] !== 200) { return true; } $title = Webmention::getTitleFromContent($source_response['content'], $source); $mention = ['permalink' => $source, 'title' => $title]; // look for the first and only h-entry or h-event on the page $entry = Webmention::findRepresentativeHEntry($source_mf2, $source, ['h-entry', 'h-event']); $card = Webmention::findAuthorHCard($source_mf2, $source, $entry); // try to get some more specific details of the mention from mf2 content if ($entry) { if (!empty($entry['properties']['url'])) { $mention['permalink'] = $entry['properties']['url'][0]; } if (!empty($entry['properties']['content'])) { $content = $entry['properties']['content'][0]; $mention['content'] = Idno::site()->template()->sanitize_html(is_array($content) ? $content['html'] : $content); } } $sender_url = false; if ($card) { if (!empty($card['properties']['url'])) { $sender_url = $card['properties']['url'][0]; $mention['owner_url'] = $card['properties']['url'][0]; } if (!empty($card['properties']['name'])) { $mention['owner_name'] = $card['properties']['name'][0]; } } $message = 'You were mentioned'; if (isset($mention['owner_name'])) { $message .= ' by ' . $mention['owner_name']; } $message .= ' on ' . parse_url($mention['permalink'], PHP_URL_HOST); $notif = new Notification(); if ($notif->setNotificationKey(['mention', $user->getUUID(), $source, $target])) { $notif->setOwner($user); $notif->setMessage($message); $notif->setMessageTemplate('content/notification/mention'); $notif->setActor($sender_url); $notif->setVerb('mention'); $notif->setObject($mention); $notif->setTarget($user); $notif->save(); $user->notify($notif); } else { \Idno\Core\Idno::site()->logging()->debug("ignoring duplicate notification", ['source' => $source, 'target' => $target, 'user' => $user->getHandle()]); } return true; }
/** * Add webmentions as annotations based on Microformats 2 data * * @param string $source The source URL * @param string $target The target URL (i.e., the page on this site that was pinged) * @param array $source_response The Webservice response from fetching the source page * @param array $source_mf2 Parsed Microformats 2 content from $source * @return bool Success */ function addWebmentions($source, $target, $source_response, $source_mf2) { if ($source_response['response'] == 410) { $this->removeAnnotation($source); $this->save(); return true; } $return = false; if (!empty($source_mf2) && !empty($source_mf2['items']) && is_array($source_mf2['items'])) { // At this point, we don't know who owns the page or what the content is. // First, we'll initialize some variables that we're interested in filling. $mentions = array('owner' => array(), 'mentions' => array()); // Content owner and usable webmention items // Get the page title from the source content $title = Webmention::getTitleFromContent($source_response['content'], $source); // primary h-entry on the page $primary = Webmention::findRepresentativeHEntry($source_mf2, $source, ['h-entry']); $author = Webmention::findAuthorHCard($source_mf2, $source, $primary); // Convert the h-entry to one or more mentions if ($primary) { $mentions = $this->addWebmentionItem($primary, $author, $mentions, $source, $target, $title); } if (!empty($mentions['mentions']) && !empty($mentions['owner'])) { $return = true; if (empty($mentions['owner']['photo'])) { $mentions['owner']['photo'] = ''; } if (empty($mentions['owner']['url'])) { $mentions['owner']['url'] = $source; } if (empty($mentions['owner']['name'])) { $mentions['owner']['name'] = 'Web user'; } if (empty($mentions['title'])) { $mentions['title'] = ''; } $this->removeAnnotation($source); foreach ($mentions['mentions'] as $mention) { if (!empty($mention['url'])) { $permalink = $mention['url'][0]; //implode('', $mention['url']); } else { $permalink = $source; } // Special exemption for bridgy if (strpos($source, 'https://brid-gy.appspot.com/') !== false && in_array($mention['type'], array('like', 'share', 'rsvp'))) { $permalink = \Idno\Core\Idno::site()->template()->getURLWithVar('known_from', $source, implode('', $mention['url'])); } if (!$this->addAnnotation($mention['type'], $mentions['owner']['name'], $mentions['owner']['url'], $mentions['owner']['photo'], $mention['content'], $permalink, $mention['created'], $mention['title'])) { $return = false; } } $this->save(); if ($return && $this->isReply()) { if ($reply_urls = $this->getReplyToURLs()) { foreach ($reply_urls as $reply_url) { Webmention::sendWebmentionPayload($this->getDisplayURL(), $reply_url); } } } } } return $return; }