Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0234.py @ 3079:f8cc88c773c8
core (memory/sqlite): added `before_uid` filter to retrieve history before a message UID
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 05 Dec 2019 22:58:06 +0100 |
parents | fee60f17ebac |
children | 9d0df638c8b4 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # SAT plugin for Jingle File Transfer (XEP-0234) |
2771 | 5 # Copyright (C) 2009-2019 Jérôme Poisson (goffi@goffi.org) |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
1574
babd97d80049
plugins XEP-0234, file: moved file request dialog to file plugin
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
20 from sat.core.i18n import _ |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 from sat.core.constants import Const as C |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from sat.core.log import getLogger |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
23 |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 log = getLogger(__name__) |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from sat.core import exceptions |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from wokkel import disco, iwokkel |
3028 | 27 from zope.interface import implementer |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from sat.tools import utils |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
29 from sat.tools import stream |
2612
3e4e78de9cca
tools (date_utils): moved date_parse to common.date_utils, because it can be used in frontends
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
30 from sat.tools.common import date_utils |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 import os.path |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 from twisted.words.xish import domish |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 from twisted.words.protocols.jabber import jid |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 from twisted.python import failure |
1566
ec3848916ee8
plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents:
1557
diff
changeset
|
35 from twisted.words.protocols.jabber.xmlstream import XMPPHandler |
1571
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1568
diff
changeset
|
36 from twisted.internet import defer |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
37 from twisted.internet import reactor |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
38 from twisted.internet import error as internet_error |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
39 from collections import namedtuple |
2535
a19b2c43e719
plugin XEP-0234: fixed regex import
Goffi <goffi@goffi.org>
parents:
2512
diff
changeset
|
40 from sat.tools.common import regex |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
41 import mimetypes |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
44 NS_JINGLE_FT = "urn:xmpp:jingle:apps:file-transfer:5" |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 PLUGIN_INFO = { |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
47 C.PI_NAME: "Jingle File Transfer", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
48 C.PI_IMPORT_NAME: "XEP-0234", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
49 C.PI_TYPE: "XEP", |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
50 C.PI_MODES: C.PLUG_MODE_BOTH, |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
51 C.PI_PROTOCOLS: ["XEP-0234"], |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
52 C.PI_DEPENDENCIES: ["XEP-0166", "XEP-0300", "FILE"], |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
53 C.PI_MAIN: "XEP_0234", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
54 C.PI_HANDLER: "yes", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
55 C.PI_DESCRIPTION: _("""Implementation of Jingle File Transfer"""), |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 } |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 |
3040 | 58 EXTRA_ALLOWED = {"path", "namespace", "file_desc", "file_hash", "hash_algo"} |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
59 Range = namedtuple("Range", ("offset", "length")) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
60 |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 class XEP_0234(object): |
1571
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1568
diff
changeset
|
63 # TODO: assure everything is closed when file is sent or session terminate is received |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
64 # TODO: call self._f.unregister when unloading order will be managing (i.e. when dependencies will be unloaded at the end) |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
65 Range = Range # we copy the class here, so it can be used by other plugins |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 def __init__(self, host): |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 log.info(_("plugin Jingle File Transfer initialization")) |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 self.host = host |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
70 host.registerNamespace("jingle-ft", NS_JINGLE_FT) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
71 self._j = host.plugins["XEP-0166"] # shortcut to access jingle |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 self._j.registerApplication(NS_JINGLE_FT, self) |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 self._f = host.plugins["FILE"] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
74 self._f.register( |
3028 | 75 NS_JINGLE_FT, self.fileJingleSend, priority=10000, method_name="Jingle" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
76 ) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1598
diff
changeset
|
77 self._hash = self.host.plugins["XEP-0300"] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
78 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
79 "fileJingleSend", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
80 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
81 in_sign="ssssa{ss}s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
82 out_sign="", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
83 method=self._fileJingleSend, |
3028 | 84 async_=True, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
85 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
86 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
87 "fileJingleRequest", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
88 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
89 in_sign="sssssa{ss}s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
90 out_sign="s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
91 method=self._fileJingleRequest, |
3028 | 92 async_=True, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
93 ) |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
95 def getHandler(self, client): |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 return XEP_0234_handler() |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
98 def getProgressId(self, session, content_name): |
1585
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
99 """Return a unique progress ID |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
100 |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
101 @param session(dict): jingle session |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
102 @param content_name(unicode): name of the content |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
103 @return (unicode): unique progress id |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
104 """ |
3028 | 105 return "{}_{}".format(session["id"], content_name) |
1585
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
106 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
107 # generic methods |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
108 |
3040 | 109 def buildFileElement(self, name=None, file_hash=None, hash_algo=None, size=None, |
2927
69e4716d6268
plugins (jingle) file transfer: use initial "from" attribute as local jid instead of client.jid:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
110 mime_type=None, desc=None, modified=None, transfer_range=None, path=None, |
69e4716d6268
plugins (jingle) file transfer: use initial "from" attribute as local jid instead of client.jid:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
111 namespace=None, file_elt=None, **kwargs): |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
112 """Generate a <file> element with available metadata |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
113 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
114 @param file_hash(unicode, None): hash of the file |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
115 empty string to set <hash-used/> element |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
116 @param hash_algo(unicode, None): hash algorithm used |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
117 if file_hash is None and hash_algo is set, a <hash-used/> element will be generated |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
118 @param transfer_range(Range, None): where transfer must start/stop |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
119 @param modified(int, unicode, None): date of last modification |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
120 0 to use current date |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
121 int to use an unix timestamp |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
122 else must be an unicode string which will be used as it (it must be an XMPP time) |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
123 @param file_elt(domish.Element, None): element to use |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
124 None to create a new one |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
125 @param **kwargs: data for plugin extension (ignored by default) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
126 @return (domish.Element): generated element |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
127 @trigger XEP-0234_buildFileElement(file_elt, extra_args): can be used to extend elements to add |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
128 """ |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
129 if file_elt is None: |
3028 | 130 file_elt = domish.Element((NS_JINGLE_FT, "file")) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
131 for name, value in ( |
3028 | 132 ("name", name), |
133 ("size", size), | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
134 ("media-type", mime_type), |
3028 | 135 ("desc", desc), |
136 ("path", path), | |
137 ("namespace", namespace), | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
138 ): |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
139 if value is not None: |
3028 | 140 file_elt.addElement(name, content=str(value)) |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
141 |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
142 if modified is not None: |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
143 if isinstance(modified, int): |
3028 | 144 file_elt.addElement("date", utils.xmpp_date(modified or None)) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
145 else: |
3028 | 146 file_elt.addElement("date", modified) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
147 elif "created" in kwargs: |
3028 | 148 file_elt.addElement("date", utils.xmpp_date(kwargs.pop("created"))) |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
149 |
3028 | 150 range_elt = file_elt.addElement("range") |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
151 if transfer_range is not None: |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
152 if transfer_range.offset is not None: |
3028 | 153 range_elt["offset"] = transfer_range.offset |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
154 if transfer_range.length is not None: |
3028 | 155 range_elt["length"] = transfer_range.length |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
156 if file_hash is not None: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
157 if not file_hash: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
158 file_elt.addChild(self._hash.buildHashUsedElt()) |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
159 else: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
160 file_elt.addChild(self._hash.buildHashElt(file_hash, hash_algo)) |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
161 elif hash_algo is not None: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
162 file_elt.addChild(self._hash.buildHashUsedElt(hash_algo)) |
3028 | 163 self.host.trigger.point("XEP-0234_buildFileElement", file_elt, extra_args=kwargs) |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
164 if kwargs: |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
165 for kw in kwargs: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
166 log.debug("ignored keyword: {}".format(kw)) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
167 return file_elt |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
168 |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
169 def buildFileElementFromDict(self, file_data, **kwargs): |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
170 """like buildFileElement but get values from a file_data dict |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
171 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
172 @param file_data(dict): metadata to use |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
173 @param **kwargs: data to override |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
174 """ |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
175 if kwargs: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
176 file_data = file_data.copy() |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
177 file_data.update(kwargs) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
178 return self.buildFileElement(**file_data) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
179 |
3040 | 180 def parseFileElement(self, file_elt, file_data=None, given=False, parent_elt=None, |
181 keep_empty_range=False,): | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
182 """Parse a <file> element and file dictionary accordingly |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
183 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
184 @param file_data(dict, None): dict where the data will be set |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
185 following keys will be set (and overwritten if they already exist): |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
186 name, file_hash, hash_algo, size, mime_type, desc, path, namespace, range |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
187 if None, a new dict is created |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
188 @param given(bool): if True, prefix hash key with "given_" |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
189 @param parent_elt(domish.Element, None): parent of the file element |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
190 if set, file_elt must not be set |
3040 | 191 @param keep_empty_range(bool): if True, keep empty range (i.e. range when offset |
192 and length are None). | |
193 Empty range is useful to know if a peer_jid can handle range | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
194 @return (dict): file_data |
3040 | 195 @trigger XEP-0234_parseFileElement(file_elt, file_data): can be used to parse new |
196 elements | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
197 @raise exceptions.NotFound: there is not <file> element in parent_elt |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
198 @raise exceptions.DataError: if file_elt uri is not NS_JINGLE_FT |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
199 """ |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
200 if parent_elt is not None: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
201 if file_elt is not None: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
202 raise exceptions.InternalError( |
3028 | 203 "file_elt must be None if parent_elt is set" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
204 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
205 try: |
3028 | 206 file_elt = next(parent_elt.elements(NS_JINGLE_FT, "file")) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
207 except StopIteration: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
208 raise exceptions.NotFound() |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
209 else: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
210 if not file_elt or file_elt.uri != NS_JINGLE_FT: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
211 raise exceptions.DataError( |
3028 | 212 "invalid <file> element: {stanza}".format(stanza=file_elt.toXml()) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
213 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
214 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
215 if file_data is None: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
216 file_data = {} |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
217 |
3028 | 218 for name in ("name", "desc", "path", "namespace"): |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
219 try: |
3028 | 220 file_data[name] = str(next(file_elt.elements(NS_JINGLE_FT, name))) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
221 except StopIteration: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
222 pass |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
223 |
3028 | 224 name = file_data.get("name") |
225 if name == "..": | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
226 # we don't want to go to parent dir when joining to a path |
3028 | 227 name = "--" |
228 file_data["name"] = name | |
3040 | 229 elif name is not None and ("/" in name or "\\" in name): |
3028 | 230 file_data["name"] = regex.pathEscape(name) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
231 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
232 try: |
3028 | 233 file_data["mime_type"] = str( |
234 next(file_elt.elements(NS_JINGLE_FT, "media-type")) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
235 ) |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
236 except StopIteration: |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
237 pass |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
238 |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
239 try: |
3028 | 240 file_data["size"] = int( |
241 str(next(file_elt.elements(NS_JINGLE_FT, "size"))) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
242 ) |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
243 except StopIteration: |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
244 pass |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
245 |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
246 try: |
3028 | 247 file_data["modified"] = date_utils.date_parse( |
248 next(file_elt.elements(NS_JINGLE_FT, "date")) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
249 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
250 except StopIteration: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
251 pass |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
252 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
253 try: |
3028 | 254 range_elt = next(file_elt.elements(NS_JINGLE_FT, "range")) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
255 except StopIteration: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
256 pass |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
257 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
258 offset = range_elt.getAttribute("offset") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
259 length = range_elt.getAttribute("length") |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
260 if offset or length or keep_empty_range: |
3028 | 261 file_data["transfer_range"] = Range(offset=offset, length=length) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
262 |
3028 | 263 prefix = "given_" if given else "" |
264 hash_algo_key, hash_key = "hash_algo", prefix + "file_hash" | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
265 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
266 file_data[hash_algo_key], file_data[hash_key] = self._hash.parseHashElt( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
267 file_elt |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
268 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
269 except exceptions.NotFound: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
270 pass |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
271 |
3028 | 272 self.host.trigger.point("XEP-0234_parseFileElement", file_elt, file_data) |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
273 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
274 return file_data |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
275 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
276 # bridge methods |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
277 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
278 def _fileJingleSend( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
279 self, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
280 peer_jid, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
281 filepath, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
282 name="", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
283 file_desc="", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
284 extra=None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
285 profile=C.PROF_KEY_NONE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
286 ): |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
287 client = self.host.getClient(profile) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
288 return self.fileJingleSend( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
289 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
290 jid.JID(peer_jid), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
291 filepath, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
292 name or None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
293 file_desc or None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
294 extra or None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
295 ) |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
296 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
297 @defer.inlineCallbacks |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
298 def fileJingleSend( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
299 self, client, peer_jid, filepath, name, file_desc=None, extra=None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
300 ): |
1585
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
301 """Send a file using jingle file transfer |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
302 |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
303 @param peer_jid(jid.JID): destinee jid |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
304 @param filepath(str): absolute path of the file |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
305 @param name(unicode, None): name of the file |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
306 @param file_desc(unicode, None): description of the file |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
307 @return (D(unicode)): progress id |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
308 """ |
846a39900fa6
plugins XEP-0096, XEP-0260, file: sendFile method is managed by file plugin, which choose the best available method + progress_id fix
Goffi <goffi@goffi.org>
parents:
1575
diff
changeset
|
309 progress_id_d = defer.Deferred() |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
310 if extra is None: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
311 extra = {} |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
312 if file_desc is not None: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
313 extra["file_desc"] = file_desc |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
314 yield self._j.initiate( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
315 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
316 peer_jid, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
317 [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
318 { |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
319 "app_ns": NS_JINGLE_FT, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
320 "senders": self._j.ROLE_INITIATOR, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
321 "app_kwargs": { |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
322 "filepath": filepath, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
323 "name": name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
324 "extra": extra, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
325 "progress_id_d": progress_id_d, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
326 }, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
327 } |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
328 ], |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
329 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
330 progress_id = yield progress_id_d |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
331 defer.returnValue(progress_id) |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
332 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
333 def _fileJingleRequest( |
3040 | 334 self, peer_jid, filepath, name="", file_hash="", hash_algo="", extra=None, |
335 profile=C.PROF_KEY_NONE): | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
336 client = self.host.getClient(profile) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
337 return self.fileJingleRequest( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
338 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
339 jid.JID(peer_jid), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
340 filepath, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
341 name or None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
342 file_hash or None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
343 hash_algo or None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
344 extra or None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
345 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
346 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
347 @defer.inlineCallbacks |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
348 def fileJingleRequest( |
3040 | 349 self, client, peer_jid, filepath, name=None, file_hash=None, hash_algo=None, |
350 extra=None): | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
351 """Request a file using jingle file transfer |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
352 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
353 @param peer_jid(jid.JID): destinee jid |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
354 @param filepath(str): absolute path where the file will be downloaded |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
355 @param name(unicode, None): name of the file |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
356 @param file_hash(unicode, None): hash of the file |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
357 @return (D(unicode)): progress id |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
358 """ |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
359 progress_id_d = defer.Deferred() |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
360 if extra is None: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
361 extra = {} |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
362 if file_hash is not None: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
363 if hash_algo is None: |
3028 | 364 raise ValueError(_("hash_algo must be set if file_hash is set")) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
365 extra["file_hash"] = file_hash |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
366 extra["hash_algo"] = hash_algo |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
367 else: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
368 if hash_algo is not None: |
3028 | 369 raise ValueError(_("file_hash must be set if hash_algo is set")) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
370 yield self._j.initiate( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
371 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
372 peer_jid, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
373 [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
374 { |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
375 "app_ns": NS_JINGLE_FT, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
376 "senders": self._j.ROLE_RESPONDER, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
377 "app_kwargs": { |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
378 "filepath": filepath, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
379 "name": name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
380 "extra": extra, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
381 "progress_id_d": progress_id_d, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
382 }, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
383 } |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
384 ], |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
385 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
386 progress_id = yield progress_id_d |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
387 defer.returnValue(progress_id) |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
388 |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
389 # jingle callbacks |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
390 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
391 def jingleSessionInit( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
392 self, client, session, content_name, filepath, name, extra, progress_id_d |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
393 ): |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
394 if extra is None: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
395 extra = {} |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
396 else: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
397 if not EXTRA_ALLOWED.issuperset(extra): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
398 raise ValueError( |
3028 | 399 _("only the following keys are allowed in extra: {keys}").format( |
400 keys=", ".join(EXTRA_ALLOWED) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
401 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
402 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
403 progress_id_d.callback(self.getProgressId(session, content_name)) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
404 content_data = session["contents"][content_name] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
405 application_data = content_data["application_data"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
406 assert "file_path" not in application_data |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
407 application_data["file_path"] = filepath |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
408 file_data = application_data["file_data"] = {} |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
409 desc_elt = domish.Element((NS_JINGLE_FT, "description")) |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
410 file_elt = desc_elt.addElement("file") |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
411 |
3028 | 412 if content_data["senders"] == self._j.ROLE_INITIATOR: |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
413 # we send a file |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
414 if name is None: |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
415 name = os.path.basename(filepath) |
3028 | 416 file_data["date"] = utils.xmpp_date() |
417 file_data["desc"] = extra.pop("file_desc", "") | |
418 file_data["name"] = name | |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
419 mime_type = mimetypes.guess_type(name, strict=False)[0] |
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2502
diff
changeset
|
420 if mime_type is not None: |
3028 | 421 file_data["mime_type"] = mime_type |
422 file_data["size"] = os.path.getsize(filepath) | |
423 if "namespace" in extra: | |
424 file_data["namespace"] = extra["namespace"] | |
425 if "path" in extra: | |
426 file_data["path"] = extra["path"] | |
427 self.buildFileElementFromDict(file_data, file_elt=file_elt, file_hash="") | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
428 else: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
429 # we request a file |
3028 | 430 file_hash = extra.pop("file_hash", "") |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
431 if not name and not file_hash: |
3028 | 432 raise ValueError(_("you need to provide at least name or file hash")) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
433 if name: |
3028 | 434 file_data["name"] = name |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
435 if file_hash: |
3028 | 436 file_data["file_hash"] = file_hash |
437 file_data["hash_algo"] = extra["hash_algo"] | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
438 else: |
3028 | 439 file_data["hash_algo"] = self._hash.getDefaultAlgo() |
440 if "namespace" in extra: | |
441 file_data["namespace"] = extra["namespace"] | |
442 if "path" in extra: | |
443 file_data["path"] = extra["path"] | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
444 self.buildFileElementFromDict(file_data, file_elt=file_elt) |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
445 |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
446 return desc_elt |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
447 |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
448 def jingleRequestConfirmation(self, client, action, session, content_name, desc_elt): |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
449 """This method request confirmation for a jingle session""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
450 content_data = session["contents"][content_name] |
3028 | 451 senders = content_data["senders"] |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
452 if senders not in (self._j.ROLE_INITIATOR, self._j.ROLE_RESPONDER): |
3028 | 453 log.warning("Bad sender, assuming initiator") |
454 senders = content_data["senders"] = self._j.ROLE_INITIATOR | |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
455 # first we grab file informations |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
456 try: |
3028 | 457 file_elt = next(desc_elt.elements(NS_JINGLE_FT, "file")) |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
458 except StopIteration: |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
459 raise failure.Failure(exceptions.DataError) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
460 file_data = {"progress_id": self.getProgressId(session, content_name)} |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
461 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
462 if senders == self._j.ROLE_RESPONDER: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
463 # we send the file |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
464 return self._fileSendingRequestConf( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
465 client, session, content_data, content_name, file_data, file_elt |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
466 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
467 else: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
468 # we receive the file |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
469 return self._fileReceivingRequestConf( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
470 client, session, content_data, content_name, file_data, file_elt |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
471 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
472 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
473 @defer.inlineCallbacks |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
474 def _fileSendingRequestConf( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
475 self, client, session, content_data, content_name, file_data, file_elt |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
476 ): |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
477 """parse file_elt, and handle file retrieving/permission checking""" |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
478 self.parseFileElement(file_elt, file_data) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
479 content_data["application_data"]["file_data"] = file_data |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
480 finished_d = content_data["finished_d"] = defer.Deferred() |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
481 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
482 # confirmed_d is a deferred returning confimed value (only used if cont is False) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
483 cont, confirmed_d = self.host.trigger.returnPoint( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
484 "XEP-0234_fileSendingRequest", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
485 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
486 session, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
487 content_data, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
488 content_name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
489 file_data, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
490 file_elt, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
491 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
492 if not cont: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
493 confirmed = yield confirmed_d |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
494 if confirmed: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
495 args = [client, session, content_name, content_data] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
496 finished_d.addCallbacks( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
497 self._finishedCb, self._finishedEb, args, None, args |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
498 ) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
499 defer.returnValue(confirmed) |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
500 |
3028 | 501 log.warning(_("File continue is not implemented yet")) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
502 defer.returnValue(False) |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
503 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
504 def _fileReceivingRequestConf( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
505 self, client, session, content_data, content_name, file_data, file_elt |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
506 ): |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
507 """parse file_elt, and handle user permission/file opening""" |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
508 self.parseFileElement(file_elt, file_data, given=True) |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
509 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
510 hash_algo, file_data["given_file_hash"] = self._hash.parseHashElt(file_elt) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
511 except exceptions.NotFound: |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
512 try: |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
513 hash_algo = self._hash.parseHashUsedElt(file_elt) |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
514 except exceptions.NotFound: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
515 raise failure.Failure(exceptions.DataError) |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
516 |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
517 if hash_algo is not None: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
518 file_data["hash_algo"] = hash_algo |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
519 file_data["hash_hasher"] = hasher = self._hash.getHasher(hash_algo) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
520 file_data["data_cb"] = lambda data: hasher.update(data) |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
521 |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
522 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
523 file_data["size"] = int(file_data["size"]) |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
524 except ValueError: |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
525 raise failure.Failure(exceptions.DataError) |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
526 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
527 name = file_data["name"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
528 if "/" in name or "\\" in name: |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
529 log.warning( |
3028 | 530 "File name contain path characters, we replace them: {}".format(name) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
531 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
532 file_data["name"] = name.replace("/", "_").replace("\\", "_") |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
533 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
534 content_data["application_data"]["file_data"] = file_data |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
535 |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
536 # now we actualy request permission to user |
1574
babd97d80049
plugins XEP-0234, file: moved file request dialog to file plugin
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
537 def gotConfirmation(confirmed): |
babd97d80049
plugins XEP-0234, file: moved file request dialog to file plugin
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
538 if confirmed: |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
539 args = [client, session, content_name, content_data] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
540 finished_d.addCallbacks( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
541 self._finishedCb, self._finishedEb, args, None, args |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
542 ) |
1574
babd97d80049
plugins XEP-0234, file: moved file request dialog to file plugin
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
543 return confirmed |
babd97d80049
plugins XEP-0234, file: moved file request dialog to file plugin
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
544 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
545 # deferred to track end of transfer |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
546 finished_d = content_data["finished_d"] = defer.Deferred() |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
547 d = self._f.getDestDir( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
548 client, session["peer_jid"], content_data, file_data, stream_object=True |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
549 ) |
1574
babd97d80049
plugins XEP-0234, file: moved file request dialog to file plugin
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
550 d.addCallback(gotConfirmation) |
babd97d80049
plugins XEP-0234, file: moved file request dialog to file plugin
Goffi <goffi@goffi.org>
parents:
1571
diff
changeset
|
551 return d |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
552 |
3040 | 553 @defer.inlineCallbacks |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
554 def jingleHandler(self, client, action, session, content_name, desc_elt): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
555 content_data = session["contents"][content_name] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
556 application_data = content_data["application_data"] |
1556
cbfbe028d099
plugin XEP-0166, XEP-0234, XEP-0261:
Goffi <goffi@goffi.org>
parents:
1529
diff
changeset
|
557 if action in (self._j.A_ACCEPTED_ACK,): |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
558 pass |
1556
cbfbe028d099
plugin XEP-0166, XEP-0234, XEP-0261:
Goffi <goffi@goffi.org>
parents:
1529
diff
changeset
|
559 elif action == self._j.A_SESSION_INITIATE: |
3028 | 560 file_elt = next(desc_elt.elements(NS_JINGLE_FT, "file")) |
1556
cbfbe028d099
plugin XEP-0166, XEP-0234, XEP-0261:
Goffi <goffi@goffi.org>
parents:
1529
diff
changeset
|
561 try: |
3028 | 562 next(file_elt.elements(NS_JINGLE_FT, "range")) |
1556
cbfbe028d099
plugin XEP-0166, XEP-0234, XEP-0261:
Goffi <goffi@goffi.org>
parents:
1529
diff
changeset
|
563 except StopIteration: |
cbfbe028d099
plugin XEP-0166, XEP-0234, XEP-0261:
Goffi <goffi@goffi.org>
parents:
1529
diff
changeset
|
564 # initiator doesn't manage <range>, but we do so we advertise it |
3040 | 565 # FIXME: to be checked |
1556
cbfbe028d099
plugin XEP-0166, XEP-0234, XEP-0261:
Goffi <goffi@goffi.org>
parents:
1529
diff
changeset
|
566 log.debug("adding <range> element") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
567 file_elt.addElement("range") |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
568 elif action == self._j.A_SESSION_ACCEPT: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
569 assert not "stream_object" in content_data |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
570 file_data = application_data["file_data"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
571 file_path = application_data["file_path"] |
3028 | 572 senders = content_data["senders"] |
573 if senders != session["role"]: | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
574 # we are receiving the file |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
575 try: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
576 # did the responder specified the size of the file? |
3028 | 577 file_elt = next(desc_elt.elements(NS_JINGLE_FT, "file")) |
578 size_elt = next(file_elt.elements(NS_JINGLE_FT, "size")) | |
579 size = int(str(size_elt)) | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
580 except (StopIteration, ValueError): |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
581 size = None |
3040 | 582 # XXX: hash security is not critical here, so we just take the higher |
583 # mandatory one | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
584 hasher = file_data["hash_hasher"] = self._hash.getHasher() |
3040 | 585 progress_id = self.getProgressId(session, content_name) |
586 try: | |
587 content_data["stream_object"] = stream.FileStreamObject( | |
588 self.host, | |
589 client, | |
590 file_path, | |
591 mode="wb", | |
592 uid=progress_id, | |
593 size=size, | |
594 data_cb=lambda data: hasher.update(data), | |
595 ) | |
596 except Exception as e: | |
597 self.host.bridge.progressError( | |
598 progress_id, C.PROGRESS_ERROR_FAILED, client.profile | |
599 ) | |
600 yield self._j.terminate( | |
601 client, self._j.REASON_FAILED_APPLICATION, session) | |
602 raise e | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
603 else: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
604 # we are sending the file |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
605 size = file_data["size"] |
3040 | 606 # XXX: hash security is not critical here, so we just take the higher |
607 # mandatory one | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
608 hasher = file_data["hash_hasher"] = self._hash.getHasher() |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
609 content_data["stream_object"] = stream.FileStreamObject( |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
610 self.host, |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
611 client, |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
612 file_path, |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
613 uid=self.getProgressId(session, content_name), |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
614 size=size, |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
615 data_cb=lambda data: hasher.update(data), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
616 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
617 finished_d = content_data["finished_d"] = defer.Deferred() |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
618 args = [client, session, content_name, content_data] |
1571
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1568
diff
changeset
|
619 finished_d.addCallbacks(self._finishedCb, self._finishedEb, args, None, args) |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
620 else: |
3028 | 621 log.warning("FIXME: unmanaged action {}".format(action)) |
3040 | 622 defer.returnValue(desc_elt) |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
623 |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
624 def jingleSessionInfo(self, client, action, session, content_name, jingle_elt): |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
625 """Called on session-info action |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
626 |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
627 manage checksum, and ignore <received/> element |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
628 """ |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
629 # TODO: manage <received/> element |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
630 content_data = session["contents"][content_name] |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
631 elts = [elt for elt in jingle_elt.elements() if elt.uri == NS_JINGLE_FT] |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
632 if not elts: |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
633 return |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
634 for elt in elts: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
635 if elt.name == "received": |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
636 pass |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
637 elif elt.name == "checksum": |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
638 # we have received the file hash, we need to parse it |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
639 if content_data["senders"] == session["role"]: |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
640 log.warning( |
3028 | 641 "unexpected checksum received while we are the file sender" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
642 ) |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
643 raise exceptions.DataError |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
644 info_content_name = elt["name"] |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
645 if info_content_name != content_name: |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
646 # it was for an other content... |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
647 return |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
648 file_data = content_data["application_data"]["file_data"] |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
649 try: |
3028 | 650 file_elt = next(elt.elements((NS_JINGLE_FT, "file"))) |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
651 except StopIteration: |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
652 raise exceptions.DataError |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
653 algo, file_data["given_file_hash"] = self._hash.parseHashElt(file_elt) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
654 if algo != file_data.get("hash_algo"): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
655 log.warning( |
3028 | 656 "Hash algorithm used in given hash ({peer_algo}) doesn't correspond to the one we have used ({our_algo}) [{profile}]".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
657 peer_algo=algo, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
658 our_algo=file_data.get("hash_algo"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
659 profile=client.profile, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
660 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
661 ) |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
662 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
663 self._receiverTryTerminate( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
664 client, session, content_name, content_data |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
665 ) |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
666 else: |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
667 raise NotImplementedError |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
668 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
669 def jingleTerminate(self, client, action, session, content_name, jingle_elt): |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
670 if jingle_elt.decline: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
671 # progress is the only way to tell to frontends that session has been declined |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
672 progress_id = self.getProgressId(session, content_name) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
673 self.host.bridge.progressError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
674 progress_id, C.PROGRESS_ERROR_DECLINED, client.profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
675 ) |
3040 | 676 elif not jingle_elt.success: |
677 progress_id = self.getProgressId(session, content_name) | |
678 first_child = jingle_elt.firstChildElement() | |
679 if first_child is not None: | |
680 reason = first_child.name | |
681 else: | |
682 reason = C.PROGRESS_ERROR_FAILED | |
683 self.host.bridge.progressError( | |
684 progress_id, reason, client.profile | |
685 ) | |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
686 |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
687 def _sendCheckSum(self, client, session, content_name, content_data): |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
688 """Send the session-info with the hash checksum""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
689 file_data = content_data["application_data"]["file_data"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
690 hasher = file_data["hash_hasher"] |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
691 hash_ = hasher.hexdigest() |
3028 | 692 log.debug("Calculated hash: {}".format(hash_)) |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
693 iq_elt, jingle_elt = self._j.buildSessionInfo(client, session) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
694 checksum_elt = jingle_elt.addElement((NS_JINGLE_FT, "checksum")) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
695 checksum_elt["creator"] = content_data["creator"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
696 checksum_elt["name"] = content_name |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
697 file_elt = checksum_elt.addElement("file") |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
698 file_elt.addChild(self._hash.buildHashElt(hash_)) |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
699 iq_elt.send() |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
700 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
701 def _receiverTryTerminate( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
702 self, client, session, content_name, content_data, last_try=False |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
703 ): |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
704 """Try to terminate the session |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
705 |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
706 This method must only be used by the receiver. |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
707 It check if transfer is finished, and hash available, |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
708 if everything is OK, it check hash and terminate the session |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
709 @param last_try(bool): if True this mean than session must be terminated even given hash is not available |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
710 @return (bool): True if session was terminated |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
711 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
712 if not content_data.get("transfer_finished", False): |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
713 return False |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
714 file_data = content_data["application_data"]["file_data"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
715 given_hash = file_data.get("given_file_hash") |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
716 if given_hash is None: |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
717 if last_try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
718 log.warning( |
3028 | 719 "sender didn't sent hash checksum, we can't check the file [{profile}]".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
720 profile=client.profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
721 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
722 ) |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
723 self._j.delayedContentTerminate(client, session, content_name) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
724 content_data["stream_object"].close() |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
725 return True |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
726 return False |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
727 hasher = file_data["hash_hasher"] |
3040 | 728 hash_ = hasher.hexdigest() |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
729 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2489
diff
changeset
|
730 if hash_ == given_hash: |
3040 | 731 log.info(f"Hash checked, file was successfully transfered: {hash_}") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
732 progress_metadata = { |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
733 "hash": hash_, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
734 "hash_algo": file_data["hash_algo"], |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
735 "hash_verified": C.BOOL_TRUE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
736 } |
1626
63cef4dbf2a4
core, plugins file, XEP-0234, bridge: progression api enhancement:
Goffi <goffi@goffi.org>
parents:
1620
diff
changeset
|
737 error = None |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
738 else: |
3028 | 739 log.warning("Hash mismatch, the file was not transfered correctly") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
740 progress_metadata = None |
3028 | 741 error = "Hash mismatch: given={algo}:{given}, calculated={algo}:{our}".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
742 algo=file_data["hash_algo"], given=given_hash, our=hash_ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
743 ) |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
744 |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
745 self._j.delayedContentTerminate(client, session, content_name) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
746 content_data["stream_object"].close(progress_metadata, error) |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
747 # we may have the last_try timer still active, so we try to cancel it |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
748 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
749 content_data["last_try_timer"].cancel() |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
750 except (KeyError, internet_error.AlreadyCalled): |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
751 pass |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
752 return True |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
753 |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
754 def _finishedCb(self, __, client, session, content_name, content_data): |
3028 | 755 log.info("File transfer terminated") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
756 if content_data["senders"] != session["role"]: |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
757 # we terminate the session only if we are the receiver, |
1571
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1568
diff
changeset
|
758 # as recommanded in XEP-0234 §2 (after example 6) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
759 content_data["transfer_finished"] = True |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
760 if not self._receiverTryTerminate( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
761 client, session, content_name, content_data |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
762 ): |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
763 # we have not received the hash yet, we wait 5 more seconds |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
764 content_data["last_try_timer"] = reactor.callLater( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
765 5, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
766 self._receiverTryTerminate, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
767 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
768 session, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
769 content_name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
770 content_data, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
771 last_try=True, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
772 ) |
1620
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
773 else: |
4dd07d026214
plugin XEP-0234: hash checksum proper handling
Goffi <goffi@goffi.org>
parents:
1618
diff
changeset
|
774 # we are the sender, we send the checksum |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
775 self._sendCheckSum(client, session, content_name, content_data) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
776 content_data["stream_object"].close() |
1571
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1568
diff
changeset
|
777 |
2489
e2a7bb875957
plugin pipe/stream, file transfert: refactoring and improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
778 def _finishedEb(self, failure, client, session, content_name, content_data): |
3028 | 779 log.warning("Error while streaming file: {}".format(failure)) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
780 content_data["stream_object"].close() |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
781 self._j.contentTerminate( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
782 client, session, content_name, reason=self._j.REASON_FAILED_TRANSPORT |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
783 ) |
1571
c668081eba1c
plugins XEP-0234, XEP-0260, XEP-0261: jingle session termination is managed by application (XEP-0234) instead of transport
Goffi <goffi@goffi.org>
parents:
1568
diff
changeset
|
784 |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
785 |
3028 | 786 @implementer(iwokkel.IDisco) |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
787 class XEP_0234_handler(XMPPHandler): |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
788 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
789 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
790 return [disco.DiscoFeature(NS_JINGLE_FT)] |
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
791 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2612
diff
changeset
|
792 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
1528
1c71d7335d02
plugin XEP-0234: jingle file transfer first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
793 return [] |