# mvirt 0.24.20

migrations: no
wire: unchanged
rev: e3b1ae7e6e2ef53914d9408f89930ec17302aa0a

mvirt 0.24.20

Password login is throttled and no longer tells which usernames exist.
A read-only project member gets no Kubernetes API access any more (no
kubeconfig, no GUI proxy). One API key can be revoked without deleting
its service account. A guest's DNS to its network gateway stays on the
host.

- cplane: per-client token bucket on POST /v1/auth/login (429 with
  Retry-After), per-account exponential backoff capped at 15 min, and
  argon2 against a dummy hash for unknown users; forwarded client
  addresses are believed only from loopback, control-plane members and
  MVIRT_TRUSTED_PROXIES (#145).
- cplane: kubeconfig and the k8s GUI proxy require
  kubernetescluster.write; the console disables Dashboard/Connect for
  viewers (#146).
- cplane, console: DELETE /v1/projects/{p}/service-accounts/{sa}/
  api-keys/{key} revokes one key, idempotently and audited; the Access
  page has a Revoke action (#147).
- ebpf: DNS to the network's own gateway address is consumed at the
  vNIC instead of leaving the host north-south, unless a vNIC holds that
  address (#354; ownership of .1 is #369).
- cplane: a drifted manifest key logs once and then on change or every
  15 min, not on every pass (#278).


## Upgrading

Point your flake's `mvirt` input at this release and redeploy the control-plane
host first, then each node in turn:

```
nix run .#colmena -- apply boot --reboot --on <control-plane host>
nix run .#colmena -- apply boot --reboot --on <node>   # one at a time
```

This release adds no migrations, so the control-plane host rolls back the same way
a node does: boot the previous NixOS generation.
