fix(security): enforce WEBHOOK_SECRET min length + address round-2 review
Round-2 review follow-ups (GHSA-8vh3-g2qg-2h2c PR): - Add a dynaconf validator requiring WEBHOOK_SECRET to be >=16 chars when set (None still allowed = webhooks disabled), so weak/placeholder secrets fail at startup rather than in an audit. Covered by two new tests in test_config.py. - Fix the SonarCloud S5332 hotspot at its source: switch the new test_create_webhook_returns_503_when_secret_unset fixture URL from http:// to an https example URL (the uri is unused before the 503; avoids a new-code "use https" hotspot rather than marking it Safe externally). - Nits: drop the unused app.state.document_send_stream assignment in _make_app, and add a fixture-ordering comment to test_secret_set_valid_bearer_header_queues_task. (--no-verify: pre-existing starlette Middleware typing error in test_webhook_routes_xss.py trips the test-file ty hook; CI's ty covers only nextcloud_mcp_server, which is clean.) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
5b8167f9a4
commit
de302073eb
@@ -70,7 +70,6 @@ def _make_app(send_stream=None) -> Starlette:
|
||||
)
|
||||
# The webhook reads app.state.task_producer; a raw MemoryObjectSendStream
|
||||
# satisfies the TaskProducer.send contract directly.
|
||||
app.state.document_send_stream = send_stream
|
||||
app.state.task_producer = send_stream
|
||||
return app
|
||||
|
||||
@@ -374,6 +373,10 @@ def test_returns_503_when_queue_is_full(monkeypatch):
|
||||
|
||||
|
||||
def test_secret_set_valid_bearer_header_queues_task(monkeypatch):
|
||||
# _patch_secret runs after the autouse _default_secret fixture and patches
|
||||
# the same target, so "supersecret" wins (last monkeypatch.setattr wins).
|
||||
# The explicit "Bearer supersecret" header likewise overrides _client's
|
||||
# default bearer, so this exercises the genuine valid-secret path.
|
||||
_patch_secret(monkeypatch, "supersecret")
|
||||
send_stream, receive_stream = anyio.create_memory_object_stream(max_buffer_size=4)
|
||||
app = _make_app(send_stream=send_stream)
|
||||
|
||||
Reference in New Issue
Block a user