diff --git a/app/Services/Mail/GuestMailConfig.php b/app/Services/Mail/GuestMailConfig.php index e4af9a5..8f610fa 100644 --- a/app/Services/Mail/GuestMailConfig.php +++ b/app/Services/Mail/GuestMailConfig.php @@ -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, diff --git a/tests/Feature/Mail/GuestMailConfigTest.php b/tests/Feature/Mail/GuestMailConfigTest.php index 630904e..44ece29 100644 --- a/tests/Feature/Mail/GuestMailConfigTest.php +++ b/tests/Feature/Mail/GuestMailConfigTest.php @@ -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 () {