- Covered webhook SSR allow list useage via test.
- Updated allow list handling to use trailing slash, or hash, or end of
line as late anchor for better handling for hosts (prevent .co.uk
passing for .co domain host)
protected function urlMatchesPattern($url, $pattern): bool
{
- $pattern = trim($pattern);
+ $pattern = rtrim(trim($pattern), '/');
$url = trim($url);
if (empty($pattern) || empty($url)) {
$quoted = preg_quote($pattern, '/');
$regexPattern = str_replace('\*', '.*', $quoted);
- return preg_match('/^' . $regexPattern . '.*$/i', $url);
+ return preg_match('/^' . $regexPattern . '($|\/.*$|#.*$)/i', $url);
}
/**
$this->assertNotNull($webhook->last_errored_at);
}
+ public function test_webhook_uses_ssr_hosts_option_if_set()
+ {
+ config()->set('app.ssr_hosts', 'https://*.example.com');
+ $http = Http::fake();
+
+ $webhook = $this->newWebhook(['active' => true, 'endpoint' => 'https://wh.example.co.uk'], ['all']);
+ $this->runEvent(ActivityType::ROLE_CREATE);
+ $http->assertNothingSent();
+
+ $webhook->refresh();
+ $this->assertEquals('The URL does not match the configured allowed SSR hosts', $webhook->last_error);
+ $this->assertNotNull($webhook->last_errored_at);
+ }
+
public function test_webhook_call_data_format()
{
Http::fake([
['config' => 'https://*.example.com', 'url' => 'https://test.example.com', 'result' => true],
['config' => '*//example.com', 'url' => 'https://example.com', 'result' => true],
['config' => '*//example.com', 'url' => 'http://example.com', 'result' => true],
+ ['config' => '*//example.co', 'url' => 'http://example.co.uk', 'result' => false],
+ ['config' => '*//example.co/bookstack', 'url' => 'https://example.co/bookstack/a/path', 'result' => true],
+ ['config' => '*//example.co*', 'url' => 'https://example.co.uk/bookstack/a/path', 'result' => true],
['config' => 'https://example.com', 'url' => 'https://example.com/a/b/c?test=cat', 'result' => true],
['config' => 'https://example.com', 'url' => 'https://example.co.uk', 'result' => false],