plugins invitation, invitation-file: adapt service JID and affiliation:

if the user part of the service is missing while creating and invitation, it's added
because using only the domain will lead to a different repository depending on the
requester. In addition, the invitee is added to the repostiroy path as a member, to be
sure he/she can access it.
This commit is contained in:
Goffi 2020-08-01 16:24:03 +02:00
commit 9ee767d0cb
2 changed files with 32 additions and 12 deletions

View file

@ -35,8 +35,8 @@ PLUGIN_INFO = {
C.PI_IMPORT_NAME: "INVITATION",
C.PI_TYPE: "EXP",
C.PI_PROTOCOLS: [],
C.PI_DEPENDENCIES: ["XEP-0060", "XEP-0329"],
C.PI_RECOMMENDATIONS: [],
C.PI_DEPENDENCIES: ["XEP-0060", "XEP-0106", "XEP-0329"],
C.PI_RECOMMENDATIONS: ["EMAIL_INVITATION"],
C.PI_MAIN: "Invitation",
C.PI_HANDLER: "yes",
C.PI_DESCRIPTION: _("Experimental handling of invitations"),
@ -145,8 +145,10 @@ class Invitation(object):
pubsub_elt["item"] = item_id
return client.send(mess_data["xml"])
def sendFileSharingInvitation(self, client, invitee_jid, service, repos_type=None,
namespace=None, path=None, name=None, extra=None):
async def sendFileSharingInvitation(
self, client, invitee_jid, service, repos_type=None, namespace=None, path=None,
name=None, extra=None
):
"""Send a file sharing invitation in a <message> stanza
@param invitee_jid(jid.JID): entitee to send invitation to
@ -161,6 +163,22 @@ class Invitation(object):
"""
if extra is None:
extra = {}
# FIXME: Q&D fix as the bare file sharing service JID will lead to user own
# repository, which thus would not be the same for the host and the guest.
# By specifying the user part, we for the use of the host repository.
# A cleaner way should be implemented
if service.user is None:
service.user = self.host.plugins['XEP-0106'].escape(client.jid.user)
# FIXME: not the best place to adapt permission, but it's necessary to check them
# for UX
try:
await self.host.plugins['XEP-0329'].affiliationsSet(
client, service, namespace, path, {invitee_jid: "member"}
)
except Exception as e:
log.warning(f"Can't set affiliation: {e}")
mess_data, invitation_elt = self._generateBaseInvitation(
client, invitee_jid, name, extra)
file_sharing_elt = invitation_elt.addElement("file_sharing")
@ -176,7 +194,7 @@ class Invitation(object):
file_sharing_elt["namespace"] = namespace
if path is not None:
file_sharing_elt["path"] = path
return client.send(mess_data["xml"])
client.send(mess_data["xml"])
@defer.inlineCallbacks
def _parsePubsubElt(self, client, pubsub_elt):

View file

@ -1,7 +1,6 @@
#!/usr/bin/env python3
# SAT plugin to detect language (experimental)
# SàT plugin to send invitations for file sharing
# Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org)
# This program is free software: you can redistribute it and/or modify
@ -40,7 +39,7 @@ PLUGIN_INFO = {
}
class FileSharingInvitation(object):
class FileSharingInvitation:
def __init__(self, host):
log.info(_("File Sharing Invitation plugin initialization"))
@ -53,6 +52,7 @@ class FileSharingInvitation(object):
in_sign="ssssssss",
out_sign="",
method=self._sendFileSharingInvitation,
async_=True
)
def _sendFileSharingInvitation(
@ -62,10 +62,12 @@ class FileSharingInvitation(object):
invitee_jid = jid.JID(invitee_jid_s)
service = jid.JID(service_s)
extra = data_format.deserialise(extra_s)
return self.host.plugins["INVITATION"].sendFileSharingInvitation(
client, invitee_jid, service, repos_type=repos_type or None,
namespace=namespace or None, path=path or None, name=name or None,
extra=extra)
return defer.ensureDeferred(
self.host.plugins["INVITATION"].sendFileSharingInvitation(
client, invitee_jid, service, repos_type=repos_type or None,
namespace=namespace or None, path=path or None, name=name or None,
extra=extra)
)
def onInvitation(self, client, name, extra, service, repos_type, namespace, path):
if repos_type == "files":