summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2015-10-14 17:14:48 +0100
committerRobert Ancell <robert.ancell@canonical.com>2015-10-14 17:14:48 +0100
commit4a59874b6976fc1bd3d028f01ba45a7aa6e96cc9 (patch)
treeba295f4eeb05ea550565109ed626dffffe877d87
parentc2d7194575dcf4ebf6ca756ffb07252cf498b27c (diff)
downloadlightdm-git-4a59874b6976fc1bd3d028f01ba45a7aa6e96cc9.tar.gz
Check the version of the X server we are running so we correctly pass -listen tcp when required.
Also add tests for xserver-allow-tcp function and check in all cases we are listening on tcp/unix only when appropriate.
-rw-r--r--src/x-server-local.c64
-rw-r--r--src/x-server-local.h4
-rw-r--r--tests/Makefile.am8
-rw-r--r--tests/scripts/allow-tcp-xorg-1.16.conf34
-rw-r--r--tests/scripts/allow-tcp-xorg-1.17.conf34
-rw-r--r--tests/scripts/xdmcp-client.conf2
-rw-r--r--tests/scripts/xdmcp-server-login.conf2
-rw-r--r--tests/scripts/xdmcp-server-open-file-descriptors.conf2
-rw-r--r--tests/src/X.c63
-rwxr-xr-xtests/test-allow-tcp-xorg-1.162
-rwxr-xr-xtests/test-allow-tcp-xorg-1.172
11 files changed, 206 insertions, 11 deletions
diff --git a/src/x-server-local.c b/src/x-server-local.c
index d908f2ad..390f53d1 100644
--- a/src/x-server-local.c
+++ b/src/x-server-local.c
@@ -77,8 +77,65 @@ struct XServerLocalPrivate
G_DEFINE_TYPE (XServerLocal, x_server_local, X_SERVER_TYPE);
+static gchar *version = NULL;
+static guint version_major = 0, version_minor = 0;
static GList *display_numbers = NULL;
+#define XORG_VERSION_PREFIX "X.Org X Server "
+
+static gchar *
+find_version (const gchar *line)
+{
+ if (!g_str_has_prefix (line, XORG_VERSION_PREFIX))
+ return NULL;
+
+ return g_strdup (line + strlen (XORG_VERSION_PREFIX));
+}
+
+const gchar *
+x_server_local_get_version (void)
+{
+ gchar *stderr_text;
+ gint exit_status;
+ gchar **tokens;
+ guint n_tokens;
+
+ if (version)
+ return version;
+
+ if (!g_spawn_command_line_sync ("X -version", NULL, &stderr_text, &exit_status, NULL))
+ return NULL;
+ if (exit_status == EXIT_SUCCESS)
+ {
+ gchar **lines;
+ int i;
+
+ lines = g_strsplit (stderr_text, "\n", -1);
+ for (i = 0; lines[i] && !version; i++)
+ version = find_version (lines[i]);
+ g_strfreev (lines);
+ }
+ g_free (stderr_text);
+
+ tokens = g_strsplit (version, ".", 3);
+ n_tokens = g_strv_length (tokens);
+ version_major = n_tokens > 0 ? atoi (tokens[0]) : 0;
+ version_minor = n_tokens > 1 ? atoi (tokens[1]) : 0;
+ g_strfreev (tokens);
+
+ return version;
+}
+
+gint
+x_server_local_version_compare (guint major, guint minor)
+{
+ x_server_local_get_version ();
+ if (major == version_major)
+ return version_minor - minor;
+ else
+ return version_major - major;
+}
+
static gboolean
display_number_in_use (guint display_number)
{
@@ -496,7 +553,12 @@ x_server_local_start (DisplayServer *display_server)
if (server->priv->xdmcp_key)
g_string_append_printf (command, " -cookie %s", server->priv->xdmcp_key);
}
- else if (!server->priv->allow_tcp)
+ else if (server->priv->allow_tcp)
+ {
+ if (x_server_local_version_compare (1, 17) >= 0)
+ g_string_append (command, " -listen tcp");
+ }
+ else
g_string_append (command, " -nolisten tcp");
if (server->priv->vt >= 0)
diff --git a/src/x-server-local.h b/src/x-server-local.h
index 1dca0235..81eb5450 100644
--- a/src/x-server-local.h
+++ b/src/x-server-local.h
@@ -33,6 +33,10 @@ typedef struct
XServerClass parent_class;
} XServerLocalClass;
+const gchar *x_server_local_get_version (void);
+
+gint x_server_local_version_compare (guint major, guint minor);
+
guint x_server_local_get_unused_display_number (void);
void x_server_local_release_display_number (guint display_number);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 84bae837..dd461647 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -34,6 +34,8 @@ TESTS = \
test-autologin-new-authtok \
test-autologin-gobject-timeout \
test-autologin-gobject-guest-timeout \
+ test-allow-tcp-xorg-1.16 \
+ test-allow-tcp-xorg-1.17 \
test-change-authentication \
test-restart-authentication \
test-gobject-cancel-authentication \
@@ -162,7 +164,7 @@ TESTS = \
test-utmp-login \
test-utmp-autologin \
test-utmp-wrong-password \
- test-audit-autologin \
+ test-audit-autologin \
test-no-accounts-service \
test-console-kit \
test-no-console-kit \
@@ -350,7 +352,9 @@ EXTRA_DIST = \
scripts/additional-config-priority.conf \
scripts/additional-system-config.conf \
scripts/additional-system-config-priority.conf \
- scripts/audit-autologin.conf \
+ scripts/allow-tcp-xorg-1.16.conf \
+ scripts/allow-tcp-xorg-1.17.conf \
+ scripts/audit-autologin.conf \
scripts/autologin.conf \
scripts/autologin-guest.conf \
scripts/autologin-guest-fail-setup-script.conf \
diff --git a/tests/scripts/allow-tcp-xorg-1.16.conf b/tests/scripts/allow-tcp-xorg-1.16.conf
new file mode 100644
index 00000000..08cbc41a
--- /dev/null
+++ b/tests/scripts/allow-tcp-xorg-1.16.conf
@@ -0,0 +1,34 @@
+#
+# Check can enable TCP listening in X.Org < 1.17 (default is listening enabled)
+#
+
+[test-xserver-config]
+version=1.16.0
+
+[Seat:*]
+autologin-user=have-password1
+user-session=default
+xserver-allow-tcp=true
+
+#?*START-DAEMON
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7 LISTEN-TCP SEAT=seat0
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Session starts
+#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 DESKTOP_SESSION=default USER=have-password1
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+#?XSERVER-0 ACCEPT-CONNECT
+#?SESSION-X-0 CONNECT-XSERVER
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/allow-tcp-xorg-1.17.conf b/tests/scripts/allow-tcp-xorg-1.17.conf
new file mode 100644
index 00000000..aa3fdb41
--- /dev/null
+++ b/tests/scripts/allow-tcp-xorg-1.17.conf
@@ -0,0 +1,34 @@
+#
+# Check can enable TCP listening in X.Org >= 1.17 (default is listening disabled)
+#
+
+[test-xserver-config]
+version=1.17.0
+
+[Seat:*]
+autologin-user=have-password1
+user-session=default
+xserver-allow-tcp=true
+
+#?*START-DAEMON
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7 LISTEN-TCP SEAT=seat0
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Session starts
+#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 DESKTOP_SESSION=default USER=have-password1
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+#?XSERVER-0 ACCEPT-CONNECT
+#?SESSION-X-0 CONNECT-XSERVER
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/xdmcp-client.conf b/tests/scripts/xdmcp-client.conf
index 08ef4af3..180cabbd 100644
--- a/tests/scripts/xdmcp-client.conf
+++ b/tests/scripts/xdmcp-client.conf
@@ -10,7 +10,7 @@ xdmcp-port=9999
#?RUNNER DAEMON-START
# X server starts
-#?XSERVER-0 START VT=7 SEAT=seat0
+#?XSERVER-0 START VT=7 LISTEN-TCP SEAT=seat0
#?*XSERVER-0 INDICATE-READY
#?XSERVER-0 INDICATE-READY
#?XSERVER-0 ACCEPT-CONNECT
diff --git a/tests/scripts/xdmcp-server-login.conf b/tests/scripts/xdmcp-server-login.conf
index 590639ed..bd43127d 100644
--- a/tests/scripts/xdmcp-server-login.conf
+++ b/tests/scripts/xdmcp-server-login.conf
@@ -18,7 +18,7 @@ user-session=default
# Start a remote X server to log in with XDMCP
#?*START-XSERVER ARGS=":98 -query localhost -port 9999 -nolisten unix"
-#?XSERVER-98 START
+#?XSERVER-98 START LISTEN-TCP NO-LISTEN-UNIX
# Start sending XDMCP queries
#?*XSERVER-98 START-XDMCP
diff --git a/tests/scripts/xdmcp-server-open-file-descriptors.conf b/tests/scripts/xdmcp-server-open-file-descriptors.conf
index aa55db0e..c87497ed 100644
--- a/tests/scripts/xdmcp-server-open-file-descriptors.conf
+++ b/tests/scripts/xdmcp-server-open-file-descriptors.conf
@@ -18,7 +18,7 @@ user-session=default
# Start a remote X server to log in with XDMCP
#?*START-XSERVER ARGS=":98 -query localhost -port 9999 -nolisten unix"
-#?XSERVER-98 START
+#?XSERVER-98 START LISTEN-TCP NO-LISTEN-UNIX
# Start sending XDMCP queries
#?*XSERVER-98 START-XDMCP
diff --git a/tests/src/X.c b/tests/src/X.c
index 55921754..b737ddbd 100644
--- a/tests/src/X.c
+++ b/tests/src/X.c
@@ -18,9 +18,19 @@ static int exit_status = EXIT_SUCCESS;
static GKeyFile *config;
+/* Version to pretend to be */
+static gchar *xorg_version;
+static gint xorg_version_major, xorg_version_minor;
+
/* Path to lock file */
static gchar *lock_path = NULL;
+/* TRUE if we allow TCP connections */
+static gboolean listen_tcp = TRUE;
+
+/* TRUE if we allow Unix connections */
+static gboolean listen_unix = TRUE;
+
/* Path to authority database to use */
static gchar *auth_path = NULL;
@@ -194,10 +204,20 @@ request_cb (const gchar *name, GHashTable *params)
}
}
+static int
+version_compare (int major, int minor)
+{
+ if (major == xorg_version_major)
+ return xorg_version_minor - minor;
+ else
+ return xorg_version_major - major;
+}
+
int
main (int argc, char **argv)
{
int i;
+ gchar **tokens;
char *pid_string;
gboolean do_xdmcp = FALSE;
guint xdmcp_port = 0;
@@ -219,6 +239,20 @@ main (int argc, char **argv)
g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
g_unix_signal_add (SIGHUP, sighup_cb, NULL);
+ config = g_key_file_new ();
+ g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
+
+ xorg_version = g_key_file_get_string (config, "test-xserver-config", "version", NULL);
+ if (!xorg_version)
+ xorg_version = g_strdup ("1.16.0");
+ tokens = g_strsplit (xorg_version, ".", -1);
+ xorg_version_major = g_strv_length (tokens) > 0 ? atoi (tokens[0]) : 0;
+ xorg_version_minor = g_strv_length (tokens) > 1 ? atoi (tokens[1]) : 0;
+ g_strfreev (tokens);
+
+ /* TCP listening default changed in 1.17.0 */
+ listen_tcp = version_compare (1, 17) < 0;
+
for (i = 1; i < argc; i++)
{
char *arg = argv[i];
@@ -232,14 +266,23 @@ main (int argc, char **argv)
auth_path = argv[i+1];
i++;
}
+ else if (strcmp (arg, "-listen") == 0 && version_compare (1, 17) >= 0)
+ {
+ char *protocol = argv[i+1];
+ i++;
+ if (strcmp (protocol, "tcp") == 0)
+ listen_tcp = TRUE;
+ else if (strcmp (protocol, "unix") == 0)
+ listen_unix = TRUE;
+ }
else if (strcmp (arg, "-nolisten") == 0)
{
char *protocol = argv[i+1];
i++;
if (strcmp (protocol, "tcp") == 0)
- ;//listen_tcp = FALSE;
+ listen_tcp = FALSE;
else if (strcmp (protocol, "unix") == 0)
- ;//listen_unix = FALSE;
+ listen_unix = FALSE;
}
else if (strcmp (arg, "-nr") == 0)
{
@@ -258,11 +301,13 @@ main (int argc, char **argv)
{
do_xdmcp = TRUE;
xdmcp_host = argv[i+1];
+ listen_tcp = TRUE;
i++;
}
else if (strcmp (arg, "-broadcast") == 0)
{
do_xdmcp = TRUE;
+ listen_tcp = TRUE;
}
else if (g_str_has_prefix (arg, "vt"))
{
@@ -291,12 +336,18 @@ main (int argc, char **argv)
/* FIXME */
i++;
}
+ else if (strcmp (arg, "-version") == 0)
+ {
+ fprintf (stderr, "\nX.Org X Server %s\nBlah blah blah\n", xorg_version);
+ return EXIT_SUCCESS;
+ }
else
{
g_printerr ("Unrecognized option: %s\n"
"Use: %s [:<display>] [option]\n"
"-auth file Select authorization file\n"
"-nolisten protocol Don't listen on protocol\n"
+ "-listen protocol Listen on protocol\n"
"-background [none] Create root window with no background\n"
"-nr (Ubuntu-specific) Synonym for -background none\n"
"-query host-name Contact named host for XDMCP\n"
@@ -306,6 +357,7 @@ main (int argc, char **argv)
"-sharevts share VTs with another X server\n"
"-mir id Mir ID to use\n"
"-mirSocket name Mir socket to use\n"
+ "-version show the server version\n"
"vtxx Use virtual terminal xx instead of the next available\n",
arg, argv[0]);
return EXIT_FAILURE;
@@ -324,6 +376,10 @@ main (int argc, char **argv)
g_string_printf (status_text, "%s START", id);
if (vt_number >= 0)
g_string_append_printf (status_text, " VT=%d", vt_number);
+ if (listen_tcp)
+ g_string_append (status_text, " LISTEN-TCP");
+ if (!listen_unix)
+ g_string_append (status_text, " NO-LISTEN-UNIX");
if (seat != NULL)
g_string_append_printf (status_text, " SEAT=%s", seat);
if (sharevts)
@@ -333,9 +389,6 @@ main (int argc, char **argv)
status_notify (status_text->str);
g_string_free (status_text, TRUE);
- config = g_key_file_new ();
- g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
-
if (g_key_file_has_key (config, "test-xserver-config", "return-value", NULL))
{
int return_value = g_key_file_get_integer (config, "test-xserver-config", "return-value", NULL);
diff --git a/tests/test-allow-tcp-xorg-1.16 b/tests/test-allow-tcp-xorg-1.16
new file mode 100755
index 00000000..08c07744
--- /dev/null
+++ b/tests/test-allow-tcp-xorg-1.16
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner allow-tcp-xorg-1.16 test-gobject-greeter
diff --git a/tests/test-allow-tcp-xorg-1.17 b/tests/test-allow-tcp-xorg-1.17
new file mode 100755
index 00000000..db2a80b1
--- /dev/null
+++ b/tests/test-allow-tcp-xorg-1.17
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner allow-tcp-xorg-1.17 test-gobject-greeter