Is your feature request related to a problem? Please describe.
The Microsoft Teams conference plugin (dispatch_microsoft_teams/conference/) is
substantially behind the Zoom plugin it parallels. Verified against main
(0fe79bda):
|
Teams |
Zoom |
| Methods |
create |
create, delete, add_participant, remove_participant |
Metrics (counter/timer) |
silently absent |
working |
| Config doc |
none |
configuring-zoom.mdx |
| Tests |
none |
none (parity) |
The metrics gap is a real defect rather than an omission. apply (src/dispatch/decorators.py:164)
is a class decorator — it iterates cls.__dict__ and rewrites each callable
attribute. Teams applies it to the create method (plugin.py:25-26), whose
__dict__ is empty, so the loop body never runs and the function is returned
untouched. Zoom applies it to the class (plugin.py:53-54) and is instrumented.
No crash, no warning — just missing telemetry.
Additional defects in dispatch_microsoft_teams/conference/client.py:
logger.info(f"Masked Result is {result}") (line 53) logs the entire MSAL
token response, including access_token. Nothing is masked despite the label.
Mitigating: the default LOG_LEVEL resolves to ERROR, so it only fires when
an operator raises the level to INFO/DEBUG — i.e. exactly while debugging.
requests.post (line 65) has no timeout and can hang indefinitely.
- No HTTP status check. A Graph error body flows into
meeting_info["joinWebUrl"]
(plugin.py:38) → KeyError → swallowed by the broad except → create
returns None.
recordAutomatically and isPasscodeRequired are sent as JSON strings
("true"/"false") rather than booleans. Inferred — not tested against live
Graph.
- That broad
except also means the real exception never reaches
conference/flows.py, so the incident event log records a generic "plugin
encountered an error" (flows.py:39) instead of the cause. Zoom lets it
propagate into the except at flows.py:28, which logs the reason.
Missing delete is not a live leak — nothing in the codebase calls
conference.delete; Zoom's is dead code too. Worth noting so it is not
prioritized as a resource leak.
Describe the solution you'd like
Bring Teams to Zoom parity:
- Move
@apply(counter, ...)/@apply(timer, ...) from the method to the class
so metrics actually emit.
- Add a
timeout to the Graph call and check the HTTP status; raise on error
rather than returning a body that fails downstream with KeyError.
- Stop logging the MSAL result, or log only the non-secret fields.
- Narrow or remove the broad
except in create so the real reason reaches the
incident event log.
- Send
recordAutomatically/isPasscodeRequired as booleans.
- Add
configuring-microsoft-teams.mdx alongside configuring-zoom.mdx.
- Implement
delete/add_participant/remove_participant for interface parity
(low priority — unused by callers).
Describe alternatives you've considered
Fixing only the metrics decorator. Rejected: the token logging and the missing
timeout are the changes with actual operator impact, and they sit in the same two
files.
Guarding against the apply-on-a-method misuse inside apply itself (raise when
handed a non-class). Reasonable as a follow-up so the mistake cannot recur
silently, but it is a separate change from making Teams work.
Additional context
Line references are against 0fe79bda. Every claim above is verified against
source except the boolean-vs-string Graph payload, which is inferred — it was
not tested against live Graph and needs a real tenant to confirm.
Is your feature request related to a problem? Please describe.
The Microsoft Teams conference plugin (
dispatch_microsoft_teams/conference/) issubstantially behind the Zoom plugin it parallels. Verified against
main(
0fe79bda):createcreate,delete,add_participant,remove_participantcounter/timer)configuring-zoom.mdxThe metrics gap is a real defect rather than an omission.
apply(src/dispatch/decorators.py:164)is a class decorator — it iterates
cls.__dict__and rewrites each callableattribute. Teams applies it to the
createmethod (plugin.py:25-26), whose__dict__is empty, so the loop body never runs and the function is returneduntouched. Zoom applies it to the class (
plugin.py:53-54) and is instrumented.No crash, no warning — just missing telemetry.
Additional defects in
dispatch_microsoft_teams/conference/client.py:logger.info(f"Masked Result is {result}")(line 53) logs the entire MSALtoken response, including
access_token. Nothing is masked despite the label.Mitigating: the default
LOG_LEVELresolves toERROR, so it only fires whenan operator raises the level to
INFO/DEBUG— i.e. exactly while debugging.requests.post(line 65) has no timeout and can hang indefinitely.meeting_info["joinWebUrl"](
plugin.py:38) →KeyError→ swallowed by the broadexcept→createreturns
None.recordAutomaticallyandisPasscodeRequiredare sent as JSON strings(
"true"/"false") rather than booleans. Inferred — not tested against liveGraph.
exceptalso means the real exception never reachesconference/flows.py, so the incident event log records a generic "pluginencountered an error" (
flows.py:39) instead of the cause. Zoom lets itpropagate into the
exceptatflows.py:28, which logs the reason.Missing
deleteis not a live leak — nothing in the codebase callsconference.delete; Zoom's is dead code too. Worth noting so it is notprioritized as a resource leak.
Describe the solution you'd like
Bring Teams to Zoom parity:
@apply(counter, ...)/@apply(timer, ...)from the method to the classso metrics actually emit.
timeoutto the Graph call and check the HTTP status; raise on errorrather than returning a body that fails downstream with
KeyError.exceptincreateso the real reason reaches theincident event log.
recordAutomatically/isPasscodeRequiredas booleans.configuring-microsoft-teams.mdxalongsideconfiguring-zoom.mdx.delete/add_participant/remove_participantfor interface parity(low priority — unused by callers).
Describe alternatives you've considered
Fixing only the metrics decorator. Rejected: the token logging and the missing
timeout are the changes with actual operator impact, and they sit in the same two
files.
Guarding against the
apply-on-a-method misuse insideapplyitself (raise whenhanded a non-class). Reasonable as a follow-up so the mistake cannot recur
silently, but it is a separate change from making Teams work.
Additional context
Line references are against
0fe79bda. Every claim above is verified againstsource except the boolean-vs-string Graph payload, which is inferred — it was
not tested against live Graph and needs a real tenant to confirm.