annotate sat/plugins/plugin_xep_0446.py @ 4002:5245b675f7ad

plugin XEP-0313: don't wait for MAM to be retrieved in connection workflow: MAM retrieval can be long, and can be done after connection, message just need to be sorted when being inserted (i.e. frontends must do insort). To avoid blocking connection for too long and result in bad UX and timeout risk, one2one MAM message are not retrieved in background.
author Goffi <goffi@goffi.org>
date Fri, 10 Mar 2023 17:22:45 +0100
parents 0ff265725489
children 524856bd7b19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3896
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 # Copyright (C) 2009-2022 Jérôme Poisson (goffi@goffi.org)
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
4
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
5 # This program is free software: you can redistribute it and/or modify
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # it under the terms of the GNU Affero General Public License as published by
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # the Free Software Foundation, either version 3 of the License, or
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # (at your option) any later version.
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
9
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # This program is distributed in the hope that it will be useful,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # GNU Affero General Public License for more details.
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
14
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # You should have received a copy of the GNU Affero General Public License
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
17
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 from logging import exception
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
19 from typing import Optional, Union, Tuple, Dict, Any
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
20 from pathlib import Path
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
21
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from twisted.words.xish import domish
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
23
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from sat.core.constants import Const as C
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from sat.core.i18n import _
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from sat.core.log import getLogger
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from sat.core import exceptions
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from sat.tools import utils
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
29
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 log = getLogger(__name__)
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
31
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
32
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
33 PLUGIN_INFO = {
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 C.PI_NAME: "File Metadata Element",
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 C.PI_IMPORT_NAME: "XEP-0446",
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 C.PI_TYPE: "XEP",
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 C.PI_MODES: C.PLUG_MODE_BOTH,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 C.PI_PROTOCOLS: ["XEP-0446"],
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 C.PI_DEPENDENCIES: ["XEP-0300"],
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 C.PI_MAIN: "XEP_0446",
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 C.PI_HANDLER: "no",
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 C.PI_DESCRIPTION: _("""Implementation of XEP-0446 (File Metadata Element)"""),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 }
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
44
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 NS_FILE_METADATA = "urn:xmpp:file:metadata:0"
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
46
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
47
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 class XEP_0446:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
49
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 def __init__(self, host):
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 log.info(_("XEP-0446 (File Metadata Element) plugin initialization"))
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 host.registerNamespace("file-metadata", NS_FILE_METADATA)
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 self._hash = host.plugins["XEP-0300"]
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
54
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 def get_file_metadata_elt(
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 self,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 name: Optional[str] = None,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 media_type: Optional[str] = None,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 desc: Optional[str] = None,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 size: Optional[int] = None,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
61 file_hash: Optional[Tuple[str, str]] = None,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 date: Optional[Union[float, int]] = None,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 width: Optional[int] = None,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 height: Optional[int] = None,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 length: Optional[int] = None,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
66 thumbnail: Optional[str] = None,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 ) -> domish.Element:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 """Generate the element describing a file
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
69
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
70 @param name: name of the file
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 @param media_type: media-type
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
72 @param desc: description
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
73 @param size: size in bytes
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 @param file_hash: (algo, hash)
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
75 @param date: timestamp of the last modification datetime
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 @param width: image width in pixels
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
77 @param height: image height in pixels
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
78 @param length: video length in seconds
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
79 @param thumbnail: URL to a thumbnail
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
80 @return: ``<file/>`` element
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 """
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 if name:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 name = Path(name).name
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
84 file_elt = domish.Element((NS_FILE_METADATA, "file"))
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 for name, value in (
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
86 ("name", name),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
87 ("media-type", media_type),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
88 ("desc", desc),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
89 ("size", size),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
90 ("width", width),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
91 ("height", height),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
92 ("length", length),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
93 ):
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 if value is not None:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
95 file_elt.addElement(name, content=str(value))
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
96 if file_hash is not None:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
97 hash_algo, hash_ = file_hash
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
98 file_elt.addChild(self._hash.buildHashElt(hash_, hash_algo))
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
99 if date is not None:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
100 file_elt.addElement("date", utils.xmpp_date(date))
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
101 if thumbnail is not None:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
102 # TODO: implement thumbnails
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
103 log.warning("thumbnail is not implemented yet")
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 return file_elt
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
105
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
106 def parse_file_metadata_elt(
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 self,
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
108 file_metadata_elt: domish.Element
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
109 ) -> Dict[str, Any]:
3922
0ff265725489 plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents: 3896
diff changeset
110 """Parse <file/> element
3896
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
111
3922
0ff265725489 plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents: 3896
diff changeset
112 @param file_metadata_elt: <file/> element
3896
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
113 a parent element can also be used
3922
0ff265725489 plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents: 3896
diff changeset
114 @return: file metadata. It's a dict whose keys correspond to
3896
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
115 [get_file_metadata_elt] parameters
3922
0ff265725489 plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents: 3896
diff changeset
116 @raise exceptions.NotFound: no <file/> element has been found
3896
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
117 """
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
118
3922
0ff265725489 plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents: 3896
diff changeset
119 if file_metadata_elt.name != "file":
3896
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 try:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
121 file_metadata_elt = next(
3922
0ff265725489 plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents: 3896
diff changeset
122 file_metadata_elt.elements(NS_FILE_METADATA, "file")
3896
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 )
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
124 except StopIteration:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
125 raise exceptions.NotFound
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
126 data: Dict[str, Any] = {}
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
127
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
128 for key, type_ in (
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 ("name", str),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 ("media-type", str),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 ("desc", str),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
132 ("size", int),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
133 ("date", "timestamp"),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
134 ("width", int),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
135 ("height", int),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 ("length", int),
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 ):
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
138 elt = next(file_metadata_elt.elements(NS_FILE_METADATA, key), None)
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
139 if elt is not None:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 if type_ in (str, int):
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
141 content = str(elt)
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 if key == "name":
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
143 # we avoid malformed names or names containing path elements
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
144 content = Path(content).name
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
145 elif key == "media-type":
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
146 key = "media_type"
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
147 data[key] = type_(content)
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
148 elif type == "timestamp":
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 data[key] = utils.parse_xmpp_date(str(elt))
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 else:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 raise exceptions.InternalError
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
152
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 try:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 algo, hash_ = self._hash.parseHashElt(file_metadata_elt)
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 except exceptions.NotFound:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
156 pass
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 except exceptions.DataError:
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
158 from sat.tools.xml_tools import pFmtElt
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
159 log.warning("invalid <hash/> element:\n{pFmtElt(file_metadata_elt)}")
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
160 else:
3922
0ff265725489 plugin XEP-0447: handle attachment and download:
Goffi <goffi@goffi.org>
parents: 3896
diff changeset
161 data["file_hash"] = (algo, hash_)
3896
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
162
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
163 # TODO: thumbnails
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
164
dbf0c7faaf49 plugin XEP-0446: File Metadata implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 return data