mirror of
https://github.com/tiennm99/coolify.git
synced 2026-10-14 04:15:55 +00:00
refactor(webhook): encrypt manual webhook secrets and tighten HMAC verification
- Auto-generate a 40-char random secret for each manual_webhook_secret_* column on Application creation so new apps are never left with an empty secret. - Add encrypted cast for the four webhook-secret columns; backfill migration re-encrypts existing plaintext values and fills missing ones. - Reject webhook deliveries when the stored secret is empty (GitHub, GitLab, Bitbucket, Gitea manual endpoints). - Bitbucket: require the sha256 algorithm prefix on X-Hub-Signature instead of trusting the client-supplied algo. - GitLab: drop the ?? '' fallback on the token comparison. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
1 parent
0627e14810
commit
bafb9a5a8b
7 files changed
+464
-8
No files matched your search
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class BackfillAndEncryptWebhookSecrets extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
$columns = [
|
||||
'manual_webhook_secret_github',
|
||||
'manual_webhook_secret_gitlab',
|
||||
'manual_webhook_secret_bitbucket',
|
||||
'manual_webhook_secret_gitea',
|
||||
];
|
||||
|
||||
Schema::table('applications', function ($table) use ($columns) {
|
||||
foreach ($columns as $col) {
|
||||
$table->text($col)->nullable()->change();
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
DB::table('applications')->chunkById(100, function ($apps) use ($columns) {
|
||||
foreach ($apps as $app) {
|
||||
$updates = [];
|
||||
foreach ($columns as $col) {
|
||||
$current = $app->{$col};
|
||||
|
||||
if (empty($current)) {
|
||||
$updates[$col] = Crypt::encryptString(Str::random(40));
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
Crypt::decryptString($current);
|
||||
|
||||
continue;
|
||||
} catch (Exception) {
|
||||
// Not encrypted yet
|
||||
}
|
||||
|
||||
$updates[$col] = Crypt::encryptString($current);
|
||||
}
|
||||
if ($updates !== []) {
|
||||
DB::table('applications')->where('id', $app->id)->update($updates);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (Exception $e) {
|
||||
echo 'Backfilling and encrypting webhook secrets failed.';
|
||||
echo $e->getMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user