Posílání exception e-mailem včetně HTML z Tracy

Petr Parolek
Člen | 455
+
0
-

Ahoj, jak mám prosím posílat při chybě na serveru exception e-mailem včetně HTML v příloze z Tracy? Běžný logger pošle jen jednoduchou chybu bez podrobností.

Editoval Petr Parolek (19. 7. 2022 19:21)

David Grudl
Nette Core | 8082
+
+5
-

Něco takového je strašně nebezpečné, HTML může obsahovat věci, které se emailem posílat nemají.

dakur
Člen | 493
+
0
-

Můžeš taky využít nástroj typu Sentry – úryvky kódu máš pak v něm a on tě o chybách e-mailem notifikuje. V případě hlubšího debuggingu si pak vlezeš na server do logu.

Editoval dakur (20. 7. 2022 7:19)

finwe
Člen | 58
+
0
-

Dá se posílat odkaz na HTML, který je uložený někde lokálně/za autentizací.

Vlastní Logger v Debuggeru, přetížená/custom metoda log a property mailer

Editoval finwe (20. 7. 2022 13:43)

Pavel Kravčík
Člen | 1180
+
0
-

Když jsme u těch obskurních řešení, můžeš to zaheslovat a poslat zipem. :)

Kamil Valenta
Člen | 752
+
0
-

@PavelKravčík jak zahesluješ zip? :)

Pavel Kravčík
Člen | 1180
+
+2
-

Často se to dělá pro faktury posílané emailem a podobně. ;) PHP doc

Kamil Valenta
Člen | 752
+
0
-

A opravdu tím zahesluješ vytvářený zip v php?
(neslouží to jen k dekompresi zaheslovaného zipu?)

Před nějakým časem jsem to řešil a moc se ničeho nedobral…

Editoval Kamil Valenta (21. 7. 2022 13:58)

Pavel Kravčík
Člen | 1180
+
0
-

@KamilValenta: Ano, děláme to dlouho. Ale máš pravdu, že ve vanilla bez konzole je to jen pro čtení. Bez konzole bude fungovat tohle: ne-lexa/php-zip

filbar
Člen | 13
+
-5
-

Myslím si,
že uživatel by sám měl mít možnost toto rozhodnout jestli e-mail považuje za bezpečnou metodu pro předávání takových informací.

Přijde mi to stejně hloupé jako, že Google Pay odmítá fungovat bez zámku telefonu, když v telefonu mám mnohem citlivější informace jako Firefox včetně napojení na jeho úložiště hesel, kde mám hesla k projektům pro klienty, nebo e-mail, kde také mám hesla ke klientským projektům(DB, FTP přístupu).

Petr Parolek
Člen | 455
+
0
-

Vyřešeno:

<?php declare(strict_types = 1);

namespace App\Services;

use Nette\Http\Request;
use Nette\Mail\Mailer;
use Nette\Mail\Message;
use Throwable;
use Tracy\Helpers;

/**
 * @property string $email
 */
final class Logger extends \Tracy\Logger
{

	private Mailer $customMailer;

	private Request $request;

	public function __construct(string $logDir, string $email, Mailer $customMailer, Request $request)
	{
		$this->customMailer = $customMailer;
		$this->request = $request;
		$this->email = $email;

		parent::__construct($logDir, $email);
	}

	public function logException(Throwable $exception, ?string $file = null): string
	{
		$exceptionFile = parent::logException($exception, $file);

		$snooze = is_numeric($this->emailSnooze)
			? $this->emailSnooze
			: strtotime($this->emailSnooze) - time();

		if (
			(int) @filemtime($this->directory . '/email-sent') + $snooze < time() // @ file may not exist
			&& @file_put_contents($this->directory . '/email-sent', 'sent') !== false // @ file may not be writable
		) {
			$body = parent::formatMessage($exception) . "\n\nsource: " . Helpers::getSource();
			$mail = new Message();
			$mail->addTo($this->email)
				->setSubject('PHP: An error occurred on the server ' . $this->request->getUrl()->getHost())
				->setBody($body)
				->addAttachment($exceptionFile);
			$this->customMailer->send($mail);
		}

		return $exceptionFile;
	}

}

a registrace v DI:

services:
	tracy.logger: App\Services\Logger(%tempDir%/../log, %emailFrom%)

P.S. Jen škoda, že není některý kod v Tracy v metodě logException okolo snooze a musel jsem část vykopírovávat.

Petr Parolek
Člen | 455
+
0
-

Akorát nevím, proč se mi nezobrazuje verze PHP a Tracy dole:

Report generated at 2022/07/22 15:07:11
PHP 8.0.21
Apache/2.4.54 (Debian)
Tracy 2.9.3

Bug?

Vyřešeno úpravou konstruktoru v mém loggeru:

	public function __construct(string $logDir, string $email, Mailer $customMailer, Request $request)
	{
		$this->customMailer = $customMailer;
		$this->request = $request;
		$this->email = $email;

		$bluescreen = new \Tracy\BlueScreen();
		$bluescreen->info = [
			'PHP ' . PHP_VERSION,
			$_SERVER['SERVER_SOFTWARE'] ?? null,
			'Tracy ' . Debugger::VERSION,
		];
		parent::__construct(
			$logDir,
			$email,
			$bluescreen
		);
	}

Editoval Petr Parolek (22. 7. 2022 15:12)

Petr Parolek
Člen | 455
+
0
-

@DavidGrudl Máme v konfiguraci keysToHide od verze 2.8.7 a scrubber od verze 2.8.0, takže úniky citlivých údajů lze bez problémů ošetřit.

Marek Bartoš
Nette Blogger | 1146
+
+1
-

S podporou #[\SensitiveParameter] by mohlo být posílání bluescreenů přes email bezpečnější, avšak pořád existuje riziko zapomenutí některého klíče.
https://wiki.php.net/…_back_traces