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 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 77aed2ac..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,25 +177,48 @@ private function importUsers(string $token): void private function addAliases(User $user, array $proxyAdresses): array { $aliases = []; - foreach ($proxyAdresses as $proxyAdresse) { - if (strpos($proxyAdresse, "smtp") !== false) { - $aliasEmail = explode('smtp:', $proxyAdresse)[1]; - $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; - } + foreach ($proxyAdresses as $proxyAdress) { + if (!str_starts_with(strtolower($proxyAdress), 'smtp:')) { + continue; + } + + $aliasEmail = substr($proxyAdress, strlen('smtp:')); + if (!Email::validate($aliasEmail)) { + continue; } + + // 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; } 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') %}