Změna nastavení SMTP Maileru za běhu

DefenestrationPraha
Člen | 110
+
-1
-

Současná implementace Nette\Mail\SmtpMailer se typicky užívá tak, že uživatelské jméno a heslo se načtou z local.neon a nastaví v rámci konfigurace Nette.

Navrhuji přidat funkci


public function setCredentials(string $username,
		#[\SensitiveParameter]
		string $password) {
	$this->username = $username;
	$this->password = $password;
}

která by umožňovala změnu přihlašovacích údajů za běhu. Rád bych totiž umožnil svým uživatelům, aby si heslo k SMTP zkonfigurovali nikoliv v local.neon, ale v rámci nastavení serveru (tj. bylo by uloženo v databázi, ne v local.neon).

Chci tím snížit pravděpodobnost, že někdo třeba omylem commitne do nějakého veřejného úložiště heslo k funkční SMTP službě. Je sice pravda, že local.neon by se obecně měl chránit před cizíma očima, ale prosákne-li, dejme tomu, jen heslo k databázi, celkem snadno jej v případě nutnosti změníte. Databáze bývá místní a dost často ani není dostupná zvenčí. Kdežto SMTP často zvenčí dostupné je a jeden účet může používat více služeb, pak byste to museli měnit u všech naráz.

Editoval DefenestrationPraha (17. 5. 2023 12:12)

Marek Bartoš
Nette Blogger | 1171
+
+1
-

Co takhle?

services:
	mail.mail: YourCustomMailer
class YourCustomMailer implements \Nette\Mail\IMailer
{

	public function send(Message $mail): void
	{
		$mailer = new SmtpMailer(/* ... */);
		$mailer->send($mail);
	}

}

Editoval Marek Bartoš (17. 5. 2023 12:19)

DefenestrationPraha
Člen | 110
+
0
-

Marek Bartoš napsal(a):

Co takhle?

services:
	mail.mail: YourCustomMailer
class YourCustomMailer implements \Nette\Mail\IMailer
{

	public function send(Message $mail): void
	{
		$mailer = new SmtpMailer(/* ... */);
		$mailer->send($mail);
	}

}

To je chytré.

Už jsem mezitím uvažoval o alternativě, přenastavit tu property pomocí ReflectionProperty::setValue(), to by asi taky šlo?

Marek Bartoš
Nette Blogger | 1171
+
+4
-

Nepoužívej reflexi, když nezbytně nemusíš.

m.brecher
Generous Backer | 758
+
0
-

@MarekBartoš

Nepoužívej reflexi, když nezbytně nemusíš.

Kvůli čemu – znepřehlední kód, nebo sníží výkon ??

Marek Bartoš
Nette Blogger | 1171
+
0
-

@m.brecher Pokud něco není dostupné bez použití reflexe, tak to není součástí api. Privátní property se může kdykoli přejmenovat.

Reflexe je primárně pro statickou analýzu, generování api dokumentace a všemožné deklarativní enginy, jako je nextras/orm, doctrine, orisai/object-mapper apod.

A ano, bude to pomalejší když se to v runtime s reflexí přežene, ale spadá to do kolonky mikrooptimalizací

Editoval Marek Bartoš (17. 5. 2023 18:34)

MajklNajt
Člen | 471
+
0
-

a to heslo v databázi budeš mať uložené plain? to je trošku z kaluže do blata :D

DefenestrationPraha
Člen | 110
+
0
-

MajklNajt napsal(a):

a to heslo v databázi budeš mať uložené plain? to je trošku z kaluže do blata :D

Ne, to není. Ještě jsem neviděl, že by někdo omylem commitnul obsah lokální databáze do veřejného Gitu, kdežto lokální konfigurační soubory s plaintextovým heslem … to je celkem častý „failure mode“ i u zkušených lidí.