Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
175 commits
Select commit Hold shift + click to select a range
0435d56
Add Stalwart container to the opencloud_full deployment, using the Op…
pbleser-oc Apr 16, 2025
d638fba
WIP: initial implementation of the groupware service
pbleser-oc Apr 16, 2025
72af257
add missing routing for /groupware (currently unprotected for testing)
pbleser-oc Apr 16, 2025
6620313
rename Stalwart fallback admin username from 'admin' to 'mailadmin' s…
pbleser-oc Apr 22, 2025
6da208e
add an OIDC Directory to Stalwart, requires exposing Keycloak port 80…
pbleser-oc Apr 28, 2025
da9ed5f
WIP: restructure the Jmap client, and implement the /me/messages Grap…
pbleser-oc May 2, 2025
4cf4d44
move services/groupware/pkg/jmap to pkg/jmap
pbleser-oc May 5, 2025
4e6053c
add an auth-api service to make an exemplary implementation of an ext…
pbleser-oc May 7, 2025
ebd58fc
Introduce a the auth-api service
pbleser-oc May 12, 2025
02f33bd
minor corrections to the Stalwart configuration
pbleser-oc May 22, 2025
a6cdb4e
upgrade Stalwart to 0.12
pbleser-oc May 26, 2025
71cddaa
groupware and jmap improvements and refactoring
pbleser-oc May 30, 2025
b3766ab
auth-api: fix: was missing newly introduced metrics
pbleser-oc May 30, 2025
0f47e3a
jwkset: remove debugging printlns
pbleser-oc May 30, 2025
22e51bd
groupware: removed debugging logs
pbleser-oc May 30, 2025
e0ea733
upgrade Stalwart to 0.12.4
pbleser-oc Jun 4, 2025
772a902
Use password policy overlay in LDAP and configure Stalwart to use it
pbleser-oc Jun 4, 2025
5920291
fix Stalwart LDAP configuration
pbleser-oc Jun 4, 2025
3f8076a
Groupware improvements: refactoring, k6 tests
pbleser-oc Jun 6, 2025
2412e64
opencloud_full: upgrade Stalwart to 0.12.5, and use the ghcr.io conta…
pbleser-oc Jul 1, 2025
8df4ef6
groupware: remove unneeded messages.go that was a remainder from an e…
pbleser-oc Jul 1, 2025
d544efd
Groupware and jmap: cleanup and API documentation
pbleser-oc Jul 7, 2025
07522ce
Refactor groupware service after ADR decision on the Groupware API
pbleser-oc Jul 25, 2025
2191b1d
groupware: implement JSON:API's error response format, with a revampe…
pbleser-oc Jul 28, 2025
8be4d11
groupware: refactoring the API mechanisms
pbleser-oc Jul 29, 2025
94c932d
refactored the Session object, refactored the services/groupware dire…
pbleser-oc Jul 30, 2025
1b9249e
upgrade Stalwart to 0.13.2
pbleser-oc Jul 30, 2025
0d2a5e9
groupware: further implementation and improvements
pbleser-oc Jul 31, 2025
ac8d258
groupware: more JMAP operations implementation
pbleser-oc Aug 1, 2025
6e4918b
groupware: blob streaming (upload and download)
pbleser-oc Aug 4, 2025
a64223f
groupware: implement message search with snippets
pbleser-oc Aug 5, 2025
e6441e5
Groupware: refactor jmap package, implement Email/set, EmailSubmission
pbleser-oc Aug 6, 2025
446a98d
groupware: fix email search, add variant that includes the full emails
pbleser-oc Aug 7, 2025
0a5d13b
groupware: fix email search, add variant that includes the full emails
pbleser-oc Aug 7, 2025
2bdbc5a
groupware: add identities of all accounts to the index resource
pbleser-oc Aug 7, 2025
084eb00
groupware: minor email searching response improvements + started impl…
pbleser-oc Aug 8, 2025
8d9c3b0
Groupware improvements
pbleser-oc Aug 11, 2025
72ee47f
groupware: swagger API documentation improvements
pbleser-oc Aug 12, 2025
f97bc0e
groupware: add /bootstrap
pbleser-oc Aug 21, 2025
d214cfa
groupware: initial related emails implementation with SSE
pbleser-oc Aug 22, 2025
0f3dac0
groupware: Etag handling
pbleser-oc Aug 25, 2025
5b51804
groupware: implement metrics
pbleser-oc Aug 26, 2025
1fc75a9
groupware: jmap: add metrics
pbleser-oc Aug 27, 2025
724c445
groupware: improve metrics
pbleser-oc Aug 27, 2025
fc938bc
jmap: minor logging improvements
pbleser-oc Aug 28, 2025
1d6433f
refactor(groupware): logging and metrics improvements
pbleser-oc Aug 28, 2025
58583a6
docs(groupware): add Groupware related ADRs
pbleser-oc Aug 29, 2025
3ac4bcf
groupware: fix debug server, was missing a lot of configuration optio…
pbleser-oc Sep 2, 2025
c9a4bb9
groupware: session handling improvements
pbleser-oc Sep 3, 2025
3e48284
add a .gitignore entry for debug binaries built by VSCode when runnin…
pbleser-oc Sep 3, 2025
33cc336
groupware: add DNS auto-discovery (currently disabled, needs testing)
pbleser-oc Sep 4, 2025
1b732b8
refactor(groupware): session cache and DNS autodiscovery
pbleser-oc Sep 4, 2025
a8c2bea
test(groupware): add testcontainers based jmap test
pbleser-oc Sep 4, 2025
62cace1
docs(groupware): OpenAPI improvements
pbleser-oc Sep 5, 2025
f470462
feat(groupware): add fetching all mailboxes for all accounts
pbleser-oc Sep 8, 2025
aab08dd
chore(groupware): add launcher for OC + containers for services
pbleser-oc Sep 8, 2025
0da72cf
groupware: minor typo fixes
pbleser-oc Sep 8, 2025
6224ded
refactor(groupware): add max requests check
pbleser-oc Sep 9, 2025
df21fdf
docs(groupware): add services/groupware/DEVELOPER.md
pbleser-oc Sep 9, 2025
c4fb13b
refactor(groupware): use a function for multi-account method call IDs
pbleser-oc Sep 10, 2025
3026ddb
refactor(groupware): rename "Messages" to "Email" everywhere
pbleser-oc Sep 10, 2025
c31d7c5
fix(groupware): fix JMAP error handling
pbleser-oc Sep 10, 2025
d54e27d
docs(groupware): add configuration instructions to DEVELOPER.md
pbleser-oc Sep 11, 2025
3cb78ed
more updates to the Groupware DEVELOPER.md
pbleser-oc Sep 11, 2025
1d94e38
docs(groupware): more developer instructions
pbleser-oc Sep 11, 2025
431a5ab
fix(groupware): update DEVELOPER.md imap-filler usage since it was up…
pbleser-oc Sep 11, 2025
21ea094
jmap: modify GetBlob -> GetBlobMetadata
pbleser-oc Sep 12, 2025
a65a59b
groupware: improved attachment APIs
pbleser-oc Sep 12, 2025
c4a16e3
refactor(groupware): just use a function for the attachment picker
pbleser-oc Sep 18, 2025
2ea8afe
feat(groupware): add WebsocketEndpoint to the JMAP Session
pbleser-oc Sep 18, 2025
4fee453
start websocket implementation, add endpoint for email summaries
pbleser-oc Sep 24, 2025
5cc98f0
Docker Compose Groupware improvements
pbleser-oc Sep 24, 2025
e2c9350
Implement JSContact (RFC9553) Model
pbleser-oc Sep 25, 2025
0e3e960
JSContact: refactored after full test coverage, stronger typing for e…
pbleser-oc Sep 26, 2025
85fed11
services/groupware/DEVELOPER.md: adapt to new path for the opencloud_…
pbleser-oc Sep 26, 2025
09f69c5
implement JSCalendar (RFC 8984)
pbleser-oc Sep 26, 2025
04b038a
opencloud_full: also keep the 'Trace-Id' HTTP header
pbleser-oc Sep 30, 2025
eeccb56
groupware: add mock endpoints for addressbooks and contacts
pbleser-oc Sep 30, 2025
2c6ff6c
groupware: more mock data, added missing JMAP types
pbleser-oc Oct 1, 2025
ed488b5
groupware: implement JMAP Task specification
pbleser-oc Oct 1, 2025
ebd51db
groupware: add mock endpoints for tasklists and tasks
pbleser-oc Oct 2, 2025
101f38d
/auth: add SkipXAccessToken:true
pbleser-oc Oct 2, 2025
f4f2466
groupware: add JMAP capability checking (in part: for contacts, calen…
pbleser-oc Oct 2, 2025
17b281c
groupware: add flag to currently ignore session capability checks for…
pbleser-oc Oct 6, 2025
01b4a1f
groupware: minor improvements to the DEVELOPER.md
pbleser-oc Oct 6, 2025
abb5719
groupware: add quota API + add support for Accept-Language and Conten…
pbleser-oc Oct 6, 2025
d79f0b3
groupware: update @redocly/cli: 2.2.2 -> 2.3.0
pbleser-oc Oct 6, 2025
a5701ce
groupware: improve instructions in DEVELOPER.md
pbleser-oc Oct 6, 2025
d95b9a8
groupware: add /quota for all accounts
pbleser-oc Oct 6, 2025
2343e7f
groupware: add bootstrapping on / with quotas for all accounts
pbleser-oc Oct 7, 2025
0052d6f
groupware: upgrade Stalwart in devtools from 0.13.2 to 0.13.4
pbleser-oc Oct 7, 2025
e6abc2d
groupware: rewrite JMAP integration test to be more reusable, and upg…
pbleser-oc Oct 7, 2025
7587c54
groupware: improve jmap integration tests
pbleser-oc Oct 7, 2025
b369f8b
fixed connection reset issue. adapted make file to generate swagger d…
ScharfViktor Oct 8, 2025
996bc85
docs(groupware): fix basepath in OpenAPI, /groupware instead of /grou…
pbleser-oc Oct 8, 2025
d7b6752
groupware: update @redocly/cli from 2.3.0 to 2.3.1
pbleser-oc Oct 8, 2025
11a6996
groupware: devtools: Stalwart: add internal LDAP configuration
pbleser-oc Oct 8, 2025
197c854
groupware: make everything also work with the built-in LDAP and IDP
pbleser-oc Oct 8, 2025
3da0deb
groupware: for /accounts/all/emails/latest/summary, rename the ?unrea…
pbleser-oc Oct 8, 2025
925d9b8
groupware: further updates to make everything work with the builtin L…
pbleser-oc Oct 9, 2025
d470b51
jmap: fix Email/set
pbleser-oc Oct 9, 2025
051b483
docs(groupware): upgrade @redocly/cli 2.3.1 -> 2.4.0
pbleser-oc Oct 9, 2025
f5ac628
groupware: implement email updating and email keyword updating endpoints
pbleser-oc Oct 9, 2025
96fcf96
groupware: add Mermaid diagrams to describe the two setup options
pbleser-oc Oct 9, 2025
73fd7e0
jmap: add GetInboxNameForMultipleAccounts
pbleser-oc Oct 10, 2025
d3cb741
groupware: try an alternative way to configure Stalwart dynamically i…
pbleser-oc Oct 14, 2025
2efc4fd
groupware: jmap: don't collpase threads when searching for emails, an…
pbleser-oc Oct 14, 2025
f1972e0
groupware: DEVELOPER.md: explain how to set a quota on a user using t…
pbleser-oc Oct 14, 2025
ecc9e6b
groupware: accept both '_' and '*' as the 'default account' placeholder
pbleser-oc Oct 14, 2025
4cb8a8a
groupware: DEVELOPER.md: add note explaining LDAPTLS_REQCERT
pbleser-oc Oct 14, 2025
b580392
groupware: fix devtools LDAP passwords, as it was breaking regular op…
pbleser-oc Oct 15, 2025
cb2c6dc
groupware: fix NPE when one of the accounts is a group account
pbleser-oc Oct 15, 2025
633679c
groupware: add instructions for using stalwart-admin
pbleser-oc Oct 16, 2025
df8b424
groupware:
pbleser-oc Oct 17, 2025
1845fa8
groupware: add identity deletion
pbleser-oc Oct 17, 2025
0d23867
groupware: add email HTML sanitization
pbleser-oc Oct 17, 2025
f024c2c
groupware: add searching emails by their Message-Id + retrieving an e…
pbleser-oc Oct 20, 2025
4dfed5a
groupware: add the Retry-After header in responses when the session c…
pbleser-oc Oct 20, 2025
0507779
groupware: add markAsSeen=true to mark an email as $seen before it is
pbleser-oc Oct 21, 2025
8a97320
groupware: add headers Unmatched-Path and Unsupported-Method to make
pbleser-oc Oct 21, 2025
46f8d27
groupware: improve email sanitization by using the mime package to pa…
pbleser-oc Oct 21, 2025
d80db93
groupware: add threadSize property in the email summary endpoint
pbleser-oc Oct 21, 2025
ed605f9
groupware: fix keyword patching syntax for markAsSeen=true
pbleser-oc Oct 21, 2025
2358e61
groupware: fix keyword patching syntax for adding and removing email …
pbleser-oc Oct 21, 2025
5e61c03
groupware: introduce constants for Email property names, see EmailSum…
pbleser-oc Oct 22, 2025
84ce6b2
groupware: add threadSize in email-by-id response
pbleser-oc Oct 22, 2025
1f59143
upgrade to Stalwart 0.14.0
pbleser-oc Oct 23, 2025
276209c
groupware: add recipe for using ldapsearch in an Alpine container to …
pbleser-oc Oct 23, 2025
0fdc5a0
groupware: add ContactCard operations
pbleser-oc Oct 23, 2025
ed730b0
groupware: add threadCount to /groupware/accounts/{accountId}/mailbox…
pbleser-oc Oct 23, 2025
8530513
groupware: add missing total,limit,offset attributes in the QueryEmai…
pbleser-oc Oct 23, 2025
f15681c
groupware: fix compilation in tests after recent changes
pbleser-oc Oct 23, 2025
43c1107
groupware: actually add total and limit to the email summary endpoint
pbleser-oc Oct 23, 2025
f2e5156
groupware: fix creating contacts
pbleser-oc Oct 23, 2025
3cddb65
groupware: change /accounts endpoint to return an array with the acco…
pbleser-oc Oct 24, 2025
26317a1
groupware: minor: reorganize the route nesting
pbleser-oc Oct 24, 2025
e9fb96e
groupware: jmap: fix id -> blobId attribute when uploading a blob
pbleser-oc Oct 24, 2025
9275ff1
groupware: also change accounts to an array instead of a map in the r…
pbleser-oc Oct 24, 2025
18027f1
groupware: add Mailbox sorting
pbleser-oc Oct 24, 2025
e36dff9
groupware: add ical blob parsing endpoint
pbleser-oc Oct 28, 2025
0b393de
groupware: implement Mailbox modification endpoints + refactor ETag/s…
pbleser-oc Oct 28, 2025
d53f7be
groupware: implement/fix email submission
pbleser-oc Oct 29, 2025
4c1b887
groupware: add real calendars and events
pbleser-oc Oct 30, 2025
dce5b16
groupware: move POST+DELETE of contacts and events as a top-level rou…
pbleser-oc Oct 31, 2025
db3efe6
groupware: return identities with accounts in the /accounts endpoint
pbleser-oc Oct 31, 2025
000b7b2
groupware: some fixes accordingly to the latest JMAP and jscalendarbi…
pbleser-oc Nov 4, 2025
abd7a37
groupware: remove mock calendars and contacts
pbleser-oc Nov 5, 2025
3465008
groupware: fix deserialization of Event Alert Trigger types using map…
pbleser-oc Nov 5, 2025
29d9071
groupware: improved integration test for email, fixed two bugs
pbleser-oc Nov 6, 2025
457e0d1
groupware: add getting a contact by ID + add integration tests for co…
pbleser-oc Nov 7, 2025
b305855
groupware: fix blob uploading metadata and add 'POST /blobs' route
pbleser-oc Nov 17, 2025
a6aeb78
groupware: fix recently introduced error with UploadedBlob with and w…
pbleser-oc Nov 18, 2025
b8f60f3
groupware: stalwart: add the magic sharing.allow-directory-query conf…
pbleser-oc Nov 18, 2025
e27df2c
groupware: improve JMAP integration tests for ContactCards
pbleser-oc Nov 18, 2025
5dc9f71
groupware: improve JMAP ContactCard integration tests
pbleser-oc Nov 19, 2025
9f65d90
groupware: refactor the JMAP integration tests
pbleser-oc Nov 19, 2025
1ea251c
groupware: finalize JMAP events integration test, with multiple chang…
pbleser-oc Nov 20, 2025
ae9c8dc
groupware: feature test improvements and upgrade to Stalwart 0.14.1
pbleser-oc Nov 24, 2025
225f6f6
groupware: add Object-Type and Account-Id response headers
pbleser-oc Nov 26, 2025
282bee5
groupware: response payload /groupware/accounts/{id}/emails should be…
pbleser-oc Nov 26, 2025
6a5c90e
groupware: fix email summaries and allow negative offsets
pbleser-oc Nov 26, 2025
14bd930
groupware: JMAP WS push notifications support
pbleser-oc Nov 27, 2025
aa95437
groupware: WS push improvements, add getting email changes to WS inte…
pbleser-oc Nov 28, 2025
dfda4b3
groupware: upgrade the Stalwart image in devtools from 0.14.0 to 0.14.1
pbleser-oc Dec 1, 2025
d0effed
groupware, auth-api: remove tracing and tracing configuration
pbleser-oc Dec 3, 2025
8ae4694
groupware: fix missing casting to jmap.State after changes in pkg/jmap
pbleser-oc Dec 3, 2025
e7d557c
groupware: minor: remove network declaration in stalwart.yml
pbleser-oc Dec 3, 2025
25068ad
groupware: refactor response objects to take a list of accountIds
pbleser-oc Dec 4, 2025
42cce92
groupware: add retrieving and adding mailboxIds for drafts and sent i…
pbleser-oc Dec 5, 2025
5dc1f28
groupware: improve email submission and testing
pbleser-oc Dec 8, 2025
6ff5b1a
groupware: add description and version annotations for env configurat…
pbleser-oc Dec 9, 2025
3da6855
groupware: fix failing pkg/jscalendar unit tests
pbleser-oc Dec 9, 2025
dc7df40
groupware: fix failing pkg/jscontact unit tests
pbleser-oc Dec 9, 2025
790a241
groupware: shift some attributes of the Groupware object around, in d…
pbleser-oc Dec 9, 2025
3d8cad1
groupware: update to Stalwart 0.15.0
pbleser-oc Dec 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
132 changes: 132 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,138 @@
"OC_SERVICE_ACCOUNT_SECRET": "service-account-secret"
}
},
{
"name": "OpenCloud server with Groupware",
"type": "go",
"request": "launch",
"mode": "debug",
"buildFlags": [
// "-tags", "enable_vips"
],
"program": "${workspaceFolder}/opencloud/cmd/opencloud",
"args": ["server"],
"env": {
// log settings for human developers
"OC_LOG_LEVEL": "info",
"OC_LOG_PRETTY": "true",
"OC_LOG_COLOR": "true",
// set insecure options because we don't have valid certificates in dev environments
"OC_INSECURE": "true",
// enable basic auth for dev setup so that we can use curl for testing
"PROXY_ENABLE_BASIC_AUTH": "true",
// demo users
"IDM_CREATE_DEMO_USERS": "true",
// OC_RUN_SERVICES allows to start a subset of services even in the supervised mode
//"OC_RUN_SERVICES": "settings,storage-system,graph,idp,idm,ocs,store,thumbnails,web,webdav,frontend,gateway,users,groups,auth-basic,storage-authmachine,storage-users,storage-shares,storage-publiclink,storage-system,app-provider,sharing,proxy,ocdav",

/*
* Keep secrets and passwords in one block to allow easy uncommenting
*/
// user id of "admin", for user creation and admin role assignement
"OC_ADMIN_USER_ID": "some-admin-user-id-0000-000000000000", // FIXME currently must have the length of a UUID, see reva/pkg/storage/utils/decomposedfs/spaces.go:228
// admin user default password
"IDM_ADMIN_PASSWORD": "admin",
// system user
"OC_SYSTEM_USER_ID": "some-system-user-id-000-000000000000", // FIXME currently must have the length of a UUID, see reva/pkg/storage/utils/decomposedfs/spaces.go:228
"OC_SYSTEM_USER_API_KEY": "some-system-user-machine-auth-api-key",
// set some hardcoded secrets
"OC_JWT_SECRET": "some-opencloud-jwt-secret",
"OC_MACHINE_AUTH_API_KEY": "some-opencloud-machine-auth-api-key",
"OC_TRANSFER_SECRET": "some-opencloud-transfer-secret",
// collaboration
"COLLABORATION_WOPIAPP_SECRET": "some-wopi-secret",
// idm ldap
"IDM_SVC_PASSWORD": "some-ldap-idm-password",
"GRAPH_LDAP_BIND_PASSWORD": "some-ldap-idm-password",
// reva ldap
"IDM_REVASVC_PASSWORD": "some-ldap-reva-password",
"GROUPS_LDAP_BIND_PASSWORD": "some-ldap-reva-password",
"USERS_LDAP_BIND_PASSWORD": "some-ldap-reva-password",
"AUTH_BASIC_LDAP_BIND_PASSWORD": "some-ldap-reva-password",
// idp ldap
"IDM_IDPSVC_PASSWORD": "some-ldap-idp-password",
"IDP_LDAP_BIND_PASSWORD": "some-ldap-idp-password",
// storage users mount ID
"GATEWAY_STORAGE_USERS_MOUNT_ID": "storage-users-1",
"STORAGE_USERS_MOUNT_ID": "storage-users-1",
// graph application ID
"GRAPH_APPLICATION_ID": "application-1",

// service accounts
"OC_SERVICE_ACCOUNT_ID": "service-account-id",
"OC_SERVICE_ACCOUNT_SECRET": "service-account-secret",

"OC_ADD_RUN_SERVICES": "groupware",
"GROUPWARE_LOG_LEVEL": "trace"
}
},
{
"name": "OpenCloud server with external services",
"type": "go",
"request": "launch",
"mode": "debug",
"buildFlags": [
// "-tags", "enable_vips"
],
"program": "${workspaceFolder}/opencloud/cmd/opencloud",
"args": ["server"],
"env": {
"OC_URL": "https://localhost:9200/",
"PROXY_DEBUG_ADDR": "0.0.0.0:9205",
"OC_BASE_DATA_PATH": "${env:HOME}/.opencloud-with-external",
"OC_CONFIG_DIR": "${env:HOME}/.opencloud-with-external/config",
"GROUPWARE_LOG_LEVEL": "trace",
"OC_LOG_LEVEL": "info",
"OC_LOG_PRETTY": "true",
"OC_LOG_COLOR": "true",
"OC_INSECURE": "true",
"PROXY_ENABLE_BASIC_AUTH": "false",
"IDM_CREATE_DEMO_USERS": "false",
"OC_LDAP_URI": "ldaps://localhost:636",
"OC_LDAP_INSECURE": "true",
"OC_LDAP_BIND_DN": "cn=admin,dc=opencloud,dc=eu",
"OC_LDAP_BIND_PASSWORD": "admin",
"OC_LDAP_GROUP_BASE_DN": "ou=groups,dc=opencloud,dc=eu",
"OC_LDAP_GROUP_SCHEMA_ID": "entryUUID",
"OC_LDAP_USER_BASE_DN": "ou=users,dc=opencloud,dc=eu",
"OC_LDAP_USER_FILTER": "(objectclass=inetOrgPerson)",
"OC_LDAP_USER_SCHEMA_ID": "entryUUID",
"OC_LDAP_DISABLE_USER_MECHANISM": "none",
"OC_LDAP_SERVER_WRITE_ENABLED": "false",
"OC_EXCLUDE_RUN_SERVICES": "idm",
"OC_ADD_RUN_SERVICES": "notifications,groupware",
"NATS_NATS_HOST": "0.0.0.0",
"NATS_NATS_PORT": "9233",
"FRONTEND_ARCHIVER_MAX_SIZE": "10000000000",
"MICRO_REGISTRY_ADDRESS": "127.0.0.1:9233",
"NOTIFICATIONS_SMTP_HOST": "localhost",
"NOTIFICATIONS_SMTP_PORT": "2500",
"NOTIFICATIONS_SMTP_SENDER": "OpenCloud notifications <notifications@cloud.opencloud.test>",
"NOTIFICATIONS_SMTP_USERNAME": "notifications@cloud.opencloud.test",
"NOTIFICATIONS_SMTP_INSECURE": "true",
"NOTIFICATIONS_SMTP_PASSWORD": "",
"NOTIFICATIONS_SMTP_AUTHENTICATION": "",
"NOTIFICATIONS_SMTP_ENCRYPTION": "none",
"PROXY_AUTOPROVISION_ACCOUNTS": "false",
"PROXY_ROLE_ASSIGNMENT_DRIVER": "oidc",
"OC_OIDC_ISSUER": "https://keycloak.opencloud.test/realms/openCloud",
"PROXY_OIDC_REWRITE_WELLKNOWN": "true",
"WEB_OIDC_CLIENT_ID": "web",
"PROXY_USER_OIDC_CLAIM": "uuid",
"PROXY_USER_CS3_CLAIM": "userid",
"WEB_OPTION_ACCOUNT_EDIT_LINK_HREF": "https://keycloak.opencloud.test/realms/openCloud/account",
"OC_ADMIN_USER_ID": "",
"SETTINGS_SETUP_DEFAULT_ASSIGNMENTS": "false",
"GRAPH_ASSIGN_DEFAULT_USER_ROLE": "false",
"GRAPH_USERNAME_MATCH": "none",
"KEYCLOAK_DOMAIN": "keycloak.opencloud.test",
"IDM_ADMIN_PASSWORD": "admin",
"GRAPH_LDAP_SERVER_UUID": "true",
"GRAPH_LDAP_GROUP_CREATE_BASE_DN": "ou=custom,ou=groups,dc=opencloud,dc=eu",
"GRAPH_LDAP_REFINT_ENABLED": "true",
"GATEWAY_GRPC_ADDR": "0.0.0.0:9142",
}
},
{
"name": "Fed OpenCloud server",
"type": "go",
Expand Down
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ OC_MODULES = \
services/app-provider \
services/app-registry \
services/audit \
services/auth-api \
services/auth-app \
services/auth-basic \
services/auth-bearer \
Expand All @@ -39,6 +40,7 @@ OC_MODULES = \
services/gateway \
services/graph \
services/groups \
services/groupware \
services/idm \
services/idp \
services/invitations \
Expand Down
9 changes: 8 additions & 1 deletion devtools/deployments/opencloud_full/.env
Original file line number Diff line number Diff line change
Expand Up @@ -305,8 +305,15 @@ KEYCLOAK_ADMIN_PASSWORD=
# Leaving it default stores data in docker internal volumes.
#RADICALE_DATA_DIR=/your/local/radicale/data

### Stalwart Settings ###
# Note: the leading colon is required to enable the service.
#STALWART=:stalwart.yml
# Domain of Stalwart
# Defaults to "stalwart.opencloud.test"
STALWART_DOMAIN=

Comment on lines +313 to +314
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
STALWART_DOMAIN=
STALWART_DOMAIN=
# LDAP config to use. Can either be idmldap (the built in IdP) or ldap (when using keycloak).
STALWART_AUTH_DIRECTORY=idmldap

## IMPORTANT ##
# This MUST be the last line as it assembles the supplemental compose files to be used.
# ALL supplemental configs must be added here, whether commented or not.
# Each var must either be empty or contain :path/file.yml
COMPOSE_FILE=docker-compose.yml${OPENCLOUD:-}${TIKA:-}${DECOMPOSEDS3:-}${DECOMPOSEDS3_MINIO:-}${DECOMPOSED:-}${COLLABORA:-}${MONITORING:-}${IMPORTER:-}${CLAMAV:-}${INBUCKET:-}${EXTENSIONS:-}${UNZIP:-}${DRAWIO:-}${JSONVIEWER:-}${PROGRESSBARS:-}${EXTERNALSITES:-}${KEYCLOAK:-}${LDAP:-}${KEYCLOAK_AUTOPROVISIONING:-}${LDAP_MANAGER:-}${RADICALE:-}
COMPOSE_FILE=docker-compose.yml${OPENCLOUD:-}${TIKA:-}${DECOMPOSEDS3:-}${DECOMPOSEDS3_MINIO:-}${DECOMPOSED:-}${COLLABORA:-}${MONITORING:-}${IMPORTER:-}${CLAMAV:-}${INBUCKET:-}${EXTENSIONS:-}${UNZIP:-}${DRAWIO:-}${JSONVIEWER:-}${PROGRESSBARS:-}${EXTERNALSITES:-}${KEYCLOAK:-}${LDAP:-}${KEYCLOAK_AUTOPROVISIONING:-}${LDAP_MANAGER:-}${RADICALE:-}${STALWART:-}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
{
"clientId": "groupware",
"name": "OpenCloud Groupware",
"description": "Used for authenticating automated HTTP clients of the OpenCloud Groupware API",
"rootUrl": "",
"adminUrl": "",
"baseUrl": "",
"surrogateAuthRequired": false,
"enabled": true,
"alwaysDisplayInConsole": false,
"clientAuthenticatorType": "client-secret",
"redirectUris": [
"/*"
],
"webOrigins": [
"/*"
],
"notBefore": 0,
"bearerOnly": false,
"consentRequired": false,
"standardFlowEnabled": true,
"implicitFlowEnabled": false,
"directAccessGrantsEnabled": true,
"serviceAccountsEnabled": false,
"publicClient": true,
"frontchannelLogout": true,
"protocol": "openid-connect",
"attributes": {
"oidc.ciba.grant.enabled": "false",
"backchannel.logout.session.required": "true",
"oauth2.device.authorization.grant.enabled": "false",
"backchannel.logout.revoke.offline.tokens": "false"
},
"authenticationFlowBindingOverrides": {},
"fullScopeAllowed": true,
"nodeReRegistrationTimeout": -1,
"defaultClientScopes": [
"web-origins",
"acr",
"profile",
"roles",
"groups",
"OpenCloudUnique_ID",
"basic",
"email"
],
"optionalClientScopes": [
"address",
"phone",
"offline_access",
"microprofile-jwt"
],
"access": {
"view": true,
"configure": true,
"manage": true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
dn: ou=policies,dc=opencloud,dc=eu
objectClass: organizationalUnit
objectClass: top
ou: policies

dn: cn=default,ou=policies,dc=opencloud,dc=eu
cn: default
objectClass: pwdPolicy
objectClass: person
objectClass: top
pwdAllowUserChange: TRUE
pwdAttribute: userPassword
pwdCheckQuality: 0
pwdExpireWarning: 600
pwdFailureCountInterval: 30
pwdGraceAuthNLimit: 5
pwdInHistory: 5
pwdLockout: FALSE
pwdLockoutDuration: 0
pwdMaxAge: 0
pwdMaxFailure: 5
pwdMinAge: 0
pwdMinLength: 1
pwdMustChange: FALSE
pwdSafeModify: FALSE
sn: default
21 changes: 21 additions & 0 deletions devtools/deployments/opencloud_full/config/stalwart/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Stalwart Configuration

The mechanics are currently to mount a different configuration file depending on the environment, as we support two scenarios that are described in [`services/groupware/DEVELOPER.md`](../../../../../services/groupware/DEVELOPER.md):

* &laquo;production&raquo; setup, with OpenLDAP and Keycloak containers
* &laquo;homelab&raquo; setup, with the built-in IDM (LDAP) and IDP that run as part of the `opencloud` container

The Docker Compose setup (in [`stalwart.yml`](../../stalwart.yml)) mounts either [`idmldap.toml`](./idmldap.toml) or [`ldap.toml`](./ldap.toml) depending on how the variable `STALWART_AUTH_DIRECTORY` is set, which is either `idmldap` for the homelab setup, or `ldap` for the production setup.

This is thus all done automatically, but whenever changes are performed to Stalwart configuration files, they must be reflected across those two files, to keep them in sync, as the only entry that should differ is this one:

```ruby
storage.directory = "ldap"
```

or this:

```ruby
storage.directory = "idmldap"
```

110 changes: 110 additions & 0 deletions devtools/deployments/opencloud_full/config/stalwart/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
authentication.fallback-admin.secret = "$6$4qPYDVhaUHkKcY7s$bB6qhcukb9oFNYRIvaDZgbwxrMa2RvF5dumCjkBFdX19lSNqrgKltf3aPrFMuQQKkZpK2YNuQ83hB1B3NiWzj."
authentication.fallback-admin.user = "mailadmin"
authentication.master.secret = "$6$4qPYDVhaUHkKcY7s$bB6qhcukb9oFNYRIvaDZgbwxrMa2RvF5dumCjkBFdX19lSNqrgKltf3aPrFMuQQKkZpK2YNuQ83hB1B3NiWzj."
authentication.master.user = "master"
directory.idmldap.attributes.class = "objectClass"
directory.idmldap.attributes.description = "displayName"
directory.idmldap.attributes.email = "mail"
directory.idmldap.attributes.groups = "memberOf"
directory.idmldap.attributes.name = "uid"
directory.idmldap.attributes.secret = "userPassword"
directory.idmldap.base-dn = "o=libregraph-idm"
directory.idmldap.bind.auth.method = "default"
directory.idmldap.bind.dn = "uid=reva,ou=sysusers,o=libregraph-idm"
directory.idmldap.bind.secret = "admin"
directory.idmldap.cache.size = 1048576
directory.idmldap.cache.ttl.negative = "10m"
directory.idmldap.cache.ttl.positive = "1h"
directory.idmldap.filter.email = "(&(|(objectClass=person)(objectClass=groupOfNames))(mail=?))"
directory.idmldap.filter.name = "(&(|(objectClass=person)(objectClass=groupOfNames))(uid=?))"
directory.idmldap.timeout = "15s"
directory.idmldap.tls.allow-invalid-certs = true
directory.idmldap.tls.enable = true
directory.idmldap.type = "ldap"
directory.idmldap.url = "ldaps://opencloud:9235"
directory.keycloak.auth.method = "user-token"
directory.keycloak.cache.size = 1048576
directory.keycloak.cache.ttl.negative = "10m"
directory.keycloak.cache.ttl.positive = "1h"
directory.keycloak.endpoint.method = "introspect"
directory.keycloak.endpoint.url = "http://keycloak:8080/realms/openCloud/protocol/openid-connect/userinfo"
directory.keycloak.fields.email = "email"
directory.keycloak.fields.full-name = "name"
directory.keycloak.fields.username = "preferred_username"
directory.keycloak.timeout = "15s"
directory.keycloak.type = "oidc"
directory.ldap.attributes.class = "objectClass"
directory.ldap.attributes.description = "displayName"
directory.ldap.attributes.email = "mail"
directory.ldap.attributes.email-alias = "mailAlias"
directory.ldap.attributes.groups = "memberOf"
directory.ldap.attributes.name = "uid"
directory.ldap.attributes.secret = "userPassword"
directory.ldap.attributes.secret-changed = "pwdChangedTime"
directory.ldap.base-dn = "dc=opencloud,dc=eu"
directory.ldap.bind.auth.dn = "cn=?,ou=users,dc=opencloud,dc=eu"
directory.ldap.bind.auth.enable = true
directory.ldap.bind.auth.search = true
directory.ldap.bind.dn = "cn=admin,dc=opencloud,dc=eu"
directory.ldap.bind.secret = "admin"
directory.ldap.cache.ttl.negative = "10m"
directory.ldap.cache.ttl.positive = "1h"
directory.ldap.filter.email = "(&(|(objectClass=person)(objectClass=groupOfNames))(|(uid=?)(mail=?)(mailAlias=?)(cn=?)))"
directory.ldap.filter.name = "(&(|(objectClass=person)(objectClass=groupOfNames))(|(uid=?)(cn=?)))"
directory.ldap.timeout = "5s"
directory.ldap.tls.allow-invalid-certs = true
directory.ldap.tls.enable = true
directory.ldap.type = "ldap"
directory.ldap.url = "ldap://ldap-server:1389"
http.allowed-endpoint = 200
http.hsts = true
http.permissive-cors = false
http.url = "'https://' + config_get('server.hostname')"
http.use-x-forwarded = true
metrics.prometheus.auth.secret = "secret"
metrics.prometheus.auth.username = "metrics"
metrics.prometheus.enable = true
server.listener.http.bind = "0.0.0.0:8080"
server.listener.http.protocol = "http"
server.listener.https.bind = "0.0.0.0:443"
server.listener.https.protocol = "http"
server.listener.https.tls.implicit = true
server.listener.imap.bind = "0.0.0.0:143"
server.listener.imap.protocol = "imap"
server.listener.imaptls.bind = "0.0.0.0:993"
server.listener.imaptls.protocol = "imap"
server.listener.imaptls.tls.implicit = true
server.listener.pop3.bind = "0.0.0.0:110"
server.listener.pop3.protocol = "pop3"
server.listener.pop3s.bind = "0.0.0.0:995"
server.listener.pop3s.protocol = "pop3"
server.listener.pop3s.tls.implicit = true
server.listener.sieve.bind = "0.0.0.0:4190"
server.listener.sieve.protocol = "managesieve"
server.listener.smtp.bind = "0.0.0.0:25"
server.listener.smtp.protocol = "smtp"
server.listener.submission.bind = "0.0.0.0:587"
server.listener.submission.protocol = "smtp"
server.listener.submissions.bind = "0.0.0.0:465"
server.listener.submissions.protocol = "smtp"
server.listener.submissions.tls.implicit = true
server.max-connections = 8192
server.socket.backlog = 1024
server.socket.nodelay = true
server.socket.reuse-addr = true
server.socket.reuse-port = true
storage.blob = "rocksdb"
storage.data = "rocksdb"
storage.directory = "%{env:STALWART_AUTH_DIRECTORY}%"
storage.fts = "rocksdb"
storage.lookup = "rocksdb"
store.rocksdb.compression = "lz4"
store.rocksdb.path = "/opt/stalwart/data"
store.rocksdb.type = "rocksdb"
tracer.console.ansi = true
tracer.console.buffered = true
tracer.console.enable = true
tracer.console.level = "trace"
tracer.console.lossy = false
tracer.console.multiline = false
tracer.console.type = "stdout"
Loading