Make the SECRETS_KEY test able to fail

The Task 2 reviewer rewired the model to Laravel's APP_KEY-based Crypt
facade and every test stayed green. Laravel's encrypter is a container
singleton resolved once from app.key, so config()->set('app.key') never
rebuilds it and the rotation the test performed was invisible.

Replaced with a positive proof — rotating SECRETS_KEY must break
decryption — plus the APP_KEY case with forgetInstance(), which is what
makes that direction mean anything.
feat/mailboxes
nexxo 2026-07-27 21:44:59 +02:00
parent aaddffc096
commit c5252847bb
1 changed files with 20 additions and 1 deletions

View File

@ -256,11 +256,30 @@ it('stores the password encrypted and never in the clear', function () {
->and($box->fresh()->password)->toBe('sehr-geheim'); ->and($box->fresh()->password)->toBe('sehr-geheim');
}); });
it('uses SECRETS_KEY, not APP_KEY — rotating APP_KEY leaves mail working', function () { it('is keyed to SECRETS_KEY — rotating it makes the password unreadable', function () {
// The POSITIVE proof, and the one that discriminates. Without it the pair
// below passes even against an APP_KEY implementation.
$box = Mailbox::factory()->create(['password' => 'geheim']);
config()->set('admin_access.secrets_key', 'base64:'.base64_encode(random_bytes(32)));
expect(fn () => $box->fresh()->password)
->toThrow(Illuminate\Contracts\Encryption\DecryptException::class);
});
it('is NOT keyed to APP_KEY — rotating that leaves mail working', function () {
$box = Mailbox::factory()->create(['password' => 'bleibt-lesbar']); $box = Mailbox::factory()->create(['password' => 'bleibt-lesbar']);
config()->set('app.key', 'base64:'.base64_encode(random_bytes(32))); config()->set('app.key', 'base64:'.base64_encode(random_bytes(32)));
// forgetInstance is what makes this test mean anything. Laravel's encrypter
// is a container singleton resolved once from whatever app.key held at the
// time; config()->set() afterwards mutates the array and never rebuilds it.
// Without this line the test passes even when the model is rewired to
// Laravel's own APP_KEY-based Crypt facade — proven by mutation during the
// Task 2 review, where every test stayed green through exactly that change.
app()->forgetInstance('encrypter');
expect($box->fresh()->password)->toBe('bleibt-lesbar'); expect($box->fresh()->password)->toBe('bleibt-lesbar');
}); });