Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0300.py @ 4005:54a6b44f173b
component AP gateway: reset stream position after getting payload:
the stream position needs to be reset, as the body may be read again to compute signature
hash.
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 16 Mar 2023 12:28:52 +0100 |
parents | 40d47cc29ea4 |
children | 524856bd7b19 |
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 |
3916 | 20 from typing import Tuple |
21 import base64 | |
22 from collections import OrderedDict | |
23 import hashlib | |
24 | |
25 from twisted.internet import threads | |
26 from twisted.internet import defer | |
27 from twisted.words.protocols.jabber.xmlstream import XMPPHandler | |
28 from twisted.words.xish import domish | |
29 from wokkel import disco, iwokkel | |
30 from zope.interface import implementer | |
31 | |
32 from sat.core import exceptions | |
33 from sat.core.constants import Const as C | |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 from sat.core.i18n import _ |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 from sat.core.log import getLogger |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
36 |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 log = getLogger(__name__) |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 PLUGIN_INFO = { |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
41 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
|
42 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
|
43 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
|
44 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
|
45 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
|
46 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
|
47 C.PI_HANDLER: "yes", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
48 C.PI_DESCRIPTION: _("""Management of cryptographic hashes"""), |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 } |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
51 NS_HASHES = "urn:xmpp:hashes:2" |
3028 | 52 NS_HASHES_FUNCTIONS = "urn:xmpp:hash-function-text-names:{}" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
53 BUFFER_SIZE = 2 ** 12 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
54 ALGO_DEFAULT = "sha-256" |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
55 |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 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
|
58 # TODO: add blake after moving to Python 3 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
59 ALGOS = OrderedDict( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
60 ( |
3028 | 61 ("md5", hashlib.md5), |
62 ("sha-1", hashlib.sha1), | |
63 ("sha-256", hashlib.sha256), | |
64 ("sha-512", hashlib.sha512), | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
65 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
66 ) |
3916 | 67 ALGO_DEFAULT = ALGO_DEFAULT |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 def __init__(self, host): |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 log.info(_("plugin Hashes initialization")) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
71 host.registerNamespace("hashes", NS_HASHES) |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
73 def getHandler(self, client): |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
74 return XEP_0300_handler() |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
75 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
76 def getHasher(self, algo=ALGO_DEFAULT): |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
77 """Return hasher instance |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
78 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
79 @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
|
80 @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
|
81 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
|
82 diget or hexdigest can be used at the end |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
83 """ |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
84 return self.ALGOS[algo]() |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
85 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
86 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
|
87 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
|
88 |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
89 @defer.inlineCallbacks |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
90 def getBestPeerAlgo(self, to_jid, profile): |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
91 """Return the best available hashing algorith of other peer |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
92 |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
93 @param to_jid(jid.JID): peer jid |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
94 @parm profile: %(doc_profile)s |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
95 @return (D(unicode, None)): best available algorithm, |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
96 or None if hashing is not possible |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
97 """ |
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
|
98 client = self.host.getClient(profile) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
99 for algo in reversed(XEP_0300.ALGOS): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
100 has_feature = yield self.host.hasFeature( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
101 client, NS_HASHES_FUNCTIONS.format(algo), to_jid |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
102 ) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
103 if has_feature: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
104 log.debug( |
3028 | 105 "Best hashing algorithm found for {jid}: {algo}".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
106 jid=to_jid.full(), algo=algo |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
107 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
108 ) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
109 defer.returnValue(algo) |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
110 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
111 def _calculateHashBlocking(self, file_obj, hasher): |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
112 """Calculate hash in a blocking way |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
113 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
114 /!\\ blocking method, please use calculateHash instead |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
115 @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
|
116 @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
|
117 @return (str): the hex digest of the hash |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
118 """ |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
119 while True: |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
120 buf = file_obj.read(BUFFER_SIZE) |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
121 if not buf: |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
122 break |
3286
ddf3ded93b78
plugin XEP-0300; fixed use of calculateHash with getHasher
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
123 hasher.update(buf) |
ddf3ded93b78
plugin XEP-0300; fixed use of calculateHash with getHasher
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
124 return hasher.hexdigest() |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
125 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
126 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
|
127 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
|
128 |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
129 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
|
130 """Compute hash and build hash element |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
132 @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
|
133 @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
|
134 @return (D(domish.Element)): hash element |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
135 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
136 |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
137 def hashCalculated(hash_): |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
138 return self.buildHashElt(hash_, algo) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
139 |
3286
ddf3ded93b78
plugin XEP-0300; fixed use of calculateHash with getHasher
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
140 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
|
141 hash_d = self.calculateHash(file_obj, hasher) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
142 hash_d.addCallback(hashCalculated) |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
143 return hash_d |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
144 |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
145 def buildHashUsedElt(self, algo=ALGO_DEFAULT): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
146 hash_used_elt = domish.Element((NS_HASHES, "hash-used")) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
147 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
|
148 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
|
149 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
150 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
|
151 """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
|
152 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
153 @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
|
154 @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
|
155 @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
|
156 @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
|
157 """ |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
158 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
159 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
|
160 except StopIteration: |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
161 raise exceptions.NotFound |
3028 | 162 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
|
163 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
|
164 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
|
165 return algo |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
166 |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
167 def buildHashElt(self, hash_, algo=ALGO_DEFAULT): |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
168 """Compute hash and build hash element |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
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 @param hash_(str): hash to use |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 @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
|
172 @return (domish.Element): computed hash |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 """ |
2502
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
174 assert hash_ |
7ad5f2c4e34a
XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
175 assert algo |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
176 hash_elt = domish.Element((NS_HASHES, "hash")) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
177 if hash_ is not None: |
3028 | 178 b64_hash = base64.b64encode(hash_.encode('utf-8')).decode('utf-8') |
179 hash_elt.addContent(b64_hash) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
180 hash_elt["algo"] = algo |
1526
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 return hash_elt |
bb451fd1cea3
plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 |
3916 | 183 def parseHashElt(self, parent: domish.Element) -> Tuple[str, bytes]: |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
184 """Find and parse a hash element |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
185 |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
186 if multiple elements are found, the strongest managed one is returned |
3916 | 187 @param parent: parent of <hash/> element |
188 @return: (algo, hash) tuple | |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
189 both values can be None if <hash/> is empty |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
190 @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
|
191 @raise exceptions.DataError: the element is invalid |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
192 """ |
3028 | 193 algos = list(XEP_0300.ALGOS.keys()) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
194 hash_elt = None |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
195 best_algo = None |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
196 best_value = None |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
197 for hash_elt in parent.elements(NS_HASHES, "hash"): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
198 algo = hash_elt.getAttribute("algo") |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
199 try: |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
200 idx = algos.index(algo) |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
201 except ValueError: |
3040 | 202 log.warning(f"Proposed {algo} algorithm is not managed") |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
203 algo = None |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
204 continue |
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 best_algo is None or algos.index(best_algo) < idx: |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
207 best_algo = algo |
3040 | 208 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
|
209 |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
210 if not hash_elt: |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
211 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
|
212 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
|
213 raise exceptions.DataError |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
214 return best_algo, best_value |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
215 |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
216 |
3028 | 217 @implementer(iwokkel.IDisco) |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
218 class XEP_0300_handler(XMPPHandler): |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
219 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
220 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
221 hash_functions_names = [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
222 disco.DiscoFeature(NS_HASHES_FUNCTIONS.format(algo)) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
223 for algo in XEP_0300.ALGOS |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
224 ] |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
225 return [disco.DiscoFeature(NS_HASHES)] + hash_functions_names |
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
226 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
227 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
1618
0de5f210fe56
plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents:
1526
diff
changeset
|
228 return [] |