plugin XEP-0447: handle attachment and download:

- plugin XEP-0447 can now be used in message attachments and to retrieve an attachment
- plugin attach: `attachment` being processed is added to `extra` so the handler can inspect it
- plugin attach: `size` is added to attachment
- plugin download: a whole attachment dict is now used in `download` and
  `file_download`/`file_download_complete`. `download_uri` can be used as a shortcut when
  just a URI is used. In addition to URI scheme handler, whole attachment handlers can now
  be registered with `register_download_handler`
- plugin XEP-0363: `file_http_upload` `XEP-0363_upload_size` triggers have been renamed to
  `XEP-0363_upload_pre_slot` and is now using a dict with arguments, allowing for the size
  but also the filename to be modified, which is necessary for encryption (filename may
  be hidden from URL this way).
- plugin XEP-0446: fix wrong element name
- plugin XEP-0447: source handler can now be registered (`url-data` is registered by
  default)
- plugin XEP-0447: source parsing has been put in a separated `parse_sources_elt` method,
  as it may be useful to do it independently (notably with XEP-0448)
- plugin XEP-0447: parse received message and complete attachments when suitable
- plugin XEP-0447: can now be used with message attachments
- plugin XEP-0447: can now be used with attachments download
- renamed `options` arguments to `extra` for consistency
- some style change (progressive move from legacy camelCase to PEP8 snake_case)
- some typing

rel 379
This commit is contained in:
Goffi 2022-10-06 16:02:05 +02:00
commit a8fc70fca6

View file

@ -18,15 +18,20 @@
import os
import os.path
from pathlib import Path
from typing import Optional, Tuple, Union
from twisted.internet import defer
from twisted.words.protocols.jabber import jid
from twisted.words.protocols.jabber import error as jabber_error
from sat.core.i18n import _, D_
from sat.core.constants import Const as C
from sat.tools.common import data_format
from sat.core.log import getLogger
from sat.core import exceptions
from sat.core.constants import Const as C
from sat.core.core_types import SatXMPPEntity
from sat.core.i18n import D_, _
from sat.core.log import getLogger
from sat.tools import xml_tools
from sat.tools.common import data_format
log = getLogger(__name__)
@ -99,26 +104,32 @@ class UploadPlugin(object):
else:
return {"progress": progress_id}
async def upload(self, client, filepath, filename=None, upload_jid=None,
options=None):
async def upload(
self,
client: SatXMPPEntity,
filepath: Union[Path, str],
filename: Optional[str] = None,
upload_jid: Optional[jid.JID] = None,
extra: Optional[dict]=None
) -> Tuple[str, defer.Deferred]:
"""Send a file using best available method
@param filepath(str): absolute path to the file
@param filename(None, unicode): name to use for the upload
@param filepath: absolute path to the file
@param filename: name to use for the upload
None to use basename of the path
@param upload_jid(jid.JID, None): upload capable entity jid,
@param upload_jid: upload capable entity jid,
or None to use autodetected, if possible
@param options(dict): option to use for the upload, may be:
@param extra: extra data/options to use for the upload, may be:
- ignore_tls_errors(bool): True to ignore SSL/TLS certificate verification
used only if HTTPS transport is needed
- progress_id(str): id to use for progression
if not specified, one will be generated
@param profile: %(doc_profile)s
@return (tuple[unicode,D(unicode)]): progress_id and a Deferred which fire
download URL when upload is finished
@return: progress_id and a Deferred which fire download URL when upload is
finished
"""
if options is None:
options = {}
if extra is None:
extra = {}
if not os.path.isfile(filepath):
raise exceptions.DataError("The given path doesn't link to a file")
for method_name, available_cb, upload_cb, priority in self._upload_callbacks:
@ -132,7 +143,7 @@ class UploadPlugin(object):
"{name} method will be used to upload the file".format(name=method_name)
)
progress_id, download_d = await upload_cb(
client, filepath, filename, upload_jid, options
client, filepath, filename, upload_jid, extra
)
return progress_id, download_d