component file sharing: add/parse affiliation when possible

This commit is contained in:
Goffi 2020-07-17 13:00:10 +02:00
commit d7844a98b4

View file

@ -23,7 +23,6 @@ from functools import partial
import shortuuid
import unicodedata
from urllib.parse import urljoin, urlparse, quote, unquote
from dataclasses import dataclass
from pathlib import Path
from sat.core.i18n import _
from sat.core.constants import Const as C
@ -69,6 +68,7 @@ PLUGIN_INFO = {
HASH_ALGO = "sha-256"
NS_COMMENTS = "org.salut-a-toi.comments"
NS_FS_AFFILIATION = "org.salut-a-toi.file-sharing-affiliation"
COMMENT_NODE_PREFIX = "org.salut-a-toi.file_comments/"
# Directory used to buffer request body (i.e. file in case of PUT) we use more than one @
# there, to be sure than it's not conflicting with a JID
@ -270,7 +270,7 @@ class FileSharingRequest(server.Request):
try:
upload_id, filename = self.upload_data
except exceptions.DataError as e:
log.warning("Invalid PUT request, we stop here: {e}")
log.warning(f"Invalid PUT request, we stop here: {e}")
return self.refuseRequest()
try:
client, upload_request, timer = self.file_sharing.expected_uploads.pop(upload_id)
@ -343,9 +343,15 @@ class FileSharing:
self.host.trigger.add(
"XEP-0234_fileSendingRequest", self._fileSendingRequestTrigger, priority=1000
)
self.host.trigger.add("XEP-0234_buildFileElement", self._addFileComments)
self.host.trigger.add("XEP-0234_parseFileElement", self._getFileComments)
self.host.trigger.add("XEP-0329_compGetFilesFromNode", self._addCommentsData)
self.host.trigger.add("XEP-0234_buildFileElement", self._addFileMetadataElts)
self.host.trigger.add("XEP-0234_parseFileElement", self._getFileMetadataElts)
self.host.trigger.add("XEP-0329_compGetFilesFromNode", self._addFileMetadata)
self.host.trigger.add(
"XEP-0329_compGetFilesFromNode_build_directory",
self._addDirectoryMetadataElts)
self.host.trigger.add(
"XEP-0329_parseResult_directory",
self._getDirectoryMetadataElts)
self.files_path = self.host.getLocalPath(None, C.FILES_DIR, profile=False)
self.http_port = self.host.memory.getConfig(
'component file_sharing', 'http_upload_port', 8888)
@ -353,19 +359,19 @@ class FileSharing:
'component file_sharing', 'http_upload_connection_type', 'https')
if connection_type not in ('http', 'https'):
raise exceptions.ConfigError(
f'bad http_upload_connection_type, you must use one of "http" or "https"'
'bad http_upload_connection_type, you must use one of "http" or "https"'
)
self.server = FileSharingSite(self)
self.expected_uploads = {}
if connection_type == 'http':
reactor.listenTCP(self.http_port, self.server)
else:
options = tls.getOptionsFromConfig(self.host.memory.config, "component file_sharing")
options = tls.getOptionsFromConfig(
self.host.memory.config, "component file_sharing")
tls.TLSOptionsCheck(options)
context_factory = tls.getTLSContextFactory(options)
reactor.listenSSL(self.http_port, self.server, context_factory)
def getHandler(self, client):
return Comments_handler(self)
@ -581,9 +587,15 @@ class FileSharing:
)
return slot
## comments triggers ##
## metadata triggers ##
def _addFileComments(self, file_elt, extra_args):
def _addFileMetadataElts(self, client, file_elt, extra_args):
# affiliation
affiliation = extra_args.get('affiliation')
if affiliation is not None:
file_elt.addElement((NS_FS_AFFILIATION, "affiliation"), content=affiliation)
# comments
try:
comments_url = extra_args.pop("comments_url")
except KeyError:
@ -599,16 +611,27 @@ class FileSharing:
comment_elt["count"] = str(count)
return True
def _getFileComments(self, file_elt, file_data):
def _getFileMetadataElts(self, client, file_elt, file_data):
# affiliation
try:
affiliation_elt = next(file_elt.elements(NS_FS_AFFILIATION, "affiliation"))
except StopIteration:
pass
else:
file_data["affiliation"] = str(affiliation_elt)
# comments
try:
comments_elt = next(file_elt.elements(NS_COMMENTS, "comments"))
except StopIteration:
return
file_data["comments_url"] = str(comments_elt)
file_data["comments_count"] = comments_elt["count"]
pass
else:
file_data["comments_url"] = str(comments_elt)
file_data["comments_count"] = comments_elt["count"]
return True
def _addCommentsData(self, client, iq_elt, owner, node_path, files_data):
def _addFileMetadata(
self, client, iq_elt, iq_result_elt, owner, node_path, files_data):
for file_data in files_data:
file_data["comments_url"] = uri.buildXMPPUri(
"pubsub",
@ -617,12 +640,30 @@ class FileSharing:
)
return True
def _addDirectoryMetadataElts(
self, client, file_data, directory_elt, owner, node_path):
affiliation = file_data.get('affiliation')
if affiliation is not None:
directory_elt.addElement(
(NS_FS_AFFILIATION, "affiliation"),
content=affiliation
)
def _getDirectoryMetadataElts(
self, client, elt, file_data):
try:
affiliation_elt = next(elt.elements((NS_FS_AFFILIATION, "affiliation")))
except StopIteration:
pass
else:
file_data['affiliation'] = str(affiliation_elt)
class Comments_handler(pubsub.PubSubService):
"""This class is a minimal Pubsub service handling virtual nodes for comments"""
def __init__(self, plugin_parent):
super(Comments_handler, self).__init__() # PubsubVirtualResource())
super(Comments_handler, self).__init__()
self.host = plugin_parent.host
self.plugin_parent = plugin_parent
self.discoIdentity = {