From 07917f1d841f449157aa3aaa2507b0547dd274e7 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Mon, 16 Nov 2020 15:55:33 +0100 Subject: Refactor XmppStream, TLS and connection method logic fixes #534 --- xmpp-vala/src/core/starttls_xmpp_stream.vala | 54 ++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 xmpp-vala/src/core/starttls_xmpp_stream.vala (limited to 'xmpp-vala/src/core/starttls_xmpp_stream.vala') diff --git a/xmpp-vala/src/core/starttls_xmpp_stream.vala b/xmpp-vala/src/core/starttls_xmpp_stream.vala new file mode 100644 index 00000000..3df0dffb --- /dev/null +++ b/xmpp-vala/src/core/starttls_xmpp_stream.vala @@ -0,0 +1,54 @@ +public class Xmpp.StartTlsXmppStream : TlsXmppStream { + + private const string TLS_NS_URI = "urn:ietf:params:xml:ns:xmpp-tls"; + + string host; + uint16 port; + + public StartTlsXmppStream(Jid remote, string host, uint16 port) { + this.remote_name = remote; + this.host = host; + this.port = port; + } + + public override async void connect() throws IOStreamError { + try { + SocketClient client = new SocketClient(); + debug("Connecting to %s %i (starttls)", host, port); + IOStream stream = yield client.connect_to_host_async(host, port); + reset_stream(stream); + + yield setup(); + + StanzaNode node = yield read(); + var starttls_node = node.get_subnode("starttls", TLS_NS_URI); + if (starttls_node == null) { + warning("%s does not offer starttls", remote_name.to_string()); + } + + write(new StanzaNode.build("starttls", TLS_NS_URI).add_self_xmlns()); + + node = yield read(); + + if (node.ns_uri != TLS_NS_URI || node.name != "proceed") { + warning("Server did not 'proceed' starttls request"); + } + + try { + var identity = new NetworkService("xmpp-client", "tcp", remote_name.to_string()); + var conn = TlsClientConnection.new(get_stream(), identity); + reset_stream(conn); + + conn.accept_certificate.connect(on_invalid_certificate); + } catch (Error e) { + stderr.printf("Failed to start TLS: %s\n", e.message); + } + + yield setup(); + + attach_negotation_modules(); + } catch (Error e) { + throw new IOStreamError.CONNECT("Failed connecting to %s:%i (starttls): %s", host, port, e.message); + } + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf