Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0300.py @ 3913:944f51f9c2b4
core (xmpp): make `send` a blocking method, fix `sendMessageData` calls:
original `send` method is blocking, and it is used as such by Wokkel and thus can't be
changed to an async method easily. However, an Async method is necessary to have an async
trigger at the very end of the send workflow for end-to-end encryption. To workaround
that, `send` is an async method which call `a_send`, an async method which actually does
the sending. This way legacy method can still call `send` while `a_send` can be await
otherwise.
Fix calls to `sendMessageData`: the method now being an `async` one, `ensureDeferred` had
to be used in some calls.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 24 Sep 2022 16:31:39 +0200 |
parents | be6d91572633 |
children | 40d47cc29ea4 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # SAT plugin for Hash functions (XEP-0300) |
3479 | 5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 from sat.core.i18n import _ |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
21 from sat.core.constants import Const as C |
1526
bb451fd1cea3
plugin XEP-0300: hashes management 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:
2562
diff
changeset
|
23 |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 log = getLogger(__name__) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
25 from sat.core import exceptions |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from twisted.words.xish import domish |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
27 from twisted.words.protocols.jabber.xmlstream import XMPPHandler |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
28 from twisted.internet import threads |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
29 from twisted.internet import defer |
3028 | 30 from zope.interface import implementer |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
31 from wokkel import disco, iwokkel |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
32 from collections import OrderedDict |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 import hashlib |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
34 import base64 |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 PLUGIN_INFO = { |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
38 C.PI_NAME: "Cryptographic Hash Functions", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
39 C.PI_IMPORT_NAME: "XEP-0300", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
40 C.PI_TYPE: "XEP", |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
41 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
|
42 C.PI_PROTOCOLS: ["XEP-0300"], |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
43 C.PI_MAIN: "XEP_0300", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
44 C.PI_HANDLER: "yes", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
45 C.PI_DESCRIPTION: _("""Management of cryptographic hashes"""), |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 } |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
48 NS_HASHES = "urn:xmpp:hashes:2" |
3028 | 49 NS_HASHES_FUNCTIONS = "urn:xmpp:hash-function-text-names:{}" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
50 BUFFER_SIZE = 2 ** 12 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
51 ALGO_DEFAULT = "sha-256" |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
52 |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 class XEP_0300(object): |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
55 # TODO: add blake after moving to Python 3 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
56 ALGOS = OrderedDict( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
57 ( |
3028 | 58 ("md5", hashlib.md5), |
59 ("sha-1", hashlib.sha1), | |
60 ("sha-256", hashlib.sha256), | |
61 ("sha-512", hashlib.sha512), | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
62 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
63 ) |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 def __init__(self, host): |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 log.info(_("plugin Hashes initialization")) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
67 host.registerNamespace("hashes", NS_HASHES) |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
69 def getHandler(self, client): |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
70 return XEP_0300_handler() |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
71 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
72 def getHasher(self, algo=ALGO_DEFAULT): |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
73 """Return hasher instance |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
74 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
75 @param algo(unicode): one of the XEP_300.ALGOS keys |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
76 @return (hash object): same object s in hashlib. |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
77 update method need to be called for each chunh |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
78 diget or hexdigest can be used at the end |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
79 """ |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
80 return self.ALGOS[algo]() |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
81 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
82 def getDefaultAlgo(self): |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
83 return ALGO_DEFAULT |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
84 |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
85 @defer.inlineCallbacks |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
86 def getBestPeerAlgo(self, to_jid, profile): |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
87 """Return the best available hashing algorith of other peer |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
88 |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
89 @param to_jid(jid.JID): peer jid |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
90 @parm profile: %(doc_profile)s |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
91 @return (D(unicode, None)): best available algorithm, |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
92 or None if hashing is not possible |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
93 """ |
2148
a543eda2c923
core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents:
2145
diff
changeset
|
94 client = self.host.getClient(profile) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
95 for algo in reversed(XEP_0300.ALGOS): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
96 has_feature = yield self.host.hasFeature( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
97 client, NS_HASHES_FUNCTIONS.format(algo), to_jid |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
98 ) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
99 if has_feature: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
100 log.debug( |
3028 | 101 "Best hashing algorithm found for {jid}: {algo}".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
102 jid=to_jid.full(), algo=algo |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
103 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
104 ) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
105 defer.returnValue(algo) |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
106 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
107 def _calculateHashBlocking(self, file_obj, hasher): |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
108 """Calculate hash in a blocking way |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
109 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
110 /!\\ blocking method, please use calculateHash instead |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
111 @param file_obj(file): a file-like object |
3286
ddf3ded93b78
plugin XEP-0300; fixed use of calculateHash with getHasher
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
112 @param hasher(hash object): the method to call to initialise hash object |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
113 @return (str): the hex digest of the hash |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
114 """ |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
115 while True: |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
116 buf = file_obj.read(BUFFER_SIZE) |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
117 if not buf: |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
118 break |
3286
ddf3ded93b78
plugin XEP-0300; fixed use of calculateHash with getHasher
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
119 hasher.update(buf) |
ddf3ded93b78
plugin XEP-0300; fixed use of calculateHash with getHasher
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
120 return hasher.hexdigest() |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
121 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
122 def calculateHash(self, file_obj, hasher): |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
123 return threads.deferToThread(self._calculateHashBlocking, file_obj, hasher) |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
124 |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
125 def calculateHashElt(self, file_obj=None, algo=ALGO_DEFAULT): |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 """Compute hash and build hash element |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
128 @param file_obj(file, None): file-like object to use to calculate the hash |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
129 @param algo(unicode): algorithme to use, must be a key of XEP_0300.ALGOS |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
130 @return (D(domish.Element)): hash element |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
131 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
132 |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
133 def hashCalculated(hash_): |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
134 return self.buildHashElt(hash_, algo) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
135 |
3286
ddf3ded93b78
plugin XEP-0300; fixed use of calculateHash with getHasher
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
136 hasher = self.getHasher(algo) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
137 hash_d = self.calculateHash(file_obj, hasher) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
138 hash_d.addCallback(hashCalculated) |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
139 return hash_d |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
140 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
141 def buildHashUsedElt(self, algo=ALGO_DEFAULT): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
142 hash_used_elt = domish.Element((NS_HASHES, "hash-used")) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
143 hash_used_elt["algo"] = algo |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
144 return hash_used_elt |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
145 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
146 def parseHashUsedElt(self, parent): |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
147 """Find and parse a hash-used element |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
148 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
149 @param (domish.Element): parent of <hash/> element |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
150 @return (unicode): hash algorithm used |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
151 @raise exceptions.NotFound: the element is not present |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
152 @raise exceptions.DataError: the element is invalid |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
153 """ |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
154 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
155 hash_used_elt = next(parent.elements(NS_HASHES, "hash-used")) |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
156 except StopIteration: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
157 raise exceptions.NotFound |
3028 | 158 algo = hash_used_elt["algo"] |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
159 if not algo: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
160 raise exceptions.DataError |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
161 return algo |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
162 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
163 def buildHashElt(self, hash_, algo=ALGO_DEFAULT): |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
164 """Compute hash and build hash element |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
165 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
166 @param hash_(str): hash to use |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
167 @param algo(unicode): algorithme to use, must be a key of XEP_0300.ALGOS |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 @return (domish.Element): computed hash |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 """ |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
170 assert hash_ |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
171 assert algo |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
172 hash_elt = domish.Element((NS_HASHES, "hash")) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
173 if hash_ is not None: |
3028 | 174 b64_hash = base64.b64encode(hash_.encode('utf-8')).decode('utf-8') |
175 hash_elt.addContent(b64_hash) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
176 hash_elt["algo"] = algo |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 return hash_elt |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
179 def parseHashElt(self, parent): |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
180 """Find and parse a hash element |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
181 |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
182 if multiple elements are found, the strongest managed one is returned |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
183 @param (domish.Element): parent of <hash/> element |
3028 | 184 @return (tuple[str, bytes]): (algo, hash) tuple |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
185 both values can be None if <hash/> is empty |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
186 @raise exceptions.NotFound: the element is not present |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
187 @raise exceptions.DataError: the element is invalid |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
188 """ |
3028 | 189 algos = list(XEP_0300.ALGOS.keys()) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
190 hash_elt = None |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
191 best_algo = None |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
192 best_value = None |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
193 for hash_elt in parent.elements(NS_HASHES, "hash"): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
194 algo = hash_elt.getAttribute("algo") |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
195 try: |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
196 idx = algos.index(algo) |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
197 except ValueError: |
3040 | 198 log.warning(f"Proposed {algo} algorithm is not managed") |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
199 algo = None |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
200 continue |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
201 |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
202 if best_algo is None or algos.index(best_algo) < idx: |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
203 best_algo = algo |
3040 | 204 best_value = base64.b64decode(str(hash_elt)).decode('utf-8') |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
205 |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
206 if not hash_elt: |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
207 raise exceptions.NotFound |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
208 if not best_algo or not best_value: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
209 raise exceptions.DataError |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
210 return best_algo, best_value |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
211 |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
212 |
3028 | 213 @implementer(iwokkel.IDisco) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
214 class XEP_0300_handler(XMPPHandler): |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
215 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
216 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
217 hash_functions_names = [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
218 disco.DiscoFeature(NS_HASHES_FUNCTIONS.format(algo)) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
219 for algo in XEP_0300.ALGOS |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
220 ] |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
221 return [disco.DiscoFeature(NS_HASHES)] + hash_functions_names |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
222 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
223 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
224 return [] |