From e67efff74c5f843092d3354ccea96ec48477f42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Fri, 20 Dec 2024 10:35:26 +0000 Subject: [PATCH] Fix custom SMTP locale --- app/controllers/api/account.php | 34 +++++++++++++++++++++------------ app/controllers/api/teams.php | 9 ++++++--- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 76a3ef8b61..7264a15e7a 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -59,10 +59,10 @@ use Utopia\Validator\WhiteList; $oauthDefaultSuccess = '/console/auth/oauth2/success'; $oauthDefaultFailure = '/console/auth/oauth2/failure'; -function sendSessionAlert(Locale $locale, Document $user, Document $project, Document $session, Mail $queueForMails) +function sendSessionAlert(string $language, Locale $locale, Document $user, Document $project, Document $session, Mail $queueForMails) { $subject = $locale->getText("emails.sessionAlert.subject"); - $customTemplate = $project->getAttribute('templates', [])['email.sessionAlert-' . $locale->default] ?? []; + $customTemplate = $project->getAttribute('templates', [])['email.sessionAlert-' . $language] ?? []; $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-session-alert.tpl'); $message @@ -240,7 +240,8 @@ $createSession = function (string $userId, string $secret, Request $request, Res ]) !== 1; if ($isAllowedTokenType && $hasUserEmail && $isSessionAlertsEnabled && $isNotFirstSession) { - sendSessionAlert($locale, $user, $project, $session, $queueForMails); + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + sendSessionAlert($language, $locale, $user, $project, $session, $queueForMails); } $queueForEvents @@ -918,7 +919,8 @@ App::post('/v1/account/sessions/email') if ($dbForProject->count('sessions', [ Query::equal('userId', [$user->getId()]), ]) !== 1) { - sendSessionAlert($locale, $user, $project, $session, $queueForMails); + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + sendSessionAlert($language, $locale, $user, $project, $session, $queueForMails); } } @@ -1884,7 +1886,8 @@ App::post('/v1/account/tokens/magic-url') $url = Template::unParseURL($url); $subject = $locale->getText("emails.magicSession.subject"); - $customTemplate = $project->getAttribute('templates', [])['email.magicSession-' . $locale->default] ?? []; + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + $customTemplate = $project->getAttribute('templates', [])['email.magicSession-' . $language] ?? []; $detector = new Detector($request->getUserAgent('UNKNOWN')); $agentOs = $detector->getOS(); @@ -2115,7 +2118,8 @@ App::post('/v1/account/tokens/email') $dbForProject->purgeCachedDocument('users', $user->getId()); $subject = $locale->getText("emails.otpSession.subject"); - $customTemplate = $project->getAttribute('templates', [])['email.otpSession-' . $locale->default] ?? []; + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + $customTemplate = $project->getAttribute('templates', [])['email.otpSession-' . $language] ?? []; $detector = new Detector($request->getUserAgent('UNKNOWN')); $agentOs = $detector->getOS(); @@ -2426,7 +2430,8 @@ App::post('/v1/account/tokens/phone') if ($sendSMS) { $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/sms-base.tpl'); - $customTemplate = $project->getAttribute('templates', [])['sms.login-' . $locale->default] ?? []; + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + $customTemplate = $project->getAttribute('templates', [])['sms.login-' . $language] ?? []; if (!empty($customTemplate)) { $message = $customTemplate['message'] ?? $message; } @@ -3037,7 +3042,8 @@ App::post('/v1/account/recovery') $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); $body = $locale->getText("emails.recovery.body"); $subject = $locale->getText("emails.recovery.subject"); - $customTemplate = $project->getAttribute('templates', [])['email.recovery-' . $locale->default] ?? []; + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + $customTemplate = $project->getAttribute('templates', [])['email.recovery-' . $language] ?? []; $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); $message @@ -3287,7 +3293,8 @@ App::post('/v1/account/verification') $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); $body = $locale->getText("emails.verification.body"); $subject = $locale->getText("emails.verification.subject"); - $customTemplate = $project->getAttribute('templates', [])['email.verification-' . $locale->default] ?? []; + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + $customTemplate = $project->getAttribute('templates', [])['email.verification-' . $language] ?? []; $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); $message @@ -3522,7 +3529,8 @@ App::post('/v1/account/verification/phone') if ($sendSMS) { $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/sms-base.tpl'); - $customTemplate = $project->getAttribute('templates', [])['sms.verification-' . $locale->default] ?? []; + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + $customTemplate = $project->getAttribute('templates', [])['sms.verification-' . $language] ?? []; if (!empty($customTemplate)) { $message = $customTemplate['message'] ?? $message; } @@ -4060,7 +4068,8 @@ App::post('/v1/account/mfa/challenge') $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/sms-base.tpl'); - $customTemplate = $project->getAttribute('templates', [])['sms.mfaChallenge-' . $locale->default] ?? []; + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + $customTemplate = $project->getAttribute('templates', [])['sms.mfaChallenge-' . $language] ?? []; if (!empty($customTemplate)) { $message = $customTemplate['message'] ?? $message; } @@ -4097,7 +4106,8 @@ App::post('/v1/account/mfa/challenge') } $subject = $locale->getText("emails.mfaChallenge.subject"); - $customTemplate = $project->getAttribute('templates', [])['email.mfaChallenge-' . $locale->default] ?? []; + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + $customTemplate = $project->getAttribute('templates', [])['email.mfaChallenge-' . $language] ?? []; $detector = new Detector($request->getUserAgent('UNKNOWN')); $agentOs = $detector->getOS(); diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index f829800b98..a8ea5411f4 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -415,6 +415,7 @@ App::post('/v1/teams/:teamId/memberships') }, 'Array of strings. Use this param to set the user roles in the team. A role can be any string. Learn more about [roles and permissions](https://appwrite.io/docs/permissions). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' roles are allowed, each 32 characters long.', false, ['project']) ->param('url', '', fn ($clients) => new Host($clients), 'URL to redirect the user back to your app from the invitation email. This parameter is not required when an API key is supplied. Only URLs from hostnames in your project platform list are allowed. This requirement helps to prevent an [open redirect](https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html) attack against your project API.', true, ['clients']) // TODO add our own built-in confirm page ->param('name', '', new Text(128), 'Name of the new team member. Max length: 128 chars.', true) + ->inject('request') ->inject('response') ->inject('project') ->inject('user') @@ -423,7 +424,7 @@ App::post('/v1/teams/:teamId/memberships') ->inject('queueForMails') ->inject('queueForMessaging') ->inject('queueForEvents') - ->action(function (string $teamId, string $email, string $userId, string $phone, array $roles, string $url, string $name, Response $response, Document $project, Document $user, Database $dbForProject, Locale $locale, Mail $queueForMails, Messaging $queueForMessaging, Event $queueForEvents) { + ->action(function (string $teamId, string $email, string $userId, string $phone, array $roles, string $url, string $name, Request $request, Response $response, Document $project, Document $user, Database $dbForProject, Locale $locale, Mail $queueForMails, Messaging $queueForMessaging, Event $queueForEvents) { $isAPIKey = Auth::isAppUser(Authorization::getRoles()); $isPrivilegedUser = Auth::isPrivilegedUser(Authorization::getRoles()); @@ -589,7 +590,8 @@ App::post('/v1/teams/:teamId/memberships') $body = $locale->getText("emails.invitation.body"); $subject = \sprintf($locale->getText("emails.invitation.subject"), $team->getAttribute('name'), $projectName); - $customTemplate = $project->getAttribute('templates', [])['email.invitation-' . $locale->default] ?? []; + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + $customTemplate = $project->getAttribute('templates', [])['email.invitation-' . $language] ?? []; $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl'); $message @@ -671,7 +673,8 @@ App::post('/v1/teams/:teamId/memberships') $message = Template::fromFile(__DIR__ . '/../../config/locale/templates/sms-base.tpl'); - $customTemplate = $project->getAttribute('templates', [])['sms.invitation-' . $locale->default] ?? []; + $language = (string)$request->getParam('locale', $request->getHeader('x-appwrite-locale', $locale->default)); + $customTemplate = $project->getAttribute('templates', [])['sms.invitation-' . $language] ?? []; if (!empty($customTemplate)) { $message = $customTemplate['message']; }