v0.1.23
Security
-
/healthzhanded out the installation's configuration, to anybody, now.
main.pycopies the webhook sub-app's routes into the main app; the sub-app
declares its own detailed/healthz, and a copied route lands ahead of the
plain one declared below — first match wins.middleware.pyexempts the path
from authentication and Caddy proxies/backend/*, so the public answer
carried every model name, deadline, budget, the cache size and which backends
are configured. Observed answering exactly that on production.The route is no longer copied. The reason the block existed is real and is
kept:env_filepoints at a.envthat does not exist in the container, so
a setting the compose file does not forward silently takes the code default
and nothing outside could tell which had happened. It is served from
/api/ops/review-settings, behind an admin. -
/readyzand/metricswere public by the same route./readyz
returned per-dependency detail including a user count andstr(exc)[:200]
from a failed connection — for a bad DSN, a fragment of the DSN. It now
answers{"ok": …}and the status code, which is a probe's whole contract;
the detail is at/api/ops/readyzbehind an admin./metricsreturned the entire Prometheus slice — queue depths, spend, review
counts, error rates. It now needsCELMIS_METRICS_TOKENwhen the request
passed a proxy, and is served unconditionally when it did not: the bundled
Prometheus scrapesapi:8000/metricsdirectly over the compose network and
keeps working. A caller can addX-Forwarded-Forand lose access; they
cannot remove Caddy's, so the public path fails closed.