Add typed Android JMAP mailbox client #12

Open
ober wants to merge 14 commits from feat/android-mail-port into main
Owner

What changed

Adds the first typed-Jerboa Android JMAP mailbox client. The app stores the server, account ID, and access token in Android Keystore-backed encrypted preferences, then fetches the JMAP session and mailbox names over HTTPS. Requests reject redirects and cross-origin API URLs and cap response bodies at 1 MiB. The compose screen remains an offline draft preview; message sync, detail, mutations, and sending are not implemented.

Also wires the standalone jmail Scheme entry point so --version and --help execute in the built binary, and synchronizes the repository/package/app version to 0.3.1.

Verification

  • make test
  • .forgejo/ci-required.sh
  • make build and make binary; dist/jmail --version prints jmail 0.3.1, and --help prints usage
  • make -C android apk
  • make -C android smoke on emulator-5554
  • Jerboa balance checks and git diff --check

The security scanner reports heuristic findings on fixed-string HTTPS validation and the empty-token check; neither compares secret contents or uses a hardcoded credential. A real JMAP provider account was not available for live authentication testing.

## What changed Adds the first typed-Jerboa Android JMAP mailbox client. The app stores the server, account ID, and access token in Android Keystore-backed encrypted preferences, then fetches the JMAP session and mailbox names over HTTPS. Requests reject redirects and cross-origin API URLs and cap response bodies at 1 MiB. The compose screen remains an offline draft preview; message sync, detail, mutations, and sending are not implemented. Also wires the standalone `jmail` Scheme entry point so `--version` and `--help` execute in the built binary, and synchronizes the repository/package/app version to 0.3.1. ## Verification - `make test` - `.forgejo/ci-required.sh` - `make build` and `make binary`; `dist/jmail --version` prints `jmail 0.3.1`, and `--help` prints usage - `make -C android apk` - `make -C android smoke` on `emulator-5554` - Jerboa balance checks and `git diff --check` The security scanner reports heuristic findings on fixed-string HTTPS validation and the empty-token check; neither compares secret contents or uses a hardcoded credential. A real JMAP provider account was not available for live authentication testing.
Add typed Android JMAP mailbox client
All checks were successful
version-policy / required (pull_request) Successful in 5m1s
required-ci / required (pull_request) Successful in 7m43s
daad21c063
Add read-only JMAP inbox and message detail
All checks were successful
version-policy / required (pull_request) Successful in 4m47s
required-ci / required (pull_request) Successful in 8m39s
dfeecbf5ca
Add encrypted offline Inbox snapshot
All checks were successful
version-policy / required (pull_request) Successful in 4m43s
required-ci / required (pull_request) Successful in 7m36s
b4ff2b4d66
Add confirmed Android message actions and emulator coverage
All checks were successful
version-policy / required (pull_request) Successful in 4m43s
required-ci / required (pull_request) Successful in 7m30s
1511a81834
Add Android Trash navigation and restore flow
All checks were successful
version-policy / required (pull_request) Successful in 5m27s
required-ci / required (pull_request) Successful in 7m45s
827ede6397
Wire Android folder search and paging
Some checks failed
version-policy / required (pull_request) Successful in 4m56s
required-ci / required (pull_request) Has been cancelled
30bd31589e
Document Android folder actions and limits
All checks were successful
version-policy / required (pull_request) Successful in 4m48s
required-ci / required (pull_request) Successful in 7m40s
91f8f60a8e
Add confirmed Android logout and data removal
All checks were successful
version-policy / required (pull_request) Successful in 5m34s
required-ci / required (pull_request) Successful in 8m1s
78c6e6f0c6
Implement typed Android JMAP sending
All checks were successful
version-policy / required (pull_request) Successful in 4m54s
required-ci / required (pull_request) Successful in 8m6s
33d8e69e73
Improve Android mail accessibility
All checks were successful
version-policy / required (pull_request) Successful in 5m9s
required-ci / required (pull_request) Successful in 7m47s
19ff5c0f98
Add Android message attachment listing
All checks were successful
version-policy / required (pull_request) Successful in 4m40s
required-ci / required (pull_request) Successful in 7m37s
2bcefbcc5d
Add encrypted offline mail action queue
All checks were successful
version-policy / required (pull_request) Successful in 4m40s
required-ci / required (pull_request) Successful in 7m56s
c66227199e
Add safe JMAP MIME and attachment export
All checks were successful
version-policy / required (pull_request) Successful in 4m49s
required-ci / required (pull_request) Successful in 8m2s
dd9723f266
All checks were successful
version-policy / required (pull_request) Successful in 4m49s
Required
Details
required-ci / required (pull_request) Successful in 8m2s
Required
Details
This pull request has changes conflicting with the target branch.
  • VERSION
  • android/GENERATOR_REVISION
  • android/JERBOA_RUNTIME_REVISION
  • android/README.md
  • android/app.ss
  • android/scripts/jmap-emulator-e2e.py
  • android/scripts/smoke-emulator.sh
  • android/src/config-store.ss
  • android/src/jmap-client.ss
  • android/src/main-activity.ss
  • jpkg.sexp
  • main.ss
View command line instructions

Manual merge helper

Use this merge commit message when completing the merge manually.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/android-mail-port:feat/android-mail-port
git switch feat/android-mail-port
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ober/jerboa-mail!12
No description provided.