diff --git a/Modules/Helpdesk/Http/Controllers/GitWebhookController.php b/Modules/Helpdesk/Http/Controllers/GitWebhookController.php index bdf6f4a4..8ab5ee71 100644 --- a/Modules/Helpdesk/Http/Controllers/GitWebhookController.php +++ b/Modules/Helpdesk/Http/Controllers/GitWebhookController.php @@ -65,19 +65,45 @@ final class GitWebhookController return match ($provider) { 'github' => $this->hasValidGitHubSignature($request, $secret, $rawPayload), 'gitlab' => hash_equals($secret, (string) $request->header('X-Gitlab-Token', '')), - default => hash_equals($secret, (string) $request->header('X-Helpdesk-Token', '')), + 'bitbucket' => $this->hasValidBitbucketSignature($request, $secret, $rawPayload), + default => $this->hasValidGenericSignature($request, $secret, $rawPayload), }; } /** - * Validate GitHub's X-Hub-Signature-256 HMAC header. + * Validate GitHub's current SHA-256 signature and legacy SHA-1 signature. */ private function hasValidGitHubSignature(Request $request, string $secret, string $rawPayload): bool { - $signature = (string) $request->header('X-Hub-Signature-256', ''); - $expected = 'sha256=' . hash_hmac('sha256', $rawPayload, $secret); + $sha256Signature = (string) $request->header('X-Hub-Signature-256', ''); + $sha1Signature = (string) $request->header('X-Hub-Signature', ''); - return hash_equals($expected, $signature); + return hash_equals('sha256=' . hash_hmac('sha256', $rawPayload, $secret), $sha256Signature) + || hash_equals('sha1=' . hash_hmac('sha1', $rawPayload, $secret), $sha1Signature); + } + + /** + * Validate Bitbucket's webhook HMAC signature. + */ + private function hasValidBitbucketSignature(Request $request, string $secret, string $rawPayload): bool + { + $signature = (string) $request->header('X-Hub-Signature', ''); + + return hash_equals('sha256=' . hash_hmac('sha256', $rawPayload, $secret), $signature) + || hash_equals($secret, (string) $request->header('X-Helpdesk-Token', '')); + } + + /** + * Validate a generic Git webhook using either a token header or HMAC signature. + */ + private function hasValidGenericSignature(Request $request, string $secret, string $rawPayload): bool + { + $token = (string) ($request->header('X-Helpdesk-Token') ?: $request->header('X-Gitlab-Token')); + $signature = (string) ($request->header('X-Hub-Signature-256') ?: $request->header('X-Hub-Signature')); + + return hash_equals($secret, $token) + || hash_equals('sha256=' . hash_hmac('sha256', $rawPayload, $secret), $signature) + || hash_equals('sha1=' . hash_hmac('sha1', $rawPayload, $secret), $signature); } /** @@ -88,7 +114,8 @@ final class GitWebhookController return match ($provider) { 'github' => $request->header('X-GitHub-Event'), 'gitlab' => $request->header('X-Gitlab-Event'), - default => $request->header('X-Helpdesk-Event', 'push'), + 'bitbucket' => $request->header('X-Event-Key'), + default => $request->header('X-Helpdesk-Event') ?: $request->header('X-GitHub-Event') ?: $request->header('X-Gitlab-Event') ?: 'push', }; } @@ -100,7 +127,8 @@ final class GitWebhookController return match ($provider) { 'github' => $request->header('X-GitHub-Delivery'), 'gitlab' => $request->header('X-Gitlab-Event-UUID') ?: $request->header('X-Request-Id'), - default => $request->header('X-Helpdesk-Delivery'), + 'bitbucket' => $request->header('X-Request-UUID') ?: $request->header('X-Request-Id'), + default => $request->header('X-Helpdesk-Delivery') ?: $request->header('X-GitHub-Delivery') ?: $request->header('X-Request-Id'), }; } } diff --git a/Modules/Helpdesk/Resources/views/components/colour-select.blade.php b/Modules/Helpdesk/Resources/views/components/colour-select.blade.php index fbdd3ded..17097235 100644 --- a/Modules/Helpdesk/Resources/views/components/colour-select.blade.php +++ b/Modules/Helpdesk/Resources/views/components/colour-select.blade.php @@ -11,16 +11,16 @@ $currentLabel = \Modules\Helpdesk\Support\Color::label($currentValue); @endphp -
{{ $description }}
+ {{ $attributes->merge([ + 'class' => 'overflow-hidden rounded-3xl border border-zinc-700 bg-zinc-900 shadow-sm ring-1 ring-white/10', + ]) }}> +Configuration
+{{ $description }}
+