518 Commits
Author SHA1 Message Date
Sylvain Zimmer 533adfbe5b Add a well-know endpoint and an OIDC redirect route
This makes the JMAP Webmail demo work with light patches
2026-02-01 14:41:28 +01:00
Sylvain Zimmer c927a6857c ✨(jmap) add email sending methods 2026-01-28 10:52:34 +01:00
Sylvain Zimmer 3c941dc57d ✨(jmap) add JMAP endpoint
This is the first step in our standards-compliant JMAP support. It
implements just enough to be able to list recent threads.
2026-01-13 21:12:37 +01:00
Jean-Baptiste PENRATHandGitHub bef485a7fd ✨(search) improve recipient search filters (#476)
- `to` query key now looks up within `to`, `cc` and `bcc` message fields
- Add a `to_exact` query key to looks up only in `to` message field

Resolve #467
2026-01-12 19:18:09 +01:00
812cf51915 ✨(all) allow to display external images through proxy (#469)
Allow to users to display external images from their email
through a secure proxy endpoint to ensure security and privacy
and respect iframe csp policy.

Co-authored-by: =?UTF-8?q?Ri=C3=ABl=20Notermans?= <riel@mosa.cloud>
2026-01-12 17:09:32 +01:00
BastienandGitHub a67fd36c33 (ops) implement production docker images (#451)
* (ops) implement production docker images

Github workflows:
  - moved docker-publish jobs into a separate file on push main only
Backend:
  - added healthcheck on backend Dockerfile + minor fixes
  - bumped django to 5.1.15 to mitigate major CVE
  - moved /healthz endpoint to /__heartbeat__ + added db connection
    check
Frontend:
  - Added runtime-prod Dockerfile target + minor fixes on the Dockerfile
  - bump next to 15.5.9 to mitigate major CVE
  - moved nginx config to standard nginx container configuration
    template, fixed `scalingo_postfrontend` accordingly
Keycloak:
  - Added production Dockerfile
  - Removed scalingo_pgdump script & cron.json
socks-proxy:
  - added package upgrades run into runtime Dockerfile stage
Misc:
  - removed scalingo_pgdump.sh & cron.json
  - fixed compose and e2e nginx configs with /healthz replacement

* (fix) coderabbit recommandations
2026-01-12 15:18:25 +01:00
Sylvain ZimmerandGitHub b6394a2f56 ✨(limits) implement MAX_RECIPIENTS_PER_MESSAGE (#474)
This is mostly cherrypicked from the larger PR #459, to reduce
complexity. We might still implement the rest in the future.
2026-01-12 12:09:52 +01:00
Sylvain Zimmer fc744543bc 🔒️(errors) avoid serializing Python error externally 2026-01-10 15:16:37 +01:00
Jean-Baptiste PENRATHandGitHub e236b37054 🐛(frontend) fix reply all logic (#471)
When user replies to all, we populate the `to` field with both `to` and `cc`
recipients that was not the expected behavior so we fix it to populate properly
`to` and `cc` fields according to the situation.
2026-01-08 19:21:41 +01:00
Jean-Baptiste PENRATHandGitHub 8e42a3eabd 🐛(layout) fix panel transitions and resize handling (#470)
Prevent a bug that may left panel hidden on desktop on window resize. Also
remove the transition on resize to improve ux.
2026-01-08 18:17:25 +01:00
jbpenrath 01bfd930b2 🚨(frontend) replace next lint by eslint
Next 16 removes the lint command so we migrate our linter configuration to
use eslint directly. It appears some rules were not applied previously but looks
relevant so we keep them and fix errors.
2026-01-05 11:14:05 +01:00
jbpenrath 238cd1511e ⬆️(frontend) upgrade all frontend deps
Upgrade frontend dependencies to the latest supported version
2026-01-05 11:14:05 +01:00
Sabrina Demagny 9b41c0b016 ✅(e2e) fix date format change since 2026 2026-01-03 01:19:20 +01:00
Jean-Baptiste PENRATHandGitHub 119c9b73bb 🌐(frontend) set html lang attribute on language change (#462)
Currently the html lang attribute is always set to `en`, we want to update it
when application language is changed.
2025-12-24 00:10:10 +01:00
jbpenrath 25502130ee 💄(frontend) fix scroll issues
It was not possible to scroll in views with long data grid.
Furthermore the mailbox panel was not usable on small height
viewport so we took opportunity to also fix that.
2025-12-23 11:54:29 +01:00
jbpenrath 5efcbe1b25 🌐(frontend) fix blocknote localization
Currently blocknote ui was not localized properly.
2025-12-23 10:51:16 +01:00
BastienandGitHub 5e3f5a4494 (socks-proxy) add healthcheck to dockerfile (#402) 2025-12-20 01:01:59 +01:00
jbpenrath 06f98216e5 🐛(frontend) do not compare drive and attachment mime type
Currently to know if an attachment already exists in configured Drive instance,
we compare file retrieved by name, size and mime type but sometimes the mime
type cannot match. As it appears that name and size are enough to compare
resources we remove the mime type check.
2025-12-18 16:43:40 +01:00
jbpenrath 6f16b88e88 🚨(frontend) @typescript-eslint/no-unused-vars as error
`@typescript-eslint/no-unused-vars` rules was only a warning but our code
contains several unused imports. To prevent that in the future we now trigger
an error for this rule to prevent to merge code with unused imports.
2025-12-18 16:25:18 +01:00
Sylvain Zimmer 6558bf88a7 🐛(selfcheck) fix warning from a race condition in thread deletion 2025-12-18 15:03:01 +01:00
jbpenrath cb2ac356cc ✨(frontend) allow multiple thread selection
Add UI to select multiple thread to mark them as read/unread or assign them to
a label in batch
2025-12-17 11:09:55 +01:00
jbpenrath e5dd2b2cb7 💄(frontend) fine tune new layout
Small style improvement from the new layout
2025-12-17 11:09:54 +01:00
Jean-Baptiste PENRATHandGitHub 0e94d33736 👔(backend) add flag is_trashed to thread resource (#454)
Add a flag `is_trashed` to Thread model in order to monitor when a thread is
fully trashed. It helps to exclude those kind of threads in some views with
inactive message like archive or spam for example.

By default we exclude those kind of threads from results until user is looking
for trashed messages.
2025-12-17 10:06:13 +01:00
Sylvain ZimmerandGitHub 6a1df09848 ✨(spam) add rspamd integration, header rules and InboundMessage queue (#436)
This adds an intermediate Postgres-backed queue for inbound messages, that 
allows us to run filters like spam processing before inserting messages in their
final storage (soon to be object storage). Also include misc. refactorings.
2025-12-15 23:50:54 +01:00
Jean-Baptiste PENRATHandGitHub 36d9352a8b 💄(frontend) fix icon size issue in thread message (#455)
Remove icon size large in thred message for the fold icon
2025-12-15 18:48:45 +01:00
jbpenrath c3a439deae 💄(frontend) migrate to ui-kit v2
Migrate frontend to ui-kit v2. Improve layouts on the road and fix
major a11y issues
2025-12-15 17:59:51 +01:00
Jean-Baptiste PENRATHandGitHub bba7662691 🐛(frontend) refresh thread view on new messages (#453)
If the message count of the selected thread has changed the view should be
refreshed to display the new message.
2025-12-11 23:54:13 +01:00
Jean-Baptiste PENRATHandGitHub b1eb39c641 ✨(search) add spam folder and search functionality (#452)
Display the SPAM folder in the mailbox panel and allow to search SPAM
messages. Unlike other message flags, SPAM messages are not included
in search result by default
2025-12-11 09:31:59 +01:00
Jean-Baptiste PENRATHandGitHub 3b6f0b9f02 👔(backend) update logic to retrieve drive main_workspace (#449)
The previous route we were using to retrieve the user's Drive main workspace
through drive resource server is not working anymore. But we are able to
retrieve this workspace through the `/me` api route.
2025-12-10 14:17:16 +01:00
Jean-Baptiste PENRATHandGitHub 5161978fcd 🔊(frontend) allow to capture exception through Sentry (#448)
Install and setup a generic error handler that send event to
Sentry if configured or just log error in console otherwise.
2025-12-09 17:51:00 +01:00
Mathis RougetandGitHub 074f5abc3c 🐛(frontend) use regex patterns to detect forgotten attachments (#442)
Currently the attachments-detection-map contains regex patterns but those ones
were treat as raw strings. We now parse patterns to detect regex string (starts
and ends with `/`).
2025-12-09 15:49:25 +01:00
Niels Kersicandjbpenrath 1ac92fe44b 🔧(backend) add configurable Drive app name
Add DRIVE_APP_NAME variable that gets exposed via the config endpoint then
update frontend translation to use this variable into it.

Co-Authored-By: jbpenrath <jb.penrath@gmail.com>
2025-12-09 14:19:53 +01:00
295ffbb3cf 🐛(backend) disable pagination for thread messages
Long threads (more than 20 messages) only displayed the first 20 messages
because the MessageViewSet used the default PAGE_SIZE of 20. The frontend
doesn't handle pagination for messages, so additional messages were silently
hidden from users.

This fix disables pagination for the messages endpoint since threads typically
don't have enough messages to require pagination.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-08 10:59:51 +01:00
Niels Kersicandjbpenrath 72fef4722d 🌍(i18n) add dutch patterns for attachment detection 2025-12-08 10:57:30 +01:00
Sylvain Zimmer 1cd9809ddf 💄(logo) update Alpha label to Beta 2025-12-05 12:31:43 +01:00
jbpenrath fb3daddc5d 🐛(frontend) exclude Drive files of the attachment total size limit
Drive file are currently taken in account to compute the attachment total size
to know it the size limit has been reached. But actually we only want to take
in account the local attachments.
2025-12-02 15:13:21 +01:00
jbpenrath e616cefa8d 👔(backend) do not trigger ai features at delivery on import
On import, the `deliver_inbound_messages` triggers ai features (auto labels and
summarization) if they are enabled. But we don't want to trigger those features
on import.
2025-12-02 15:13:21 +01:00
jbpenrath 24f2644f0d ✨(interop) allow to save an attachment into Drive workspace
Setup Drive resource server query to retrieve and save files from a configured
Drive instance through OIDC resource server.

https://github.com/suitenumerique/drive/pull/379
2025-12-01 19:32:07 +01:00
jbpenrath b380612a70 ♻️(authentication) use django-lasuite oidc backend
Insatll django-lasuite and our custom authentication backend to inherit
from the LaSuiteOIDCAuthenticationBackend
2025-12-01 16:54:33 +01:00
jbpenrath a87d8f4a46 ✅(e2e) add first tests
Add first test to test import and send message

Resolve #238
2025-11-25 23:28:21 +01:00
jbpenrath 369bf83e05 🔧(e2e) setup e2e environment
Create a new project e2e based on playwright and setup a full dockerized e2e
environment
2025-11-25 23:27:48 +01:00
Sylvain ZimmerandGitHub 85a8585323 ✨(dkim) add an optional DKIM verification just before sending emails (#434)
This will catch the case where people try to send email before having
correctly configured their DNS, and would also avoid unwanted sends
of messages not supposed to go out.
2025-11-23 17:09:46 +01:00
Sylvain Zimmer b77f4aa3b5 🔧(mta-out) use MAX_OUTGOING_EMAIL_SIZE for mta-out 2025-11-21 15:26:42 +01:00
Sylvain Zimmer 2770221a13 🔧(mta-in) rename config var MESSAGE_SIZE_LIMIT to MAX_INCOMING_EMAIL_SIZE
This aligns with the config for the backend
2025-11-21 15:20:03 +01:00
Sylvain Zimmer b7d3ad6837 🐛(attachments) apply a 1.4x factor on the limit of outgoing emails
This takes into account the overhead of MIME encoding
2025-11-21 14:53:48 +01:00
670ba5699a ✨(attachments) configurable size limits (#430)
Adds new config vars for incoming & outgoing attachment sizes, validated at draft stage
and when receiving emails.

---------

Co-authored-by: Riël Notermans <riel@mosa.cloud>
2025-11-21 13:55:26 +01:00
e89c2c179a 🩹(text rendering) fix plain text line breaks (#428)
Fix text/plain rendering while preserving newlines

---------

Co-authored-by: Riël Notermans <riel@zzapps.nl>
2025-11-20 22:00:31 +01:00
Sylvain Zimmer 0959fd4418 🐛(keycloak) assign users to subGroups if needed
Previously if a KEYCLOAK_GROUP_PATH_PREFIX with a parent folder name
was specified, users were not being added to the right subgroup
2025-11-20 18:45:15 +01:00
Sabrina Demagny b27dca2f16 🐛(draft) soften logging when draft save fails 2025-11-17 15:05:48 +01:00
Sabrina Demagny f2260a177a 🐛(permissions) resolve MultipleObjectsReturned when user has access to multiple mailboxes on same thread
The has_object_permission method was failing with MultipleObjectsReturned
exception when a user had access to multiple mailboxes that both have
access to the same thread.

Changes:
- Filter thread accesses by EDITOR role and check user mailbox permissions
- Use filter().exists() instead of get() to avoid MultipleObjectsReturned
- Add test case to verify users can send messages when they have access
  to multiple mailboxes on the same thread
2025-11-13 01:02:23 +01:00