Use the native crypto library for SHA-1

instead of the one from Strophe
This commit is contained in:
JC Brand 2022-07-14 20:34:15 +02:00
parent 4aab83c4af
commit 07efd601da
2 changed files with 21 additions and 9 deletions

View File

@ -3,7 +3,7 @@
* @license Mozilla Public License (MPLv2) * @license Mozilla Public License (MPLv2)
*/ */
import { api, converse } from '@converse/headless/core'; import { api, converse } from '@converse/headless/core';
import { createCapsNode } from './utils.js'; import { addCapsNode } from './utils.js';
const { Strophe } = converse.env; const { Strophe } = converse.env;
@ -15,7 +15,7 @@ converse.plugins.add('converse-caps', {
dependencies: ['converse-status'], dependencies: ['converse-status'],
initialize () { initialize () {
api.listen.on('constructedPresence', (_, p) => (p.root().cnode(createCapsNode()).up() && p)); api.listen.on('constructedPresence', (_, p) => addCapsNode(p));
api.listen.on('constructedMUCPresence', (_, p) => (p.root().cnode(createCapsNode()).up() && p)); api.listen.on('constructedMUCPresence', (_, p) => addCapsNode(p));
} }
}); });

View File

@ -1,5 +1,5 @@
import SHA1 from 'strophe.js/src/sha1'; import { _converse, converse } from '@converse/headless/core.js';
import { _converse, converse } from '@converse/headless/core'; import { arrayBufferToBase64 } from '@converse/headless/utils/arraybuffer.js';
const { Strophe, $build } = converse.env; const { Strophe, $build } = converse.env;
@ -7,7 +7,7 @@ function propertySort (array, property) {
return array.sort((a, b) => { return a[property] > b[property] ? -1 : 1 }); return array.sort((a, b) => { return a[property] > b[property] ? -1 : 1 });
} }
function generateVerificationString () { async function generateVerificationString () {
const identities = _converse.api.disco.own.identities.get(); const identities = _converse.api.disco.own.identities.get();
const features = _converse.api.disco.own.features.get(); const features = _converse.api.disco.own.features.get();
@ -20,14 +20,26 @@ function generateVerificationString () {
let S = identities.reduce((result, id) => `${result}${id.category}/${id.type}/${id?.lang ?? ''}/${id.name}<`, ""); let S = identities.reduce((result, id) => `${result}${id.category}/${id.type}/${id?.lang ?? ''}/${id.name}<`, "");
features.sort(); features.sort();
S = features.reduce((result, feature) => `${result}${feature}<`, S); S = features.reduce((result, feature) => `${result}${feature}<`, S);
return SHA1.b64_sha1(S);
const ab = await crypto.subtle.digest('SHA-1', S);
return arrayBufferToBase64(ab);
} }
export function createCapsNode () { async function createCapsNode () {
return $build("c", { return $build("c", {
'xmlns': Strophe.NS.CAPS, 'xmlns': Strophe.NS.CAPS,
'hash': "sha-1", 'hash': "sha-1",
'node': "https://conversejs.org", 'node': "https://conversejs.org",
'ver': generateVerificationString() 'ver': await generateVerificationString()
}).nodeTree; }).nodeTree;
} }
/**
* Given a stanza, adds a XEP-0115 CAPS element
* @param { XMLElement } stanza
*/
export async function addCapsNode (stanza) {
const caps_el = await createCapsNode();
return stanza.root().cnode(caps_el).up() && stanza;
}