component AP gateway: handle attachments
This commit is contained in:
parent
072f0cc723
commit
c3f97ec712
1 changed files with 168 additions and 97 deletions
|
|
@ -267,7 +267,7 @@ class XEP_0447:
|
|||
@return: file-sharing data. It a dict whose keys correspond to
|
||||
[get_file_sharing_elt] parameters
|
||||
"""
|
||||
if file_sharing_elt.name != "file-sharing":
|
||||
if file_sharing_elt.name != "file-sharing" or file_sharing_elt.uri != NS_SFS:
|
||||
try:
|
||||
file_sharing_elt = next(
|
||||
file_sharing_elt.elements(NS_SFS, "file-sharing")
|
||||
|
|
@ -295,31 +295,30 @@ class XEP_0447:
|
|||
data: Dict[str, Any]
|
||||
) -> Dict[str, Any]:
|
||||
"""Check <message> for a shared file, and add it as an attachment"""
|
||||
# XXX: XEP-0447 doesn't support several attachments in a single message, thus only
|
||||
# one attachment can be added
|
||||
try:
|
||||
# XXX: XEP-0447 doesn't support several attachments in a single message, for now
|
||||
# however that should be fixed in future version, and so we accept several
|
||||
# <file-sharing> element in a message.
|
||||
for file_sharing_elt in message_elt.elements(NS_SFS, "file-sharing"):
|
||||
attachment = self.parse_file_sharing_elt(message_elt)
|
||||
except exceptions.NotFound:
|
||||
return data
|
||||
|
||||
if any(
|
||||
s.get(C.MESS_KEY_ENCRYPTED, False)
|
||||
for s in attachment["sources"]
|
||||
) and client.encryption.isEncrypted(data):
|
||||
# we don't add the encrypted flag if the message itself is not encrypted,
|
||||
# because the decryption key is part of the link, so sending it over
|
||||
# unencrypted channel is like having no encryption at all.
|
||||
attachment[C.MESS_KEY_ENCRYPTED] = True
|
||||
if any(
|
||||
s.get(C.MESS_KEY_ENCRYPTED, False)
|
||||
for s in attachment["sources"]
|
||||
) and client.encryption.isEncrypted(data):
|
||||
# we don't add the encrypted flag if the message itself is not encrypted,
|
||||
# because the decryption key is part of the link, so sending it over
|
||||
# unencrypted channel is like having no encryption at all.
|
||||
attachment[C.MESS_KEY_ENCRYPTED] = True
|
||||
|
||||
attachments = data['extra'].setdefault(C.MESS_KEY_ATTACHMENTS, [])
|
||||
attachments.append(attachment)
|
||||
attachments = data['extra'].setdefault(C.KEY_ATTACHMENTS, [])
|
||||
attachments.append(attachment)
|
||||
|
||||
return data
|
||||
|
||||
async def attach(self, client, data):
|
||||
# XXX: for now, XEP-0447 only allow to send one file per <message/>, thus we need
|
||||
# to send each file in a separate message
|
||||
attachments = data["extra"][C.MESS_KEY_ATTACHMENTS]
|
||||
attachments = data["extra"][C.KEY_ATTACHMENTS]
|
||||
if not data['message'] or data['message'] == {'': ''}:
|
||||
extra_attachments = attachments[1:]
|
||||
del attachments[1:]
|
||||
|
|
@ -327,7 +326,7 @@ class XEP_0447:
|
|||
# we have a message, we must send first attachment separately
|
||||
extra_attachments = attachments[:]
|
||||
attachments.clear()
|
||||
del data["extra"][C.MESS_KEY_ATTACHMENTS]
|
||||
del data["extra"][C.KEY_ATTACHMENTS]
|
||||
|
||||
if attachments:
|
||||
if len(attachments) > 1:
|
||||
|
|
@ -343,8 +342,10 @@ class XEP_0447:
|
|||
file_hash = None
|
||||
file_sharing_elt = self.get_file_sharing_elt(
|
||||
[{"url": attachment["url"]}],
|
||||
name=attachment["name"],
|
||||
size=attachment["size"],
|
||||
name=attachment.get("name"),
|
||||
size=attachment.get("size"),
|
||||
desc=attachment.get("desc"),
|
||||
media_type=attachment.get("media_type"),
|
||||
file_hash=file_hash
|
||||
)
|
||||
data["xml"].addChild(file_sharing_elt)
|
||||
|
|
@ -356,7 +357,7 @@ class XEP_0447:
|
|||
message={'': ''},
|
||||
subject=data['subject'],
|
||||
mess_type=data['type'],
|
||||
extra={C.MESS_KEY_ATTACHMENTS: [attachment]},
|
||||
extra={C.KEY_ATTACHMENTS: [attachment]},
|
||||
)
|
||||
|
||||
if ((not data['extra']
|
||||
|
|
|
|||
Loading…
Reference in a new issue