feat: implement XmppChannel and SyncXmppChannel (M10-U4+U5)
XmppChannel sends direct messages via slixmpp ClientXMPP with: - _format_message: 5 emoji sections (synthèse, agenda, devoirs, messages, infos) with sanitize_plaintext on all content (SEC-XMPP-06) - send_async: public async method with connect, STARTTLS verification, send_message, disconnect lifecycle (D1, SEC-XMPP-04) - send: sync wrapper via asyncio.run() for direct callers SyncXmppChannel adapts async XmppChannel for synchronous pipeline use (D4): - asyncio.run() when no event loop running (nominal pipeline) - daemon thread with timeout when event loop already running - Returns False on any error, never raises (non-blocking) Security: - auto_reconnect=False, failed_auth → disconnect + PipelineWarning (SEC-XMPP-04) - __cause__ and __context__ cleared on all PipelineWarning raises (SEC-XMPP-05) - redact_secrets with extra_secrets=[jid, password, to] on all logs (SEC-XMPP-02) - STARTTLS features check post-connection, disconnect on failure (D1) - dry-run mode logs redacted message without connecting 28 unit tests (20 channel + 8 adapter) covering success, errors, security. Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid> Co-authored-by: opencode/coder <coder@agents.invalid>
This commit is contained in:
@@ -133,49 +133,6 @@
|
||||
]
|
||||
}
|
||||
],
|
||||
"results": {
|
||||
"GUIDE_DEV_PYTHON.md": [
|
||||
{
|
||||
"type": "Hex High Entropy String",
|
||||
"filename": "GUIDE_DEV_PYTHON.md",
|
||||
"hashed_secret": "90bd1b48e958257948487b90bee080ba5ed00caa",
|
||||
"is_verified": true,
|
||||
"line_number": 4935,
|
||||
"is_secret": false
|
||||
}
|
||||
],
|
||||
"tests/unit/test_caldav_gateway.py": [
|
||||
{
|
||||
"type": "Secret Keyword",
|
||||
"filename": "tests/unit/test_caldav_gateway.py",
|
||||
"hashed_secret": "1c58bd92003bbaa0538e249fff6ee19a270dec5f",
|
||||
"is_verified": false,
|
||||
"line_number": 152
|
||||
},
|
||||
{
|
||||
"type": "Basic Auth Credentials",
|
||||
"filename": "tests/unit/test_caldav_gateway.py",
|
||||
"hashed_secret": "1c58bd92003bbaa0538e249fff6ee19a270dec5f",
|
||||
"is_verified": false,
|
||||
"line_number": 763
|
||||
}
|
||||
],
|
||||
"tests/unit/test_caldav_security.py": [
|
||||
{
|
||||
"type": "Basic Auth Credentials",
|
||||
"filename": "tests/unit/test_caldav_security.py",
|
||||
"hashed_secret": "8e1f07a2939b6324c70f48a3e7f64b463a4a3f8b",
|
||||
"is_verified": false,
|
||||
"line_number": 27
|
||||
},
|
||||
{
|
||||
"type": "Secret Keyword",
|
||||
"filename": "tests/unit/test_caldav_security.py",
|
||||
"hashed_secret": "6b554cd7b7e0115065fb4907307a74f1902154d4",
|
||||
"is_verified": false,
|
||||
"line_number": 28
|
||||
}
|
||||
]
|
||||
},
|
||||
"generated_at": "2026-09-07T17:59:08Z"
|
||||
"results": {},
|
||||
"generated_at": "2026-09-07T21:10:53Z"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user