Files
max/Makefile
T
finnandClaude Opus 5.5 2b1160862a Fix several small security and robustness issues
Login:
- One message for unknown email, wrong password and deactivated
  account. Before, "This account is not enabled!" only appeared after
  the right password and confirmed valid credentials.
- Email and password must be non-empty strings. A missing password
  field became the string "None" and logged in a user with that
  password.

Forms:
- "Create user" no longer renders the password back into the HTML after
  a validation error.
- Password fields for a new password use autocomplete="new-password",
  so a password manager does not fill in the admin's own password. The
  email fields on the create pages use autocomplete="off".
- Email addresses are limited to 64 characters in the local part and
  254 in total (RFC 5321). Longer ones caused a database error and
  HTTP 500.
- alerts.html no longer translates flash messages a second time. Running
  str.format() again on an already formatted message was fragile and
  logged "Unknown translation" for every German message. All flashes
  now translate when flashing, "Invalid data" included.

Debug mode:
- The Docker image sets MAX_PRODUCTION=1, and the app refuses to start
  in debug mode then. FLASK_DEBUG=1 in production would otherwise enable
  the fixed secret key, cookies without Secure, no HSTS and query
  arguments (including password hashes) in the log.
- make run-dev and run-dev-as-prod bind to 127.0.0.1.

Other:
- A denied access is logged with the logger at debug level instead of
  print. PermissionDenied loses its unused message, it is deliberately
  answered with a 404.
- Fix the typo in /user/<id>/ser-toggle-can-use-different-alias-domain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 20:04:22 +00:00

47 lines
1011 B
Makefile

# DEV
seed-dev: clear-dev
FLASK_APP=max.app FLASK_DEBUG=1 scripts/dev/seed-db.sh
clear-dev:
scripts/dev/clear-db.sh
run-dev:
FLASK_APP=max.app FLASK_DEBUG=1 flask run --host 127.0.0.1 --port 8757
run-dev-as-prod:
FLASK_APP=max.app MAX_ORIGIN=http://localhost:8757 gunicorn -w 1 -b 127.0.0.1:8757 max.app:app
run-cleanup:
scripts/dev/cleanup.sh
# DEPENDENCIES
PIP_COMPILE = pip-compile --quiet --generate-hashes --strip-extras --allow-unsafe
lock-deps:
$(PIP_COMPILE) requirements.in
$(PIP_COMPILE) requirements-dev.in
update-deps:
$(PIP_COMPILE) --upgrade requirements.in
$(PIP_COMPILE) --upgrade requirements-dev.in
sync-deps:
pip-sync requirements.txt requirements-dev.txt
audit:
pip-audit --strict -r requirements.txt
# PROD
build-prod:
docker build -t max:$(shell cat VERSION) .
run-prod:
docker-compose up -d
stop-prod:
docker-compose down
setup-prod-initial-login:
docker-compose exec max flask add-domain finn.st
docker-compose exec max flask reset-admin admin@finn.st admin