annotate sat/plugins/plugin_exp_invitation.py @ 4002:5245b675f7ad

plugin XEP-0313: don't wait for MAM to be retrieved in connection workflow: MAM retrieval can be long, and can be done after connection, message just need to be sorted when being inserted (i.e. frontends must do insort). To avoid blocking connection for too long and result in bad UX and timeout risk, one2one MAM message are not retrieved in background.
author Goffi <goffi@goffi.org>
date Fri, 10 Mar 2023 17:22:45 +0100
parents 3ef988734869
children 524856bd7b19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
3359
000b6722bd35 plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents: 3351
diff changeset
3 # SàT plugin to manage invitations
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3462
diff changeset
4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
19 from typing import Optional
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
20 from zope.interface import implementer
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
21 from twisted.internet import defer
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
22 from twisted.words.protocols.jabber import jid
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
23 from twisted.words.protocols.jabber.xmlstream import XMPPHandler
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
24 from wokkel import disco, iwokkel
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from sat.core.i18n import _
2243
5e12fc5ae52a plugin events: separation of event node and invitees node
Goffi <goffi@goffi.org>
parents: 2231
diff changeset
26 from sat.core import exceptions
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from sat.core.constants import Const as C
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from sat.core.log import getLogger
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
29 from sat.core.xmpp import SatXMPPEntity
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
30 from sat.tools import utils
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
31
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
32 log = getLogger(__name__)
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
33
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
34
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 PLUGIN_INFO = {
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
36 C.PI_NAME: "Invitation",
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
37 C.PI_IMPORT_NAME: "INVITATION",
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 C.PI_TYPE: "EXP",
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 C.PI_PROTOCOLS: [],
3781
e2a1ac1afb38 plugin invitation: use `store` hint to be sure that the invitation is archived
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
40 C.PI_DEPENDENCIES: ["XEP-0060", "XEP-0329", "XEP-0334", "LIST_INTEREST"],
3324
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
41 C.PI_RECOMMENDATIONS: ["EMAIL_INVITATION"],
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
42 C.PI_MAIN: "Invitation",
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
43 C.PI_HANDLER: "yes",
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
44 C.PI_DESCRIPTION: _("Experimental handling of invitations"),
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 }
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
46
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
47 NS_INVITATION = "https://salut-a-toi/protocol/invitation:0"
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
48 INVITATION = '/message/invitation[@xmlns="{ns_invit}"]'.format(
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
49 ns_invit=NS_INVITATION
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
50 )
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
51 NS_INVITATION_LIST = NS_INVITATION + "#list"
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
52
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
53
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
54 class Invitation(object):
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
55
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 def __init__(self, host):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
57 log.info(_("Invitation plugin initialization"))
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 self.host = host
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 self._p = self.host.plugins["XEP-0060"]
3781
e2a1ac1afb38 plugin invitation: use `store` hint to be sure that the invitation is archived
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
60 self._h = self.host.plugins["XEP-0334"]
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
61 # map from namespace of the invitation to callback handling it
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
62 self._ns_cb = {}
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
63
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
64 def getHandler(self, client):
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
65 return PubsubInvitationHandler(self)
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
66
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
67 def registerNamespace(self, namespace, callback):
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
68 """Register a callback for a namespace
2243
5e12fc5ae52a plugin events: separation of event node and invitees node
Goffi <goffi@goffi.org>
parents: 2231
diff changeset
69
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
70 @param namespace(unicode): namespace handled
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
71 @param callback(callbable): method handling the invitation
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
72 For pubsub invitation, it will be called with following arguments:
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
73 - client
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
74 - name(unicode, None): name of the event
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
75 - extra(dict): extra data
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
76 - service(jid.JID): pubsub service jid
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
77 - node(unicode): pubsub node
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
78 - item_id(unicode, None): pubsub item id
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
79 - item_elt(domish.Element): item of the invitation
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
80 For file sharing invitation, it will be called with following arguments:
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
81 - client
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
82 - name(unicode, None): name of the repository
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
83 - extra(dict): extra data
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
84 - service(jid.JID): service jid of the file repository
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
85 - repos_type(unicode): type of the repository, can be:
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
86 - files: generic file sharing
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
87 - photos: photos album
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
88 - namespace(unicode, None): namespace of the repository
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
89 - path(unicode, None): path of the repository
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
90 @raise exceptions.ConflictError: this namespace is already registered
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
91 """
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
92 if namespace in self._ns_cb:
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
93 raise exceptions.ConflictError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
94 "invitation namespace {namespace} is already register with {callback}"
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
95 .format(namespace=namespace, callback=self._ns_cb[namespace]))
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
96 self._ns_cb[namespace] = callback
2231
230fc5b609a8 plugin event: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
97
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
98 def _generateBaseInvitation(self, client, invitee_jid, name, extra):
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
99 """Generate common mess_data end invitation_elt
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
100
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
101 @param invitee_jid(jid.JID): entitee to send invitation to
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
102 @param name(unicode, None): name of the shared repository
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
103 @param extra(dict, None): extra data, where key can be:
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
104 - thumb_url: URL of a thumbnail
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
105 @return (tuple[dict, domish.Element): mess_data and invitation_elt
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
106 """
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
107 mess_data = {
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
108 "from": client.jid,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
109 "to": invitee_jid,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
110 "uid": "",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
111 "message": {},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
112 "type": C.MESS_TYPE_CHAT,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
113 "subject": {},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
114 "extra": {},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
115 }
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
116 client.generateMessageXML(mess_data)
3781
e2a1ac1afb38 plugin invitation: use `store` hint to be sure that the invitation is archived
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
117 self._h.addHintElements(mess_data["xml"], [self._h.HINT_STORE])
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
118 invitation_elt = mess_data["xml"].addElement("invitation", NS_INVITATION)
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
119 if name is not None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
120 invitation_elt["name"] = name
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
121 thumb_url = extra.get('thumb_url')
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
122 if thumb_url:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
123 if not thumb_url.startswith('http'):
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
124 log.warning(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
125 "only http URLs are allowed for thumbnails, got {url}, ignoring"
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
126 .format(url=thumb_url))
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
127 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
128 invitation_elt['thumb_url'] = thumb_url
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
129 return mess_data, invitation_elt
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
130
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
131 def sendPubsubInvitation(
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
132 self,
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
133 client: SatXMPPEntity,
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
134 invitee_jid: jid.JID,
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
135 service: jid.JID,
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
136 node: str,
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
137 item_id: Optional[str],
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
138 name: Optional[str],
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
139 extra: Optional[dict]
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
140 ) -> None:
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
141 """Send an pubsub invitation in a <message> stanza
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
142
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
143 @param invitee_jid: entitee to send invitation to
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
144 @param service: pubsub service
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
145 @param node: pubsub node
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
146 @param item_id: pubsub id
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
147 None when the invitation is for a whole node
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
148 @param name: see [_generateBaseInvitation]
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
149 @param extra: see [_generateBaseInvitation]
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
150 """
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
151 if extra is None:
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
152 extra = {}
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
153 mess_data, invitation_elt = self._generateBaseInvitation(
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
154 client, invitee_jid, name, extra)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
155 pubsub_elt = invitation_elt.addElement("pubsub")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
156 pubsub_elt["service"] = service.full()
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
157 pubsub_elt["node"] = node
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
158 if item_id is None:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
159 try:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
160 namespace = extra.pop("namespace")
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
161 except KeyError:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
162 raise exceptions.DataError('"namespace" key is missing in "extra" data')
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
163 node_data_elt = pubsub_elt.addElement("node_data")
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
164 node_data_elt["namespace"] = namespace
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
165 try:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
166 node_data_elt.addChild(extra["element"])
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
167 except KeyError:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
168 pass
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
169 else:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
170 pubsub_elt["item"] = item_id
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
171 if "element" in extra:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
172 invitation_elt.addChild(extra.pop("element"))
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
173 client.send(mess_data["xml"])
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
174
3324
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
175 async def sendFileSharingInvitation(
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
176 self, client, invitee_jid, service, repos_type=None, namespace=None, path=None,
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
177 name=None, extra=None
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
178 ):
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
179 """Send a file sharing invitation in a <message> stanza
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
180
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
181 @param invitee_jid(jid.JID): entitee to send invitation to
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
182 @param service(jid.JID): file sharing service
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
183 @param repos_type(unicode, None): type of files repository, can be:
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
184 - None, "files": files sharing
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
185 - "photos": photos album
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
186 @param namespace(unicode, None): namespace of the shared repository
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
187 @param path(unicode, None): path of the shared repository
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
188 @param name(unicode, None): see [_generateBaseInvitation]
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
189 @param extra(dict, None): see [_generateBaseInvitation]
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
190 """
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
191 if extra is None:
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
192 extra = {}
3350
cc6164a4973b plugin list of interests: normalize item ID + added `get` method
Goffi <goffi@goffi.org>
parents: 3324
diff changeset
193 li_plg = self.host.plugins["LIST_INTEREST"]
cc6164a4973b plugin list of interests: normalize item ID + added `get` method
Goffi <goffi@goffi.org>
parents: 3324
diff changeset
194 li_plg.normaliseFileSharingService(client, service)
3324
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
195
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
196 # FIXME: not the best place to adapt permission, but it's necessary to check them
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
197 # for UX
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
198 try:
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
199 await self.host.plugins['XEP-0329'].affiliationsSet(
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
200 client, service, namespace, path, {invitee_jid: "member"}
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
201 )
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
202 except Exception as e:
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
203 log.warning(f"Can't set affiliation: {e}")
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
204
3351
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
205 if "thumb_url" not in extra:
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
206 # we have no thumbnail, we check in our own list of interests if there is one
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
207 try:
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
208 item_id = li_plg.getFileSharingId(service, namespace, path)
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
209 own_interest = await li_plg.get(client, item_id)
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
210 except exceptions.NotFound:
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
211 log.debug(
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
212 "no thumbnail found for file sharing interest at "
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
213 f"[{service}/{namespace}]{path}"
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
214 )
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
215 else:
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
216 try:
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
217 extra['thumb_url'] = own_interest['thumb_url']
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
218 except KeyError:
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
219 pass
19bad15f4c0a plugin invitation: if "thumb_url" is not set, try to use one from list of interests
Goffi <goffi@goffi.org>
parents: 3350
diff changeset
220
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
221 mess_data, invitation_elt = self._generateBaseInvitation(
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
222 client, invitee_jid, name, extra)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
223 file_sharing_elt = invitation_elt.addElement("file_sharing")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
224 file_sharing_elt["service"] = service.full()
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
225 if repos_type is not None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
226 if repos_type not in ("files", "photos"):
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
227 msg = "unknown repository type: {repos_type}".format(
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
228 repos_type=repos_type)
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
229 log.warning(msg)
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
230 raise exceptions.DateError(msg)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
231 file_sharing_elt["type"] = repos_type
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
232 if namespace is not None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
233 file_sharing_elt["namespace"] = namespace
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
234 if path is not None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
235 file_sharing_elt["path"] = path
3324
b57b5e42e894 plugins invitation, invitation-file: adapt service JID and affiliation:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
236 client.send(mess_data["xml"])
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
237
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
238 async def _parsePubsubElt(self, client, pubsub_elt):
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
239 try:
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
240 service = jid.JID(pubsub_elt["service"])
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
241 node = pubsub_elt["node"]
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
242 except (RuntimeError, KeyError):
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
243 raise exceptions.DataError("Bad invitation, ignoring")
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
244
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
245 item_id = pubsub_elt.getAttribute("item")
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
246
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
247 if item_id is not None:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
248 try:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
249 items, metadata = await self._p.getItems(
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
250 client, service, node, item_ids=[item_id]
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
251 )
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
252 except Exception as e:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
253 log.warning(_("Can't get item linked with invitation: {reason}").format(
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
254 reason=e))
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
255 try:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
256 item_elt = items[0]
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
257 except IndexError:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
258 log.warning(_("Invitation was linking to a non existing item"))
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
259 raise exceptions.DataError
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
260
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
261 try:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
262 namespace = item_elt.firstChildElement().uri
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
263 except Exception as e:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
264 log.warning(_("Can't retrieve namespace of invitation: {reason}").format(
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
265 reason = e))
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
266 raise exceptions.DataError
2287
ea869f30f204 plugin events: added eventInvite command as a helper for the complex invitation workflow:
Goffi <goffi@goffi.org>
parents: 2272
diff changeset
267
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
268 args = [service, node, item_id, item_elt]
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
269 else:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
270 try:
3859
3ef988734869 core: fix calls to `domish.Element.elements`:
Goffi <goffi@goffi.org>
parents: 3781
diff changeset
271 node_data_elt = next(pubsub_elt.elements(NS_INVITATION, "node_data"))
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
272 except StopIteration:
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
273 raise exceptions.DataError("Bad invitation, ignoring")
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
274 namespace = node_data_elt['namespace']
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
275 args = [service, node, None, node_data_elt]
2287
ea869f30f204 plugin events: added eventInvite command as a helper for the complex invitation workflow:
Goffi <goffi@goffi.org>
parents: 2272
diff changeset
276
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
277 return namespace, args
2287
ea869f30f204 plugin events: added eventInvite command as a helper for the complex invitation workflow:
Goffi <goffi@goffi.org>
parents: 2272
diff changeset
278
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
279 async def _parseFileSharingElt(self, client, file_sharing_elt):
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
280 try:
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
281 service = jid.JID(file_sharing_elt["service"])
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
282 except (RuntimeError, KeyError):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
283 log.warning(_("Bad invitation, ignoring"))
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
284 raise exceptions.DataError
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
285 repos_type = file_sharing_elt.getAttribute("type", "files")
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
286 sharing_ns = file_sharing_elt.getAttribute("namespace")
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
287 path = file_sharing_elt.getAttribute("path")
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
288 args = [service, repos_type, sharing_ns, path]
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
289 ns_fis = self.host.getNamespace("fis")
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
290 return ns_fis, args
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
291
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
292 async def onInvitation(self, message_elt, client):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
293 log.debug("invitation received [{profile}]".format(profile=client.profile))
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
294 invitation_elt = message_elt.invitation
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
295
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
296 name = invitation_elt.getAttribute("name")
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
297 extra = {}
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
298 if invitation_elt.hasAttribute("thumb_url"):
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
299 extra['thumb_url'] = invitation_elt['thumb_url']
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
300
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
301 for elt in invitation_elt.elements():
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
302 if elt.uri != NS_INVITATION:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
303 log.warning("unexpected element: {xml}".format(xml=elt.toXml()))
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
304 continue
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
305 if elt.name == "pubsub":
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
306 method = self._parsePubsubElt
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
307 elif elt.name == "file_sharing":
2913
672e6be3290f plugins sharing invitation, invitation, list of interest: handle invitation to a file sharing repository
Goffi <goffi@goffi.org>
parents: 2912
diff changeset
308 method = self._parseFileSharingElt
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
309 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
310 log.warning("not implemented invitation element: {xml}".format(
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
311 xml = elt.toXml()))
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
312 continue
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
313 try:
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
314 namespace, args = await method(client, elt)
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
315 except exceptions.DataError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
316 log.warning("Can't parse invitation element: {xml}".format(
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
317 xml = elt.toXml()))
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
318 continue
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
319
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
320 try:
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
321 cb = self._ns_cb[namespace]
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
322 except KeyError:
2931
b256e90612d0 plugins invitation*, events: added an extra parameter and use it to keep a thumnail URL
Goffi <goffi@goffi.org>
parents: 2913
diff changeset
323 log.warning(_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
324 'No handler for namespace "{namespace}", invitation ignored')
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
325 .format(namespace=namespace))
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
326 else:
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
327 await utils.asDeferred(cb, client, namespace, name, extra, *args)
2287
ea869f30f204 plugin events: added eventInvite command as a helper for the complex invitation workflow:
Goffi <goffi@goffi.org>
parents: 2272
diff changeset
328
ea869f30f204 plugin events: added eventInvite command as a helper for the complex invitation workflow:
Goffi <goffi@goffi.org>
parents: 2272
diff changeset
329
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2941
diff changeset
330 @implementer(iwokkel.IDisco)
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
331 class PubsubInvitationHandler(XMPPHandler):
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
332
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
333 def __init__(self, plugin_parent):
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
334 self.plugin_parent = plugin_parent
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
335
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
336 def connectionInitialized(self):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
337 self.xmlstream.addObserver(
3462
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
338 INVITATION,
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
339 lambda message_elt: defer.ensureDeferred(
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
340 self.plugin_parent.onInvitation(message_elt, client=self.parent)
12dc234f698c plugin invitation: pubsub invitations:
Goffi <goffi@goffi.org>
parents: 3359
diff changeset
341 ),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
342 )
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
343
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
344 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
345 return [
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
346 disco.DiscoFeature(NS_INVITATION),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
347 ]
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
348
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2616
diff changeset
349 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
2616
1cc88adb5142 plugin events: invitations improvments + personal list
Goffi <goffi@goffi.org>
parents: 2612
diff changeset
350 return []