annotate libervia/backend/plugins/plugin_misc_email_invitation.py @ 4202:b26339343076

core: use a user specific directory for PID file: default location of pid file is now specific to logged user, this allow to run several instances of Libervia by different users on the same machine without PID conflicts.
author Goffi <goffi@goffi.org>
date Sun, 14 Jan 2024 17:48:02 +0100
parents 4b842c1fb686
children 0d7bb4df2343
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
3323
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
3 # SàT plugin for sending invitations by email
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3337
diff changeset
4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
19 import shortuuid
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
20 from typing import Optional
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
21 from twisted.internet import defer
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
22 from twisted.words.protocols.jabber import jid
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
23 from twisted.words.protocols.jabber import error
3337
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
24 from twisted.words.protocols.jabber import sasl
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
25 from libervia.backend.core.i18n import _, D_
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
26 from libervia.backend.core.constants import Const as C
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
27 from libervia.backend.core import exceptions
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
28 from libervia.backend.core.log import getLogger
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
29 from libervia.backend.tools import utils
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
30 from libervia.backend.tools.common import data_format
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
31 from libervia.backend.memory import persistent
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
32 from libervia.backend.tools.common import email as sat_email
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
33
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
34 log = getLogger(__name__)
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
35
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
36
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 PLUGIN_INFO = {
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
38 C.PI_NAME: "Email Invitations",
2912
a3faf1c86596 plugin events: refactored invitation and personal lists logic:
Goffi <goffi@goffi.org>
parents: 2909
diff changeset
39 C.PI_IMPORT_NAME: "EMAIL_INVITATION",
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 C.PI_TYPE: C.PLUG_TYPE_MISC,
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 C.PI_DEPENDENCIES: ['XEP-0077'],
2256
61e836cc9512 plugin invitations: name is now registered as nickname on XMPP server thanks to plugin identity
Goffi <goffi@goffi.org>
parents: 2255
diff changeset
42 C.PI_RECOMMENDATIONS: ["IDENTITY"],
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 C.PI_MAIN: "InvitationsPlugin",
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 C.PI_HANDLER: "no",
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
45 C.PI_DESCRIPTION: _("""invitation of people without XMPP account""")
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 }
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
47
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
48
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 SUFFIX_MAX = 5
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
50 INVITEE_PROFILE_TPL = "guest@@{uuid}"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
51 KEY_ID = 'id'
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
52 KEY_JID = 'jid'
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
53 KEY_CREATED = 'created'
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
54 KEY_LAST_CONNECTION = 'last_connection'
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
55 KEY_GUEST_PROFILE = 'guest_profile'
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
56 KEY_PASSWORD = 'password'
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
57 KEY_EMAILS_EXTRA = 'emails_extra'
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
58 EXTRA_RESERVED = {KEY_ID, KEY_JID, KEY_CREATED, 'jid_', 'jid', KEY_LAST_CONNECTION,
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
59 KEY_GUEST_PROFILE, KEY_PASSWORD, KEY_EMAILS_EXTRA}
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
60 DEFAULT_SUBJECT = D_("You have been invited by {host_name} to {app_name}")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
61 DEFAULT_BODY = D_("""Hello {name}!
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
62
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 You have received an invitation from {host_name} to participate to "{app_name}".
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 To join, you just have to click on the following URL:
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 {url}
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
66
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 Please note that this URL should not be shared with anybody!
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 If you want more details on {app_name}, you can check {app_url}.
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
69
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
70 Welcome!
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 """)
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
72
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
73
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 class InvitationsPlugin(object):
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
75
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 def __init__(self, host):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
77 log.info(_("plugin Invitations initialization"))
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
78 self.host = host
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
79 self.invitations = persistent.LazyPersistentBinaryDict('invitations')
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
80 host.bridge.add_method("invitation_create", ".plugin", in_sign='sasssssssssa{ss}s',
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
81 out_sign='a{ss}',
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
82 method=self._create,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
83 async_=True)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
84 host.bridge.add_method("invitation_get", ".plugin", in_sign='s', out_sign='a{ss}',
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
85 method=self.get,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
86 async_=True)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
87 host.bridge.add_method("invitation_delete", ".plugin", in_sign='s', out_sign='',
3337
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
88 method=self._delete,
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
89 async_=True)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
90 host.bridge.add_method("invitation_modify", ".plugin", in_sign='sa{ss}b',
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
91 out_sign='',
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
92 method=self._modify,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
93 async_=True)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
94 host.bridge.add_method("invitation_list", ".plugin", in_sign='s',
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
95 out_sign='a{sa{ss}}',
2230
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
96 method=self._list,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
97 async_=True)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
98 host.bridge.add_method("invitation_simple_create", ".plugin", in_sign='sssss',
3323
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
99 out_sign='a{ss}',
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
100 method=self._simple_create,
3323
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
101 async_=True)
2212
eaf2467d19ce plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents: 2211
diff changeset
102
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
103 def check_extra(self, extra):
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
104 if EXTRA_RESERVED.intersection(extra):
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
105 raise ValueError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
106 _("You can't use following key(s) in extra, they are reserved: {}")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
107 .format(', '.join(EXTRA_RESERVED.intersection(extra))))
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
108
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
109 def _create(self, email='', emails_extra=None, jid_='', password='', name='',
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
110 host_name='', language='', url_template='', message_subject='',
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
111 message_body='', extra=None, profile=''):
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
112 # XXX: we don't use **kwargs here to keep arguments name for introspection with
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
113 # D-Bus bridge
2291
c05000d00dbb plugin events, invitations + jp (event/create, invitation/invitee/invite): several emails addresses can now be specified for a single invitation:
Goffi <goffi@goffi.org>
parents: 2256
diff changeset
114 if emails_extra is None:
c05000d00dbb plugin events, invitations + jp (event/create, invitation/invitee/invite): several emails addresses can now be specified for a single invitation:
Goffi <goffi@goffi.org>
parents: 2256
diff changeset
115 emails_extra = []
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
116
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
117 if extra is None:
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 extra = {}
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
119 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
120 extra = {str(k): str(v) for k,v in extra.items()}
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
121
2291
c05000d00dbb plugin events, invitations + jp (event/create, invitation/invitee/invite): several emails addresses can now be specified for a single invitation:
Goffi <goffi@goffi.org>
parents: 2256
diff changeset
122 kwargs = {"extra": extra,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
123 KEY_EMAILS_EXTRA: [str(e) for e in emails_extra]
2291
c05000d00dbb plugin events, invitations + jp (event/create, invitation/invitee/invite): several emails addresses can now be specified for a single invitation:
Goffi <goffi@goffi.org>
parents: 2256
diff changeset
124 }
c05000d00dbb plugin events, invitations + jp (event/create, invitation/invitee/invite): several emails addresses can now be specified for a single invitation:
Goffi <goffi@goffi.org>
parents: 2256
diff changeset
125
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
126 # we need to be sure that values are unicode, else they won't be pickled correctly
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
127 # with D-Bus
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
128 for key in ("jid_", "password", "name", "host_name", "email", "language",
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
129 "url_template", "message_subject", "message_body", "profile"):
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 value = locals()[key]
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 if value:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
132 kwargs[key] = str(value)
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
133 return defer.ensureDeferred(self.create(**kwargs))
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
134
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
135 async def get_existing_invitation(self, email: Optional[str]) -> Optional[dict]:
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
136 """Retrieve existing invitation with given email
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
137
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
138 @param email: check if any invitation exist with this email
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
139 @return: first found invitation, or None if nothing found
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
140 """
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
141 # FIXME: This method is highly inefficient, it get all invitations and check them
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
142 # one by one, this is just a temporary way to avoid creating creating new accounts
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
143 # for an existing email. A better way will be available with Libervia 0.9.
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
144 # TODO: use a better way to check existing invitations
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
145
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
146 if email is None:
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
147 return None
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
148 all_invitations = await self.invitations.all()
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
149 for id_, invitation in all_invitations.items():
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
150 if invitation.get("email") == email:
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
151 invitation[KEY_ID] = id_
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
152 return invitation
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
153
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
154 async def _create_account_and_profile(
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
155 self,
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
156 id_: str,
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
157 kwargs: dict,
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
158 extra: dict
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
159 ) -> None:
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
160 """Create XMPP account and Libervia profile for guest"""
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
161 ## XMPP account creation
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
162 password = kwargs.pop('password', None)
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
163 if password is None:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
164 password = utils.generate_password()
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
165 assert password
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
166 # XXX: password is here saved in clear in database
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
167 # it is needed for invitation as the same password is used for profile
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
168 # and SàT need to be able to automatically open the profile with the uuid
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
169 # FIXME: we could add an extra encryption key which would be used with the
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
170 # uuid when the invitee is connecting (e.g. with URL). This key would
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
171 # not be saved and could be used to encrypt profile password.
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
172 extra[KEY_PASSWORD] = password
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
173
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
174 jid_ = kwargs.pop('jid_', None)
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
175 if not jid_:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
176 domain = self.host.memory.config_get(None, 'xmpp_domain')
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
177 if not domain:
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
178 # TODO: fallback to profile's domain
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
179 raise ValueError(_("You need to specify xmpp_domain in sat.conf"))
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
180 jid_ = "invitation-{uuid}@{domain}".format(uuid=shortuuid.uuid(),
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
181 domain=domain)
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
182 jid_ = jid.JID(jid_)
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
183 extra[KEY_JID] = jid_.full()
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
184
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
185 if jid_.user:
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
186 # we don't register account if there is no user as anonymous login is then
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
187 # used
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
188 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
189 await self.host.plugins['XEP-0077'].register_new_account(jid_, password)
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
190 except error.StanzaError as e:
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
191 prefix = jid_.user
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
192 idx = 0
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
193 while e.condition == 'conflict':
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
194 if idx >= SUFFIX_MAX:
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
195 raise exceptions.ConflictError(_("Can't create XMPP account"))
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
196 jid_.user = prefix + '_' + str(idx)
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
197 log.info(_("requested jid already exists, trying with {}".format(
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
198 jid_.full())))
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
199 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
200 await self.host.plugins['XEP-0077'].register_new_account(
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
201 jid_,
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
202 password
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
203 )
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
204 except error.StanzaError:
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
205 idx += 1
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
206 else:
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
207 break
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
208 if e.condition != 'conflict':
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
209 raise e
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
210
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
211 log.info(_("account {jid_} created").format(jid_=jid_.full()))
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
212
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
213 ## profile creation
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
214
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
215 extra[KEY_GUEST_PROFILE] = guest_profile = INVITEE_PROFILE_TPL.format(
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
216 uuid=id_
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
217 )
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
218 # profile creation should not fail as we generate unique name ourselves
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
219 await self.host.memory.create_profile(guest_profile, password)
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
220 await self.host.memory.start_session(password, guest_profile)
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
221 await self.host.memory.param_set("JabberID", jid_.full(), "Connection",
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
222 profile_key=guest_profile)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
223 await self.host.memory.param_set("Password", password, "Connection",
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
224 profile_key=guest_profile)
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
225
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
226 async def create(self, **kwargs):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
227 r"""Create an invitation
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
228
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
229 This will create an XMPP account and a profile, and use a UUID to retrieve them.
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
230 The profile is automatically generated in the form guest@@[UUID], this way they
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
231 can be retrieved easily
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
232 **kwargs: keywords arguments which can have the following keys, unset values are
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
233 equivalent to None:
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
234 jid_(jid.JID, None): jid to use for invitation, the jid will be created using
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
235 XEP-0077
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
236 if the jid has no user part, an anonymous account will be used (no XMPP
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
237 account created in this case)
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
238 if None, automatically generate an account name (in the form
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
239 "invitation-[random UUID]@domain.tld") (note that this UUID is not the
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
240 same as the invitation one, as jid can be used publicly (leaking the
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
241 UUID), and invitation UUID give access to account.
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
242 in case of conflict, a suffix number is added to the account until a free
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
243 one if found (with a failure if SUFFIX_MAX is reached)
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
244 password(unicode, None): password to use (will be used for XMPP account and
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
245 profile)
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
246 None to automatically generate one
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
247 name(unicode, None): name of the invitee
2256
61e836cc9512 plugin invitations: name is now registered as nickname on XMPP server thanks to plugin identity
Goffi <goffi@goffi.org>
parents: 2255
diff changeset
248 will be set as profile identity if present
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
249 host_name(unicode, None): name of the host
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
250 email(unicode, None): email to send the invitation to
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
251 if None, no invitation email is sent, you can still associate email using
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
252 extra
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
253 if email is used, extra can't have "email" key
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
254 language(unicode): language of the invitee (used notabily to translate the
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
255 invitation)
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
256 TODO: not used yet
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
257 url_template(unicode, None): template to use to construct the invitation URL
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
258 use {uuid} as a placeholder for identifier
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
259 use None if you don't want to include URL (or if it is already specified
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
260 in custom message)
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
261 /!\ you must put full URL, don't forget https://
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
262 /!\ the URL will give access to the invitee account, you should warn in
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
263 message to not publish it publicly
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
264 message_subject(unicode, None): customised message body for the invitation
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
265 email
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
266 None to use default subject
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
267 uses the same substitution as for message_body
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
268 message_body(unicode, None): customised message body for the invitation email
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
269 None to use default body
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
270 use {name} as a place holder for invitee name
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
271 use {url} as a placeholder for the invitation url
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
272 use {uuid} as a placeholder for the identifier
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
273 use {app_name} as a placeholder for this software name
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
274 use {app_url} as a placeholder for this software official website
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
275 use {profile} as a placeholder for host's profile
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
276 use {host_name} as a placeholder for host's name
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
277 extra(dict, None): extra data to associate with the invitee
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
278 some keys are reserved:
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
279 - created (creation date)
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
280 if email argument is used, "email" key can't be used
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
281 profile(unicode, None): profile of the host (person who is inviting)
2211
df115e4a36c7 plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents: 2210
diff changeset
282 @return (dict[unicode, unicode]): dictionary with:
df115e4a36c7 plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents: 2210
diff changeset
283 - UUID associated with the invitee (key: id)
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
284 - filled extra dictionary, as saved in the databae
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
285 """
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
286 ## initial checks
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
287 extra = kwargs.pop('extra', {})
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
288 if set(kwargs).intersection(extra):
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
289 raise ValueError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
290 _("You can't use following key(s) in both args and extra: {}").format(
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
291 ', '.join(set(kwargs).intersection(extra))))
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
292
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
293 self.check_extra(extra)
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
294
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
295 email = kwargs.pop('email', None)
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
296
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
297 existing = await self.get_existing_invitation(email)
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
298 if existing is not None:
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
299 log.info(f"There is already an invitation for {email!r}")
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
300 extra.update(existing)
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
301 del extra[KEY_ID]
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
302
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
303 emails_extra = kwargs.pop('emails_extra', [])
2291
c05000d00dbb plugin events, invitations + jp (event/create, invitation/invitee/invite): several emails addresses can now be specified for a single invitation:
Goffi <goffi@goffi.org>
parents: 2256
diff changeset
304 if not email and emails_extra:
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
305 raise ValueError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
306 _('You need to provide a main email address before using emails_extra'))
2255
ba613d32ca60 plugin invitations: doesn't raise an exception anymore if url_template is not set while email is not requested
Goffi <goffi@goffi.org>
parents: 2241
diff changeset
307
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
308 if (email is not None
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
309 and not 'url_template' in kwargs
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
310 and not 'message_body' in kwargs):
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
311 raise ValueError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
312 _("You need to provide url_template if you use default message body"))
2210
f8d61592f1fc plugin invitations: raise ValueError if url_template and message_body are both not specified
Goffi <goffi@goffi.org>
parents: 2208
diff changeset
313
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
314 ## uuid
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
315 log.info(_("creating an invitation"))
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
316 id_ = existing[KEY_ID] if existing else str(shortuuid.uuid())
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
317
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
318 if existing is None:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
319 await self._create_account_and_profile(id_, kwargs, extra)
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
320
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
321 profile = kwargs.pop('profile', None)
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
322 guest_profile = extra[KEY_GUEST_PROFILE]
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
323 jid_ = jid.JID(extra[KEY_JID])
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
324
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
325 ## identity
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
326 name = kwargs.pop('name', None)
3700
cfc06915de15 plugin email invitations: re-use existing invitation for a given email:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
327 password = extra[KEY_PASSWORD]
2256
61e836cc9512 plugin invitations: name is now registered as nickname on XMPP server thanks to plugin identity
Goffi <goffi@goffi.org>
parents: 2255
diff changeset
328 if name is not None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
329 extra['name'] = name
2256
61e836cc9512 plugin invitations: name is now registered as nickname on XMPP server thanks to plugin identity
Goffi <goffi@goffi.org>
parents: 2255
diff changeset
330 try:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
331 id_plugin = self.host.plugins['IDENTITY']
2256
61e836cc9512 plugin invitations: name is now registered as nickname on XMPP server thanks to plugin identity
Goffi <goffi@goffi.org>
parents: 2255
diff changeset
332 except KeyError:
61e836cc9512 plugin invitations: name is now registered as nickname on XMPP server thanks to plugin identity
Goffi <goffi@goffi.org>
parents: 2255
diff changeset
333 pass
61e836cc9512 plugin invitations: name is now registered as nickname on XMPP server thanks to plugin identity
Goffi <goffi@goffi.org>
parents: 2255
diff changeset
334 else:
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
335 await self.host.connect(guest_profile, password)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
336 guest_client = self.host.get_client(guest_profile)
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
337 await id_plugin.set_identity(guest_client, {'nicknames': [name]})
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
338 await self.host.disconnect(guest_profile)
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
339
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
340 ## email
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
341 language = kwargs.pop('language', None)
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
342 if language is not None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
343 extra['language'] = language.strip()
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
344
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
345 if email is not None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
346 extra['email'] = email
2291
c05000d00dbb plugin events, invitations + jp (event/create, invitation/invitee/invite): several emails addresses can now be specified for a single invitation:
Goffi <goffi@goffi.org>
parents: 2256
diff changeset
347 data_format.iter2dict(KEY_EMAILS_EXTRA, extra)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
348 url_template = kwargs.pop('url_template', '')
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
349 format_args = {
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
350 'uuid': id_,
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
351 'app_name': C.APP_NAME,
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
352 'app_url': C.APP_URL}
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
353
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
354 if name is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
355 format_args['name'] = email
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
356 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
357 format_args['name'] = name
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
358
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
359 if profile is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
360 format_args['profile'] = ''
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
361 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
362 format_args['profile'] = extra['profile'] = profile
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
363
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
364 host_name = kwargs.pop('host_name', None)
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
365 if host_name is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
366 format_args['host_name'] = profile or _("somebody")
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
367 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
368 format_args['host_name'] = extra['host_name'] = host_name
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
369
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
370 invite_url = url_template.format(**format_args)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
371 format_args['url'] = invite_url
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
372
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
373 await sat_email.send_email(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
374 self.host.memory.config,
2291
c05000d00dbb plugin events, invitations + jp (event/create, invitation/invitee/invite): several emails addresses can now be specified for a single invitation:
Goffi <goffi@goffi.org>
parents: 2256
diff changeset
375 [email] + emails_extra,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
376 (kwargs.pop('message_subject', None) or DEFAULT_SUBJECT).format(
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
377 **format_args),
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
378 (kwargs.pop('message_body', None) or DEFAULT_BODY).format(**format_args),
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
379 )
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
380
3336
e38ddaf477bd plugin email invitation: guests are now automatically added to host roster in `guests` group
Goffi <goffi@goffi.org>
parents: 3335
diff changeset
381 ## roster
e38ddaf477bd plugin email invitation: guests are now automatically added to host roster in `guests` group
Goffi <goffi@goffi.org>
parents: 3335
diff changeset
382
e38ddaf477bd plugin email invitation: guests are now automatically added to host roster in `guests` group
Goffi <goffi@goffi.org>
parents: 3335
diff changeset
383 # we automatically add guest to host roster (if host is specified)
e38ddaf477bd plugin email invitation: guests are now automatically added to host roster in `guests` group
Goffi <goffi@goffi.org>
parents: 3335
diff changeset
384 # FIXME: a parameter to disable auto roster adding would be nice
e38ddaf477bd plugin email invitation: guests are now automatically added to host roster in `guests` group
Goffi <goffi@goffi.org>
parents: 3335
diff changeset
385 if profile is not None:
e38ddaf477bd plugin email invitation: guests are now automatically added to host roster in `guests` group
Goffi <goffi@goffi.org>
parents: 3335
diff changeset
386 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
387 client = self.host.get_client(profile)
3336
e38ddaf477bd plugin email invitation: guests are now automatically added to host roster in `guests` group
Goffi <goffi@goffi.org>
parents: 3335
diff changeset
388 except Exception as e:
e38ddaf477bd plugin email invitation: guests are now automatically added to host roster in `guests` group
Goffi <goffi@goffi.org>
parents: 3335
diff changeset
389 log.error(f"Can't get host profile: {profile}: {e}")
e38ddaf477bd plugin email invitation: guests are now automatically added to host roster in `guests` group
Goffi <goffi@goffi.org>
parents: 3335
diff changeset
390 else:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
391 await self.host.contact_update(client, jid_, name, ['guests'])
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
392
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
393 if kwargs:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
394 log.warning(_("Not all arguments have been consumed: {}").format(kwargs))
2184
e0f91efa404a plugin invitations: first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
395
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
396 ## extra data saving
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
397 self.invitations[id_] = extra
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
398
2211
df115e4a36c7 plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents: 2210
diff changeset
399 extra[KEY_ID] = id_
2212
eaf2467d19ce plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents: 2211
diff changeset
400
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
401 return extra
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
402
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
403 def _simple_create(self, invitee_email, invitee_name, url_template, extra_s, profile):
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
404 client = self.host.get_client(profile)
3323
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
405 # FIXME: needed because python-dbus use a specific string class
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
406 invitee_email = str(invitee_email)
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
407 invitee_name = str(invitee_name)
3323
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
408 url_template = str(url_template)
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
409 extra = data_format.deserialise(extra_s)
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
410 d = defer.ensureDeferred(
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
411 self.simple_create(client, invitee_email, invitee_name, url_template, extra)
3323
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
412 )
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
413 d.addCallback(lambda data: {k: str(v) for k,v in data.items()})
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
414 return d
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
415
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
416 async def simple_create(
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
417 self, client, invitee_email, invitee_name, url_template, extra):
3323
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
418 """Simplified method to invite somebody by email"""
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
419 return await self.create(
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
420 name=invitee_name,
3323
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
421 email=invitee_email,
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
422 url_template=url_template,
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
423 profile=client.profile,
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
424 )
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
425
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
426 def get(self, id_):
2212
eaf2467d19ce plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents: 2211
diff changeset
427 """Retrieve invitation linked to uuid if it exists
eaf2467d19ce plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents: 2211
diff changeset
428
eaf2467d19ce plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents: 2211
diff changeset
429 @param id_(unicode): UUID linked to an invitation
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
430 @return (dict[unicode, unicode]): data associated to the invitation
2212
eaf2467d19ce plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents: 2211
diff changeset
431 @raise KeyError: there is not invitation with this id_
eaf2467d19ce plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents: 2211
diff changeset
432 """
eaf2467d19ce plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents: 2211
diff changeset
433 return self.invitations[id_]
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
434
3337
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
435 def _delete(self, id_):
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
436 return defer.ensureDeferred(self.delete(id_))
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
437
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
438 async def delete(self, id_):
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
439 """Delete an invitation data and associated XMPP account"""
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
440 log.info(f"deleting invitation {id_}")
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
441 data = await self.get(id_)
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
442 guest_profile = data['guest_profile']
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
443 password = data['password']
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
444 try:
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
445 await self.host.connect(guest_profile, password)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
446 guest_client = self.host.get_client(guest_profile)
3337
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
447 # XXX: be extra careful to use guest_client and not client below, as this will
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
448 # delete the associated XMPP account
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
449 log.debug("deleting XMPP account")
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
450 await self.host.plugins['XEP-0077'].unregister(guest_client, None)
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
451 except (error.StanzaError, sasl.SASLAuthError) as e:
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
452 log.warning(
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
453 f"Can't delete {guest_profile}'s XMPP account, maybe it as already been "
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
454 f"deleted: {e}")
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
455 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
456 await self.host.memory.profile_delete_async(guest_profile, True)
3337
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
457 except Exception as e:
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
458 log.warning(f"Can't delete guest profile {guest_profile}: {e}")
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
459 log.debug("removing guest data")
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
460 await self.invitations.adel(id_)
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
461 log.info(f"{id_} invitation has been deleted")
932cf08dfdc3 plugin email invitation: new `invitationDelete` method
Goffi <goffi@goffi.org>
parents: 3336
diff changeset
462
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
463 def _modify(self, id_, new_extra, replace):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
464 return self.modify(id_, {str(k): str(v) for k,v in new_extra.items()},
2909
90146552cde5 core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
465 replace)
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
466
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
467 def modify(self, id_, new_extra, replace=False):
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
468 """Modify invitation data
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
469
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
470 @param id_(unicode): UUID linked to an invitation
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
471 @param new_extra(dict[unicode, unicode]): data to update
2241
f87b673c7d17 plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents: 2230
diff changeset
472 empty values will be deleted if replace is True
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
473 @param replace(bool): if True replace the data
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
474 else update them
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
475 @raise KeyError: there is not invitation with this id_
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
476 """
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
477 self.check_extra(new_extra)
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
478 def got_current_data(current_data):
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
479 if replace:
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
480 new_data = new_extra
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
481 for k in EXTRA_RESERVED:
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
482 try:
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
483 new_data[k] = current_data[k]
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
484 except KeyError:
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
485 continue
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
486 else:
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
487 new_data = current_data
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
488 for k,v in new_extra.items():
2241
f87b673c7d17 plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents: 2230
diff changeset
489 if k in EXTRA_RESERVED:
3323
44a9438d6608 plugin email invitation: simple invitation creation
Goffi <goffi@goffi.org>
parents: 3253
diff changeset
490 log.warning(_("Skipping reserved key {key}").format(key=k))
2241
f87b673c7d17 plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents: 2230
diff changeset
491 continue
f87b673c7d17 plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents: 2230
diff changeset
492 if v:
f87b673c7d17 plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents: 2230
diff changeset
493 new_data[k] = v
f87b673c7d17 plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents: 2230
diff changeset
494 else:
f87b673c7d17 plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents: 2230
diff changeset
495 try:
f87b673c7d17 plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents: 2230
diff changeset
496 del new_data[k]
f87b673c7d17 plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents: 2230
diff changeset
497 except KeyError:
f87b673c7d17 plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents: 2230
diff changeset
498 pass
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
499
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
500 self.invitations[id_] = new_data
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
501
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
502 d = self.invitations[id_]
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3700
diff changeset
503 d.addCallback(got_current_data)
2219
77a3d0a28642 plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents: 2212
diff changeset
504 return d
2230
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
505
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
506 def _list(self, profile=C.PROF_KEY_NONE):
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
507 return defer.ensureDeferred(self.list(profile))
2230
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
508
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
509 async def list(self, profile=C.PROF_KEY_NONE):
2230
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
510 """List invitations
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
511
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
512 @param profile(unicode): return invitation linked to this profile only
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
513 C.PROF_KEY_NONE: don't filter invitations
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
514 @return list(unicode): invitations uids
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
515 """
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
516 invitations = await self.invitations.all()
2230
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
517 if profile != C.PROF_KEY_NONE:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
518 invitations = {id_:data for id_, data in invitations.items()
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3007
diff changeset
519 if data.get('profile') == profile}
2230
ebc0c1701811 plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents: 2223
diff changeset
520
3335
83bc9d46a417 plugin email invitation: fixed create/simpleCreate + invitee_name:
Goffi <goffi@goffi.org>
parents: 3323
diff changeset
521 return invitations