From f7b3d4dfa855a61b42763a193bc089156e1c3d9b Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:55:31 +0100 Subject: [PATCH] Add notify to phone and oauth --- app/controllers/api/account.php | 158 ++++++++++++++++++++++++++++++-- 1 file changed, 151 insertions(+), 7 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 285c306510..cb5ff8d416 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -311,7 +311,7 @@ App::post('/v1/account/sessions/email') ->addHeader('X-Fallback-Cookies', \json_encode([Auth::$cookieName => Auth::encodeSession($user->getId(), $secret)])); } - if ($project->getAttribute('auths', [])['notify'] ?? false) { + if ($project->getAttribute('auths', [])['notify'] ?? false && !empty($user->getAttribute('email', ''))) { $body = $locale->getText("emails.authNotify.body"); $subject = $locale->getText("emails.authNotify.subject"); @@ -378,7 +378,7 @@ App::post('/v1/account/sessions/email') ->setSubject($subject) ->setBody($body) ->setVariables($emailVariables) - ->setRecipient($email) + ->setRecipient($user->getAttribute('email')) ->trigger(); } @@ -1532,7 +1532,8 @@ App::put('/v1/account/sessions/phone') ->inject('locale') ->inject('geodb') ->inject('queueForEvents') - ->action(function (string $userId, string $secret, Request $request, Response $response, Document $user, Database $dbForProject, Document $project, Locale $locale, Reader $geodb, Event $queueForEvents) { + ->inject('queueForMails') + ->action(function (string $userId, string $secret, Request $request, Response $response, Document $user, Database $dbForProject, Document $project, Locale $locale, Reader $geodb, Event $queueForEvents, Mail $queueForMails) { $userFromRequest = Authorization::skip(fn () => $dbForProject->getDocument('users', $userId)); @@ -1618,6 +1619,77 @@ App::put('/v1/account/sessions/phone') ->setAttribute('current', true) ->setAttribute('countryName', $countryName); + if ($project->getAttribute('auths', [])['notify'] ?? false && !empty($user->getAttribute('email', ''))) { + $body = $locale->getText("emails.authNotify.body"); + $subject = $locale->getText("emails.authNotify.subject"); + + $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); + $message + ->setParam('{{body}}', $body) + ->setParam('{{hello}}', $locale->getText("emails.authNotify.hello")) + ->setParam('{{footer}}', $locale->getText("emails.authNotify.footer")) + ->setParam('{{thanks}}', $locale->getText("emails.authNotify.thanks")) + ->setParam('{{signature}}', $locale->getText("emails.authNotify.signature")); + $body = $message->render(); + + $smtp = $project->getAttribute('smtp', []); + $smtpEnabled = $smtp['enabled'] ?? false; + + $senderEmail = App::getEnv('_APP_SYSTEM_EMAIL_ADDRESS', APP_EMAIL_TEAM); + $senderName = App::getEnv('_APP_SYSTEM_EMAIL_NAME', APP_NAME . ' Server'); + $replyTo = ""; + + if ($smtpEnabled) { + if (!empty($smtp['senderEmail'])) { + $senderEmail = $smtp['senderEmail']; + } + if (!empty($smtp['senderName'])) { + $senderName = $smtp['senderName']; + } + if (!empty($smtp['replyTo'])) { + $replyTo = $smtp['replyTo']; + } + + $queueForMails + ->setSmtpHost($smtp['host'] ?? '') + ->setSmtpPort($smtp['port'] ?? '') + ->setSmtpUsername($smtp['username'] ?? '') + ->setSmtpPassword($smtp['password'] ?? '') + ->setSmtpSecure($smtp['secure'] ?? ''); + + $queueForMails + ->setSmtpReplyTo($replyTo) + ->setSmtpSenderEmail($senderEmail) + ->setSmtpSenderName($senderName); + } + + $device = $detector->getDevice(); + + $sessionCreatedAt = $session->getCreatedAt(); + $dateTime = new DateTimeImmutable($sessionCreatedAt); + $date = $dateTime->format('Y-m-d'); + $time = $dateTime->format('H:i:s'); + + $emailVariables = [ + 'direction' => $locale->getText('settings.direction'), + 'user' => $user->getAttribute('name'), + 'project' => $project->getAttribute('name'), + 'date' => $date, + 'time' => $time, + 'device' => $device['deviceBrand'] . " " . $device['deviceModel'] . " " . $device['deviceName'], + 'country' => $locale->getText('countries.' . strtolower($session->getAttribute('countryCode')), $locale->getText('locale.country.unknown')), + 'ip' => $request->getIP(), + 'redirect' => '' + ]; + + $queueForMails + ->setSubject($subject) + ->setBody($body) + ->setVariables($emailVariables) + ->setRecipient($user->getAttribute('email')) + ->trigger(); + } + $response->dynamic($session, Response::MODEL_SESSION); }); @@ -2538,7 +2610,8 @@ App::patch('/v1/account/sessions/:sessionId') ->inject('project') ->inject('locale') ->inject('queueForEvents') - ->action(function (?string $sessionId, Request $request, Response $response, Document $user, Database $dbForProject, Document $project, Locale $locale, Event $queueForEvents) { + ->inject('queueForMails') + ->action(function (?string $sessionId, Request $request, Response $response, Document $user, Database $dbForProject, Document $project, Locale $locale, Event $queueForEvents, Mail $queueForMails) { $authDuration = $project->getAttribute('auths', [])['duration'] ?? Auth::TOKEN_EXPIRATION_LOGIN_LONG; $sessionId = ($sessionId === 'current') ? Auth::sessionVerify($user->getAttribute('sessions'), Auth::$secret, $authDuration) @@ -2586,9 +2659,80 @@ App::patch('/v1/account/sessions/:sessionId') $authDuration = $project->getAttribute('auths', [])['duration'] ?? Auth::TOKEN_EXPIRATION_LOGIN_LONG; $queueForEvents - ->setParam('userId', $user->getId()) - ->setParam('sessionId', $session->getId()) - ->setPayload($response->output($session, Response::MODEL_SESSION)); + ->setParam('userId', $user->getId()) + ->setParam('sessionId', $session->getId()) + ->setPayload($response->output($session, Response::MODEL_SESSION)); + + if ($project->getAttribute('auths', [])['notify'] ?? false && !empty($user->getAttribute('email', ''))) { + $body = $locale->getText("emails.authNotify.body"); + $subject = $locale->getText("emails.authNotify.subject"); + + $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); + $message + ->setParam('{{body}}', $body) + ->setParam('{{hello}}', $locale->getText("emails.authNotify.hello")) + ->setParam('{{footer}}', $locale->getText("emails.authNotify.footer")) + ->setParam('{{thanks}}', $locale->getText("emails.authNotify.thanks")) + ->setParam('{{signature}}', $locale->getText("emails.authNotify.signature")); + $body = $message->render(); + + $smtp = $project->getAttribute('smtp', []); + $smtpEnabled = $smtp['enabled'] ?? false; + + $senderEmail = App::getEnv('_APP_SYSTEM_EMAIL_ADDRESS', APP_EMAIL_TEAM); + $senderName = App::getEnv('_APP_SYSTEM_EMAIL_NAME', APP_NAME . ' Server'); + $replyTo = ""; + + if ($smtpEnabled) { + if (!empty($smtp['senderEmail'])) { + $senderEmail = $smtp['senderEmail']; + } + if (!empty($smtp['senderName'])) { + $senderName = $smtp['senderName']; + } + if (!empty($smtp['replyTo'])) { + $replyTo = $smtp['replyTo']; + } + + $queueForMails + ->setSmtpHost($smtp['host'] ?? '') + ->setSmtpPort($smtp['port'] ?? '') + ->setSmtpUsername($smtp['username'] ?? '') + ->setSmtpPassword($smtp['password'] ?? '') + ->setSmtpSecure($smtp['secure'] ?? ''); + + $queueForMails + ->setSmtpReplyTo($replyTo) + ->setSmtpSenderEmail($senderEmail) + ->setSmtpSenderName($senderName); + } + + $device = $detector->getDevice(); + + $sessionCreatedAt = $session->getCreatedAt(); + $dateTime = new DateTimeImmutable($sessionCreatedAt); + $date = $dateTime->format('Y-m-d'); + $time = $dateTime->format('H:i:s'); + + $emailVariables = [ + 'direction' => $locale->getText('settings.direction'), + 'user' => $user->getAttribute('name'), + 'project' => $project->getAttribute('name'), + 'date' => $date, + 'time' => $time, + 'device' => $device['deviceBrand'] . " " . $device['deviceModel'] . " " . $device['deviceName'], + 'country' => $locale->getText('countries.' . strtolower($session->getAttribute('countryCode')), $locale->getText('locale.country.unknown')), + 'ip' => $request->getIP(), + 'redirect' => '' + ]; + + $queueForMails + ->setSubject($subject) + ->setBody($body) + ->setVariables($emailVariables) + ->setRecipient($user->getAttribute('email')) + ->trigger(); + } return $response->dynamic($session, Response::MODEL_SESSION); }