Matrix user IDs (MXIDs) contain colons (e.g. @alice:matrix.org) which
caused MatchAllowed to misinterpret them as canonical platform:id pairs.
The @ prefix in the allow_from entry is an explicit signal of a username
or MXID, not a platform:id separator.
Changes:
- Move isAtUsername check before the canonical parsing block
- Gate canonical parsing with !isAtUsername to skip it for @ entries
- Add direct match of full @-prefixed entry against PlatformID/Username
- Add test cases covering all Matrix allow_from formats from the issue
Fixes#2815
Introduce SenderInfo struct and pkg/identity package to standardize user
identification across all channels. Each channel now constructs structured
sender info (platform, platformID, canonicalID, username, displayName)
instead of ad-hoc string IDs. Allow-list matching supports all legacy
formats (numeric ID, @username, id|username) plus the new canonical
"platform:id" format. Session key resolution also handles canonical
peerIDs for backward-compatible identity link matching.