Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0191.py @ 3942:a92eef737703
plugin XEP-0373: download public keys if they are not found in local storage:
public keys were only obtained from PEP notifications, however this wasn't working if the
entity was not in our roster.
Now if no public key is retrieved from local storage, the public key node is requested,
and an error is raised if nothing is found. This allows the use of OX with entities which
are not in roster.
rel 380
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 15 Oct 2022 20:38:33 +0200 |
parents | 24fbc4cad534 |
children | 524856bd7b19 |
rev | line source |
---|---|
3787
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python3 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # Libervia plugin for XEP-0191 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # Copyright (C) 2009-2022 Jérôme Poisson (goffi@goffi.org) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 from typing import List, Set |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 from twisted.words.protocols.jabber import xmlstream, jid |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from twisted.words.xish import domish |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 from twisted.internet import defer |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from zope.interface import implementer |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from wokkel import disco, iwokkel |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 from sat.core.constants import Const as C |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from sat.core.i18n import _ |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from sat.core.log import getLogger |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 from sat.core.core_types import SatXMPPEntity |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 from sat.tools.utils import ensure_deferred |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 log = getLogger(__name__) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 PLUGIN_INFO = { |
3811
24fbc4cad534
plugin XEP-0191: fix wrong name and description
Goffi <goffi@goffi.org>
parents:
3787
diff
changeset
|
36 C.PI_NAME: "Blokcing Commands", |
3787
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 C.PI_IMPORT_NAME: "XEP-0191", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 C.PI_TYPE: C.PLUG_TYPE_XEP, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 C.PI_MODES: C.PLUG_MODE_BOTH, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 C.PI_PROTOCOLS: ["XEP-0191"], |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 C.PI_DEPENDENCIES: ["XEP-0060", "XEP-0376"], |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 C.PI_MAIN: "XEP_0191", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 C.PI_HANDLER: "yes", |
3811
24fbc4cad534
plugin XEP-0191: fix wrong name and description
Goffi <goffi@goffi.org>
parents:
3787
diff
changeset
|
44 C.PI_DESCRIPTION: _("""Implement the protocol to block users or whole domains"""), |
3787
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 } |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 NS_BLOCKING = "urn:xmpp:blocking" |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 IQ_BLOCK_PUSH = f'{C.IQ_SET}/block[@xmlns="{NS_BLOCKING}"]' |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 IQ_UNBLOCK_PUSH = f'{C.IQ_SET}/unblock[@xmlns="{NS_BLOCKING}"]' |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 class XEP_0191: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 def __init__(self, host): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 log.info(_("Blocking Command initialization")) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 host.registerNamespace("blocking", NS_BLOCKING) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 self.host = host |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 host.bridge.addMethod( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 "blockingList", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 ".plugin", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 in_sign="s", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 out_sign="as", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 method=self._blockList, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 async_=True, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 ) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 host.bridge.addMethod( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 "blockingBlock", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 ".plugin", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 in_sign="ass", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 out_sign="", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 method=self._block, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 async_=True, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 ) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 host.bridge.addMethod( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 "blockingUnblock", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 ".plugin", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 in_sign="ass", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 out_sign="", |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 method=self._unblock, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 async_=True, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 ) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 def getHandler(self, client): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 return XEP_0191_Handler(self) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 @ensure_deferred |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 async def _blockList( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 self, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 profile_key=C.PROF_KEY_NONE |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 ) -> List[str]: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 client = self.host.getClient(profile_key) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 blocked_jids = await self.blockList(client) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 return [j.full() for j in blocked_jids] |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 async def blockList(self, client: SatXMPPEntity) -> Set[jid.JID]: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 await self.host.checkFeature(client, NS_BLOCKING) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 iq_elt = client.IQ("get") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 iq_elt.addElement((NS_BLOCKING, "blocklist")) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 iq_result_elt = await iq_elt.send() |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 try: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 blocklist_elt = next(iq_result_elt.elements(NS_BLOCKING, "blocklist")) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 except StopIteration: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 log.warning(f"missing <blocklist> element: {iq_result_elt.toXml()}") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 return [] |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 blocked_jids = set() |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 for item_elt in blocklist_elt.elements(NS_BLOCKING, "item"): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 try: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 blocked_jid = jid.JID(item_elt["jid"]) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 except (RuntimeError, AttributeError): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 log.warning(f"Invalid <item> element in block list: {item_elt.toXml()}") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 else: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 blocked_jids.add(blocked_jid) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 return blocked_jids |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 def _block( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 self, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 entities: List[str], |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 profile_key: str = C.PROF_KEY_NONE |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 ) -> str: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 client = self.host.getClient(profile_key) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 return defer.ensureDeferred( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 self.block(client, [jid.JID(entity) for entity in entities]) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 ) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 async def block(self, client: SatXMPPEntity, entities: List[jid.JID]) -> None: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 await self.host.checkFeature(client, NS_BLOCKING) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 iq_elt = client.IQ("set") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
129 block_elt = iq_elt.addElement((NS_BLOCKING, "block")) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 for entity in entities: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 item_elt = block_elt.addElement("item") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 item_elt["jid"] = entity.full() |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 await iq_elt.send() |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 def _unblock( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 self, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 entities: List[str], |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 profile_key: str = C.PROF_KEY_NONE |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 ) -> None: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 client = self.host.getClient(profile_key) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 return defer.ensureDeferred( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 self.unblock(client, [jid.JID(e) for e in entities]) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 ) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 async def unblock(self, client: SatXMPPEntity, entities: List[jid.JID]) -> None: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 await self.host.checkFeature(client, NS_BLOCKING) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
147 iq_elt = client.IQ("set") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 unblock_elt = iq_elt.addElement((NS_BLOCKING, "unblock")) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
149 for entity in entities: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
150 item_elt = unblock_elt.addElement("item") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
151 item_elt["jid"] = entity.full() |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 await iq_elt.send() |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 def onBlockPush(self, iq_elt: domish.Element, client: SatXMPPEntity) -> None: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 # TODO: send notification to user |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 iq_elt.handled = True |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 for item_elt in iq_elt.block.elements(NS_BLOCKING, "item"): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 try: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 entity = jid.JID(item_elt["jid"]) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
160 except (KeyError, RuntimeError): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
161 log.warning(f"invalid item received in block push: {item_elt.toXml()}") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 else: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
163 log.info(f"{entity.full()} has been blocked for {client.profile}") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
165 client.send(iq_result_elt) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
167 def onUnblockPush(self, iq_elt: domish.Element, client: SatXMPPEntity) -> None: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 # TODO: send notification to user |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 iq_elt.handled = True |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
170 items = list(iq_elt.unblock.elements(NS_BLOCKING, "item")) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 if not items: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
172 log.info(f"All entities have been unblocked for {client.profile}") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 else: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
174 for item_elt in items: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
175 try: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 entity = jid.JID(item_elt["jid"]) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 except (KeyError, RuntimeError): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 log.warning( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 f"invalid item received in unblock push: {item_elt.toXml()}" |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 ) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 else: |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 log.info(f"{entity.full()} has been unblocked for {client.profile}") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
184 client.send(iq_result_elt) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
187 @implementer(iwokkel.IDisco) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 class XEP_0191_Handler(xmlstream.XMPPHandler): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 def __init__(self, plugin_parent: XEP_0191): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 self.plugin_parent = plugin_parent |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 def connectionInitialized(self): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 self.xmlstream.addObserver( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
195 IQ_BLOCK_PUSH, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 self.plugin_parent.onBlockPush, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
197 client=self.parent |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
198 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
199 ) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
200 self.xmlstream.addObserver( |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
201 IQ_UNBLOCK_PUSH, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
202 self.plugin_parent.onUnblockPush, |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
203 client=self.parent |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
204 ) |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
205 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
206 def getDiscoInfo(self, requestor, service, nodeIdentifier=""): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
207 return [disco.DiscoFeature(NS_BLOCKING)] |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
208 |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
209 def getDiscoItems(self, requestor, service, nodeIdentifier=""): |
f8a0f3b65371
plugin XEP-0191: Blocking Command implementation:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
210 return [] |