Files
ping-mee-self-service-platform/pyproject.toml
T
ebbe.bassandClaude Sonnet 5.5 3c69c2a156 feat: add OIDC sign-in, roles, sessions and client address rule
Authorization-code flow with PKCE through an idp adapter (with a fake), ID
token validation, identity and roles resolved from the directory with a short
cache, refusal of unknown, disabled and locked accounts with one generic page,
sessions that end when the account becomes unavailable, sign-out that ends the
server-side session, role decorators and the trusted-proxy client address rule.
Adds the OIDC_* and PUBLIC_BASE_URL configuration.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N3t4WL7bd9bdHHNjEsxzqC
2026-10-17 19:19:51 +02:00

58 lines
1.6 KiB
TOML

[project]
name = "self-service-portal"
version = "0.1.0"
description = "Self-service portal for directory users"
readme = "README.md"
requires-python = ">=3.13,<3.14"
dependencies = [
"django>=5.2,<5.3",
"gunicorn>=23.0",
"whitenoise>=6.9",
"tzdata",
"python-ldap>=3.4.4",
"authlib>=1.7,<1.8",
"requests>=2.32",
]
[dependency-groups]
dev = [
"pytest>=8",
"pytest-django>=4.9",
"pytest-env>=1.1",
"ruff>=0.8",
]
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "portal.config.settings"
testpaths = ["portal/tests"]
filterwarnings = ["ignore:No directory at:UserWarning"]
env = [
"SECRET_KEY=test-only-secret-key-not-for-use-0123456789abcdef",
"ALLOWED_HOSTS=testserver,localhost",
"DATA_DIR=.",
"DEBUG=false",
"LOG_LEVEL=INFO",
"LDAP_SERVER=dc.example.test",
"LDAP_USER_OU_DN=OU=Users,DC=example,DC=test",
"LDAP_BIND_DN=svc@example.test",
"LDAP_BIND_PASSWORD=test-only-service-password",
"LDAP_CA_FILE=pyproject.toml",
"LDAP_PUBLISHER_GROUP_DN=CN=Publishers,OU=Users,DC=example,DC=test",
"LDAP_ADMIN_GROUP_DN=CN=Admins,OU=Users,DC=example,DC=test",
"OIDC_ISSUER=https://idp.example.test/application/o/portal/",
"OIDC_CLIENT_ID=portal-client",
"OIDC_CLIENT_SECRET=test-only-client-secret",
"PUBLIC_BASE_URL=https://portal.example.test",
]
[tool.ruff]
line-length = 100
target-version = "py313"
extend-exclude = ["**/migrations", "_bmad", "_bmad-output", ".agents", "context-resources"]
[tool.ruff.lint]
select = ["E", "F", "I", "B", "UP", "S"]
[tool.ruff.lint.per-file-ignores]
"portal/tests/*" = ["S"]