summaryrefslogtreecommitdiff
path: root/daemon/gdm-session.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/gdm-session.c')
-rw-r--r--daemon/gdm-session.c87
1 files changed, 83 insertions, 4 deletions
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 610ebcd0..d5ed6de1 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -69,6 +69,7 @@ typedef struct
GPid worker_pid;
char *service_name;
GDBusMethodInvocation *starting_invocation;
+ gboolean starting_guest;
char *starting_username;
GDBusMethodInvocation *pending_invocation;
GdmDBusWorkerManager *worker_manager_interface;
@@ -87,6 +88,7 @@ struct _GdmSessionPrivate
char *selected_session;
char *saved_session;
char *saved_language;
+ gboolean selected_guest;
char *selected_user;
char *user_x11_authority_file;
@@ -637,6 +639,7 @@ gdm_session_select_user (GdmSession *self,
g_debug ("GdmSession: Setting user: '%s'", text);
+ self->priv->selected_guest = FALSE;
g_free (self->priv->selected_user);
self->priv->selected_user = g_strdup (text);
@@ -647,6 +650,22 @@ gdm_session_select_user (GdmSession *self,
self->priv->saved_language = NULL;
}
+void
+gdm_session_select_guest (GdmSession *self)
+{
+ g_debug ("GdmSession: Setting guest");
+
+ self->priv->selected_guest = TRUE;
+ g_free (self->priv->selected_user);
+ self->priv->selected_user = NULL;
+
+ g_free (self->priv->saved_session);
+ self->priv->saved_session = NULL;
+
+ g_free (self->priv->saved_language);
+ self->priv->saved_language = NULL;
+}
+
static void
cancel_pending_query (GdmSessionConversation *conversation)
{
@@ -1132,7 +1151,9 @@ register_worker (GdmDBusWorkerManager *worker_manager_interface,
}
if (conversation->starting_invocation != NULL) {
- if (conversation->starting_username != NULL) {
+ if (conversation->starting_guest) {
+ gdm_session_setup_for_guest (self, conversation->service_name);
+ } else if (conversation->starting_username != NULL) {
gdm_session_setup_for_user (self, conversation->service_name, conversation->starting_username);
g_clear_pointer (&conversation->starting_username,
@@ -1337,6 +1358,7 @@ gdm_session_handle_client_begin_verification (GdmDBusUserVerifier *user_verif
if (conversation != NULL) {
conversation->starting_invocation = g_object_ref (invocation);
+ conversation->starting_guest = FALSE;
conversation->starting_username = NULL;
}
@@ -1356,6 +1378,7 @@ gdm_session_handle_client_begin_verification_for_user (GdmDBusUserVerifier *u
if (conversation != NULL) {
conversation->starting_invocation = g_object_ref (invocation);
+ conversation->starting_guest = FALSE;
conversation->starting_username = g_strdup (username);
}
@@ -1363,6 +1386,24 @@ gdm_session_handle_client_begin_verification_for_user (GdmDBusUserVerifier *u
}
static gboolean
+gdm_session_handle_client_begin_verification_for_guest (GdmDBusUserVerifier *user_verifier_interface,
+ GDBusMethodInvocation *invocation,
+ GdmSession *self)
+{
+ GdmSessionConversation *conversation;
+
+ conversation = begin_verification_conversation (self, invocation, "gdm-autologin");
+
+ if (conversation != NULL) {
+ conversation->starting_invocation = g_object_ref (invocation);
+ conversation->starting_guest = TRUE;
+ conversation->starting_username = NULL;
+ }
+
+ return TRUE;
+}
+
+static gboolean
gdm_session_handle_client_answer_query (GdmDBusUserVerifier *user_verifier_interface,
GDBusMethodInvocation *invocation,
const char *service_name,
@@ -1415,6 +1456,19 @@ gdm_session_handle_client_select_user (GdmDBusGreeter *greeter_interface,
}
static gboolean
+gdm_session_handle_client_select_guest (GdmDBusGreeter *greeter_interface,
+ GDBusMethodInvocation *invocation,
+ GdmSession *self)
+{
+ if (self->priv->greeter_interface != NULL) {
+ gdm_dbus_greeter_complete_select_guest (greeter_interface,
+ invocation);
+ }
+ gdm_session_select_guest (self);
+ return TRUE;
+}
+
+static gboolean
gdm_session_handle_client_start_session_when_ready (GdmDBusGreeter *greeter_interface,
GDBusMethodInvocation *invocation,
const char *service_name,
@@ -1495,6 +1549,10 @@ export_user_verifier_interface (GdmSession *self,
G_CALLBACK (gdm_session_handle_client_begin_verification_for_user),
self);
g_signal_connect (user_verifier_interface,
+ "handle-begin-verification-for-guest",
+ G_CALLBACK (gdm_session_handle_client_begin_verification_for_guest),
+ self);
+ g_signal_connect (user_verifier_interface,
"handle-answer-query",
G_CALLBACK (gdm_session_handle_client_answer_query),
self);
@@ -1532,6 +1590,10 @@ export_greeter_interface (GdmSession *self,
G_CALLBACK (gdm_session_handle_client_select_user),
self);
g_signal_connect (greeter_interface,
+ "handle-select-guest",
+ G_CALLBACK (gdm_session_handle_client_select_guest),
+ self);
+ g_signal_connect (greeter_interface,
"handle-start-session-when-ready",
G_CALLBACK (gdm_session_handle_client_start_session_when_ready),
self);
@@ -2224,6 +2286,7 @@ on_initialization_complete_cb (GdmDBusWorker *proxy,
static void
initialize (GdmSession *self,
const char *service_name,
+ gboolean guest,
const char *username,
const char *log_file)
{
@@ -2240,6 +2303,9 @@ initialize (GdmSession *self,
g_variant_builder_add_parsed (&details, "{'extensions', <%^as>}", extensions);
+ if (guest)
+ g_variant_builder_add_parsed (&details, "{'guest', <%b>}", guest);
+
if (username != NULL)
g_variant_builder_add_parsed (&details, "{'username', <%s>}", username);
@@ -2294,7 +2360,7 @@ gdm_session_setup (GdmSession *self,
update_session_type (self);
- initialize (self, service_name, NULL, NULL);
+ initialize (self, service_name, FALSE, NULL, NULL);
}
@@ -2312,7 +2378,20 @@ gdm_session_setup_for_user (GdmSession *self,
gdm_session_select_user (self, username);
self->priv->is_program_session = FALSE;
- initialize (self, service_name, self->priv->selected_user, NULL);
+ initialize (self, service_name, FALSE, self->priv->selected_user, NULL);
+}
+
+void
+gdm_session_setup_for_guest (GdmSession *self,
+ const char *service_name)
+{
+
+ g_return_if_fail (GDM_IS_SESSION (self));
+
+ update_session_type (self);
+
+ self->priv->is_program_session = FALSE;
+ initialize (self, service_name, TRUE, NULL, NULL);
}
void
@@ -2325,7 +2404,7 @@ gdm_session_setup_for_program (GdmSession *self,
g_return_if_fail (GDM_IS_SESSION (self));
self->priv->is_program_session = TRUE;
- initialize (self, service_name, username, log_file);
+ initialize (self, service_name, FALSE, username, log_file);
}
void