Passwort-Leck-Test verschaerft, mail_smtpauth an authenticates gekoppelt
Der Passwort-Test prüfte nur die Abwesenheit des Schlüssels mail_smtppassword — ein Leck unter anderem Namen wäre durchgerutscht. Prüft jetzt zusätzlich, dass der Passwort-WERT in keinem values()-Eintrag steckt. mail_smtpauth stand fest auf 'true', obwohl Mailbox::isConfigured() ein Postfach ohne Anmeldung ausdrücklich zulässt. Nextcloud hätte sich dann mit leerem Passwort anzumelden versucht — jeder Versand wäre still gescheitert. Richtet sich jetzt nach $box->authenticates, mit Test für den false-Fall.feat/versandtakt
parent
da9e71bc88
commit
cacdca0a18
|
|
@ -55,12 +55,18 @@ final class GuestMailConfig
|
|||
// fuehrt: den linken Teil als Absender, den rechten als Maildomain.
|
||||
[$local, $domain] = array_pad(explode('@', $box->address, 2), 2, '');
|
||||
|
||||
// Ein Postfach OHNE Anmeldung ist erlaubt (Mailbox::isConfigured() —
|
||||
// ein vertrauenswuerdiges lokales Relay verlangt kein Passwort). Ein
|
||||
// fest verdrahtetes 'true' wuerde Nextcloud trotzdem zur Anmeldung
|
||||
// zwingen, sie versucht es dann mit einem leeren Passwort, und JEDER
|
||||
// Versand scheitert — still, denn der Fehler zeigt sich erst beim
|
||||
// naechsten Mailversand des Kunden, nie bei dieser Konfiguration.
|
||||
return new self(null, [
|
||||
'mail_smtpmode' => 'smtp',
|
||||
'mail_smtphost' => $host,
|
||||
'mail_smtpport' => (string) $port,
|
||||
'mail_smtpsecure' => (string) Settings::get('mail.encryption', 'tls'),
|
||||
'mail_smtpauth' => 'true',
|
||||
'mail_smtpauth' => $box->authenticates ? 'true' : 'false',
|
||||
'mail_smtpname' => $box->smtpUsername(),
|
||||
'mail_from_address' => $local,
|
||||
'mail_domain' => $domain,
|
||||
|
|
|
|||
|
|
@ -43,13 +43,41 @@ it('baut die Werte aus Server UND Postfach zusammen', function () {
|
|||
->and($config->password())->toBe('geheim');
|
||||
});
|
||||
|
||||
it('schreibt mail_smtpauth false fuer ein Postfach ohne Anmeldung', function () {
|
||||
// Ein Relay ohne Anmeldung ist bei Mailbox::isConfigured() ausdruecklich
|
||||
// erlaubt und verlangt kein Passwort. Ein fest verdrahtetes 'true' wuerde
|
||||
// Nextcloud trotzdem zur Anmeldung mit leerem Passwort zwingen und jeden
|
||||
// Versand still scheitern lassen — genau das darf hier nicht passieren.
|
||||
Settings::set('mail.host', 'mail.clupilot.cloud');
|
||||
Settings::set('mail.port', 587);
|
||||
Settings::set('mail.encryption', 'tls');
|
||||
|
||||
Mailbox::factory()->create([
|
||||
'key' => 'instance-relay',
|
||||
'address' => 'noreply@clupilot.cloud',
|
||||
'password' => null,
|
||||
'active' => true,
|
||||
'authenticates' => false,
|
||||
]);
|
||||
|
||||
$config = GuestMailConfig::for(Instance::factory()->create());
|
||||
|
||||
expect($config->available())->toBeTrue()
|
||||
->and($config->values())->toMatchArray(['mail_smtpauth' => 'false']);
|
||||
});
|
||||
|
||||
it('traegt das Passwort NICHT unter values()', function () {
|
||||
// values() wandert in Befehle. Das Passwort geht einen eigenen Weg, damit
|
||||
// niemand es versehentlich mit den uebrigen Werten mitschleift.
|
||||
versandbereit();
|
||||
|
||||
expect(GuestMailConfig::for(Instance::factory()->create())->values())
|
||||
->not->toHaveKey('mail_smtppassword');
|
||||
$values = GuestMailConfig::for(Instance::factory()->create())->values();
|
||||
|
||||
expect($values)->not->toHaveKey('mail_smtppassword')
|
||||
// Der Schluessel allein beweist nichts: ein Leck unter einem anderen
|
||||
// Namen faende der Test oben nicht. Deshalb zusaetzlich nach dem WERT
|
||||
// suchen, egal unter welchem Schluessel er sich versteckt.
|
||||
->and($values)->not->toContain('geheim');
|
||||
});
|
||||
|
||||
it('sagt ohne Mailserver, dass nichts geschrieben werden darf', function () {
|
||||
|
|
|
|||
Loading…
Reference in New Issue