matterbridge-shelly
Version:
Matterbridge shelly plugin
57 lines (56 loc) • 2.18 kB
JavaScript
import crypto from 'node:crypto';
export function parseBasicAuthenticateHeader(authHeader) {
authHeader = authHeader.replace('Basic ', '');
const authParams = {};
authHeader.split(', ').forEach((param) => {
const eqIdx = param.indexOf('=');
if (eqIdx === -1)
return;
const key = param.slice(0, eqIdx).trim();
const value = param.slice(eqIdx + 1).replace(/"/g, '');
authParams[key] = value;
});
return authParams;
}
export function parseDigestAuthenticateHeader(authHeader) {
authHeader = authHeader.replace('Digest ', '');
const authParams = {};
authHeader.split(', ').forEach((param) => {
const eqIdx = param.indexOf('=');
if (eqIdx === -1)
return;
const key = param.slice(0, eqIdx).trim();
const value = param.slice(eqIdx + 1).replace(/"/g, '');
authParams[key] = value;
});
return authParams;
}
export function createBasicShellyAuth(username, password) {
return Buffer.from(`${username}:${password}`).toString('base64');
}
export function createDigestShellyAuth(username, password, nonce, cnonce, realm, nc = 1) {
const ncHex = nc.toString(16).padStart(8, '0');
const auth = { realm, username, nonce, cnonce, nc: ncHex, response: '', algorithm: 'SHA-256' };
const ha1 = crypto.createHash('sha256').update(`admin:${auth.realm}:${password}`).digest('hex');
const ha2 = crypto.createHash('sha256').update('dummy_method:dummy_uri').digest('hex');
auth.response = crypto.createHash('sha256').update(`${ha1}:${auth.nonce}:${ncHex}:${cnonce}:auth:${ha2}`).digest('hex');
return auth;
}
export function generateNonce(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
export function getGen1BodyOptions(params) {
return new URLSearchParams(params).toString();
}
export function getGen2BodyOptions(jsonrpc, id, src, method, params, auth) {
const body = {};
body.jsonrpc = '2.0';
body.id = 10;
body.src = 'Matterbridge';
body.method = method;
if (params)
body.params = params;
if (auth)
body.auth = auth;
return JSON.stringify(body);
}