From bffa0088b44c41b68c31afedf7952f8b2bd98d1d Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 22 Dec 2024 06:33:37 +0100 Subject: [PATCH] Extend warning with IP + host etc. --- .../Admin/UnknownUserLoginAttempt.php | 15 ++++++++---- app/Notifications/User/UserLogin.php | 24 ++++--------------- app/Support/Steam.php | 13 +++++++--- resources/lang/en_US/email.php | 1 + .../views/emails/owner/unknown-user.blade.php | 8 ++++++- 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/app/Notifications/Admin/UnknownUserLoginAttempt.php b/app/Notifications/Admin/UnknownUserLoginAttempt.php index 701a7fa91e..ef4f2d37a9 100644 --- a/app/Notifications/Admin/UnknownUserLoginAttempt.php +++ b/app/Notifications/Admin/UnknownUserLoginAttempt.php @@ -27,10 +27,12 @@ namespace FireflyIII\Notifications\Admin; use FireflyIII\Notifications\Notifiables\OwnerNotifiable; use FireflyIII\Notifications\ReturnsAvailableChannels; use FireflyIII\Notifications\ReturnsSettings; +use FireflyIII\Support\Facades\Steam; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Notification; +use Illuminate\Support\Facades\Request; use NotificationChannels\Pushover\PushoverMessage; use Ntfy\Message; @@ -59,10 +61,14 @@ class UnknownUserLoginAttempt extends Notification */ public function toMail(OwnerNotifiable $notifiable): MailMessage { + $ip = Request::ip(); + $host = Steam::getHostName($ip); + $userAgent = Request::userAgent(); + $time = now(config('app.timezone'))->isoFormat((string) trans('config.date_time_js')); + return new MailMessage() - ->markdown('emails.owner.unknown-user', ['address' => $this->address]) - ->subject((string) trans('email.unknown_user_subject')) - ; + ->markdown('emails.owner.unknown-user', ['address' => $this->address, 'ip' => $ip, 'host' => $host, 'userAgent' => $userAgent, 'time' => $time]) + ->subject((string) trans('email.unknown_user_subject')); } /** @@ -85,8 +91,7 @@ class UnknownUserLoginAttempt extends Notification public function toPushover(OwnerNotifiable $notifiable): PushoverMessage { return PushoverMessage::create((string) trans('email.unknown_user_message', ['address' => $this->address])) - ->title((string) trans('email.unknown_user_subject')) - ; + ->title((string) trans('email.unknown_user_subject')); } /** diff --git a/app/Notifications/User/UserLogin.php b/app/Notifications/User/UserLogin.php index 11ecf67618..f9e695dc87 100644 --- a/app/Notifications/User/UserLogin.php +++ b/app/Notifications/User/UserLogin.php @@ -27,6 +27,7 @@ namespace FireflyIII\Notifications\User; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Notifications\ReturnsAvailableChannels; use FireflyIII\Notifications\ReturnsSettings; +use FireflyIII\Support\Facades\Steam; use FireflyIII\User; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; @@ -63,7 +64,7 @@ class UserLogin extends Notification $time = now(config('app.timezone'))->isoFormat((string) trans('config.date_time_js')); return (new MailMessage()) - ->markdown('emails.new-ip', ['time' => $time, 'ipAddress' => $this->ip, 'host' => $this->getHost()]) + ->markdown('emails.new-ip', ['time' => $time, 'ipAddress' => $this->ip, 'host' => Steam::getHostName($this->ip)]) ->subject((string) trans('email.login_from_new_ip')) ; } @@ -74,7 +75,7 @@ class UserLogin extends Notification $message = new Message(); $message->topic($settings['ntfy_topic']); $message->title((string) trans('email.login_from_new_ip')); - $message->body((string) trans('email.slack_login_from_new_ip', ['host' => $this->getHost(), 'ip' => $this->ip])); + $message->body((string) trans('email.slack_login_from_new_ip', ['host' => Steam::getHostName($this->ip), 'ip' => $this->ip])); return $message; } @@ -84,7 +85,7 @@ class UserLogin extends Notification */ public function toPushover(User $notifiable): PushoverMessage { - return PushoverMessage::create((string) trans('email.slack_login_from_new_ip', ['host' => $this->getHost(), 'ip' => $this->ip])) + return PushoverMessage::create((string) trans('email.slack_login_from_new_ip', ['host' => Steam::getHostName($this->ip), 'ip' => $this->ip])) ->title((string) trans('email.login_from_new_ip')) ; } @@ -94,7 +95,7 @@ class UserLogin extends Notification */ public function toSlack(User $notifiable) { - return new SlackMessage()->content((string) trans('email.slack_login_from_new_ip', ['host' => $this->getHost(), 'ip' => $this->ip])); + return new SlackMessage()->content((string) trans('email.slack_login_from_new_ip', ['host' => Steam::getHostName($this->ip), 'ip' => $this->ip])); } /** @@ -105,20 +106,5 @@ class UserLogin extends Notification return ReturnsAvailableChannels::returnChannels('user', $notifiable); } - private function getHost(): string - { - $host = ''; - try { - $hostName = app('steam')->getHostName($this->ip); - } catch (FireflyException $e) { - app('log')->error($e->getMessage()); - $hostName = $this->ip; - } - if ($hostName !== $this->ip) { - $host = $hostName; - } - - return $host; - } } diff --git a/app/Support/Steam.php b/app/Support/Steam.php index da13ba52fb..1ecd94e121 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -770,13 +770,20 @@ class Steam */ public function getHostName(string $ipAddress): string { + $host = ''; + try { $hostName = gethostbyaddr($ipAddress); - } catch (\Exception $e) { // intentional generic exception - throw new FireflyException($e->getMessage(), 0, $e); + } catch (\Exception $e) { + app('log')->error($e->getMessage()); + $hostName = $ipAddress; } - return (string) $hostName; + if ('' !== (string) $hostName && $hostName !== $ipAddress) { + $host = $hostName; + } + + return (string) $host; } public function getLastActivities(array $accounts): array diff --git a/resources/lang/en_US/email.php b/resources/lang/en_US/email.php index 36712a4bbe..02e03c022f 100644 --- a/resources/lang/en_US/email.php +++ b/resources/lang/en_US/email.php @@ -54,6 +54,7 @@ return [ 'ip_address' => 'IP address', 'host_name' => 'Host', 'date_time' => 'Date + time', + 'user_agent' => 'Browser', // access token created 'access_token_created_subject' => 'A new access token was created', diff --git a/resources/views/emails/owner/unknown-user.blade.php b/resources/views/emails/owner/unknown-user.blade.php index 3aaf0e8ade..02ede93c41 100644 --- a/resources/views/emails/owner/unknown-user.blade.php +++ b/resources/views/emails/owner/unknown-user.blade.php @@ -1,3 +1,9 @@ @component('mail::message') - {{ trans('email.unknown_user_body', ['address' => $address]) }} +{{ trans('email.unknown_user_body', ['address' => $address]) }} + +- {{ trans('email.date_time') }}: {{ $time }} +- {{ trans('email.ip_address') }}: {{ $ip }} +- {{ trans('email.host_name') }}: {{ $host }} +- {{ trans('email.user_agent') }}: {{ $userAgent }} + @endcomponent