annotate sat/plugins/plugin_xep_0300.py @ 2613:9680cd958529

plugin XEP-0045: fixed crash when muc service is not found
author Goffi <goffi@goffi.org>
date Thu, 21 Jun 2018 01:21:44 +0200
parents 26edcf3a30eb
children 56f94936df1e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1934
2daf7b4c6756 use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
1 #!/usr/bin/env python2
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
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)
2483
0046283a285d dates update
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
5 # Copyright (C) 2009-2018 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
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
23 log = getLogger(__name__)
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
24 from sat.core import exceptions
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from twisted.words.xish import domish
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
26 from twisted.words.protocols.jabber.xmlstream import XMPPHandler
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
27 from twisted.internet import threads
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
28 from twisted.internet import defer
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
29 from zope.interface import implements
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
30 from wokkel import disco, iwokkel
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
31 from collections import OrderedDict
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
32 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
33 import base64
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
34
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 PLUGIN_INFO = {
2145
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
37 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
38 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
39 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
40 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
41 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
42 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
43 C.PI_HANDLER: "yes",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
44 C.PI_DESCRIPTION: _("""Management of cryptographic hashes""")
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
45 }
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
46
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
47 NS_HASHES = "urn:xmpp:hashes:2"
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
48 NS_HASHES_FUNCTIONS = u"urn:xmpp:hash-function-text-names:{}"
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
49 BUFFER_SIZE = 2**12
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
50 ALGO_DEFAULT = 'sha-256'
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
51
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
52
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
53 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
54 # TODO: add blake after moving to Python 3
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
55 ALGOS = OrderedDict((
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
56 (u'md5', hashlib.md5),
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
57 (u'sha-1', hashlib.sha1),
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
58 (u'sha-256', hashlib.sha256),
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
59 (u'sha-512', hashlib.sha512),
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
60 ))
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
61
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
62 def __init__(self, host):
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
63 log.info(_("plugin Hashes initialization"))
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
64 host.registerNamespace('hashes', NS_HASHES)
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
65
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
66 def getHandler(self, client):
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
67 return XEP_0300_handler()
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
68
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
69 def getHasher(self, algo=ALGO_DEFAULT):
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
70 """Return hasher instance
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 @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
73 @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
74 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
75 diget or hexdigest can be used at the end
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
76 """
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
77 return self.ALGOS[algo]()
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 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
80 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
81
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
82 @defer.inlineCallbacks
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
83 def getBestPeerAlgo(self, to_jid, profile):
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
84 """Return the best available hashing algorith of other peer
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
85
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
86 @param to_jid(jid.JID): peer jid
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
87 @parm profile: %(doc_profile)s
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
88 @return (D(unicode, None)): best available algorithm,
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
89 or None if hashing is not possible
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
90 """
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
91 client = self.host.getClient(profile)
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
92 for algo in reversed(XEP_0300.ALGOS):
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
93 has_feature = yield self.host.hasFeature(client, NS_HASHES_FUNCTIONS.format(algo), to_jid)
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
94 if has_feature:
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
95 log.debug(u"Best hashing algorithm found for {jid}: {algo}".format(
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
96 jid=to_jid.full(),
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
97 algo=algo))
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
98 defer.returnValue(algo)
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
99
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
100 def _calculateHashBlocking(self, file_obj, hasher):
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
101 """Calculate hash in a blocking way
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
102
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
103 /!\\ blocking method, please use calculateHash instead
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
104 @param file_obj(file): a file-like object
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
105 @param hasher(callable): the method to call to initialise hash object
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
106 @return (str): the hex digest of the hash
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
107 """
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
108 hash_ = hasher()
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
109 while True:
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
110 buf = file_obj.read(BUFFER_SIZE)
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
111 if not buf:
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
112 break
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
113 hash_.update(buf)
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
114 return hash_.hexdigest()
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
115
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
116 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
117 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
118
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
119 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
120 """Compute hash and build hash element
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
121
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
122 @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
123 @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
124 @return (D(domish.Element)): hash element
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
125 """
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
126 def hashCalculated(hash_):
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
127 return self.buildHashElt(hash_, algo)
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
128 hasher = self.ALGOS[algo]
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
129 hash_d = self.calculateHash(file_obj, hasher)
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
130 hash_d.addCallback(hashCalculated)
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
131 return hash_d
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
132
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
133 def buildHashUsedElt(self, algo=ALGO_DEFAULT):
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
134 hash_used_elt = domish.Element((NS_HASHES, 'hash-used'))
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
135 hash_used_elt['algo'] = algo
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
136 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
137
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
138 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
139 """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
140
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
141 @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
142 @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
143 @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
144 @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
145 """
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
146 try:
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
147 hash_used_elt = next(parent.elements(NS_HASHES, 'hash-used'))
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
148 except StopIteration:
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
149 raise exceptions.NotFound
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
150 algo = hash_used_elt[u'algo']
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
151 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
152 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
153 return algo
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
154
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
155 def buildHashElt(self, hash_, algo=ALGO_DEFAULT):
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
156 """Compute hash and build hash element
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
157
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
158 @param hash_(str): hash to use
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
159 @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
160 @return (domish.Element): computed hash
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
161 """
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
162 assert hash_
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
163 assert algo
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
164 hash_elt = domish.Element((NS_HASHES, 'hash'))
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
165 if hash_ is not None:
2502
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
166 hash_elt.addContent(base64.b64encode(hash_))
7ad5f2c4e34a XEP-0065,XEP-0096,XEP-0166,XEP-0235,XEP-0300: file transfer improvments:
Goffi <goffi@goffi.org>
parents: 2483
diff changeset
167 hash_elt['algo'] = algo
1526
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
168 return hash_elt
bb451fd1cea3 plugin XEP-0300: hashes management first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
169
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
170 def parseHashElt(self, parent):
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
171 """Find and parse a hash element
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
172
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
173 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
174 @param (domish.Element): parent of <hash/> element
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
175 @return (tuple[unicode, str]): (algo, hash) tuple
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
176 both values can be None if <hash/> is empty
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
177 @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
178 @raise exceptions.DataError: the element is invalid
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
179 """
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
180 algos = XEP_0300.ALGOS.keys()
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
181 hash_elt = None
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
182 best_algo = None
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
183 best_value = None
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
184 for hash_elt in parent.elements(NS_HASHES, 'hash'):
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
185 algo = hash_elt.getAttribute('algo')
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
186 try:
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
187 idx = algos.index(algo)
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
188 except ValueError:
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
189 log.warning(u"Proposed {} algorithm is not managed".format(algo))
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
190 algo = None
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
191 continue
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
192
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
193 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
194 best_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
195 best_value = base64.b64decode(unicode(hash_elt))
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
196
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
197 if not hash_elt:
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
198 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
199 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
200 raise exceptions.DataError
1618
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
201 return best_algo, best_value
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
202
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
203
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
204 class XEP_0300_handler(XMPPHandler):
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
205 implements(iwokkel.IDisco)
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
206
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
207 def getDiscoInfo(self, requestor, target, nodeIdentifier=''):
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
208 hash_functions_names = [disco.DiscoFeature(NS_HASHES_FUNCTIONS.format(algo)) for algo in XEP_0300.ALGOS]
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
209 return [disco.DiscoFeature(NS_HASHES)] + hash_functions_names
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
210
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
211 def getDiscoItems(self, requestor, target, nodeIdentifier=''):
0de5f210fe56 plugin XEP-0300: implemented hashing:
Goffi <goffi@goffi.org>
parents: 1526
diff changeset
212 return []