#include <xcb/xcb.h>
#include <lightdm.h>
#include <glib-unix.h>
+#include <ctype.h>
#include "status.h"
}
static void
-request_cb (const gchar *request)
+print_hints (LightDMGreeter *greeter)
{
- gchar *r;
+ if (lightdm_greeter_get_select_user_hint (greeter))
+ status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, lightdm_greeter_get_select_user_hint (greeter));
+ if (lightdm_greeter_get_select_guest_hint (greeter))
+ status_notify ("%s SELECT-GUEST-HINT", greeter_id);
+ if (lightdm_greeter_get_lock_hint (greeter))
+ status_notify ("%s LOCK-HINT", greeter_id);
+ if (!lightdm_greeter_get_has_guest_account_hint (greeter))
+ status_notify ("%s HAS-GUEST-ACCOUNT-HINT=FALSE", greeter_id);
+ if (lightdm_greeter_get_hide_users_hint (greeter))
+ status_notify ("%s HIDE-USERS-HINT", greeter_id);
+ if (lightdm_greeter_get_show_manual_login_hint (greeter))
+ status_notify ("%s SHOW-MANUAL-LOGIN-HINT", greeter_id);
+ if (!lightdm_greeter_get_show_remote_login_hint (greeter))
+ status_notify ("%s SHOW-REMOTE-LOGIN-HINT=FALSE", greeter_id);
+}
+
+static void
+idle_cb (LightDMGreeter *greeter)
+{
+ status_notify ("%s IDLE", greeter_id);
+}
+
+static void
+reset_cb (LightDMGreeter *greeter)
+{
+ status_notify ("%s RESET", greeter_id);
+ print_hints (greeter);
+}
- if (!request)
+static void
+user_changed_cb (LightDMUser *user)
+{
+ status_notify ("%s USER-CHANGED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
+}
+
+static void
+request_cb (const gchar *name, GHashTable *params)
+{
+ if (!name)
{
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 AUTHENTICATE-GUEST", greeter_id);
- if (strcmp (request, r) == 0)
+
+ if (strcmp (name, "CRASH") == 0)
+ kill (getpid (), SIGSEGV);
+
+ else if (strcmp (name, "AUTHENTICATE") == 0)
+ lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME"));
+
+ else if (strcmp (name, "AUTHENTICATE-GUEST") == 0)
lightdm_greeter_authenticate_as_guest (greeter);
- g_free (r);
- r = g_strdup_printf ("%s AUTHENTICATE-AUTOLOGIN", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "AUTHENTICATE-AUTOLOGIN") == 0)
lightdm_greeter_authenticate_autologin (greeter);
- g_free (r);
- r = g_strdup_printf ("%s AUTHENTICATE-REMOTE SESSION=", greeter_id);
- if (g_str_has_prefix (request, r))
- lightdm_greeter_authenticate_remote (greeter, request + strlen (r), NULL);
- g_free (r);
+ else if (strcmp (name, "AUTHENTICATE-REMOTE") == 0)
+ lightdm_greeter_authenticate_remote (greeter, g_hash_table_lookup (params, "SESSION"), NULL);
- 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);
+ else if (strcmp (name, "RESPOND") == 0)
+ lightdm_greeter_respond (greeter, g_hash_table_lookup (params, "TEXT"));
- r = g_strdup_printf ("%s CANCEL-AUTHENTICATION", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "CANCEL-AUTHENTICATION") == 0)
lightdm_greeter_cancel_authentication (greeter);
- g_free (r);
- r = g_strdup_printf ("%s START-SESSION", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "START-SESSION") == 0)
{
- if (!lightdm_greeter_start_session_sync (greeter, NULL, NULL))
- status_notify ("%s SESSION-FAILED", greeter_id);
+ if (!lightdm_greeter_start_session_sync (greeter, g_hash_table_lookup (params, "SESSION"), 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);
-
- r = g_strdup_printf ("%s LOG-DEFAULT-SESSION", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "LOG-DEFAULT-SESSION") == 0)
status_notify ("%s LOG-DEFAULT-SESSION SESSION=%s", greeter_id, lightdm_greeter_get_default_session_hint (greeter));
- g_free (r);
- r = g_strdup_printf ("%s LOG-USER-LIST-LENGTH", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "LOG-USER-LIST-LENGTH") == 0)
status_notify ("%s LOG-USER-LIST-LENGTH N=%d", greeter_id, lightdm_user_list_get_length (lightdm_user_list_get_instance ()));
- g_free (r);
- r = g_strdup_printf ("%s LOG-USER USERNAME=", greeter_id);
- if (g_str_has_prefix (request, r))
+ else if (strcmp (name, "WRITE-SHARED-DATA") == 0)
{
- LightDMUser *user;
- const gchar *username;
+ gchar *dir;
- username = request + strlen (r);
- user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
- status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
+ dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME"));
+ if (dir)
+ {
+ gchar *path;
+ FILE *f;
+
+ g_printerr ("dir='%s'\n", dir);
+
+ path = g_build_filename (dir, "data", NULL);
+ if (!(f = fopen (path, "w")) || fprintf (f, "%s", (const gchar *) g_hash_table_lookup (params, "DATA")) < 0)
+ status_notify ("%s WRITE-SHARED-DATA ERROR=%s", greeter_id, strerror (errno));
+ else
+ status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", greeter_id);
+
+ if (f)
+ fclose (f);
+ g_free (path);
+ g_free (dir);
+ }
+ else
+ status_notify ("%s WRITE-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
}
- g_free (r);
- r = g_strdup_printf ("%s LOG-USER-LIST", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "READ-SHARED-DATA") == 0)
{
- GList *users, *link;
+ gchar *dir;
- users = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
- for (link = users; link; link = link->next)
+ dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME"));
+ if (dir)
{
- LightDMUser *user = link->data;
- status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
+ gchar *path;
+ gchar *contents = NULL;
+ GError *error = NULL;
+
+ g_printerr ("dir='%s'\n", dir);
+
+ path = g_build_filename (dir, "data", NULL);
+ if (g_file_get_contents (path, &contents, NULL, &error))
+ status_notify ("%s READ-SHARED-DATA DATA=%s", greeter_id, contents);
+ else
+ status_notify ("%s READ-SHARED-DATA ERROR=%s", greeter_id, error->message);
+ g_free (path);
+ g_free (contents);
+ g_clear_error (&error);
}
+ else
+ status_notify ("%s READ-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
}
- g_free (r);
- r = g_strdup_printf ("%s LOG-LAYOUT USERNAME=", greeter_id);
- if (g_str_has_prefix (request, r))
+ else if (strcmp (name, "WATCH-USER") == 0)
{
LightDMUser *user;
- const gchar *username, *layout;
+ const gchar *username;
- username = request + strlen (r);
+ username = g_hash_table_lookup (params, "USERNAME");
user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
- layout = lightdm_user_get_layout (user);
-
- status_notify ("%s LOG-LAYOUT USERNAME=%s LAYOUT='%s'", greeter_id, username, layout ? layout : "");
+ if (user)
+ g_signal_connect (user, "changed", G_CALLBACK (user_changed_cb), NULL);
+ status_notify ("%s WATCH-USER USERNAME=%s", greeter_id, username);
}
- g_free (r);
- r = g_strdup_printf ("%s LOG-LAYOUTS USERNAME=", greeter_id);
- if (g_str_has_prefix (request, r))
+ else if (strcmp (name, "LOG-USER") == 0)
{
LightDMUser *user;
- const gchar *username;
- const gchar * const *layouts;
+ const gchar *username, *image, *background, *language, *layout, *session;
+ const gchar * const * layouts;
+ gchar **fields = NULL;
+ gchar *layouts_text;
+ GString *status_text;
int i;
- username = request + strlen (r);
+ username = g_hash_table_lookup (params, "USERNAME");
+ if (g_hash_table_lookup (params, "FIELDS"))
+ fields = g_strsplit (g_hash_table_lookup (params, "FIELDS"), ",", -1);
+ if (!fields)
+ {
+ fields = g_malloc (sizeof (gchar *) * 1);
+ fields[0] = NULL;
+ }
+
user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
+ image = lightdm_user_get_image (user);
+ background = lightdm_user_get_background (user);
+ language = lightdm_user_get_language (user);
+ layout = lightdm_user_get_layout (user);
layouts = lightdm_user_get_layouts (user);
+ layouts_text = g_strjoinv (";", (gchar **) layouts);
+ session = lightdm_user_get_session (user);
+
+ status_text = g_string_new ("");
+ g_string_append_printf (status_text, "%s LOG-USER USERNAME=%s", greeter_id, username);
+ for (i = 0; fields[i]; i++)
+ {
+ if (strcmp (fields[i], "REAL-NAME") == 0)
+ g_string_append_printf (status_text, " REAL-NAME=%s", lightdm_user_get_real_name (user));
+ else if (strcmp (fields[i], "DISPLAY-NAME") == 0)
+ g_string_append_printf (status_text, " DISPLAY-NAME=%s", lightdm_user_get_display_name (user));
+ else if (strcmp (fields[i], "IMAGE") == 0)
+ g_string_append_printf (status_text, " IMAGE=%s", image ? image : "");
+ else if (strcmp (fields[i], "BACKGROUND") == 0)
+ g_string_append_printf (status_text, " BACKGROUND=%s", background ? background : "");
+ else if (strcmp (fields[i], "LANGUAGE") == 0)
+ g_string_append_printf (status_text, " LANGUAGE=%s", language ? language : "");
+ else if (strcmp (fields[i], "LAYOUT") == 0)
+ g_string_append_printf (status_text, " LAYOUT=%s", layout ? layout : "");
+ else if (strcmp (fields[i], "LAYOUTS") == 0)
+ g_string_append_printf (status_text, " LAYOUTS=%s", layouts_text);
+ else if (strcmp (fields[i], "SESSION") == 0)
+ g_string_append_printf (status_text, " SESSION=%s", session ? session : "");
+ else if (strcmp (fields[i], "LOGGED-IN") == 0)
+ g_string_append_printf (status_text, " LOGGED-IN=%s", lightdm_user_get_logged_in (user) ? "TRUE" : "FALSE");
+ else if (strcmp (fields[i], "HAS-MESSAGES") == 0)
+ g_string_append_printf (status_text, " HAS-MESSAGES=%s", lightdm_user_get_has_messages (user) ? "TRUE" : "FALSE");
+ }
+ g_strfreev (fields);
+ g_free (layouts_text);
- for (i = 0; layouts[i]; i++)
- status_notify ("%s LOG-LAYOUTS USERNAME=%s LAYOUT='%s'", greeter_id, username, layouts[i]);
+ status_notify (status_text->str);
+ g_string_free (status_text, TRUE);
}
- g_free (r);
- r = g_strdup_printf ("%s LOG-LANGUAGE USERNAME=", greeter_id);
- if (g_str_has_prefix (request, r))
+ else if (strcmp (name, "LOG-USER-LIST") == 0)
{
- LightDMUser *user;
- const gchar *username, *language;
-
- username = request + strlen (r);
- user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
- language = lightdm_user_get_language (user);
+ GList *users, *link;
- status_notify ("%s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s", greeter_id, username, language ? language : "");
+ users = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
+ for (link = users; link; link = link->next)
+ {
+ LightDMUser *user = link->data;
+ status_notify ("%s LOG-USER USERNAME=%s", greeter_id, lightdm_user_get_name (user));
+ }
}
- g_free (r);
- r = g_strdup_printf ("%s GET-CAN-SUSPEND", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "GET-CAN-SUSPEND") == 0)
{
gboolean can_suspend = lightdm_get_can_suspend ();
status_notify ("%s CAN-SUSPEND ALLOWED=%s", greeter_id, can_suspend ? "TRUE" : "FALSE");
}
- g_free (r);
- r = g_strdup_printf ("%s SUSPEND", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "SUSPEND") == 0)
{
GError *error = NULL;
if (!lightdm_suspend (&error))
status_notify ("%s FAIL-SUSPEND", greeter_id);
g_clear_error (&error);
}
- g_free (r);
- r = g_strdup_printf ("%s GET-CAN-HIBERNATE", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "GET-CAN-HIBERNATE") == 0)
{
gboolean can_hibernate = lightdm_get_can_hibernate ();
status_notify ("%s CAN-HIBERNATE ALLOWED=%s", greeter_id, can_hibernate ? "TRUE" : "FALSE");
}
- g_free (r);
- r = g_strdup_printf ("%s HIBERNATE", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "HIBERNATE") == 0)
{
GError *error = NULL;
if (!lightdm_hibernate (&error))
status_notify ("%s FAIL-HIBERNATE", greeter_id);
g_clear_error (&error);
}
- g_free (r);
- r = g_strdup_printf ("%s GET-CAN-RESTART", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "GET-CAN-RESTART") == 0)
{
gboolean can_restart = lightdm_get_can_restart ();
status_notify ("%s CAN-RESTART ALLOWED=%s", greeter_id, can_restart ? "TRUE" : "FALSE");
}
- g_free (r);
- r = g_strdup_printf ("%s RESTART", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "RESTART") == 0)
{
GError *error = NULL;
if (!lightdm_restart (&error))
status_notify ("%s FAIL-RESTART", greeter_id);
g_clear_error (&error);
}
- g_free (r);
- r = g_strdup_printf ("%s GET-CAN-SHUTDOWN", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "GET-CAN-SHUTDOWN") == 0)
{
gboolean can_shutdown = lightdm_get_can_shutdown ();
status_notify ("%s CAN-SHUTDOWN ALLOWED=%s", greeter_id, can_shutdown ? "TRUE" : "FALSE");
}
- g_free (r);
- r = g_strdup_printf ("%s SHUTDOWN", greeter_id);
- if (strcmp (request, r) == 0)
+ else if (strcmp (name, "SHUTDOWN") == 0)
{
GError *error = NULL;
if (!lightdm_shutdown (&error))
status_notify ("%s FAIL-SHUTDOWN", greeter_id);
g_clear_error (&error);
}
- g_free (r);
}
static void
xdg_session_class = getenv ("XDG_SESSION_CLASS");
mir_socket = getenv ("MIR_SOCKET");
mir_vt = getenv ("MIR_SERVER_VT");
- mir_id = getenv ("MIR_ID");
+ mir_id = getenv ("MIR_SERVER_NAME");
if (display)
{
if (display[0] == ':')
g_unix_signal_add (SIGINT, sigint_cb, NULL);
g_unix_signal_add (SIGTERM, sigterm_cb, NULL);
- status_connect (request_cb);
+ status_connect (request_cb, greeter_id);
status_text = g_string_new ("");
g_string_printf (status_text, "%s START", greeter_id);
g_signal_connect (lightdm_user_list_get_instance (), "user-removed", G_CALLBACK (user_removed_cb), NULL);
}
+ if (g_key_file_get_boolean (config, "test-greeter-config", "resettable", NULL))
+ {
+ lightdm_greeter_set_resettable (greeter, TRUE);
+ g_signal_connect (greeter, "idle", G_CALLBACK (idle_cb), NULL);
+ g_signal_connect (greeter, "reset", G_CALLBACK (reset_cb), NULL);
+ }
+
status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
if (!lightdm_greeter_connect_sync (greeter, NULL))
{
status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
- if (lightdm_greeter_get_select_user_hint (greeter))
- status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, lightdm_greeter_get_select_user_hint (greeter));
- if (lightdm_greeter_get_select_guest_hint (greeter))
- status_notify ("%s SELECT-GUEST-HINT", greeter_id);
- if (lightdm_greeter_get_lock_hint (greeter))
- status_notify ("%s LOCK-HINT", greeter_id);
- if (!lightdm_greeter_get_has_guest_account_hint (greeter))
- status_notify ("%s HAS-GUEST-ACCOUNT-HINT=FALSE", greeter_id);
- if (lightdm_greeter_get_hide_users_hint (greeter))
- status_notify ("%s HIDE-USERS-HINT", greeter_id);
- if (lightdm_greeter_get_show_manual_login_hint (greeter))
- status_notify ("%s SHOW-MANUAL-LOGIN-HINT", greeter_id);
- if (!lightdm_greeter_get_show_remote_login_hint (greeter))
- status_notify ("%s SHOW-REMOTE-LOGIN-HINT=FALSE", greeter_id);
+ print_hints (greeter);
g_main_loop_run (loop);