Commit Graph

4603 Commits

Author SHA1 Message Date
Pascal Bleser
674a6743cc groupware: fix debug server, was missing a lot of configuration options and was binding to :80 2026-06-16 16:48:31 +02:00
Pascal Bleser
55ca319180 refactor(groupware): logging and metrics improvements
* some minor code refactorings to improve logging and metrics

 * more code documentation
2026-06-16 16:48:31 +02:00
Pascal Bleser
5b5137169e groupware: improve metrics
* implement more metrics, in a more streamlined fashion

 * use concurrent-map to store SSE streams instead of a regular map with
   one big lock that will not scale when it grows, causing too much
   contention on that one lock

 * while testing error metrics, noticed a few bugs with error handling
   when Stalwart is down: fixed
2026-06-16 16:48:31 +02:00
Pascal Bleser
d99412963b groupware: implement metrics
* implement a framework for metrics, with a few exemplary ones
2026-06-16 16:48:31 +02:00
Pascal Bleser
cc12f32346 groupware: Etag handling
* implement correct Etag and If-None-Match handling, responding with
   304 Not Modified if they match

 * introduce SessionState and State string type aliases to ensure we are
   using the correct fields for those, respectively

 * extract the SessionState from the JMAP response bodies in the
   groupware framework instead of having to do that in every single
   groupware API

 * use uint instead of int in some places to clarify that the values are
   >= 0

 * trace-log how long a Session was held in cache before being evicted

 * add Trace-Id header handling: add to response when specified in
   request, and implement a custom request logger to include it as a
   field

 * implement a more compact trace-logging of all the methods and URIs
   that are served, to put them into a single log entry instead of
   creating one log entry for every URI
2026-06-16 16:48:31 +02:00
Pascal Bleser
8384d998cb groupware: initial related emails implementation with SSE 2026-06-16 16:48:31 +02:00
Pascal Bleser
6f60e7e290 groupware: add /bootstrap
* add a GET /accounts/{a}/boostrap URI that delivers the same as GET /
   but also mailboxes for a given account, in case the UI remembers the
   last used account identifier, to avoid an additional roundtrip

 * streamline the use of simpleError()

 * add logging of errors at the calling site

 * add logging of evictions of Sessions from the cache

 * change default Session cache TTL to 5min instead of 30sec
2026-06-16 16:48:31 +02:00
Pascal Bleser
870ea388a4 groupware: swagger API documentation improvements
* add more documentation for properties

 * fixes after a bit of trial-and-error with go-swagger

 * fix email filter marshalling when there are no search criteria

 * introduce an apidoc.yml that contains Swagger data and is merged when
   generating the swagger.yml from sources
