JMAP administration front written in svelte for:
- create, remove calendars
- create, remove addressbooks
- create, remove shared folders
- manage rights for calendars/addressbooks/folders
- quota management
The architecture is based on SvelteKit back and front with typescript, JMAP server as backend. The JMAP backend base URL is given to the app with JMAP_URL environment variable.
The goal is to make a graphical interface for what cyradm is providing as command line interface.
It is a work in progress.
There is a docker image here: iroco/jmapadmin.
Two environment variables are needed by the app:
JMAP_URL: the backend urlJWT_SECRET: the JWT signing key
Optionally and depending on your web server configuration, PORT, HOST, ORIGIN and other env variables can be set, see the sveltekit node adapter configuration.
The app is stateless, the user should come with a Json Web Token in a Authorization cookie. The JWT will be used to send JMAP queries to the backend. For Cyrus the header has to contain the fields,
{
"typ": "JWT",
"alg": "HS512"
}The payload should have the following structure:
{
"role": 3,
"sub": "user@domain.co",
"iat": 1704359437,
"iss": "urn:iroco:issuer",
"exp": 1704361242
}The role is corresponding to the typescript enum. It should be ADMIN(3) else a 403 Unauthorized will be thrown:
enum Role {
Temporary,
Trial,
User,
Admin,
SuperAdmin
}A secret should be provided to the app with an environment variable JWT_SECRET to check the signature of the token. For more details on accessing the app see hooks.server.ts. For authenticating to the backend, the same secret should be shared with the JMAP or IMAP server (for Cyrus see the http_jwt_key_dir section in imapd.conf).
Installing dépendencies
npm iRun tests
npm run testRun dev server
npm run devReleasing: the docker is built and pushed by the CI. We use release-it for creating a TAG. We use the semantic versioning.
npm run release