# HG changeset patch # User Goffi # Date 1596291843 -7200 # Node ID b57b5e42e894892a43b14edf98dab35fecb04900 # Parent 44a9438d66089f11b976aac24d46fbfb10c6e4d8 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. diff -r 44a9438d6608 -r b57b5e42e894 sat/plugins/plugin_exp_invitation.py --- a/sat/plugins/plugin_exp_invitation.py Sat Aug 01 16:19:50 2020 +0200 +++ b/sat/plugins/plugin_exp_invitation.py Sat Aug 01 16:24:03 2020 +0200 @@ -35,8 +35,8 @@ 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 @@ 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 stanza @param invitee_jid(jid.JID): entitee to send invitation to @@ -161,6 +163,22 @@ """ 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 @@ 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): diff -r 44a9438d6608 -r b57b5e42e894 sat/plugins/plugin_exp_invitation_file.py --- a/sat/plugins/plugin_exp_invitation_file.py Sat Aug 01 16:19:50 2020 +0200 +++ b/sat/plugins/plugin_exp_invitation_file.py Sat Aug 01 16:24:03 2020 +0200 @@ -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 @@ } -class FileSharingInvitation(object): +class FileSharingInvitation: def __init__(self, host): log.info(_("File Sharing Invitation plugin initialization")) @@ -53,6 +52,7 @@ in_sign="ssssssss", out_sign="", method=self._sendFileSharingInvitation, + async_=True ) def _sendFileSharingInvitation( @@ -62,10 +62,12 @@ 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":