2026-06-16 16:48:31 +02:00
Pascal Bleser
0b6c7314fb Groupware improvements
* ensure that all the jmap responses contain the SessionState

 * implement missing errors that were marked as TODO

 * moved common functions from pkg/jmap and pkg/services/groupware to
   pkg/log and pkg/structs to commonalize them across both source trees

 * implement error handling for SetError occurences

 * Email: replace anonymous map[string]bool for mailbox rights with a
   MailboxRights struct, as the keys are well-defined, which allows for
   properly documenting them

 * introduce ObjectType as an "enum"

 * fix JSON marshalling and unmarshalling of EmailBodyStructure

 * move the swagger documentation structs from groupware_api.go to
   groupware_docs.go

 * fix: change verb for /groupware/accounts/*/vacation from POST to PUT
2026-06-16 16:48:31 +02:00
Pascal Bleser
970e7928ec groupware: minor email searching response improvements + started implementing vacation response setting API 2026-06-16 16:48:31 +02:00
Pascal Bleser
ee066f26d8 groupware: add identities of all accounts to the index resource 2026-06-16 16:48:31 +02:00
Pascal Bleser
54e1bfdf94 groupware: fix email search, add variant that includes the full emails 2026-06-16 16:48:31 +02:00
Pascal Bleser
f5ba41508f groupware: fix email search, add variant that includes the full emails 2026-06-16 16:48:31 +02:00
Pascal Bleser
1b1ef91f53 Groupware: refactor jmap package, implement Email/set, EmailSubmission
* refactor the jmap package to split it into several files as the
   jmap.api.go file was becoming too unwieldy

 * refactor the Groupware handler function response to be a Response
   object, to be more future-proof and avoid adding more and more
   return parameters while handling "no content" response as well

 * more godoc for the JMAP model

 * add Email creation, updating, deleting (Email/set,
   EmailSubmission/set)

 * add endpoints
   - POST /accounts/{accountid}/messages
   - PATCH|PUT /accounts/{accountid}/messages/{messageid}
   - DELETE /accounts/{accountid}/messages/{messageid}
2026-06-16 16:48:31 +02:00
Pascal Bleser
2aa8ad11af groupware: implement message search with snippets 2026-06-16 16:48:31 +02:00
Pascal Bleser
d2a2992944 groupware: blob streaming (upload and download) 2026-06-16 16:48:31 +02:00
Pascal Bleser
ef354d6065 groupware: more JMAP operations implementation 2026-06-16 16:48:31 +02:00
Pascal Bleser
cace541896 groupware: further implementation and improvements 2026-06-16 16:48:31 +02:00
Pascal Bleser
7b4aafad34 refactored the Session object, refactored the services/groupware directory, and started Swagger documentation implementation 2026-06-16 16:48:31 +02:00
Pascal Bleser
2c41319a27 groupware: refactoring the API mechanisms 2026-06-16 16:48:31 +02:00
Pascal Bleser
843793bdff groupware: implement JSON:API's error response format, with a revamped error handling in jmap and services/groupware 2026-06-16 16:48:31 +02:00
Pascal Bleser
11b7b94468 Refactor groupware service after ADR decision on the Groupware API
* after having decided that the Groupware API should be a standalone
   independent custom REST API that is using JMAP data models as much as
   possible,
 * removed Groupware APIs from the Graph service
 * moved Groupware implementation to the Groupware service, and
   refactored a few things accordingly
2026-06-16 16:48:31 +02:00
Pascal Bleser
7199509130 Groupware and jmap: cleanup and API documentation 2026-06-16 16:48:31 +02:00
Pascal Bleser
6c14a88f0f groupware: remove unneeded messages.go that was a remainder from an earlier implementation attempt, which also fixes compilation issues due to changes in main 2026-06-16 16:48:31 +02:00
Pascal Bleser
01c10af655 Groupware improvements: refactoring, k6 tests
* refactored the models to be strongly typed with structs and mapstruct
   to decompose the dynamic parts of the JMAP payloads

 * externalized large JSON strings for tests into .json files under
   testdata/

 * added a couple of fantasy Graph groupware APIs to explore further
   options

 * added k6 scripts to test those graph/me/messages APIs, with a setup
   program to set up users in LDAP, fill their IMAP inbox, activate them
   in Stalwart, cleaning things up, etc...
2026-06-16 16:48:31 +02:00
Pascal Bleser
7043b87ca9 groupware: removed debugging logs 2026-06-16 16:48:31 +02:00
Pascal Bleser
6142492c28 auth-api: fix: was missing newly introduced metrics 2026-06-16 16:48:31 +02:00
Pascal Bleser
b0e3a9ec89 groupware and jmap improvements and refactoring 2026-06-16 16:48:31 +02:00
Pascal Bleser
3561f3cba5 Introduce a the auth-api service
* primitive implementation to demonstrate how it could work, still to
   be considered WIP at best

 * add new dependency: MicahParks/jwkset and MicahParks/keyfunc to
   retrieve the JWK set from KeyCloak to verify the signature of the
   JWTs sent as part of Bearer authentication in the /auth API

 * (minor) opencloud/.../service.go: clean up a logging statement that
   was introduced earlier to hunt down why the auth-api service was not
   being started
2026-06-16 16:48:30 +02:00
Pascal Bleser
26505f7443 add an auth-api service to make an exemplary implementation of an external authentication API for third party services such as Stalwart 2026-06-16 16:48:30 +02:00
Pascal Bleser
8e76649270 move services/groupware/pkg/jmap to pkg/jmap 2026-06-16 16:48:30 +02:00
Pascal Bleser
429880566c WIP: restructure the Jmap client, and implement the /me/messages Graph API endpoint with it 2026-06-16 16:48:30 +02:00
Pascal Bleser
f8328827a9 add missing routing for /groupware (currently unprotected for testing) 2026-06-16 16:48:30 +02:00
Pascal Bleser
91d2fb92e1 WIP: initial implementation of the groupware service 2026-06-16 16:48:30 +02:00
Jörn Friedrich Dreyer
81fd00043e Merge pull request #2063 from opencloud-eu/nats-tls-options
add tls support for all nats connections
2026-06-16 13:21:22 +02:00
Christian Richter
faf3ff1959 change error level for trashing items interaction with search
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2026-06-15 10:39:23 +02:00
opencloudeu
76a14b550f [tx] updated from transifex 2026-06-14 23:16:54 +00:00
opencloudeu
89353aa7c8 [tx] updated from transifex 2026-06-12 23:16:52 +00:00
opencloudeu
600640bb35 [tx] updated from transifex 2026-06-12 12:21:04 +00:00
opencloudeu
7db40eece4 [tx] updated from transifex 2026-06-12 12:14:52 +00:00
Jannik Stehle
9341a82b87 Merge pull request #2940 from opencloud-eu/chore/bump-web-7.2.0-beta.2
[full-ci] chore: bump web to v7.2.0-beta.2
2026-06-12 11:36:03 +02:00
Florian Schade
836cb980f2 Merge pull request #2928 from opencloud-eu/add-roles
feat: add more roles
2026-06-12 11:31:22 +02:00
Michael Barz
42dfc8b04f feat: add more roles 2026-06-12 10:51:10 +02:00
Jannik Stehle
63b4957b0f chore: bump web to v7.2.0-beta.2 2026-06-12 10:46:36 +02:00
Ralf Haferkamp
490eb5882b Merge pull request #2935 from rhafer/issue/2800
fix(graph): translate sharing roles consistently
2026-06-12 08:11:48 +02:00
opencloudeu
c21ce5d285 [tx] updated from transifex 2026-06-11 23:17:04 +00:00
Ralf Haferkamp
d163c8ed29 fix(graph): translate sharing roles consitently
GetRoleDefinition/s does now handle l10n correctly. Previsouly it just
returned the non-localized string. What made things worse was that
ListPermissions() mutated global list of available roles and replaced
some strings with translated values depending on the `accept-language`
header. Which resulted in GetRoleDefinition returning results in mixed
localization depending on who/what called ListPermissions before.

Fixes: #2800
2026-06-11 14:31:44 +02:00
opencloudeu
3c0d70987d [tx] updated from transifex 2026-06-11 10:00:56 +00:00
opencloudeu
6e0045bd87 [tx] updated from transifex 2026-06-11 09:51:16 +00:00
Florian Schade
40efa88989 Merge pull request #2924 from opencloud-eu/next
next to main
2026-06-11 11:48:49 +02:00