This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository libx2goclient. commit f919a4b85f4de20ead19cb2dd41087fd74f9666b Author: Mihai Moldovan <ionic@ionic.de> Date: Sat Aug 31 21:50:59 2019 +0200 src/x2goclient-network-ssh.{c,h}: initial ssh command call construction. Currently creates something like [ssh] [host] [[-p] [port]]. --- src/x2goclient-network-ssh.c | 99 +++++++++++++++++++++++++++++++++++++++++--- src/x2goclient-network-ssh.h | 6 ++- 2 files changed, 99 insertions(+), 6 deletions(-) diff --git a/src/x2goclient-network-ssh.c b/src/x2goclient-network-ssh.c index fa9612c..94374c3 100644 --- a/src/x2goclient-network-ssh.c +++ b/src/x2goclient-network-ssh.c @@ -592,18 +592,107 @@ static gboolean x2goclient_network_ssh_parent_connect (X2GoClientNetwork *parent g_free (dirname); dirname = NULL; - GArray *ssh_cmd = g_array_new (TRUE, TRUE, sizeof (gchar*)); - g_array_set_clear_func (ssh_cmd, &x2goclient_clear_strings); - (void) g_array_append_vals (ssh_cmd, "ssh", 1); + GPtrArray *ssh_cmd = g_ptr_array_new_with_free_func (&x2goclient_clear_strings); + g_ptr_array_add (ssh_cmd, g_strdup ("ssh")); + + GSocketAddress *sock_addr = NULL; if (ret) { - ret = FALSE; + g_object_get (G_OBJECT (self), "socket", &sock_addr, NULL); + + if (!(sock_addr)) { + g_set_error_literal (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_NULL, "No end point to connect to."); + ret = FALSE; + } + } + + if (ret) { + if (G_IS_UNIX_SOCKET_ADDRESS (sock_addr)) { + GUnixSocketAddress *unix_sock_addr = G_UNIX_SOCKET_ADDRESS (sock_addr); + + /* + * Tiny problem here: abstract sockets won't work. + * Since program arguments can't contain NULL bytes due to being C + * strings and every abstract socket already has to start with a NULL + * byte, we'll be just adding an empty argument here. + * + * Maybe there will be a way to do that correctly, some day. + */ + g_ptr_array_add (ssh_cmd, g_strdup (g_unix_socket_address_get_path (unix_sock_addr))); + } + else if (G_IS_INET_SOCKET_ADDRESS (sock_addr)) { + GInetSocketAddress *inet_sock_addr = G_INET_SOCKET_ADDRESS (sock_addr); + GInetAddress *inet_addr = g_inet_socket_address_get_address (inet_sock_addr); + guint16 port = g_inet_socket_address_get_port (inet_sock_addr); + + if (!(inet_addr)) { + g_set_error_literal (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_INET_ADDR_NULL, "Internet socket address is undefined, cannot connect to an unknown remote IP host."); + ret = FALSE; + } + else { + g_ptr_array_add (ssh_cmd, g_inet_address_to_string (inet_addr)); + + /* + * Handle port parameter, unless it's 0, which means to use the default + * value. + */ + if (port) { + g_ptr_array_add (ssh_cmd, g_strdup ("-p")); + g_ptr_array_add (ssh_cmd, g_strdup_printf ("%d", port)); + } + } + } + else if (G_IS_NATIVE_SOCKET_ADDRESS (sock_addr)) { + GNativeSocketAddress *native_sock_addr = G_NATIVE_SOCKET_ADDRESS (sock_addr); + + g_assert (sizeof (struct sockaddr_ho) == g_socket_address_get_native_size (sock_addr)); + + struct sockaddr_ho tmp_sockaddr = { 0 }; + + /* Fetch data. */ + GError *tmp_err = NULL; + g_socket_address_to_native (sock_addr, &tmp_sockaddr, sizeof (struct sockaddr_ho), &tmp_err); + + if (tmp_err) { + g_set_error (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_NATIVE_FETCH, "Unable to convert native socket address object to sockaddr struct: %s", tmp_err->message); + g_clear_error (&tmp_err); + ret = FALSE; + } + + if (ret) { + g_ptr_array_add (ssh_cmd, g_strdup (tmp_sockaddr.sho_addr)); + + /* + * Handle port parameter, unless it's 0, which means to use the default + * value. + */ + if (tmp_sockaddr.sho_port) { + g_ptr_array_add (ssh_cmd, g_strdup ("-p")); + g_ptr_array_add (ssh_cmd, g_strdup_printf ("%d", tmp_sockaddr.sho_port)); + } + } + } + else { + g_set_error_literal (gerr, X2GOCLIENT_NETWORK_SSH_ERROR, X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_UNKNOWN, "Unknown data in socket property, can't connect."); + ret = FALSE; + } + + g_clear_object (&sock_addr); + sock_addr = NULL; + } + + if (ret) { + g_printf ("Would try to connect via:"); + for (gsize i = 0; i < ssh_cmd->len; ++i) { + g_printf (" [%s]", (gchar *)g_ptr_array_index (ssh_cmd, i)); + } + g_printf ("\n"); } g_free (session_path); session_path = NULL; - g_array_unref (ssh_cmd); + g_ptr_array_unref (ssh_cmd); ssh_cmd = NULL; return (ret); diff --git a/src/x2goclient-network-ssh.h b/src/x2goclient-network-ssh.h index 6c88c0e..dcb83f8 100644 --- a/src/x2goclient-network-ssh.h +++ b/src/x2goclient-network-ssh.h @@ -51,7 +51,11 @@ enum { X2GOCLIENT_NETWORK_SSH_ERROR_IPV6_CONV, X2GOCLIENT_NETWORK_SSH_ERROR_IPV4_CONV, X2GOCLIENT_NETWORK_SSH_ERROR_ALIAS_CONV, - X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_DIR_CREATE + X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_DIR_CREATE, + X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_NULL, + X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_INET_ADDR_NULL, + X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_NATIVE_FETCH, + X2GOCLIENT_NETWORK_SSH_ERROR_CONNECT_SOCK_ADDR_UNKNOWN, }; -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/libx2goclient.git