diff options
author | lovetox <philipp@hoerist.com> | 2020-04-05 16:32:06 +0300 |
---|---|---|
committer | lovetox <philipp@hoerist.com> | 2020-04-05 16:32:06 +0300 |
commit | 19d047e08a3e7cf3ac3e7a9d0c71637d8519ef78 (patch) | |
tree | cbbf7e0b7ab6e374eae6ba708b4886c7e998a527 | |
parent | 0100dc908360d9b58a1396fab55c9bedb41e25c9 (diff) |
MUC: Only force role/affiliation on presences
-rw-r--r-- | nbxmpp/modules/muc.py | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/nbxmpp/modules/muc.py b/nbxmpp/modules/muc.py index b9bd0e2..2a3d473 100644 --- a/nbxmpp/modules/muc.py +++ b/nbxmpp/modules/muc.py @@ -178,7 +178,8 @@ class MUC(BaseModule): muc_user = stanza.getTag('x', namespace=NS_MUC_USER) if muc_user is not None: try: - properties.muc_user = self._parse_muc_user(muc_user) + properties.muc_user = self._parse_muc_user(muc_user, + is_presence=False) except StanzaMalformed as error: self._log.warning(error) self._log.warning(stanza) @@ -540,7 +541,7 @@ class MUC(BaseModule): return CommonResult(jid=stanza.getFrom()) @staticmethod - def _parse_muc_user(muc_user): + def _parse_muc_user(muc_user, is_presence=True): item = muc_user.getTag('item') if item is None: return None @@ -548,22 +549,26 @@ class MUC(BaseModule): item_dict = item.getAttrs() role = item_dict.get('role') - if role is None: - raise StanzaMalformed('role attr missing') + if role is not None: + try: + role = Role(role) + except ValueError: + raise StanzaMalformed('invalid role %s' % role) - try: - role = Role(role) - except ValueError: - raise StanzaMalformed('invalid role %s' % role) + elif is_presence: + # role attr MUST be included in all presence broadcasts + raise StanzaMalformed('role attr missing') affiliation = item_dict.get('affiliation') - if affiliation is None: - raise StanzaMalformed('affiliation attr missing') + if affiliation is not None: + try: + affiliation = Affiliation(affiliation) + except ValueError: + raise StanzaMalformed('invalid affiliation %s' % affiliation) - try: - affiliation = Affiliation(affiliation) - except ValueError: - raise StanzaMalformed('invalid affiliation %s' % affiliation) + elif is_presence: + # affiliation attr MUST be included in all presence broadcasts + raise StanzaMalformed('affiliation attr missing') jid = item_dict.get('jid') if jid is not None: |