tests/src/plymouth
tests/src/test-gobject-greeter
tests/src/test-greeter-wrapper
+tests/src/test-mir-greeter
tests/src/test-qt4-greeter
tests/src/test-qt5-greeter
tests/src/test-runner
lightdm_get_remote_sessions
lightdm_get_sessions
lightdm_session_get_key
+lightdm_session_get_session_type
lightdm_session_get_name
lightdm_session_get_comment
<SUBSECTION Standard>
@Returns:
+<!-- ##### FUNCTION lightdm_session_get_session_type ##### -->
+<para>
+
+</para>
+
+@session:
+@Returns:
+
+
<!-- ##### FUNCTION lightdm_session_get_name ##### -->
<para>
const gchar *lightdm_session_get_key (LightDMSession *session);
+const gchar *lightdm_session_get_session_type (LightDMSession *session);
+
const gchar *lightdm_session_get_name (LightDMSession *session);
const gchar *lightdm_session_get_comment (LightDMSession *session);
typedef struct
{
gchar *key;
+ gchar *type;
gchar *name;
gchar *comment;
} LightDMSessionPrivate;
static gboolean have_sessions = FALSE;
static GList *local_sessions = NULL;
static GList *remote_sessions = NULL;
+static GList *mir_sessions = NULL;
static gint
compare_session (gconstpointer a, gconstpointer b)
static LightDMSession *
load_session (GKeyFile *key_file, const gchar *key)
{
- gchar *domain, *name;
+ gchar *type, *domain, *name;
LightDMSession *session;
LightDMSessionPrivate *priv;
gchar *try_exec;
g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, NULL))
return NULL;
+ type = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Session-Type", NULL);
+ if (!type)
+ type = "x";
+
#ifdef G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN
domain = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, NULL);
#else
g_free (priv->key);
priv->key = g_strdup (key);
+ g_free (priv->type);
+ priv->type = g_strdup (type);
+
g_free (priv->name);
priv->name = name;
gchar *config_path = NULL;
gchar *sessions_dir;
gchar *remote_sessions_dir;
+ gchar *mir_sessions_dir;
gboolean result;
GError *error = NULL;
return GET_PRIVATE (session)->key;
}
+/**
+ * lightdm_session_get_session_type:
+ * @session: A #LightDMSession
+ *
+ * Get the type a session
+ *
+ * Return value: The session type, e.g. x or mir
+ **/
+const gchar *
+lightdm_session_get_session_type (LightDMSession *session)
+{
+ g_return_val_if_fail (LIGHTDM_IS_SESSION (session), NULL);
+ return GET_PRIVATE (session)->type;
+}
+
/**
* lightdm_session_get_name:
* @session: A #LightDMSession
LightDMSessionPrivate *priv = GET_PRIVATE (self);
g_free (priv->key);
+ g_free (priv->type);
g_free (priv->name);
g_free (priv->comment);
}
//name is exposed as Qt::DisplayRole
//comment is exposed as Qt::TooltipRole
KeyRole = Qt::UserRole,
- IdRole = KeyRole /** Deprecated */
+ IdRole = KeyRole, /** Deprecated */
+ TypeRole
};
enum SessionType {
{
public:
QString key;
+ QString type;
QString name;
QString comment;
};
SessionItem session;
session.key = QString::fromUtf8(lightdm_session_get_key(ldmSession));
+ session.type = QString::fromUtf8(lightdm_session_get_session_type(ldmSession));
session.name = QString::fromUtf8(lightdm_session_get_name(ldmSession));
session.comment = QString::fromUtf8(lightdm_session_get_comment(ldmSession));
switch (role) {
case SessionsModel::KeyRole:
return d->items[row].key;
+ case SessionsModel::TypeRole:
+ return d->items[row].type;
case Qt::DisplayRole:
return d->items[row].name;
case Qt::ToolTipRole:
lightdm.c \
login1.c \
login1.h \
+ mir-server.c \
+ mir-server.h \
plymouth.c \
plymouth.h \
privileges.c \
vt.h \
x-authority.c \
x-authority.h \
- x-greeter.c \
- x-greeter.h \
x-server-local.c \
x-server-local.h \
x-server-remote.c \
x-server-xvnc.h \
x-server.c \
x-server.h \
- x-session.c \
- x-session.h \
xdmcp-protocol.c \
xdmcp-protocol.h \
xdmcp-server.c \
return TRUE;
}
+void
+display_server_setup_session (DisplayServer *server, Session *session)
+{
+ return DISPLAY_SERVER_GET_CLASS (server)->setup_session (server, session);
+}
+
+static void
+display_server_real_setup_session (DisplayServer *server, Session *session)
+{
+}
+
void
display_server_stop (DisplayServer *server)
{
{
klass->get_vt = display_server_real_get_vt;
klass->start = display_server_real_start;
+ klass->setup_session = display_server_real_setup_session;
klass->stop = display_server_real_stop;
g_type_class_add_private (klass, sizeof (DisplayServerPrivate));
#include <glib-object.h>
+typedef struct DisplayServer DisplayServer;
+
+#include "session.h"
+
G_BEGIN_DECLS
#define DISPLAY_SERVER_TYPE (display_server_get_type())
typedef struct DisplayServerPrivate DisplayServerPrivate;
-typedef struct
+struct DisplayServer
{
GObject parent_instance;
DisplayServerPrivate *priv;
-} DisplayServer;
+};
typedef struct
{
gint (*get_vt)(DisplayServer *server);
gboolean (*start)(DisplayServer *server);
+ void (*setup_session)(DisplayServer *server, Session *session);
void (*stop)(DisplayServer *server);
} DisplayServerClass;
gboolean display_server_start (DisplayServer *server);
+void display_server_setup_session (DisplayServer *server, Session *session);
+
void display_server_stop (DisplayServer *server);
gboolean display_server_get_is_stopping (DisplayServer *server);
static gboolean read_cb (GIOChannel *source, GIOCondition condition, gpointer data);
+Greeter *
+greeter_new (void)
+{
+ return g_object_new (GREETER_TYPE, NULL);
+}
+
void
greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gchar *autologin_pam_service)
{
GType greeter_get_type (void);
+Greeter *greeter_new (void);
+
void greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gchar *autologin_pam_service);
void greeter_set_allow_guest (Greeter *greeter, gboolean allow_guest);
--- /dev/null
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#include <string.h>
+
+#include "mir-server.h"
+
+struct MirServerPrivate
+{
+ /* VT to run on */
+ gint vt;
+};
+
+G_DEFINE_TYPE (MirServer, mir_server, DISPLAY_SERVER_TYPE);
+
+MirServer *mir_server_new (void)
+{
+ return g_object_new (MIR_SERVER_TYPE, NULL);
+}
+
+static gint
+mir_server_local_get_vt (DisplayServer *server)
+{
+ g_return_val_if_fail (server != NULL, 0);
+ return MIR_SERVER (server)->priv->vt;
+}
+
+static gboolean
+mir_server_start (DisplayServer *display_server)
+{
+ return DISPLAY_SERVER_CLASS (mir_server_parent_class)->start (display_server);
+}
+
+static void
+mir_server_setup_session (DisplayServer *display_server, Session *session)
+{
+}
+
+static void
+mir_server_init (MirServer *server)
+{
+ server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, MIR_SERVER_TYPE, MirServerPrivate);
+ server->priv->vt = -1;
+}
+
+static void
+mir_server_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (mir_server_parent_class)->finalize (object);
+}
+
+static void
+mir_server_class_init (MirServerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
+
+ display_server_class->get_vt = mir_server_local_get_vt;
+ display_server_class->start = mir_server_start;
+ display_server_class->setup_session = mir_server_setup_session;
+ object_class->finalize = mir_server_finalize;
+
+ g_type_class_add_private (klass, sizeof (MirServerPrivate));
+}
--- /dev/null
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#ifndef MIR_SERVER_H_
+#define MIR_SERVER_H_
+
+#include <glib-object.h>
+#include "display-server.h"
+
+G_BEGIN_DECLS
+
+#define MIR_SERVER_TYPE (mir_server_get_type())
+#define MIR_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIR_SERVER_TYPE, MirServer))
+#define MIR_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MIR_SERVER_TYPE, MirServerClass))
+#define MIR_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MIR_SERVER_TYPE, MirServerClass))
+#define IS_MIR_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIR_SERVER_TYPE))
+
+typedef struct MirServerPrivate MirServerPrivate;
+
+typedef struct
+{
+ DisplayServer parent_instance;
+ MirServerPrivate *priv;
+} MirServer;
+
+typedef struct
+{
+ DisplayServerClass parent_class;
+} MirServerClass;
+
+GType mir_server_get_type (void);
+
+MirServer *mir_server_new (void);
+
+G_END_DECLS
+
+#endif /* MIR_SERVER_H_ */
#include "seat-unity.h"
#include "configuration.h"
#include "x-server-local.h"
-#include "x-greeter.h"
-#include "x-session.h"
+#include "mir-server.h"
#include "vt.h"
#include "plymouth.h"
}
static DisplayServer *
-seat_unity_create_display_server (Seat *seat)
+create_x_server (Seat *seat)
{
XServerLocal *x_server;
const gchar *command = NULL, *layout = NULL, *config_file = NULL, *xdmcp_manager = NULL, *key_name = NULL;
return DISPLAY_SERVER (x_server);
}
+static DisplayServer *
+seat_unity_create_display_server (Seat *seat, const gchar *session_type)
+{
+ if (strcmp (session_type, "x") == 0)
+ return create_x_server (seat);
+ else if (strcmp (session_type, "mir") == 0)
+ return DISPLAY_SERVER (mir_server_new ());
+ else
+ {
+ g_warning ("Can't create unsupported display server '%s'", session_type);
+ return NULL;
+ }
+}
+
static Greeter *
seat_unity_create_greeter_session (Seat *seat)
{
- XGreeter *greeter_session;
+ Greeter *greeter_session;
- greeter_session = x_greeter_new ();
+ greeter_session = greeter_new ();
session_set_env (SESSION (greeter_session), "XDG_SEAT", "seat0");
- return GREETER (greeter_session);
+ return greeter_session;
}
static Session *
seat_unity_create_session (Seat *seat)
{
- XSession *session;
+ Session *session;
- session = x_session_new ();
- session_set_env (SESSION (session), "XDG_SEAT", "seat0");
+ session = session_new ();
+ session_set_env (session, "XDG_SEAT", "seat0");
- return SESSION (session);
+ return session;
}
static void
#include "seat-xdmcp-session.h"
#include "x-server-remote.h"
-#include "x-greeter.h"
-#include "x-session.h"
struct SeatXDMCPSessionPrivate
{
}
static DisplayServer *
-seat_xdmcp_session_create_display_server (Seat *seat)
+seat_xdmcp_session_create_display_server (Seat *seat, const gchar *session_type)
{
XAuthority *authority;
gchar *host;
XServerRemote *x_server;
+ if (strcmp (session_type, "x") != 0)
+ {
+ g_warning ("XDMCP seat only supports X display servers, not '%s'", session_type);
+ return NULL;
+ }
+
authority = xdmcp_session_get_authority (SEAT_XDMCP_SESSION (seat)->priv->session);
host = g_inet_address_to_string (xdmcp_session_get_address (SEAT_XDMCP_SESSION (seat)->priv->session));
x_server = x_server_remote_new (host, xdmcp_session_get_display_number (SEAT_XDMCP_SESSION (seat)->priv->session), authority);
return DISPLAY_SERVER (x_server);
}
-static Greeter *
-seat_xdmcp_session_create_greeter_session (Seat *seat)
-{
- return GREETER (x_greeter_new ());
-}
-
-static Session *
-seat_xdmcp_session_create_session (Seat *seat)
-{
- return SESSION (x_session_new ());
-}
-
static void
seat_xdmcp_session_init (SeatXDMCPSession *seat)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
seat_class->create_display_server = seat_xdmcp_session_create_display_server;
- seat_class->create_greeter_session = seat_xdmcp_session_create_greeter_session;
- seat_class->create_session = seat_xdmcp_session_create_session;
object_class->finalize = seat_xdmcp_session_finalize;
g_type_class_add_private (klass, sizeof (SeatXDMCPSessionPrivate));
#include "seat-xlocal.h"
#include "configuration.h"
#include "x-server-local.h"
-#include "x-greeter.h"
-#include "x-session.h"
+#include "mir-server.h"
#include "vt.h"
G_DEFINE_TYPE (SeatXLocal, seat_xlocal, SEAT_TYPE);
+static gboolean
+seat_xlocal_get_start_local_sessions (Seat *seat)
+{
+ return !seat_get_string_property (seat, "xdmcp-manager");
+}
+
static void
seat_xlocal_setup (Seat *seat)
{
}
static DisplayServer *
-seat_xlocal_create_display_server (Seat *seat)
+create_x_server (Seat *seat)
{
XServerLocal *x_server;
const gchar *command = NULL, *layout = NULL, *config_file = NULL, *xdmcp_manager = NULL, *key_name = NULL;
return DISPLAY_SERVER (x_server);
}
+static DisplayServer *
+seat_xlocal_create_display_server (Seat *seat, const gchar *session_type)
+{
+ if (strcmp (session_type, "x") == 0)
+ return create_x_server (seat);
+ else if (strcmp (session_type, "mir") == 0)
+ return DISPLAY_SERVER (mir_server_new ());
+ else
+ {
+ g_warning ("Can't create unsupported display server '%s'", session_type);
+ return NULL;
+ }
+}
+
static Greeter *
seat_xlocal_create_greeter_session (Seat *seat)
{
- XGreeter *greeter_session;
+ Greeter *greeter_session;
- greeter_session = x_greeter_new ();
+ greeter_session = SEAT_CLASS (seat_xlocal_parent_class)->create_greeter_session (seat);
session_set_env (SESSION (greeter_session), "XDG_SEAT", "seat0");
- return GREETER (greeter_session);
+ return greeter_session;
}
static Session *
seat_xlocal_create_session (Seat *seat)
{
- XSession *session;
+ Session *session;
- session = x_session_new ();
+ session = SEAT_CLASS (seat_xlocal_parent_class)->create_session (seat);
session_set_env (SESSION (session), "XDG_SEAT", "seat0");
- return SESSION (session);
+ return session;
}
static void
{
SeatClass *seat_class = SEAT_CLASS (klass);
+ seat_class->get_start_local_sessions = seat_xlocal_get_start_local_sessions;
seat_class->setup = seat_xlocal_setup;
seat_class->create_display_server = seat_xlocal_create_display_server;
seat_class->create_greeter_session = seat_xlocal_create_greeter_session;
#include "seat-xremote.h"
#include "configuration.h"
#include "x-server-remote.h"
-#include "x-greeter.h"
-#include "x-session.h"
G_DEFINE_TYPE (SeatXRemote, seat_xremote, SEAT_TYPE);
}
static DisplayServer *
-seat_xremote_create_display_server (Seat *seat)
+seat_xremote_create_display_server (Seat *seat, const gchar *session_type)
{
XServerRemote *x_server;
const gchar *hostname;
gint number;
+ if (strcmp (session_type, "x") != 0)
+ {
+ g_warning ("X remote seat only supports X display servers, not '%s'", session_type);
+ return NULL;
+ }
+
hostname = seat_get_string_property (seat, "xserver-hostname");
if (!hostname)
hostname = "localhost";
static Greeter *
seat_xremote_create_greeter_session (Seat *seat)
{
- XGreeter *greeter_session;
+ Greeter *greeter_session;
- greeter_session = x_greeter_new ();
+ greeter_session = SEAT_CLASS (seat_xremote_parent_class)->create_greeter_session (seat);
session_set_env (SESSION (greeter_session), "XDG_SEAT", "seat0");
- return GREETER (greeter_session);
+ return greeter_session;
}
static Session *
seat_xremote_create_session (Seat *seat)
{
- return SESSION (x_session_new ());
+ Session *session;
+
+ session = SEAT_CLASS (seat_xremote_parent_class)->create_session (seat);
+ session_set_env (SESSION (session), "XDG_SEAT", "seat0");
+
+ return session;
}
static void
* license.
*/
+#include <string.h>
+
#include "seat-xvnc.h"
#include "x-server-xvnc.h"
-#include "x-greeter.h"
-#include "x-session.h"
#include "configuration.h"
G_DEFINE_TYPE (SeatXVNC, seat_xvnc, SEAT_TYPE);
}
static DisplayServer *
-seat_xvnc_create_display_server (Seat *seat)
+seat_xvnc_create_display_server (Seat *seat, const gchar *session_type)
{
XServerXVNC *x_server;
const gchar *command = NULL;
+ if (strcmp (session_type, "x") != 0)
+ {
+ g_warning ("XVNC seat only supports X display servers, not '%s'", session_type);
+ return NULL;
+ }
+
x_server = x_server_xvnc_new ();
x_server_xvnc_set_socket (x_server, g_socket_get_fd (SEAT_XVNC (seat)->priv->connection));
return DISPLAY_SERVER (x_server);
}
-static Greeter *
-seat_xvnc_create_greeter_session (Seat *seat)
-{
- return GREETER (x_greeter_new ());
-}
-
-static Session *
-seat_xvnc_create_session (Seat *seat)
-{
- return SESSION (x_session_new ());
-}
-
static void
seat_xvnc_run_script (Seat *seat, DisplayServer *display_server, Process *script)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
seat_class->create_display_server = seat_xvnc_create_display_server;
- seat_class->create_greeter_session = seat_xvnc_create_greeter_session;
- seat_class->create_session = seat_xvnc_create_session;
seat_class->run_script = seat_xvnc_run_script;
object_class->finalize = seat_xdmcp_session_finalize;
static GHashTable *seat_modules = NULL;
// FIXME: Make a get_display_server() that re-uses display servers if supported
-static DisplayServer *create_display_server (Seat *seat);
+static DisplayServer *create_display_server (Seat *seat, const gchar *session_type);
static Greeter *create_greeter_session (Seat *seat);
static void start_session (Seat *seat, Session *session);
{
DisplayServer *display_server;
- display_server = create_display_server (seat);
+ display_server = create_display_server (seat, session_get_session_type (session));
if (!display_server_start (display_server))
{
g_debug ("Failed to start display server for greeter");
gchar **argv;
session = create_session (seat, TRUE);
+ session_set_session_type (session, session_config_get_session_type (session_config));
session_set_env (session, "DESKTOP_SESSION", session_name);
session_set_env (session, "GDMSESSION", session_name);
if (language && language[0] != '\0')
}
session = create_session (seat, TRUE);
+ session_set_session_type (session, session_config_get_session_type (session_config));
session_set_do_authenticate (session, TRUE);
session_set_is_guest (session, TRUE);
argv = get_session_argv (session_config, seat_get_string_property (seat, "session-wrapper"));
Session *session;
session = create_session (seat, FALSE);
+ session_set_session_type (session, session_get_session_type (SESSION (greeter)));
session_set_display_server (session, session_get_display_server (SESSION (greeter)));
return g_object_ref (session);
{
DisplayServer *display_server;
- display_server = create_display_server (seat);
+ display_server = create_display_server (seat, session_get_session_type (session));
if (!display_server_start (display_server))
return FALSE;
}
greeter_session = SEAT_GET_CLASS (seat)->create_greeter_session (seat);
+ session_set_session_type (SESSION (greeter_session), session_config_get_session_type (session_config));
seat->priv->sessions = g_list_append (seat->priv->sessions, SESSION (greeter_session));
g_signal_connect (greeter_session, "authentication-complete", G_CALLBACK (session_authentication_complete_cb), seat);
g_signal_connect (greeter_session, "stopped", G_CALLBACK (session_stopped_cb), seat);
}
static DisplayServer *
-create_display_server (Seat *seat)
+create_display_server (Seat *seat, const gchar *session_type)
{
DisplayServer *display_server;
- display_server = SEAT_GET_CLASS (seat)->create_display_server (seat);
+ display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session_type);
seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server);
g_signal_connect (display_server, "ready", G_CALLBACK (display_server_ready_cb), seat);
g_signal_connect (display_server, "stopped", G_CALLBACK (display_server_stopped_cb), seat);
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
- display_server = create_display_server (seat);
+ display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)));
session_set_display_server (SESSION (greeter_session), display_server);
if (!display_server_start (display_server))
return FALSE;
seat->priv->session_to_activate = g_object_ref (session);
session_set_pam_service (session, USER_SERVICE);
- display_server = create_display_server (seat);
+ display_server = create_display_server (seat, session_get_session_type (session));
session_set_display_server (session, display_server);
if (!display_server_start (display_server))
return FALSE;
return TRUE;
}
- display_server = create_display_server (seat);
- if (!display_server_start (display_server))
- return FALSE;
-
session = create_guest_session (seat);
if (!session)
return FALSE;
+
+ display_server = create_display_server (seat, session_get_session_type (session));
+ if (!display_server_start (display_server))
+ return FALSE;
+
if (seat->priv->session_to_activate)
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (session);
return TRUE;
}
- display_server = create_display_server (seat);
+ greeter_session = create_greeter_session (seat);
+ if (!greeter_session)
+ return FALSE;
+
+ display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)));
if (!display_server_start (display_server))
return FALSE;
- greeter_session = create_greeter_session (seat);
if (seat->priv->session_to_activate)
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
int autologin_timeout;
gboolean autologin_guest;
gboolean autologin_in_background;
- Session *session = NULL;
+ Session *session = NULL, *background_session = NULL;
DisplayServer *display_server;
g_debug ("Starting seat");
- display_server = create_display_server (seat);
-
/* If this display server doesn't have a session running on it, just start it */
if (!get_start_local_sessions (seat))
+ {
+ display_server = create_display_server (seat, "x"); // FIXME: Not necessarily an X seat, but not sure what to put here
return display_server_start (display_server);
+ }
/* Get autologin settings */
autologin_username = seat_get_string_property (seat, "autologin-user");
/* Load in background if required */
if (autologin_in_background && session)
{
- DisplayServer *background_display_server;
-
- background_display_server = create_display_server (seat);
- session_set_display_server (session, background_display_server);
- if (!display_server_start (background_display_server))
- return FALSE;
-
- /* Start a greeter as well */
+ background_session = session;
session = NULL;
}
}
return FALSE;
}
+ display_server = create_display_server (seat, session_get_session_type (session));
+ if (!display_server)
+ return FALSE;
+
/* Start display server to show session on */
session_set_display_server (session, display_server);
if (!display_server_start (display_server))
return FALSE;
+ /* Start background session */
+ if (background_session)
+ {
+ DisplayServer *background_display_server;
+
+ background_display_server = create_display_server (seat, session_get_session_type (background_session));
+ session_set_display_server (background_session, background_display_server);
+ if (!display_server_start (background_display_server))
+ g_warning ("Failed to start display server for background session");
+ }
+
return TRUE;
}
+static Greeter *
+seat_real_create_greeter_session (Seat *seat)
+{
+ return greeter_new ();
+}
+
+static Session *
+seat_real_create_session (Seat *seat)
+{
+ return session_new ();
+}
+
static void
seat_real_set_active_session (Seat *seat, Session *session)
{
klass->get_start_local_sessions = seat_real_get_start_local_sessions;
klass->setup = seat_real_setup;
klass->start = seat_real_start;
+ klass->create_greeter_session = seat_real_create_greeter_session;
+ klass->create_session = seat_real_create_session;
klass->set_active_session = seat_real_set_active_session;
klass->get_active_session = seat_real_get_active_session;
klass->run_script = seat_real_run_script;
gboolean (*get_start_local_sessions) (Seat *seat);
void (*setup)(Seat *seat);
gboolean (*start)(Seat *seat);
- DisplayServer *(*create_display_server) (Seat *seat);
+ DisplayServer *(*create_display_server) (Seat *seat, const gchar *session_type);
Greeter *(*create_greeter_session) (Seat *seat);
Session *(*create_session) (Seat *seat);
void (*set_active_session)(Seat *seat, Session *session);
struct SessionConfigPrivate
{
+ /* Session type */
+ gchar *session_type;
+
/* Command to run */
gchar *command;
};
config = g_object_new (SESSION_CONFIG_TYPE, NULL);
config->priv->command = command;
+ config->priv->session_type = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Session-Type", NULL);
+ if (!config->priv->session_type)
+ config->priv->session_type = g_strdup ("x");
g_key_file_free (desktop_file);
return config->priv->command;
}
+const gchar *
+session_config_get_session_type (SessionConfig *config)
+{
+ g_return_val_if_fail (config != NULL, NULL);
+ return config->priv->session_type;
+}
static void
session_config_init (SessionConfig *config)
{
SessionConfig *self = SESSION_CONFIG (object);
+ g_free (self->priv->session_type);
g_free (self->priv->command);
G_OBJECT_CLASS (session_config_parent_class)->finalize (object);
const gchar *session_config_get_command (SessionConfig *config);
+const gchar *session_config_get_session_type (SessionConfig *config);
G_END_DECLS
struct SessionPrivate
{
+ /* Session type */
+ gchar *session_type;
+
/* Display server running on */
DisplayServer *display_server;
G_DEFINE_TYPE (Session, session, G_TYPE_OBJECT);
+Session *
+session_new (void)
+{
+ return g_object_new (SESSION_TYPE, NULL);
+}
+
+void
+session_set_session_type (Session *session, const gchar *session_type)
+{
+ g_return_if_fail (session != NULL);
+ g_free (session->priv->session_type);
+ session->priv->session_type = g_strdup (session_type);
+}
+
+const gchar *
+session_get_session_type (Session *session)
+{
+ g_return_val_if_fail (session != NULL, NULL);
+ return session->priv->session_type;
+}
+
void
session_set_pam_service (Session *session, const gchar *pam_service)
{
g_return_val_if_fail (session->priv->pid == 0, FALSE);
+ display_server_setup_session (session->priv->display_server, session);
+
/* Create pipes to talk to the child */
if (pipe (to_child_pipe) < 0 || pipe (from_child_pipe) < 0)
{
g_return_if_fail (session->priv->argv != NULL);
g_return_if_fail (session->priv->pid != 0);
+ display_server_setup_session (session->priv->display_server, session);
+
session->priv->command_run = TRUE;
command = g_strjoinv (" ", session->priv->argv);
session_init (Session *session)
{
session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, SESSION_TYPE, SessionPrivate);
+ session->priv->log_filename = g_strdup (".xsession-errors");
}
static void
Session *self = SESSION (object);
int i;
+ g_free (self->priv->session_type);
if (self->priv->display_server)
g_object_unref (self->priv->display_server);
if (self->priv->pid)
#include <security/pam_appl.h>
+typedef struct Session Session;
+
#include "display-server.h"
#include "accounts.h"
#include "x-authority.h"
typedef struct SessionPrivate SessionPrivate;
-typedef struct
+struct Session
{
GObject parent_instance;
SessionPrivate *priv;
-} Session;
+};
typedef struct
{
GType session_get_type (void);
+Session *session_new (void);
+
+void session_set_session_type (Session *session, const gchar *session_type);
+
+const gchar *session_get_session_type (Session *session);
+
void session_set_pam_service (Session *session, const gchar *pam_service);
void session_set_username (Session *session, const gchar *username);
+++ /dev/null
-/*
- * Copyright (C) 2013 Robert Ancell.
- * Author: Robert Ancell <robert.ancell@canonical.com>
- *
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
- * license.
- */
-
-#include <errno.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#include "x-greeter.h"
-#include "x-server.h"
-#include "configuration.h"
-
-G_DEFINE_TYPE (XGreeter, x_greeter, GREETER_TYPE);
-
-XGreeter *
-x_greeter_new (void)
-{
- return g_object_new (XGREETER_TYPE, NULL);
-}
-
-static void
-setup_env (XGreeter *greeter)
-{
- DisplayServer *display_server;
- gint vt;
-
- display_server = session_get_display_server (SESSION (greeter));
-
- vt = display_server_get_vt (display_server);
- if (vt > 0)
- {
- gchar *t;
-
- t = g_strdup_printf ("/dev/tty%d", vt);
- session_set_tty (SESSION (greeter), t);
- g_free (t);
-
- t = g_strdup_printf ("%d", vt);
- session_set_env (SESSION (greeter), "XDG_VTNR", t);
- g_free (t);
- }
-
- session_set_env (SESSION (greeter), "DISPLAY", x_server_get_address (X_SERVER (display_server)));
- session_set_tty (SESSION (greeter), x_server_get_address (X_SERVER (display_server)));
- session_set_xdisplay (SESSION (greeter), x_server_get_address (X_SERVER (display_server)));
- session_set_remote_host_name (SESSION (greeter), x_server_get_hostname (X_SERVER (display_server)));
- session_set_x_authority (SESSION (greeter),
- x_server_get_authority (X_SERVER (display_server)),
- config_get_boolean (config_get_instance (), "LightDM", "user-authority-in-system-dir"));
-}
-
-static gboolean
-x_greeter_start (Session *session)
-{
- setup_env (XGREETER (session));
- return SESSION_CLASS (x_greeter_parent_class)->start (session);
-}
-
-static void
-x_greeter_run (Session *session)
-{
- setup_env (XGREETER (session));
- SESSION_CLASS (x_greeter_parent_class)->run (session);
-}
-
-static void
-x_greeter_init (XGreeter *session)
-{
-}
-
-static void
-x_greeter_class_init (XGreeterClass *klass)
-{
- SessionClass *session_class = SESSION_CLASS (klass);
-
- session_class->start = x_greeter_start;
- session_class->run = x_greeter_run;
-}
+++ /dev/null
-/*
- * Copyright (C) 2013 Robert Ancell.
- * Author: Robert Ancell <robert.ancell@canonical.com>
- *
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
- * license.
- */
-
-#ifndef XGREETER_H_
-#define XGREETER_H_
-
-#include "greeter.h"
-
-G_BEGIN_DECLS
-
-#define XGREETER_TYPE (x_greeter_get_type())
-#define XGREETER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XGREETER_TYPE, XGreeter))
-
-typedef struct XGreeterPrivate XGreeterPrivate;
-
-typedef struct
-{
- Greeter parent_instance;
- XGreeterPrivate *priv;
-} XGreeter;
-
-typedef struct
-{
- GreeterClass parent_class;
-} XGreeterClass;
-
-GType x_greeter_get_type (void);
-
-XGreeter *x_greeter_new (void);
-
-G_END_DECLS
-
-#endif /* XGREETER_H_ */
#include <xcb/xcb.h>
#include "x-server.h"
-#include "x-session.h"
+#include "configuration.h"
struct XServerPrivate
{
}
static void
+x_server_setup_session (DisplayServer *display_server, Session *session)
+{
+ gint vt;
+
+ display_server = session_get_display_server (session);
+
+ vt = display_server_get_vt (display_server);
+ if (vt > 0)
+ {
+ gchar *t;
+
+ t = g_strdup_printf ("/dev/tty%d", vt);
+ session_set_tty (session, t);
+ g_free (t);
+
+ t = g_strdup_printf ("%d", vt);
+ session_set_env (session, "XDG_VTNR", t);
+ g_free (t);
+ }
+
+ session_set_env (session, "DISPLAY", x_server_get_address (X_SERVER (display_server)));
+ session_set_tty (session, x_server_get_address (X_SERVER (display_server)));
+ session_set_xdisplay (session, x_server_get_address (X_SERVER (display_server)));
+ session_set_remote_host_name (session, x_server_get_hostname (X_SERVER (display_server)));
+ session_set_x_authority (session,
+ x_server_get_authority (X_SERVER (display_server)),
+ config_get_boolean (config_get_instance (), "LightDM", "user-authority-in-system-dir"));
+}
+
+void
x_server_init (XServer *server)
{
server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_TYPE, XServerPrivate);
DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
display_server_class->start = x_server_start;
+ display_server_class->setup_session = x_server_setup_session;
object_class->finalize = x_server_finalize;
g_type_class_add_private (klass, sizeof (XServerPrivate));
+++ /dev/null
-/*
- * Copyright (C) 2010-2011 Robert Ancell.
- * Author: Robert Ancell <robert.ancell@canonical.com>
- *
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
- * license.
- */
-
-#include <errno.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#include "x-session.h"
-#include "x-server.h"
-#include "configuration.h"
-
-G_DEFINE_TYPE (XSession, x_session, SESSION_TYPE);
-
-XSession *
-x_session_new (void)
-{
- XSession *session;
-
- session = g_object_new (XSESSION_TYPE, NULL);
- session_set_log_file (SESSION (session), ".xsession-errors");
-
- return session;
-}
-
-static void
-setup_env (XSession *session)
-{
- DisplayServer *display_server;
- gint vt;
-
- display_server = session_get_display_server (SESSION (session));
-
- vt = display_server_get_vt (display_server);
- if (vt > 0)
- {
- gchar *t;
-
- t = g_strdup_printf ("/dev/tty%d", vt);
- session_set_tty (SESSION (session), t);
- g_free (t);
-
- t = g_strdup_printf ("%d", vt);
- session_set_env (SESSION (session), "XDG_VTNR", t);
- g_free (t);
- }
-
- session_set_env (SESSION (session), "DISPLAY", x_server_get_address (X_SERVER (display_server)));
- session_set_tty (SESSION (session), x_server_get_address (X_SERVER (display_server)));
- session_set_xdisplay (SESSION (session), x_server_get_address (X_SERVER (display_server)));
- session_set_remote_host_name (SESSION (session), x_server_get_hostname (X_SERVER (display_server)));
- session_set_x_authority (SESSION (session),
- x_server_get_authority (X_SERVER (display_server)),
- config_get_boolean (config_get_instance (), "LightDM", "user-authority-in-system-dir"));
-}
-
-static gboolean
-x_session_start (Session *session)
-{
- setup_env (XSESSION (session));
- return SESSION_CLASS (x_session_parent_class)->start (session);
-}
-
-static void
-x_session_run (Session *session)
-{
- setup_env (XSESSION (session));
- SESSION_CLASS (x_session_parent_class)->run (session);
-}
-
-static void
-x_session_init (XSession *session)
-{
-}
-
-static void
-x_session_class_init (XSessionClass *klass)
-{
- SessionClass *session_class = SESSION_CLASS (klass);
-
- session_class->start = x_session_start;
- session_class->run = x_session_run;
-}
+++ /dev/null
-/*
- * Copyright (C) 2010-2011 Robert Ancell.
- * Author: Robert Ancell <robert.ancell@canonical.com>
- *
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
- * license.
- */
-
-#ifndef XSESSION_H_
-#define XSESSION_H_
-
-#include "session.h"
-
-G_BEGIN_DECLS
-
-#define XSESSION_TYPE (x_session_get_type())
-#define XSESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XSESSION_TYPE, XSession))
-
-typedef struct XSessionPrivate XSessionPrivate;
-
-typedef struct
-{
- Session parent_instance;
- XSessionPrivate *priv;
-} XSession;
-
-typedef struct
-{
- SessionClass parent_class;
-} XSessionClass;
-
-GType x_session_get_type (void);
-
-XSession *x_session_new (void);
-
-G_END_DECLS
-
-#endif /* XSESSION_H_ */
test-autologin-new-authtok \
test-autologin-gobject-timeout \
test-autologin-gobject-guest-timeout \
- test-autologin-python-timeout \
- test-autologin-python-guest-timeout \
test-change-authentication \
test-restart-authentication \
test-gobject-cancel-authentication \
- test-python-cancel-authentication \
test-pam \
test-login-pam \
test-denied \
test-user-renamed \
test-user-renamed-invalid \
test-users-gobject \
- test-users-python \
test-keyboard-layout \
test-no-keyboard-layout \
test-language \
test-login-gobject-guest-fail-setup-script \
test-login-gobject-guest-logout \
test-login-gobject-remote-session \
- test-login-python \
- test-login-python-manual \
- test-login-python-manual-previous-session \
- test-login-python-no-password \
- test-login-python-long-username \
- test-login-python-long-password \
- test-login-python-two-factor \
- test-login-python-new-authtok \
- test-login-python-info-prompt \
- test-login-python-multi-info-prompt \
- test-login-python-previous-session \
- test-login-python-wrong-password \
- test-login-python-invalid-user \
- test-login-python-invalid-session \
- test-login-python-logout \
- test-login-python-pick-session \
- test-login-python-remember-session \
- test-login-python-guest \
- test-login-python-guest-disabled \
- test-login-python-guest-no-setup-script \
- test-login-python-guest-fail-setup-script \
- test-login-python-guest-logout \
- test-login-python-remote-session \
test-login-session-crash \
test-login-xserver-crash \
test-xserver-no-share \
test-gobject-power-no-console-kit \
test-gobject-power-no-login1 \
test-gobject-power-no-services \
- test-python-power \
- test-python-power-no-console-kit \
- test-python-power-no-login1 \
- test-python-power-no-services \
test-open-file-descriptors \
test-xdmcp-server-open-file-descriptors \
+ test-mir-autologin \
+ test-mir-greeter-x-session \
+ test-mir-greeter-mir-session \
+ test-mir-session-x-greeter \
test-unity-compositor-command \
test-unity-compositor-fail-start \
test-unity-compositor-fail-ready \
test-unity-autologin \
test-unity-login \
test-unity-switch \
- test-unity-plymouth
+ test-unity-plymouth \
+ test-unity-mir-login
# test-session-exit-error
# test-greeter-no-exit
# test-qt-change-password
# test-autologin-create-directory
+TESTS += \
+ test-python-cancel-authentication \
+ test-users-python \
+ test-login-python \
+ test-login-python-manual \
+ test-login-python-manual-previous-session \
+ test-login-python-no-password \
+ test-login-python-long-username \
+ test-login-python-long-password \
+ test-login-python-two-factor \
+ test-login-python-new-authtok \
+ test-login-python-info-prompt \
+ test-login-python-multi-info-prompt \
+ test-login-python-previous-session \
+ test-login-python-wrong-password \
+ test-login-python-invalid-user \
+ test-login-python-invalid-session \
+ test-login-python-logout \
+ test-login-python-pick-session \
+ test-login-python-remember-session \
+ test-login-python-guest \
+ test-login-python-guest-disabled \
+ test-login-python-guest-no-setup-script \
+ test-login-python-guest-fail-setup-script \
+ test-login-python-guest-logout \
+ test-login-python-remote-session \
+ test-autologin-python-timeout \
+ test-autologin-python-guest-timeout \
+ test-python-power \
+ test-python-power-no-console-kit \
+ test-python-power-no-login1 \
+ test-python-power-no-services
+
if COMPILE_LIBLIGHTDM_QT4
TESTS += \
test-autologin-qt4-timeout \
data/greeters/test-qt5-greeter.desktop \
data/sessions/alternative.desktop \
data/sessions/default.desktop \
+ data/sessions/mir.desktop \
scripts/0-additional.conf \
scripts/1-additional.conf \
scripts/additional-config.conf \
scripts/login-two-factor.conf \
scripts/login-wrong-password.conf \
scripts/login-xserver-crash.conf \
+ scripts/mir-autologin.conf \
+ scripts/mir-greeter-x-session.conf \
+ scripts/mir-greeter-mir-session.conf \
+ scripts/mir-session-x-greeter.conf \
scripts/no-accounts-service.conf \
scripts/no-config.conf \
scripts/no-console-kit.conf \
scripts/unity-compositor-fail-ready.conf \
scripts/unity-compositor-fail-start.conf \
scripts/unity-login.conf \
+ scripts/unity-mir-login.conf \
scripts/unity-plymouth.conf \
scripts/unity-switch.conf \
scripts/users.conf \
--- /dev/null
+[Desktop Entry]
+Name=Test GObject Greeter
+Comment=LightDM test GObject greeter
+Exec=test-gobject-greeter
+X-LightDM-Session-Type=mir
--- /dev/null
+[Desktop Entry]
+Name=Test Session
+Comment=LightDM test Mir session
+Exec=test-session
+X-LightDM-Session-Type=mir
--- /dev/null
+#
+# Check can run automatically log into a Mir session
+#
+
+[SeatDefaults]
+autologin-user=have-password1
+user-session=mir
+
+#?RUNNER DAEMON-START
+
+# Session starts
+#?SESSION-MIR START VT=7 USER=have-password1
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-MIR TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
--- /dev/null
+#
+# Check can run a Mir greeter and log into a Mir session
+#
+
+[SeatDefaults]
+user-session=mir
+
+#?RUNNER DAEMON-START
+
+# Greeter starts
+#?GREETER-MIR START VT=7
+#?XSERVER-0 ACCEPT-CONNECT
+#?GREETER-MIR CONNECT-TO-DAEMON
+#?GREETER-MIR CONNECTED-TO-DAEMON
+
+# Log into account
+#?*GREETER-MIR AUTHENTICATE USERNAME=no-password1
+#?GREETER-MIR AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE
+#?*GREETER-MIR START-SESSION
+
+# Session starts
+#?SESSION-MIR START VT=8 USER=have-password1
+
+# Greeter quits once session ready
+#?GREETER-MIR TERMINATE SIGNAL=15
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-MIR TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
--- /dev/null
+#
+# Check can run a Mir greeter and log into an X session
+#
+
+[SeatDefaults]
+user-session=default
+
+#?RUNNER DAEMON-START
+
+# Greeter starts
+#?GREETER-MIR START VT=7
+#?XSERVER-0 ACCEPT-CONNECT
+#?GREETER-MIR CONNECT-TO-DAEMON
+#?GREETER-MIR CONNECTED-TO-DAEMON
+
+# Log into account
+#?*GREETER-MIR AUTHENTICATE USERNAME=no-password1
+#?GREETER-MIR AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE
+#?*GREETER-MIR START-SESSION
+#?GREETER-MIR TERMINATE SIGNAL=15
+
+# X server starts for session
+#?XSERVER-0 START VT=8
+
+# 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 USER=have-password1
+#?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
--- /dev/null
+#
+# Check can login to a Mir session from an X greeter
+#
+
+[SeatDefaults]
+user-session=mir
+
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Greeter starts
+#?GREETER-X-0 START
+#?XSERVER-0 ACCEPT-CONNECT
+#?GREETER-X-0 CONNECT-XSERVER
+#?GREETER-X-0 CONNECT-TO-DAEMON
+#?GREETER-X-0 CONNECTED-TO-DAEMON
+
+# Log into account
+#?*GREETER-X-0 AUTHENTICATE USERNAME=no-password1
+#?GREETER-X-0 AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE
+#?*GREETER-X-0 START-SESSION
+
+# Session starts
+#?SESSION-MIR START VT=8 USER=have-password1
+
+# Greeter quits once session ready
+#?GREETER-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-MIR TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
--- /dev/null
+#
+# Check can log into a Mir session from a Mir greeter
+#
+
+[SeatDefaults]
+type=unity
+user-session=default
+
+#?RUNNER DAEMON-START
+
+# System compositor starts
+#?UNITY-SYSTEM-COMPOSITOR START
+#?*UNITY-SYSTEM-COMPOSITOR READY
+
+# Greeter starts
+#?GREETER-MIR-0 START
+#?GREETER-MIR-0 CONNECT-TO-DAEMON
+#?GREETER-MIR-0 CONNECTED-TO-DAEMON
+
+# System compositor switches to greeter
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+
+# Log into account with a password
+#?*GREETER-MIR-0 AUTHENTICATE USERNAME=have-password1
+#?GREETER-MIR-0 SHOW-PROMPT TEXT="Password:"
+#?*GREETER-MIR-0 RESPOND TEXT="password"
+#?GREETER-MIR-0 AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
+#?*GREETER-MIR-0 START-SESSION
+
+# Session starts
+#?SESSION-MIR-1 START USER=have-password1
+
+# System compositor switches to session
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=1
+
+# Greeter stops
+#?GREETER-MIR-0 TERMINATE SIGNAL=15
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-MIR-1 TERMINATE SIGNAL=15
+#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
plymouth \
test-gobject-greeter \
test-greeter-wrapper \
+ test-mir-greeter \
test-runner \
test-script-hook \
test-session \
-llightdm-gobject-1 \
$(GLIB_LIBS) \
$(GIO_UNIX_LIBS) \
- $(XCB_LIBS)
+ $(XCB_LIBS)
+
+test_mir_greeter_SOURCES = test-mir-greeter.c status.c status.h
+test_mir_greeter_CFLAGS = \
+ -I$(top_srcdir)/liblightdm-gobject \
+ $(WARN_CFLAGS) \
+ $(GLIB_CFLAGS) \
+ $(GIO_UNIX_CFLAGS)
+test_mir_greeter_LDADD = \
+ -L$(top_builddir)/liblightdm-gobject \
+ -llightdm-gobject-1 \
+ $(GLIB_LIBS) \
+ $(GIO_UNIX_LIBS)
guest_account_SOURCES = guest-account.c status.c status.h
guest_account_CFLAGS = \
--- /dev/null
+/* -*- Mode: C; indent-tabs-mode: nil; tab-width: 4 -*- */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <lightdm.h>
+
+#include "status.h"
+
+static gchar *greeter_id;
+static GMainLoop *loop;
+static LightDMGreeter *greeter;
+static GKeyFile *config;
+
+static void
+show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
+{
+ status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text);
+}
+
+static void
+show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
+{
+ status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text);
+}
+
+static void
+authentication_complete_cb (LightDMGreeter *greeter)
+{
+ if (lightdm_greeter_get_authentication_user (greeter))
+ status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
+ greeter_id,
+ lightdm_greeter_get_authentication_user (greeter),
+ lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
+ else
+ status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
+ greeter_id,
+ lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
+}
+
+static void
+signal_cb (int signum)
+{
+ status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, signum);
+ exit (EXIT_SUCCESS);
+}
+
+static void
+request_cb (const gchar *request)
+{
+ gchar *r;
+
+ if (!request)
+ {
+ g_main_loop_quit (loop);
+ return;
+ }
+
+ r = g_strdup_printf ("%s AUTHENTICATE", greeter_id);
+ if (strcmp (request, r) == 0)
+ lightdm_greeter_authenticate (greeter, NULL);
+ g_free (r);
+
+ r = g_strdup_printf ("%s AUTHENTICATE USERNAME=", greeter_id);
+ if (g_str_has_prefix (request, r))
+ lightdm_greeter_authenticate (greeter, request + strlen (r));
+ g_free (r);
+
+ r = g_strdup_printf ("%s RESPOND TEXT=\"", greeter_id);
+ if (g_str_has_prefix (request, r))
+ {
+ gchar *text = g_strdup (request + strlen (r));
+ text[strlen (text) - 1] = '\0';
+ lightdm_greeter_respond (greeter, text);
+ g_free (text);
+ }
+ g_free (r);
+
+ r = g_strdup_printf ("%s CANCEL-AUTHENTICATION", greeter_id);
+ if (strcmp (request, r) == 0)
+ lightdm_greeter_cancel_authentication (greeter);
+ g_free (r);
+
+ r = g_strdup_printf ("%s START-SESSION", greeter_id);
+ if (strcmp (request, r) == 0)
+ {
+ if (!lightdm_greeter_start_session_sync (greeter, NULL, NULL))
+ status_notify ("%s SESSION-FAILED", greeter_id);
+ }
+ g_free (r);
+
+ r = g_strdup_printf ("%s START-SESSION SESSION=", greeter_id);
+ if (g_str_has_prefix (request, r))
+ {
+ if (!lightdm_greeter_start_session_sync (greeter, request + strlen (r), NULL))
+ status_notify ("%s SESSION-FAILED", greeter_id);
+ }
+ g_free (r);
+}
+
+int
+main (int argc, char **argv)
+{
+ signal (SIGINT, signal_cb);
+ signal (SIGTERM, signal_cb);
+
+#if !defined(GLIB_VERSION_2_36)
+ g_type_init ();
+#endif
+
+ greeter_id = g_strdup ("GREETER-MIR");
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ status_connect (request_cb);
+
+ status_notify ("%s START", greeter_id);
+
+ 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-greeter-config", "return-value", NULL))
+ {
+ int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
+ status_notify ("%s EXIT CODE=%d", greeter_id, return_value);
+ return return_value;
+ }
+
+ greeter = lightdm_greeter_new ();
+ g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
+ g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
+ g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
+
+ status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
+ if (!lightdm_greeter_connect_sync (greeter, NULL))
+ {
+ status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
+ return EXIT_FAILURE;
+ }
+
+ status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
+
+ g_main_loop_run (loop);
+
+ return EXIT_SUCCESS;
+}
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-autologin test-mir-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-greeter-mir-session test-mir-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-greeter-x-session test-mir-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-session-x-greeter test-mir-greeter
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner unity-mir-login test-mir-greeter