ContentHubWebhookController.php in Acquia Content Hub 8.2
File
src/Controller/ContentHubWebhookController.php
View source
<?php
namespace Drupal\acquia_contenthub\Controller;
use Drupal\acquia_contenthub\AcquiaContentHubEvents;
use Drupal\acquia_contenthub\Client\ClientFactory;
use Drupal\acquia_contenthub\Event\HandleWebhookEvent;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\Component\Serialization\Json;
use Drupal\Core\Controller\ControllerBase;
use GuzzleHttp\Psr7\Response;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
class ContentHubWebhookController extends ControllerBase {
protected $dispatcher;
protected $clientFactory;
public function __construct(EventDispatcherInterface $dispatcher, ClientFactory $client_factory) {
$this->dispatcher = $dispatcher;
$this->clientFactory = $client_factory;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('event_dispatcher'), $container
->get('acquia_contenthub.client.factory'));
}
public function receiveWebhook(Request $request) {
if ($request->headers
->has('x-original-host')) {
$request->headers
->set('host', $request->headers
->get('x-original-host'));
}
$payload = $request
->getContent();
try {
$key = $this
->validateWebhookSignature($request);
if ($key) {
$this
->getLogger('acquia_contenthub')
->debug(new FormattableMarkup('Webhook landing: @whook', [
'@whook' => print_r($payload, TRUE),
]));
if ($payload = Json::decode($payload)) {
$event = new HandleWebhookEvent($request, $payload, $key, $this->clientFactory
->getClient());
$this->dispatcher
->dispatch(AcquiaContentHubEvents::HANDLE_WEBHOOK, $event);
return $event
->getResponse();
}
}
else {
$ip_address = $request
->getClientIp();
$message = new FormattableMarkup('Webhook [from IP = @IP] rejected (Signatures do not match): @whook', [
'@IP' => $ip_address,
'@whook' => print_r($payload, TRUE),
]);
$this
->getLogger('acquia_contenthub')
->debug($message);
}
} catch (\Exception $e) {
$ip_address = $request
->getClientIp();
$message = new FormattableMarkup('Webhook [from IP = @IP] rejected. @error', [
'@IP' => $ip_address,
'@error' => print_r($e
->getMessage(), TRUE),
]);
$this
->getLogger('acquia_contenthub')
->debug($message);
}
return new Response();
}
public function validateWebhookSignature(Request $request) {
return $this->clientFactory
->authenticate($request);
}
}