* ISC License
* Copyright (C) 2024 Huawei Device Co., Ltd.
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
"use strict";
import xml from "@ohos/xmpp_xml";
import { canUpgrade,upgrade } from "./starttls";
* 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(entity.service);
entity._attachSocket(tlsSocket);
await entity.restart();
});
};