From 2e5bea1aee6a647f764f998eba57005d1781c1b3 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 14:26:45 +0530 Subject: [PATCH 01/11] update: email template to be platform agnostic. --- .../locale/templates/email-base-styled.tpl | 14 ++++----- app/controllers/api/account.php | 29 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/config/locale/templates/email-base-styled.tpl b/app/config/locale/templates/email-base-styled.tpl index 1979d560b5..81964b968f 100644 --- a/app/config/locale/templates/email-base-styled.tpl +++ b/app/config/locale/templates/email-base-styled.tpl @@ -187,7 +187,7 @@ Appwrite logo @@ -225,7 +225,7 @@ @@ -234,7 +234,7 @@ @@ -242,7 +242,7 @@ @@ -252,15 +252,15 @@ - + - +
TermsTerms
|
PrivacyPrivacy

- © {{year}} Appwrite | 251 Little Falls Drive, Wilmington 19808, + © {{year}} {{platform}} | 251 Little Falls Drive, Wilmington 19808, Delaware, United States

diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index f18cb27834..dea5ccf216 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -74,7 +74,7 @@ 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(Locale $locale, Document $user, Document $project, array $platform, Document $session, Mail $queueForMails) { $subject = $locale->getText("emails.sessionAlert.subject"); $preview = $locale->getText("emails.sessionAlert.preview"); @@ -171,13 +171,14 @@ function sendSessionAlert(Locale $locale, Document $user, Document $project, Doc if ($smtpBaseTemplate === APP_BRANDED_EMAIL_BASE_TEMPLATE) { $emailVariables = array_merge($emailVariables, [ - 'accentColor' => APP_EMAIL_ACCENT_COLOR, - 'logoUrl' => APP_EMAIL_LOGO_URL, - 'twitterUrl' => APP_SOCIAL_TWITTER, - 'discordUrl' => APP_SOCIAL_DISCORD, - 'githubUrl' => APP_SOCIAL_GITHUB_APPWRITE, - 'termsUrl' => APP_EMAIL_TERMS_URL, - 'privacyUrl' => APP_EMAIL_PRIVACY_URL, + 'accentColor' => $platform['accentUrl'], + 'logoUrl' => $platform['logoUrl'], + 'twitter' => $platform['twitterUrl'], + 'discord' => $platform['discordUrl'], + 'github' => $platform['githubUrl'], + 'terms' => $platform['termsUrl'], + 'privacy' => $platform['privacyUrl'], + 'platform' => $platform['platform'], ]); } @@ -192,9 +193,9 @@ function sendSessionAlert(Locale $locale, Document $user, Document $project, Doc ->setRecipient($email) ->trigger(); } -; -$createSession = function (string $userId, string $secret, Request $request, Response $response, User $user, Database $dbForProject, Document $project, Locale $locale, Reader $geodb, Event $queueForEvents, Mail $queueForMails, Store $store, ProofsToken $proofForToken, ProofsCode $proofForCode) { + +$createSession = function (string $userId, string $secret, Request $request, Response $response, User $user, Database $dbForProject, Document $project, array $platform, Locale $locale, Reader $geodb, Event $queueForEvents, Mail $queueForMails, Store $store, ProofsToken $proofForToken, ProofsCode $proofForCode) { /** @var Appwrite\Utopia\Database\Documents\User $userFromRequest */ $userFromRequest = Authorization::skip(fn () => $dbForProject->getDocument('users', $userId)); @@ -295,7 +296,7 @@ $createSession = function (string $userId, string $secret, Request $request, Res ]) !== 1; if ($isAllowedTokenType && $hasUserEmail && $isSessionAlertsEnabled && $isNotFirstSession) { - sendSessionAlert($locale, $user, $project, $session, $queueForMails); + sendSessionAlert($locale, $user, $project, $platform, $session, $queueForMails); } $queueForEvents @@ -953,6 +954,7 @@ App::post('/v1/account/sessions/email') ->inject('user') ->inject('dbForProject') ->inject('project') + ->inject('platform') ->inject('locale') ->inject('geodb') ->inject('queueForEvents') @@ -961,7 +963,7 @@ App::post('/v1/account/sessions/email') ->inject('store') ->inject('proofForPassword') ->inject('proofForToken') - ->action(function (string $email, string $password, Request $request, Response $response, User $user, Database $dbForProject, Document $project, Locale $locale, Reader $geodb, Event $queueForEvents, Mail $queueForMails, Hooks $hooks, Store $store, ProofsPassword $proofForPassword, ProofsToken $proofForToken) { + ->action(function (string $email, string $password, Request $request, Response $response, User $user, Database $dbForProject, Document $project, array $platform, Locale $locale, Reader $geodb, Event $queueForEvents, Mail $queueForMails, Hooks $hooks, Store $store, ProofsPassword $proofForPassword, ProofsToken $proofForToken) { $email = \strtolower($email); $protocol = $request->getProtocol(); @@ -1062,7 +1064,7 @@ App::post('/v1/account/sessions/email') Query::equal('userId', [$user->getId()]), ]) !== 1 ) { - sendSessionAlert($locale, $user, $project, $session, $queueForMails); + sendSessionAlert($locale, $user, $project, $platform, $session, $queueForMails); } } @@ -1250,6 +1252,7 @@ App::post('/v1/account/sessions/token') ->inject('user') ->inject('dbForProject') ->inject('project') + ->inject('platform') ->inject('locale') ->inject('geodb') ->inject('queueForEvents') From 8964fbc821ede74983c86a732a3ba0d6db8560d1 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 14:33:49 +0530 Subject: [PATCH 02/11] fix: projectName. --- app/controllers/api/account.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index dea5ccf216..cdd43bac85 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -157,13 +157,19 @@ function sendSessionAlert(Locale $locale, Document $user, Document $project, arr $session->setAttribute('clientName', $clientName); } + $projectName = $project->getAttribute('name'); + if ($project->getId() === 'console') { + // default on CE - Appwrite + $projectName = $platform['platformName']; + } + $emailVariables = [ 'direction' => $locale->getText('settings.direction'), 'date' => (new \DateTime())->format('F j'), 'year' => (new \DateTime())->format('YYYY'), 'time' => (new \DateTime())->format('H:i:s'), 'user' => $user->getAttribute('name'), - 'project' => $project->getAttribute('name'), + 'project' => $projectName, 'device' => $session->getAttribute('clientName'), 'ipAddress' => $session->getAttribute('ip'), 'country' => $locale->getText('countries.' . $session->getAttribute('countryCode'), $locale->getText('locale.country.unknown')), @@ -178,7 +184,7 @@ function sendSessionAlert(Locale $locale, Document $user, Document $project, arr 'github' => $platform['githubUrl'], 'terms' => $platform['termsUrl'], 'privacy' => $platform['privacyUrl'], - 'platform' => $platform['platform'], + 'platform' => $platform['platformName'], ]); } From 0a7f31333d3914b977c79b3a3970396a40e4b0ff Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 14:46:24 +0530 Subject: [PATCH 03/11] fix: key, lol. --- app/controllers/api/account.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index cdd43bac85..91c0c581de 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -177,7 +177,7 @@ function sendSessionAlert(Locale $locale, Document $user, Document $project, arr if ($smtpBaseTemplate === APP_BRANDED_EMAIL_BASE_TEMPLATE) { $emailVariables = array_merge($emailVariables, [ - 'accentColor' => $platform['accentUrl'], + 'accentColor' => $platform['accentColor'], 'logoUrl' => $platform['logoUrl'], 'twitter' => $platform['twitterUrl'], 'discord' => $platform['discordUrl'], From f73b48d4ca1a2ab3b4193d1723936e4bab04f27e Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 15:19:07 +0530 Subject: [PATCH 04/11] add: profile mode for console sdk. --- app/init/resources.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/init/resources.php b/app/init/resources.php index 99476c695f..672fcd8b4e 100644 --- a/app/init/resources.php +++ b/app/init/resources.php @@ -281,6 +281,7 @@ App::setResource('cors', fn (array $allowedHostnames) => new Cors( 'X-SDK-Language', 'X-SDK-Platform', 'X-SDK-GraphQL', + 'X-SDK-Profile', // Caching 'Range', 'Cache-Control', From 5034597750dca582eeb59a489bf25e73f2ac645a Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 15:43:10 +0530 Subject: [PATCH 05/11] add: sender name as well. --- app/config/platform.php | 1 + app/controllers/api/account.php | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/config/platform.php b/app/config/platform.php index b9d9dccbef..e44eaefa89 100644 --- a/app/config/platform.php +++ b/app/config/platform.php @@ -22,4 +22,5 @@ return [ 'termsUrl' => APP_EMAIL_TERMS_URL, 'privacyUrl' => APP_EMAIL_PRIVACY_URL, 'websiteUrl' => 'https://' . APP_DOMAIN, + 'emailSenderName' => APP_EMAIL_PLATFORM_NAME, ]; diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 91c0c581de..2c8dcdc833 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -196,8 +196,14 @@ function sendSessionAlert(Locale $locale, Document $user, Document $project, arr ->setBody($body) ->setBodyTemplate($bodyTemplate) ->setVariables($emailVariables) - ->setRecipient($email) - ->trigger(); + ->setRecipient($email); + + // since this is console project, set email sender name! + if ($smtpBaseTemplate === APP_BRANDED_EMAIL_BASE_TEMPLATE) { + $queueForMails->setSenderName($platform['emailSenderName']); + } + + $queueForMails->trigger(); } From 930db2bcc4786840a9f6ebe4549707f99ce84e33 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 15:50:34 +0530 Subject: [PATCH 06/11] add: platform injection on MFA endpoint as well. --- .../Http/Account/MFA/Challenges/Create.php | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php index 196c83999d..4240521fbc 100644 --- a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php +++ b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php @@ -98,6 +98,7 @@ class Create extends Action ->inject('user') ->inject('locale') ->inject('project') + ->inject('platform') ->inject('request') ->inject('queueForEvents') ->inject('queueForMessaging') @@ -117,6 +118,7 @@ class Create extends Action Document $user, Locale $locale, Document $project, + array $platform, Request $request, Event $queueForEvents, Messaging $queueForMessaging, @@ -309,13 +311,14 @@ class Create extends Action if ($smtpBaseTemplate === APP_BRANDED_EMAIL_BASE_TEMPLATE) { $emailVariables = array_merge($emailVariables, [ - 'accentColor' => APP_EMAIL_ACCENT_COLOR, - 'logoUrl' => APP_EMAIL_LOGO_URL, - 'twitterUrl' => APP_SOCIAL_TWITTER, - 'discordUrl' => APP_SOCIAL_DISCORD, - 'githubUrl' => APP_SOCIAL_GITHUB_APPWRITE, - 'termsUrl' => APP_EMAIL_TERMS_URL, - 'privacyUrl' => APP_EMAIL_PRIVACY_URL, + 'accentColor' => $platform['accentColor'], + 'logoUrl' => $platform['logoUrl'], + 'twitter' => $platform['twitterUrl'], + 'discord' => $platform['discordUrl'], + 'github' => $platform['githubUrl'], + 'terms' => $platform['termsUrl'], + 'privacy' => $platform['privacyUrl'], + 'platform' => $platform['platformName'], ]); } @@ -325,8 +328,14 @@ class Create extends Action ->setBody($body) ->setBodyTemplate($bodyTemplate) ->setVariables($emailVariables) - ->setRecipient($user->getAttribute('email')) - ->trigger(); + ->setRecipient($user->getAttribute('email')); + + // since this is console project, set email sender name! + if ($smtpBaseTemplate === APP_BRANDED_EMAIL_BASE_TEMPLATE) { + $queueForMails->setSenderName($platform['emailSenderName']); + } + + $queueForMails->trigger(); break; } From ee4f3e2df4597c3444bc68cae9e14b9cd9d9330d Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 15:54:49 +0530 Subject: [PATCH 07/11] update: project name on MFA. --- app/controllers/api/account.php | 1 - .../Account/Http/Account/MFA/Challenges/Create.php | 9 +++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 2c8dcdc833..0ce974e51c 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -159,7 +159,6 @@ function sendSessionAlert(Locale $locale, Document $user, Document $project, arr $projectName = $project->getAttribute('name'); if ($project->getId() === 'console') { - // default on CE - Appwrite $projectName = $platform['platformName']; } diff --git a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php index 4240521fbc..4dc50a8ec7 100644 --- a/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php +++ b/src/Appwrite/Platform/Modules/Account/Http/Account/MFA/Challenges/Create.php @@ -148,6 +148,11 @@ class Create extends Action $challenge = $dbForProject->createDocument('challenges', $challenge); + $projectName = $project->getAttribute('name'); + if ($project->getId() === 'console') { + $projectName = $platform['platformName']; + } + // 9 levels up to project root $templatesPath = \dirname(__DIR__, 9) . '/app/config/locale/templates'; @@ -172,7 +177,7 @@ class Create extends Action $messageContent = Template::fromString($locale->getText("sms.verification.body")); $messageContent - ->setParam('{{project}}', $project->getAttribute('name')) + ->setParam('{{project}}', $projectName) ->setParam('{{secret}}', $code); $messageContent = \strip_tags($messageContent->render()); $message = $message->setParam('{{token}}', $messageContent); @@ -302,7 +307,7 @@ class Create extends Action 'heading' => $heading, 'direction' => $locale->getText('settings.direction'), 'user' => $user->getAttribute('name'), - 'project' => $project->getAttribute('name'), + 'project' => $projectName, 'otp' => $code, 'agentDevice' => $agentDevice['deviceBrand'] ?? 'UNKNOWN', 'agentClient' => $agentClient['clientName'] ?? 'UNKNOWN', From b0c3ab71c4f4f4809ad59aaf506ffc79737d96d5 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 16:02:06 +0530 Subject: [PATCH 08/11] add: header in tests. --- tests/e2e/General/HTTPTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/General/HTTPTest.php b/tests/e2e/General/HTTPTest.php index b8ccde202e..6323500136 100644 --- a/tests/e2e/General/HTTPTest.php +++ b/tests/e2e/General/HTTPTest.php @@ -31,7 +31,7 @@ class HTTPTest extends Scope $this->assertEquals(204, $response['headers']['status-code']); $this->assertEquals('Appwrite', $response['headers']['server']); $this->assertEquals('GET, POST, PUT, PATCH, DELETE', $response['headers']['access-control-allow-methods']); - $this->assertEquals('Accept, Origin, Cookie, Set-Cookie, Content-Type, Content-Range, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Dev-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-Appwrite-Timeout, X-Appwrite-ID, X-Appwrite-Timestamp, X-Appwrite-Session, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-SDK-GraphQL, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies, X-Requested-With, X-Forwarded-For, X-Forwarded-User-Agent', $response['headers']['access-control-allow-headers']); + $this->assertEquals('Accept, Origin, Cookie, Set-Cookie, Content-Type, Content-Range, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Dev-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-Appwrite-Timeout, X-Appwrite-ID, X-Appwrite-Timestamp, X-Appwrite-Session, X-SDK-Version, X-SDK-Name, X-SDK-Language, X-SDK-Platform, X-SDK-GraphQL, X-SDK-Profile, Range, Cache-Control, Expires, Pragma, X-Fallback-Cookies, X-Requested-With, X-Forwarded-For, X-Forwarded-User-Agent', $response['headers']['access-control-allow-headers']); $this->assertEquals('X-Appwrite-Session, X-Fallback-Cookies', $response['headers']['access-control-expose-headers']); $this->assertEquals('http://localhost', $response['headers']['access-control-allow-origin']); $this->assertEquals('true', $response['headers']['access-control-allow-credentials']); From e1a9eb4994582a01d9005159eb4f0797adfac0e3 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 16:04:29 +0530 Subject: [PATCH 09/11] fix: missed injections. --- app/controllers/api/account.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 0ce974e51c..344b33f45e 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -2624,16 +2624,17 @@ App::put('/v1/account/sessions/magic-url') ->inject('user') ->inject('dbForProject') ->inject('project') + ->inject('platform') ->inject('locale') ->inject('geodb') ->inject('queueForEvents') ->inject('queueForMails') ->inject('store') ->inject('proofForCode') - ->action(function ($userId, $secret, $request, $response, $user, $dbForProject, $project, $locale, $geodb, $queueForEvents, $queueForMails, $store, $proofForCode) use ($createSession) { + ->action(function ($userId, $secret, $request, $response, $user, $dbForProject, $project, $platform, $locale, $geodb, $queueForEvents, $queueForMails, $store, $proofForCode) use ($createSession) { $proofForToken = new ProofsToken(TOKEN_LENGTH_MAGIC_URL); $proofForToken->setHash(new Sha()); - $createSession($userId, $secret, $request, $response, $user, $dbForProject, $project, $locale, $geodb, $queueForEvents, $queueForMails, $store, $proofForToken, $proofForCode); + $createSession($userId, $secret, $request, $response, $user, $dbForProject, $project, $platform, $locale, $geodb, $queueForEvents, $queueForMails, $store, $proofForToken, $proofForCode); }); App::put('/v1/account/sessions/phone') @@ -2671,6 +2672,7 @@ App::put('/v1/account/sessions/phone') ->inject('user') ->inject('dbForProject') ->inject('project') + ->inject('platform') ->inject('locale') ->inject('geodb') ->inject('queueForEvents') From ad54a8c33418363038343a7b945ef891b15f2d7c Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 17:05:08 +0530 Subject: [PATCH 10/11] fix: missing cases. --- app/controllers/api/account.php | 81 +++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 344b33f45e..2075e6cf97 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -2332,13 +2332,14 @@ App::post('/v1/account/tokens/email') ->inject('response') ->inject('user') ->inject('project') + ->inject('platform') ->inject('dbForProject') ->inject('locale') ->inject('queueForEvents') ->inject('queueForMails') ->inject('proofForPassword') ->inject('proofForCode') - ->action(function (string $userId, string $email, bool $phrase, Request $request, Response $response, User $user, Document $project, Database $dbForProject, Locale $locale, Event $queueForEvents, Mail $queueForMails, ProofsPassword $proofForPassword, ProofsCode $proofForCode) { + ->action(function (string $userId, string $email, bool $phrase, Request $request, Response $response, User $user, Document $project, array $platform, Database $dbForProject, Locale $locale, Event $queueForEvents, Mail $queueForMails, ProofsPassword $proofForPassword, ProofsCode $proofForCode) { if (empty(System::getEnv('_APP_SMTP_HOST'))) { throw new Exception(Exception::GENERAL_SMTP_DISABLED, 'SMTP disabled'); } @@ -2539,12 +2540,17 @@ App::post('/v1/account/tokens/email') ->setSmtpSenderName($senderName); } + $projectName = $project->getAttribute('name'); + if ($project->getId() === 'console') { + $projectName = $platform['platformName']; + } + $emailVariables = [ 'heading' => $heading, 'direction' => $locale->getText('settings.direction'), // {{user}}, {{project}} and {{otp}} are required in the templates 'user' => $user->getAttribute('name'), - 'project' => $project->getAttribute('name'), + 'project' => $projectName, 'otp' => $tokenSecret, 'agentDevice' => $agentDevice['deviceBrand'] ?? $agentDevice['deviceBrand'] ?? 'UNKNOWN', 'agentClient' => $agentClient['clientName'] ?? 'UNKNOWN', @@ -2556,13 +2562,14 @@ App::post('/v1/account/tokens/email') if ($smtpBaseTemplate === APP_BRANDED_EMAIL_BASE_TEMPLATE) { $emailVariables = array_merge($emailVariables, [ - 'accentColor' => APP_EMAIL_ACCENT_COLOR, - 'logoUrl' => APP_EMAIL_LOGO_URL, - 'twitterUrl' => APP_SOCIAL_TWITTER, - 'discordUrl' => APP_SOCIAL_DISCORD, - 'githubUrl' => APP_SOCIAL_GITHUB_APPWRITE, - 'termsUrl' => APP_EMAIL_TERMS_URL, - 'privacyUrl' => APP_EMAIL_PRIVACY_URL, + 'accentColor' => $platform['accentColor'], + 'logoUrl' => $platform['logoUrl'], + 'twitter' => $platform['twitterUrl'], + 'discord' => $platform['discordUrl'], + 'github' => $platform['githubUrl'], + 'terms' => $platform['termsUrl'], + 'privacy' => $platform['privacyUrl'], + 'platform' => $platform['platformName'], ]); } @@ -2572,8 +2579,14 @@ App::post('/v1/account/tokens/email') ->setBody($body) ->setBodyTemplate($bodyTemplate) ->setVariables($emailVariables) - ->setRecipient($email) - ->trigger(); + ->setRecipient($email); + + // since this is console project, set email sender name! + if ($smtpBaseTemplate === APP_BRANDED_EMAIL_BASE_TEMPLATE) { + $queueForMails->setSenderName($platform['emailSenderName']); + } + + $queueForMails->trigger(); $token->setAttribute('secret', $tokenSecret); @@ -2713,6 +2726,7 @@ App::post('/v1/account/tokens/phone') ->inject('response') ->inject('user') ->inject('project') + ->inject('platform') ->inject('dbForProject') ->inject('queueForEvents') ->inject('queueForMessaging') @@ -2722,7 +2736,7 @@ App::post('/v1/account/tokens/phone') ->inject('plan') ->inject('store') ->inject('proofForCode') - ->action(function (string $userId, string $phone, Request $request, Response $response, User $user, Document $project, Database $dbForProject, Event $queueForEvents, Messaging $queueForMessaging, Locale $locale, callable $timelimit, StatsUsage $queueForStatsUsage, array $plan, Store $store, ProofsCode $proofForCode) { + ->action(function (string $userId, string $phone, Request $request, Response $response, User $user, Document $project, array $platform, Database $dbForProject, Event $queueForEvents, Messaging $queueForMessaging, Locale $locale, callable $timelimit, StatsUsage $queueForStatsUsage, array $plan, Store $store, ProofsCode $proofForCode) { if (empty(System::getEnv('_APP_SMS_PROVIDER'))) { throw new Exception(Exception::GENERAL_PHONE_DISABLED, 'Phone provider not configured'); } @@ -2839,9 +2853,14 @@ App::post('/v1/account/tokens/phone') $message = $customTemplate['message'] ?? $message; } + $projectName = $project->getAttribute('name'); + if ($project->getId() === 'console') { + $projectName = $platform['platformName']; + } + $messageContent = Template::fromString($locale->getText("sms.verification.body")); $messageContent - ->setParam('{{project}}', $project->getAttribute('name')) + ->setParam('{{project}}', $projectName) ->setParam('{{secret}}', $secret); $messageContent = \strip_tags($messageContent->render()); $message = $message->setParam('{{token}}', $messageContent); @@ -3489,15 +3508,16 @@ App::post('/v1/account/recovery') ->inject('user') ->inject('dbForProject') ->inject('project') + ->inject('platform') ->inject('locale') ->inject('queueForMails') ->inject('queueForEvents') ->inject('proofForToken') - ->action(function (string $email, string $url, Request $request, Response $response, User $user, Database $dbForProject, Document $project, Locale $locale, Mail $queueForMails, Event $queueForEvents, ProofsToken $proofForToken) { - + ->action(function (string $email, string $url, Request $request, Response $response, User $user, Database $dbForProject, Document $project, array $platform, Locale $locale, Mail $queueForMails, Event $queueForEvents, ProofsToken $proofForToken) { if (empty(System::getEnv('_APP_SMTP_HOST'))) { throw new Exception(Exception::GENERAL_SMTP_DISABLED, 'SMTP Disabled'); } + $url = htmlentities($url); $email = \strtolower($email); @@ -3544,7 +3564,14 @@ App::post('/v1/account/recovery') $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $profile->getId(), 'secret' => $secret, 'expire' => $expire]); $url = Template::unParseURL($url); - $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); + $projectName = $project->isEmpty() + ? 'Console' + : $project->getAttribute('name', '[APP-NAME]'); + + if ($project->getId() === 'console') { + $projectName = $platform['platformName']; + } + $body = $locale->getText("emails.recovery.body"); $subject = $locale->getText("emails.recovery.subject"); $preview = $locale->getText("emails.recovery.preview"); @@ -3622,8 +3649,13 @@ App::post('/v1/account/recovery') ->setBody($body) ->setVariables($emailVariables) ->setSubject($subject) - ->setPreview($preview) - ->trigger(); + ->setPreview($preview); + + if ($project->getId() === 'console') { + $queueForMails->setSenderName($platform['emailSenderName']); + } + + $queueForMails->trigger(); $recovery->setAttribute('secret', $secret); @@ -3783,13 +3815,14 @@ App::post('/v1/account/verifications/email') ->inject('request') ->inject('response') ->inject('project') + ->inject('platform') ->inject('user') ->inject('dbForProject') ->inject('locale') ->inject('queueForEvents') ->inject('queueForMails') ->inject('proofForToken') - ->action(function (string $url, Request $request, Response $response, Document $project, User $user, Database $dbForProject, Locale $locale, Event $queueForEvents, Mail $queueForMails, ProofsToken $proofForToken) { + ->action(function (string $url, Request $request, Response $response, Document $project, array $platform, User $user, Database $dbForProject, Locale $locale, Event $queueForEvents, Mail $queueForMails, ProofsToken $proofForToken) { if (empty(System::getEnv('_APP_SMTP_HOST'))) { throw new Exception(Exception::GENERAL_SMTP_DISABLED, 'SMTP Disabled'); @@ -3833,7 +3866,15 @@ App::post('/v1/account/verifications/email') $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $user->getId(), 'secret' => $verificationSecret, 'expire' => $expire]); $url = Template::unParseURL($url); - $projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]'); + $projectName = $project->isEmpty() + ? 'Console' + : $project->getAttribute('name', '[APP-NAME]'); + + if ($project->getId() === 'console') { + $projectName = $platform['platformName']; + } + + $body = $locale->getText("emails.verification.body"); $preview = $locale->getText("emails.verification.preview"); $subject = $locale->getText("emails.verification.subject"); From 461c5895a4a9e9fa932c16234d6a8874d1a36e3b Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 17 Dec 2025 17:27:18 +0530 Subject: [PATCH 11/11] fix: missing cases. --- app/controllers/api/account.php | 40 +++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 2075e6cf97..7ff3a981d2 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -2265,11 +2265,16 @@ App::post('/v1/account/tokens/magic-url') ->setSmtpSenderName($senderName); } + $projectName = $project->getAttribute('name'); + if ($project->getId() === 'console') { + $projectName = $platform['platformName']; + } + $emailVariables = [ 'direction' => $locale->getText('settings.direction'), // {{user}}, {{redirect}} and {{project}} are required in default and custom templates 'user' => $user->getAttribute('name'), - 'project' => $project->getAttribute('name'), + 'project' => $projectName, 'redirect' => $url, 'agentDevice' => $agentDevice['deviceBrand'] ?? $agentDevice['deviceBrand'] ?? 'UNKNOWN', 'agentClient' => $agentClient['clientName'] ?? 'UNKNOWN', @@ -2284,8 +2289,13 @@ App::post('/v1/account/tokens/magic-url') ->setPreview($preview) ->setBody($body) ->setVariables($emailVariables) - ->setRecipient($email) - ->trigger(); + ->setRecipient($email); + + if ($project->getId() === 'console') { + $queueForMails->setSenderName($platform['emailSenderName']); + } + + $queueForMails->trigger(); $token->setAttribute('secret', $tokenSecret); @@ -3960,13 +3970,14 @@ App::post('/v1/account/verifications/email') if ($smtpBaseTemplate === APP_BRANDED_EMAIL_BASE_TEMPLATE) { $emailVariables = array_merge($emailVariables, [ - 'accentColor' => APP_EMAIL_ACCENT_COLOR, - 'logoUrl' => APP_EMAIL_LOGO_URL, - 'twitterUrl' => APP_SOCIAL_TWITTER, - 'discordUrl' => APP_SOCIAL_DISCORD, - 'githubUrl' => APP_SOCIAL_GITHUB_APPWRITE, - 'termsUrl' => APP_EMAIL_TERMS_URL, - 'privacyUrl' => APP_EMAIL_PRIVACY_URL, + 'accentColor' => $platform['accentColor'], + 'logoUrl' => $platform['logoUrl'], + 'twitter' => $platform['twitterUrl'], + 'discord' => $platform['discordUrl'], + 'github' => $platform['githubUrl'], + 'terms' => $platform['termsUrl'], + 'privacy' => $platform['privacyUrl'], + 'platform' => $platform['platformName'], ]); } @@ -3977,8 +3988,13 @@ App::post('/v1/account/verifications/email') ->setBodyTemplate($bodyTemplate) ->setVariables($emailVariables) ->setRecipient($user->getAttribute('email')) - ->setName($user->getAttribute('name') ?? '') - ->trigger(); + ->setName($user->getAttribute('name') ?? ''); + + if ($project->getId() === 'console') { + $queueForMails->setSenderName($platform['emailSenderName']); + } + + $queueForMails->trigger(); $verification->setAttribute('secret', $verificationSecret);