Sat, 02 Nov 2019 04:03:11 -0400
xmpp: Reduce redundancies in various signon methods.
| libpurple/protocols/jabber/jabber.c | file | annotate | diff | comparison | revisions |
--- a/libpurple/protocols/jabber/jabber.c Fri Nov 01 05:21:57 2019 -0400 +++ b/libpurple/protocols/jabber/jabber.c Sat Nov 02 04:03:11 2019 -0400 @@ -656,45 +656,6 @@ } static void -jabber_login_callback_ssl(GObject *source_object, GAsyncResult *res, - gpointer data) -{ - GSocketClient *client = G_SOCKET_CLIENT(source_object); - JabberStream *js = data; - GSocketConnection *conn; - GSource *source; - GError *error = NULL; - - conn = g_socket_client_connect_to_host_finish(client, res, &error); - if (conn == NULL) { - if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - g_error_free(error); - } else { - purple_connection_take_error(js->gc, error); - } - return; - } - - js->stream = G_IO_STREAM(g_tcp_wrapper_connection_get_base_io_stream( - G_TCP_WRAPPER_CONNECTION(conn))); - js->input = g_io_stream_get_input_stream(js->stream); - js->output = purple_queued_output_stream_new( - g_io_stream_get_output_stream(js->stream)); - - if (js->state == JABBER_STREAM_CONNECTING) { - jabber_send_raw(js, "<?xml version='1.0' ?>", -1); - } - jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING); - source = g_pollable_input_stream_create_source( - G_POLLABLE_INPUT_STREAM(js->input), js->cancellable); - g_source_set_callback(source, (GSourceFunc)jabber_recv_cb, js->gc, NULL); - js->inpa = g_source_attach(source, NULL); - - /* Tell the app that we're doing encryption */ - jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING_ENCRYPTION); -} - -static void txt_resolved_cb(GObject *sender, GAsyncResult *result, gpointer data) { GError *error = NULL; @@ -758,12 +719,34 @@ } static void +jabber_stream_connect_finish(JabberStream *js, GIOStream *stream) +{ + GSource *source; + + js->stream = stream; + js->input = g_io_stream_get_input_stream(js->stream); + js->output = purple_queued_output_stream_new( + g_io_stream_get_output_stream(js->stream)); + + if (js->state == JABBER_STREAM_CONNECTING) { + jabber_send_raw(js, "<?xml version='1.0' ?>", -1); + } + + jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING); + source = g_pollable_input_stream_create_source( + G_POLLABLE_INPUT_STREAM(js->input), js->cancellable); + g_source_set_callback(source, (GSourceFunc)jabber_recv_cb, js->gc, NULL); + js->inpa = g_source_attach(source, NULL); +} + +static void jabber_login_callback(GObject *source_object, GAsyncResult *res, gpointer data) { GSocketClient *client = G_SOCKET_CLIENT(source_object); JabberStream *js = data; GSocketConnection *conn; - GSource *source; + GIOStream *stream; + gboolean is_old_ssl = g_socket_client_get_tls(client); GError *error = NULL; conn = g_socket_client_connect_to_host_finish(client, res, &error); @@ -774,6 +757,10 @@ if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { g_error_free(error); return; + } else if (is_old_ssl) { + /* Old-style SSL only makes a direct connection, or fails. */ + purple_connection_take_error(js->gc, error); + return; } g_error_free(error); @@ -792,27 +779,25 @@ return; } - js->stream = G_IO_STREAM(conn); - js->input = g_io_stream_get_input_stream(js->stream); - js->output = purple_queued_output_stream_new( - g_io_stream_get_output_stream(js->stream)); - - if (js->state == JABBER_STREAM_CONNECTING) { - jabber_send_raw(js, "<?xml version='1.0' ?>", -1); + if (is_old_ssl) { + stream = G_IO_STREAM(g_tcp_wrapper_connection_get_base_io_stream( + G_TCP_WRAPPER_CONNECTION(conn))); + } else { + stream = G_IO_STREAM(conn); } - jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING); - source = g_pollable_input_stream_create_source( - G_POLLABLE_INPUT_STREAM(js->input), js->cancellable); - g_source_set_callback(source, (GSourceFunc)jabber_recv_cb, js->gc, NULL); - js->inpa = g_source_attach(source, NULL); + jabber_stream_connect_finish(js, stream); + + if (is_old_ssl) { + /* Tell the app that we're doing encryption */ + jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING_ENCRYPTION); + } } static void tls_handshake_cb(GObject *source_object, GAsyncResult *res, gpointer data) { JabberStream *js = data; - GSource *source; GError *error = NULL; if (!g_tls_connection_handshake_finish(G_TLS_CONNECTION(source_object), res, @@ -831,18 +816,7 @@ return; } - js->input = g_io_stream_get_input_stream(js->stream); - js->output = purple_queued_output_stream_new( - g_io_stream_get_output_stream(js->stream)); - - if (js->state == JABBER_STREAM_CONNECTING) { - jabber_send_raw(js, "<?xml version='1.0' ?>", -1); - } - jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING); - source = g_pollable_input_stream_create_source( - G_POLLABLE_INPUT_STREAM(js->input), js->cancellable); - g_source_set_callback(source, (GSourceFunc)jabber_recv_cb, js->gc, NULL); - js->inpa = g_source_attach(source, NULL); + jabber_stream_connect_finish(js, js->stream); /* Tell the app that we're doing encryption */ jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING_ENCRYPTION); @@ -889,7 +863,6 @@ GSocketClient *client = G_SOCKET_CLIENT(source_object); JabberStream *js = data; GSocketConnection *conn; - GSource *source; GError *error = NULL; conn = g_socket_client_connect_to_service_finish(client, result, &error); @@ -923,20 +896,7 @@ return; } - js->stream = G_IO_STREAM(conn); - js->input = g_io_stream_get_input_stream(js->stream); - js->output = purple_queued_output_stream_new( - g_io_stream_get_output_stream(js->stream)); - - if (js->state == JABBER_STREAM_CONNECTING) { - jabber_send_raw(js, "<?xml version='1.0' ?>", -1); - } - - jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING); - source = g_pollable_input_stream_create_source( - G_POLLABLE_INPUT_STREAM(js->input), js->cancellable); - g_source_set_callback(source, (GSourceFunc)jabber_recv_cb, js->gc, NULL); - js->inpa = g_source_attach(source, NULL); + jabber_stream_connect_finish(js, G_IO_STREAM(conn)); } static JabberStream * @@ -1091,7 +1051,7 @@ g_socket_client_connect_to_host_async( js->client, js->certificate_CN, purple_account_get_int(account, "port", 5223), js->cancellable, - jabber_login_callback_ssl, js); + jabber_login_callback, js); return; }