35 lines
810 B
JavaScript
35 lines
810 B
JavaScript
import xml from "@xmpp/xml";
|
|
|
|
import { canUpgrade, upgrade } from "./starttls.js";
|
|
|
|
/*
|
|
* References
|
|
* https://xmpp.org/rfcs/rfc6120.html#tls
|
|
*/
|
|
|
|
const NS = "urn:ietf:params:xml:ns:xmpp-tls";
|
|
|
|
async function negotiate(entity) {
|
|
const element = await entity.sendReceive(xml("starttls", { xmlns: NS }));
|
|
if (element.is("proceed", NS)) {
|
|
return element;
|
|
}
|
|
|
|
throw new Error("STARTTLS_FAILURE");
|
|
}
|
|
|
|
export default function starttls({ streamFeatures }) {
|
|
return streamFeatures.use("starttls", NS, async ({ entity }, next) => {
|
|
const { socket, options } = entity;
|
|
if (!canUpgrade(socket)) {
|
|
return next();
|
|
}
|
|
|
|
await negotiate(entity);
|
|
const tlsSocket = await upgrade(socket, { host: options.domain });
|
|
entity._attachSocket(tlsSocket);
|
|
|
|
await entity.restart();
|
|
});
|
|
}
|