Package the proxy properly so it can be consumed outside a container, and
without downstream users vendoring a package definition into their own
configuration.
- pyproject.toml: setuptools metadata with a `legacy-email-proxy` console
script. Runtime dependencies are read dynamically from requirements.txt, so
the Docker build and the package cannot drift apart.
- proxy_server.run(): a synchronous entry point for the console script, since
`main` is a coroutine and cannot be referenced by one directly. The
`__main__` path is unchanged in behaviour.
- package.nix / flake.nix: the package, an overlay, and a dev shell. The test
suite runs as part of the build, so `nix flake check` covers it.
- module.nix: a NixOS module exposing `services.legacy-email-proxy` with
freeform `settings` (environment variables) and a separate `environmentFile`
for credentials, so secrets stay out of the Nix store. Runs under
DynamicUser with CAP_NET_BIND_SERVICE only while a listener needs a
privileged port, and opens no firewall ports.
The Dockerfile and its CI workflow are deliberately untouched.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Accept any POP3 `USER`/`PASS` from the client and discard them. The proxy always authenticates to the IMAP backend with the configured `BACKEND_IMAP_USER` / `BACKEND_IMAP_PASS`.
## Changes
- `handle_user` / `handle_pass`: accept client credentials unconditionally, no validation.
- `authenticate`: always use backend credentials; remove the fallback that connected with client-supplied credentials when backend credentials were unset. Raise a clear configuration error when backend credentials are missing.
- Tests: client credentials are ignored; missing backend credentials are reported.
Closes#14
---------
Co-authored-by: Emma Thorpe <emma.thorpe@citrix.com>
Reviewed-on: #15
Adds a Security section: the front-end POP3/SMTP listeners are unauthenticated and must be bound to a trusted internal network only. Closes#9
Reviewed-on: #13
Co-authored-by: Lyra Thorpe <iam@emmathe.dev>
Co-committed-by: Lyra Thorpe <iam@emmathe.dev>
Moves the actions/cache step ahead of the install step and uses the runner.os Actions expression in the cache key. Closes#8
Reviewed-on: #12
Co-authored-by: Lyra Thorpe <iam@emmathe.dev>
Co-committed-by: Lyra Thorpe <iam@emmathe.dev>
Adds a dedicated non-root user and switches to it before CMD. Verified the container runs as a non-root uid. Closes#7
Reviewed-on: #11
Co-authored-by: Lyra Thorpe <iam@emmathe.dev>
Co-committed-by: Lyra Thorpe <iam@emmathe.dev>