From e03a95013c946469abcf2afaa454851e1630e4a5 Mon Sep 17 00:00:00 2001 From: Christian TRESVAUX Date: Thu, 8 Jan 2026 11:25:47 +0100 Subject: [PATCH 1/5] fix: Fix sorting messages by recipient address --- app/templates/message/index.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/message/index.html.twig b/app/templates/message/index.html.twig index efb72042..aea86b8b 100644 --- a/app/templates/message/index.html.twig +++ b/app/templates/message/index.html.twig @@ -35,7 +35,7 @@ {% endif %} {% if is_granted('ROLE_ADMIN') %} - {{ knp_pagination_sortable(messagesRecipients, 'Message.Recipient'|trans,'m.fromAddr') }} + {{ knp_pagination_sortable(messagesRecipients, 'Message.Recipient'|trans,'maddr.email') }} {% endif %} {# {{ 'Message.Status'|trans() }} #} From 927adcc756b8e4f0e9b6f79e7783e1a7acbd4e20 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Thu, 15 Jan 2026 15:39:05 +0100 Subject: [PATCH 2/5] fix(m365): Fix checking proxy address when importing alias The main issue was that we tested presence of "smtp" string instead of "smtp:". Also, we make sure that the substring is at the beginning of the string. Also, "smtp:" is case insensitive. --- app/src/Command/Office365ImportCommand.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/Command/Office365ImportCommand.php b/app/src/Command/Office365ImportCommand.php index 77aed2ac..740898a4 100644 --- a/app/src/Command/Office365ImportCommand.php +++ b/app/src/Command/Office365ImportCommand.php @@ -177,8 +177,8 @@ private function addAliases(User $user, array $proxyAdresses): array { $aliases = []; foreach ($proxyAdresses as $proxyAdresse) { - if (strpos($proxyAdresse, "smtp") !== false) { - $aliasEmail = explode('smtp:', $proxyAdresse)[1]; + if (str_starts_with(strtolower($proxyAdresse), 'smtp:')) { + $aliasEmail = substr($proxyAdresse, strlen('smtp:')); $domainAlias = explode('@', $aliasEmail)[1]; if ($domainAlias == $this->connector->getDomain()->getDomain()) { $alias = $this->em->getRepository(User::class)->findOneBy(['email' => $aliasEmail]); From ed4cff1ee6c2b7de527e4fa6e540b97a5d6843b0 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Thu, 15 Jan 2026 15:40:36 +0100 Subject: [PATCH 3/5] fix(m365): Don't mark initial user as an alias of himself --- app/migrations/Version20260115151631.php | 26 ++++++++++++++++++++++ app/src/Command/Office365ImportCommand.php | 6 +++++ 2 files changed, 32 insertions(+) create mode 100644 app/migrations/Version20260115151631.php diff --git a/app/migrations/Version20260115151631.php b/app/migrations/Version20260115151631.php new file mode 100644 index 00000000..851e32e9 --- /dev/null +++ b/app/migrations/Version20260115151631.php @@ -0,0 +1,26 @@ +addSql('UPDATE users SET original_user_id = null WHERE original_user_id = id'); + } + + public function down(Schema $schema): void + { + // Do nothing on purpose + } +} diff --git a/app/src/Command/Office365ImportCommand.php b/app/src/Command/Office365ImportCommand.php index 740898a4..42f27dfb 100644 --- a/app/src/Command/Office365ImportCommand.php +++ b/app/src/Command/Office365ImportCommand.php @@ -179,6 +179,12 @@ private function addAliases(User $user, array $proxyAdresses): array foreach ($proxyAdresses as $proxyAdresse) { if (str_starts_with(strtolower($proxyAdresse), 'smtp:')) { $aliasEmail = substr($proxyAdresse, strlen('smtp:')); + + // Don't mark the initial user as an alias of himself + if ($aliasEmail === $user->getEmail()) { + continue; + } + $domainAlias = explode('@', $aliasEmail)[1]; if ($domainAlias == $this->connector->getDomain()->getDomain()) { $alias = $this->em->getRepository(User::class)->findOneBy(['email' => $aliasEmail]); From f24fb50cabcc5e13e7a95a73b8bf5c845225d008 Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Thu, 15 Jan 2026 15:44:05 +0100 Subject: [PATCH 4/5] chore(m365): Refactor creation of aliases --- app/src/Command/Office365ImportCommand.php | 62 ++++++++++++++-------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/app/src/Command/Office365ImportCommand.php b/app/src/Command/Office365ImportCommand.php index 42f27dfb..275f0a03 100644 --- a/app/src/Command/Office365ImportCommand.php +++ b/app/src/Command/Office365ImportCommand.php @@ -7,6 +7,7 @@ use App\Entity\Office365Connector; use App\Entity\User as User; use App\Service\MailaddrService; +use App\Util\Email; use Doctrine\ORM\EntityManagerInterface; use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; @@ -176,31 +177,48 @@ private function importUsers(string $token): void private function addAliases(User $user, array $proxyAdresses): array { $aliases = []; - foreach ($proxyAdresses as $proxyAdresse) { - if (str_starts_with(strtolower($proxyAdresse), 'smtp:')) { - $aliasEmail = substr($proxyAdresse, strlen('smtp:')); + foreach ($proxyAdresses as $proxyAdress) { + if (!str_starts_with(strtolower($proxyAdress), 'smtp:')) { + continue; + } - // Don't mark the initial user as an alias of himself - if ($aliasEmail === $user->getEmail()) { - continue; - } + $aliasEmail = substr($proxyAdress, strlen('smtp:')); + if (!Email::validate($aliasEmail)) { + continue; + } - $domainAlias = explode('@', $aliasEmail)[1]; - if ($domainAlias == $this->connector->getDomain()->getDomain()) { - $alias = $this->em->getRepository(User::class)->findOneBy(['email' => $aliasEmail]); - if (!$alias) { - $alias = clone $user; - } - $alias->setUid(null); - $alias->setEmail($aliasEmail); - $alias->setUserName($aliasEmail); - $alias->setOriginalUser($user); - $alias->setOriginConnector($this->connector); - $this->em->persist($alias); - - $aliases[] = $alias; - } + // Don't mark the initial user as an alias of himself + if ($aliasEmail === $user->getEmail()) { + continue; + } + + // Get the domain associated to the email address + $domainName = Email::extractDomain($aliasEmail); + if (!$domainName) { + continue; } + + $domain = $this->em->getRepository(Domain::class)->findOneByDomain($domainName); + if (!$domain || $domain->getId() !== $this->connector->getDomain()->getId()) { + continue; + } + + // Create the alias if it doesn't exist yet + $alias = $this->em->getRepository(User::class)->findOneBy(['email' => $aliasEmail]); + if (!$alias) { + $alias = new User(); + $alias->setOriginConnector($this->connector); + } + + // And update information + $alias->setEmail($aliasEmail); + $alias->setUsername($aliasEmail); + $alias->setOriginalUser($user); + $alias->setDomain($domain); + + $this->em->persist($alias); + + $aliases[] = $alias; } return $aliases; } From 939cbc42c531dd4670e678b8f9f293f2a7882cfb Mon Sep 17 00:00:00 2001 From: Marien Fressinaud Date: Fri, 16 Jan 2026 09:27:39 +0100 Subject: [PATCH 5/5] release: Publish version 2.4.3 --- .env.example | 2 +- CHANGELOG.md | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 9bdb2f91..ec6550e9 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ # Which images to pull for production deployment -VERSION=2.4.2 +VERSION=2.4.3 # Impact containers names, see # https://docs.docker.com/compose/how-tos/environment-variables/envvars/#compose_project_name diff --git a/CHANGELOG.md b/CHANGELOG.md index 09b475d9..4cffdb7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog of AgentJ +## 2026-01-16 - 2.4.3 + +### Bug fixes + +- Fix sorting messages by recipient address ([e03a9501](https://github.com/Probesys/agentj/commit/e03a9501)) +- Don't mark initial user as an alias of himself when importing from M365 ([ed4cff1e](https://github.com/Probesys/agentj/commit/ed4cff1e)) +- Fix checking proxy address when importing alias from M365 ([927adcc7](https://github.com/Probesys/agentj/commit/927adcc7)) + +### Maintenance + +- Refactor creation of aliases ([f24fb50c](https://github.com/Probesys/agentj/commit/f24fb50c)) + ## 2025-12-19 - 2.4.2 ### Bug fixes