plugin email invitation: fixed create/simpleCreate + invitee_name:

- fixed invitationSimpleCreate signature
- fixed nicknames settings in create
- use async coroutines
- guest jid is now stored (as a string), avoiding the need to check profile to retrieve it
- invitee_name is now needed in invitationSimpleCreate
This commit is contained in:
Goffi 2020-08-13 23:46:18 +02:00
commit a8cb6e5a70

View file

@ -33,7 +33,7 @@ log = getLogger(__name__)
PLUGIN_INFO = {
C.PI_NAME: "Invitations",
C.PI_NAME: "Email Invitations",
C.PI_IMPORT_NAME: "EMAIL_INVITATION",
C.PI_TYPE: C.PLUG_TYPE_MISC,
C.PI_DEPENDENCIES: ['XEP-0077'],
@ -90,7 +90,7 @@ class InvitationsPlugin(object):
out_sign='a{sa{ss}}',
method=self._list,
async_=True)
host.bridge.addMethod("invitationSimpleCreate", ".plugin", in_sign='',
host.bridge.addMethod("invitationSimpleCreate", ".plugin", in_sign='sssss',
out_sign='a{ss}',
method=self._simpleCreate,
async_=True)
@ -125,15 +125,9 @@ class InvitationsPlugin(object):
value = locals()[key]
if value:
kwargs[key] = str(value)
d = self.create(**kwargs)
def serialize(data):
data[KEY_JID] = data[KEY_JID].full()
return data
d.addCallback(serialize)
return d
return defer.ensureDeferred(self.create(**kwargs))
@defer.inlineCallbacks
def create(self, **kwargs):
async def create(self, **kwargs):
r"""Create an invitation
This will create an XMPP account and a profile, and use a UUID to retrieve them.
@ -244,7 +238,7 @@ class InvitationsPlugin(object):
# we don't register account if there is no user as anonymous login is then
# used
try:
yield self.host.plugins['XEP-0077'].registerNewAccount(jid_, password)
await self.host.plugins['XEP-0077'].registerNewAccount(jid_, password)
except error.StanzaError as e:
prefix = jid_.user
idx = 0
@ -255,7 +249,7 @@ class InvitationsPlugin(object):
log.info(_("requested jid already exists, trying with {}".format(
jid_.full())))
try:
yield self.host.plugins['XEP-0077'].registerNewAccount(jid_,
await self.host.plugins['XEP-0077'].registerNewAccount(jid_,
password)
except error.StanzaError:
idx += 1
@ -270,11 +264,11 @@ class InvitationsPlugin(object):
extra[KEY_GUEST_PROFILE] = guest_profile = INVITEE_PROFILE_TPL.format(uuid=id_)
# profile creation should not fail as we generate unique name ourselves
yield self.host.memory.createProfile(guest_profile, password)
yield self.host.memory.startSession(password, guest_profile)
yield self.host.memory.setParam("JabberID", jid_.full(), "Connection",
await self.host.memory.createProfile(guest_profile, password)
await self.host.memory.startSession(password, guest_profile)
await self.host.memory.setParam("JabberID", jid_.full(), "Connection",
profile_key=guest_profile)
yield self.host.memory.setParam("Password", password, "Connection",
await self.host.memory.setParam("Password", password, "Connection",
profile_key=guest_profile)
name = kwargs.pop('name', None)
if name is not None:
@ -284,10 +278,10 @@ class InvitationsPlugin(object):
except KeyError:
pass
else:
yield defer.ensureDeferred(self.host.connect(guest_profile, password))
await self.host.connect(guest_profile, password)
guest_client = self.host.getClient(guest_profile)
yield id_plugin.setIdentity(guest_client, {'nick': name})
yield self.host.disconnect(guest_profile)
await id_plugin.setIdentity(guest_client, {'nicknames': [name]})
await self.host.disconnect(guest_profile)
## email
language = kwargs.pop('language', None)
@ -323,7 +317,7 @@ class InvitationsPlugin(object):
invite_url = url_template.format(**format_args)
format_args['url'] = invite_url
yield sat_email.sendEmail(
await sat_email.sendEmail(
self.host.memory.config,
[email] + emails_extra,
(kwargs.pop('message_subject', None) or DEFAULT_SUBJECT).format(
@ -331,31 +325,37 @@ class InvitationsPlugin(object):
(kwargs.pop('message_body', None) or DEFAULT_BODY).format(**format_args),
)
## extra data saving
self.invitations[id_] = extra
if kwargs:
log.warning(_("Not all arguments have been consumed: {}").format(kwargs))
extra[KEY_ID] = id_
extra[KEY_JID] = jid_
defer.returnValue(extra)
extra[KEY_JID] = jid_.full()
def _simpleCreate(self, invitee_email, url_template, extra_s, profile):
## extra data saving
self.invitations[id_] = extra
extra[KEY_ID] = id_
return extra
def _simpleCreate(self, invitee_email, invitee_name, url_template, extra_s, profile):
client = self.host.getClient(profile)
# FIXME: needed because python-dbus use a specific string class
invitee_email = str(invitee_email)
invitee_name = str(invitee_name)
url_template = str(url_template)
extra = data_format.deserialise(extra_s)
d = defer.ensureDeferred(
self.simpleCreate(client, invitee_email, url_template, extra)
self.simpleCreate(client, invitee_email, invitee_name, url_template, extra)
)
d.addCallback(lambda data: {k: str(v) for k,v in data.items()})
return d
async def simpleCreate(self, client, invitee_email, url_template, extra):
async def simpleCreate(
self, client, invitee_email, invitee_name, url_template, extra):
"""Simplified method to invite somebody by email"""
return await self.create(
name=invitee_name,
email=invitee_email,
url_template=url_template,
profile=client.profile,
@ -414,19 +414,18 @@ class InvitationsPlugin(object):
return d
def _list(self, profile=C.PROF_KEY_NONE):
return self.list(profile)
return defer.ensureDeferred(self.list(profile))
@defer.inlineCallbacks
def list(self, profile=C.PROF_KEY_NONE):
async def list(self, profile=C.PROF_KEY_NONE):
"""List invitations
@param profile(unicode): return invitation linked to this profile only
C.PROF_KEY_NONE: don't filter invitations
@return list(unicode): invitations uids
"""
invitations = yield self.invitations.all()
invitations = await self.invitations.all()
if profile != C.PROF_KEY_NONE:
invitations = {id_:data for id_, data in invitations.items()
if data.get('profile') == profile}
defer.returnValue(invitations)
return invitations