fix caps hash computaion according to XEP-0115. fixes #3925

This commit is contained in:
Yann Leboulanger 2008-05-14 18:30:39 +00:00
parent 2552e1024f
commit 44fc7ddd0c
2 changed files with 33 additions and 2 deletions

View File

@ -236,7 +236,7 @@ class ConnectionCaps(object):
return return
node, hash = node.split('#', 1) node, hash = node.split('#', 1)
computed_hash = helpers.compute_caps_hash(identities, features, computed_hash = helpers.compute_caps_hash(identities, features,
contact.caps_hash_method) dataforms=dataforms, hash_method=contact.caps_hash_method)
if computed_hash != hash: if computed_hash != hash:
# wrong hash, forget it # wrong hash, forget it
contact.caps_node = '' contact.caps_node = ''

View File

@ -1245,7 +1245,18 @@ def sort_identities_func(i1, i2):
return 1 return 1
return 0 return 0
def compute_caps_hash(identities, features, hash_method='sha-1'): def sort_dataforms_func(d1, d2):
f1 = d1.getField('FORM_TYPE')
f2 = d2.getField('FORM_TYPE')
if f1 and f2 and (f1.getValue() < f2.getValue()):
return -1
return 1
def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'):
'''Compute caps hash according to XEP-0115, V1.5
dataforms are xmpp.DataForms objects as common.dataforms don't allow several
values without a field type list-multi'''
S = '' S = ''
identities.sort(cmp=sort_identities_func) identities.sort(cmp=sort_identities_func)
for i in identities: for i in identities:
@ -1266,6 +1277,26 @@ def compute_caps_hash(identities, features, hash_method='sha-1'):
features.sort() features.sort()
for f in features: for f in features:
S += '%s<' % f S += '%s<' % f
dataforms.sort(cmp=sort_dataforms_func)
for dataform in dataforms:
# fields indexed by var
fields = {}
for f in dataform.getChildren():
fields[f.getVar()] = f
form_type = fields.get('FORM_TYPE')
if form_type:
S += form_type.getValue() + '<'
del fields['FORM_TYPE']
vars = fields.keys()
vars.sort()
for var in vars:
S += '%s<' % var
values = fields[var].getValues()
values.sort()
for value in values:
S += '%s<' % value
print S
if hash_method == 'sha-1': if hash_method == 'sha-1':
hash = hash_sha1(S) hash = hash_sha1(S)
elif hash_method == 'md5': elif hash_method == 'md5':