mirror of
https://github.com/tiennm99/coolify.git
synced 2026-04-17 17:21:04 +00:00
Fix S3 credential whitespace issue with proper trimming
- Add model saving event to trim key/secret fields (encrypted casts) - Add attribute mutators to trim endpoint, bucket, region fields - Create migration to fix existing S3 storage records with whitespace - Use chunking in migration to handle large datasets efficiently - Verify re-encryption validity before committing changes Fixes #7469 #7594 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -20,6 +20,28 @@ class S3Storage extends BaseModel
|
||||
'secret' => 'encrypted',
|
||||
];
|
||||
|
||||
/**
|
||||
* Boot the model and register event listeners.
|
||||
*/
|
||||
protected static function boot(): void
|
||||
{
|
||||
parent::boot();
|
||||
|
||||
// Trim whitespace from credentials before saving to prevent
|
||||
// "Malformed Access Key Id" errors from accidental whitespace in pasted values.
|
||||
// Note: We use the saving event instead of Attribute mutators because key/secret
|
||||
// use Laravel's 'encrypted' cast. Attribute mutators fire before casts, which
|
||||
// would cause issues with the encryption/decryption cycle.
|
||||
static::saving(function (S3Storage $storage) {
|
||||
if ($storage->key !== null) {
|
||||
$storage->key = trim($storage->key);
|
||||
}
|
||||
if ($storage->secret !== null) {
|
||||
$storage->secret = trim($storage->secret);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static function ownedByCurrentTeam(array $select = ['*'])
|
||||
{
|
||||
$selectArray = collect($select)->concat(['id']);
|
||||
@@ -55,6 +77,36 @@ class S3Storage extends BaseModel
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trim whitespace from endpoint to prevent malformed URLs.
|
||||
*/
|
||||
protected function endpoint(): Attribute
|
||||
{
|
||||
return Attribute::make(
|
||||
set: fn (?string $value) => $value ? trim($value) : null,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trim whitespace from bucket name to prevent connection errors.
|
||||
*/
|
||||
protected function bucket(): Attribute
|
||||
{
|
||||
return Attribute::make(
|
||||
set: fn (?string $value) => $value ? trim($value) : null,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Trim whitespace from region to prevent connection errors.
|
||||
*/
|
||||
protected function region(): Attribute
|
||||
{
|
||||
return Attribute::make(
|
||||
set: fn (?string $value) => $value ? trim($value) : null,
|
||||
);
|
||||
}
|
||||
|
||||
public function testConnection(bool $shouldSave = false)
|
||||
{
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user