summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2014-11-10 11:04:45 +1300
committerRobert Ancell <robert.ancell@canonical.com>2014-11-10 11:04:45 +1300
commitcb72ae149f4dc5f85ec7b6c1c529a79980b6321b (patch)
treef83ea25469e2b3b3d3e9b681e36f10b60df9c132
parent490bbc43ae05c0ae7fcac9fd781ffa899634930a (diff)
downloadlightdm-git-cb72ae149f4dc5f85ec7b6c1c529a79980b6321b.tar.gz
Add an option for XDMCP and VNC servers to only listen on one address
-rw-r--r--data/lightdm.conf4
-rw-r--r--src/vnc-server.c42
-rw-r--r--src/vnc-server.h4
-rw-r--r--src/xdmcp-server.c42
-rw-r--r--src/xdmcp-server.h4
5 files changed, 88 insertions, 8 deletions
diff --git a/data/lightdm.conf b/data/lightdm.conf
index bfce7987..4f010a5a 100644
--- a/data/lightdm.conf
+++ b/data/lightdm.conf
@@ -129,6 +129,7 @@
#
# enabled = True if XDMCP connections should be allowed
# port = UDP/IP port to listen for connections on
+# listen-address = Host/address to listen for XDMCP connections (use all addresses if not present)
# key = Authentication key to use for XDM-AUTHENTICATION-1 or blank to not use authentication (stored in keys.conf)
#
# The authentication key is a 56 bit DES key specified in hex as 0xnnnnnnnnnnnnnn. Alternatively
@@ -137,6 +138,7 @@
[XDMCPServer]
#enabled=false
#port=177
+#listen-address=
#key=
#
@@ -145,6 +147,7 @@
# enabled = True if VNC connections should be allowed
# command = Command to run Xvnc server with
# port = TCP/IP port to listen for connections on
+# listen-address = Host/address to listen for VNC connections (use all addresses if not present)
# width = Width of display to use
# height = Height of display to use
# depth = Color depth of display to use
@@ -153,6 +156,7 @@
#enabled=false
#command=Xvnc
#port=5900
+#listen-address=
#width=1024
#height=768
#depth=8
diff --git a/src/vnc-server.c b/src/vnc-server.c
index 2ccb2292..d4e6e9d9 100644
--- a/src/vnc-server.c
+++ b/src/vnc-server.c
@@ -24,6 +24,9 @@ struct VNCServerPrivate
/* Port to listen on */
guint port;
+ /* Address to listen on */
+ gchar *listen_address;
+
/* Listening sockets */
GSocket *socket, *socket6;
};
@@ -50,6 +53,22 @@ vnc_server_get_port (VNCServer *server)
return server->priv->port;
}
+void
+vnc_server_set_listen_address (VNCServer *server, const gchar *listen_address)
+{
+ g_return_if_fail (server != NULL);
+
+ g_free (server->priv->listen_address);
+ server->priv->listen_address = g_strdup (listen_address);
+}
+
+const gchar *
+vnc_server_get_listen_address (VNCServer *server)
+{
+ g_return_val_if_fail (server != NULL, NULL);
+ return server->priv->listen_address;
+}
+
static gboolean
read_cb (GSocket *socket, GIOCondition condition, VNCServer *server)
{
@@ -78,7 +97,7 @@ read_cb (GSocket *socket, GIOCondition condition, VNCServer *server)
}
static GSocket *
-open_tcp_socket (GSocketFamily family, guint port, GError **error)
+open_tcp_socket (GSocketFamily family, guint port, const gchar *listen_address, GError **error)
{
GSocket *socket;
GSocketAddress *address;
@@ -87,7 +106,21 @@ open_tcp_socket (GSocketFamily family, guint port, GError **error)
if (!socket)
return NULL;
- address = g_inet_socket_address_new (g_inet_address_new_any (family), port);
+ if (listen_address)
+ {
+ GList *addresses;
+
+ addresses = g_resolver_lookup_by_name (g_resolver_get_default (), listen_address, NULL, error);
+ if (!addresses)
+ {
+ g_object_unref (socket);
+ return NULL;
+ }
+ address = g_inet_socket_address_new (addresses->data, port);
+ g_resolver_free_addresses (addresses);
+ }
+ else
+ address = g_inet_socket_address_new (g_inet_address_new_any (family), port);
if (!g_socket_bind (socket, address, TRUE, error) ||
!g_socket_listen (socket, error))
{
@@ -106,7 +139,7 @@ vnc_server_start (VNCServer *server)
g_return_val_if_fail (server != NULL, FALSE);
- server->priv->socket = open_tcp_socket (G_SOCKET_FAMILY_IPV4, server->priv->port, &error);
+ server->priv->socket = open_tcp_socket (G_SOCKET_FAMILY_IPV4, server->priv->port, server->priv->listen_address, &error);
if (error)
g_warning ("Failed to create IPv4 VNC socket: %s", error->message);
g_clear_error (&error);
@@ -118,7 +151,7 @@ vnc_server_start (VNCServer *server)
g_source_attach (source, NULL);
}
- server->priv->socket6 = open_tcp_socket (G_SOCKET_FAMILY_IPV6, server->priv->port, &error);
+ server->priv->socket6 = open_tcp_socket (G_SOCKET_FAMILY_IPV6, server->priv->port, server->priv->listen_address, &error);
if (error)
g_warning ("Failed to create IPv6 VNC socket: %s", error->message);
g_clear_error (&error);
@@ -150,6 +183,7 @@ vnc_server_finalize (GObject *object)
self = VNC_SERVER (object);
+ g_free (self->priv->listen_address);
if (self->priv->socket)
g_object_unref (self->priv->socket);
if (self->priv->socket6)
diff --git a/src/vnc-server.h b/src/vnc-server.h
index 64fe1daf..889fdb74 100644
--- a/src/vnc-server.h
+++ b/src/vnc-server.h
@@ -44,6 +44,10 @@ void vnc_server_set_port (VNCServer *server, guint port);
guint vnc_server_get_port (VNCServer *server);
+void vnc_server_set_listen_address (VNCServer *server, const gchar *listen_address);
+
+const gchar *vnc_server_get_listen_address (VNCServer *server);
+
gboolean vnc_server_start (VNCServer *server);
G_END_DECLS
diff --git a/src/xdmcp-server.c b/src/xdmcp-server.c
index d240e380..d92b57d9 100644
--- a/src/xdmcp-server.c
+++ b/src/xdmcp-server.c
@@ -32,6 +32,9 @@ struct XDMCPServerPrivate
/* Port to listen on */
guint port;
+ /* Address to listen on */
+ gchar *listen_address;
+
/* Listening sockets */
GSocket *socket, *socket6;
@@ -74,6 +77,22 @@ xdmcp_server_get_port (XDMCPServer *server)
}
void
+xdmcp_server_set_listen_address (XDMCPServer *server, const gchar *listen_address)
+{
+ g_return_if_fail (server != NULL);
+
+ g_free (server->priv->listen_address);
+ server->priv->listen_address = g_strdup (listen_address);
+}
+
+const gchar *
+xdmcp_server_get_listen_address (XDMCPServer *server)
+{
+ g_return_val_if_fail (server != NULL, NULL);
+ return server->priv->listen_address;
+}
+
+void
xdmcp_server_set_hostname (XDMCPServer *server, const gchar *hostname)
{
g_return_if_fail (server != NULL);
@@ -604,7 +623,7 @@ read_cb (GSocket *socket, GIOCondition condition, XDMCPServer *server)
}
static GSocket *
-open_udp_socket (GSocketFamily family, guint port, GError **error)
+open_udp_socket (GSocketFamily family, guint port, const gchar *listen_address, GError **error)
{
GSocket *socket;
GSocketAddress *address;
@@ -614,7 +633,21 @@ open_udp_socket (GSocketFamily family, guint port, GError **error)
if (!socket)
return NULL;
- address = g_inet_socket_address_new (g_inet_address_new_any (family), port);
+ if (listen_address)
+ {
+ GList *addresses;
+
+ addresses = g_resolver_lookup_by_name (g_resolver_get_default (), listen_address, NULL, error);
+ if (!addresses)
+ {
+ g_object_unref (socket);
+ return NULL;
+ }
+ address = g_inet_socket_address_new (addresses->data, port);
+ g_resolver_free_addresses (addresses);
+ }
+ else
+ address = g_inet_socket_address_new (g_inet_address_new_any (family), port);
result = g_socket_bind (socket, address, TRUE, error);
if (!result)
{
@@ -633,7 +666,7 @@ xdmcp_server_start (XDMCPServer *server)
g_return_val_if_fail (server != NULL, FALSE);
- server->priv->socket = open_udp_socket (G_SOCKET_FAMILY_IPV4, server->priv->port, &error);
+ server->priv->socket = open_udp_socket (G_SOCKET_FAMILY_IPV4, server->priv->port, server->priv->listen_address, &error);
if (error)
g_warning ("Failed to create IPv4 XDMCP socket: %s", error->message);
g_clear_error (&error);
@@ -645,7 +678,7 @@ xdmcp_server_start (XDMCPServer *server)
g_source_attach (source, NULL);
}
- server->priv->socket6 = open_udp_socket (G_SOCKET_FAMILY_IPV6, server->priv->port, &error);
+ server->priv->socket6 = open_udp_socket (G_SOCKET_FAMILY_IPV6, server->priv->port, server->priv->listen_address, &error);
if (error)
g_warning ("Failed to create IPv6 XDMCP socket: %s", error->message);
g_clear_error (&error);
@@ -685,6 +718,7 @@ xdmcp_server_finalize (GObject *object)
g_object_unref (self->priv->socket);
if (self->priv->socket6)
g_object_unref (self->priv->socket6);
+ g_free (self->priv->listen_address);
g_free (self->priv->hostname);
g_free (self->priv->status);
g_free (self->priv->key);
diff --git a/src/xdmcp-server.h b/src/xdmcp-server.h
index 32ca63b4..d3b824b9 100644
--- a/src/xdmcp-server.h
+++ b/src/xdmcp-server.h
@@ -46,6 +46,10 @@ void xdmcp_server_set_port (XDMCPServer *server, guint port);
guint xdmcp_server_get_port (XDMCPServer *server);
+void xdmcp_server_set_listen_address (XDMCPServer *server, const gchar *listen_address);
+
+const gchar *xdmcp_server_get_listen_address (XDMCPServer *server);
+
void xdmcp_server_set_hostname (XDMCPServer *server, const gchar *hostname);
const gchar *xdmcp_server_get_hostname (XDMCPServer *server);