]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - tests/src/test-gobject-greeter.c
First pass at reset support
[sojka/lightdm.git] / tests / src / test-gobject-greeter.c
index afb14cc6995a4bba1b4b17b778b499373beb24d6..0be56c0b70f9ea2a610433f72e7076345f5c5b26 100644 (file)
@@ -64,6 +64,38 @@ sigterm_cb (gpointer user_data)
     return TRUE;
 }
 
+static void
+print_hints (LightDMGreeter *greeter)
+{
+    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);
+}
+
 static void
 user_changed_cb (LightDMUser *user)
 {
@@ -71,139 +103,101 @@ user_changed_cb (LightDMUser *user)
 }
 
 static void
-request_cb (const gchar *request)
+request_cb (const gchar *name, GHashTable *params)
 {
-    const gchar *c, *start;
-    int l;
-    gchar *id, *name = NULL;
-    gboolean id_matches;
-    GHashTable *params;
-
-    if (!request)
+    if (!name)
     {
         g_main_loop_quit (loop);
         return;
     }
 
-    c = request;
-    start = c;
-    l = 0;
-    while (*c && !isspace (*c))
-    {
-        c++;
-        l++;
-    }
-    id = g_strdup_printf ("%.*s", l, start);
-    id_matches = strcmp (id, greeter_id) == 0;
-    g_free (id);
-    if (!id_matches)
-        return;
-
-    while (isspace (*c))
-        c++;
-    start = c;
-    l = 0;
-    while (*c && !isspace (*c))
-    {
-        c++;
-        l++;
-    }
-    name = g_strdup_printf ("%.*s", l, start);
-
-    params = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-    while (TRUE)
-    {
-        const gchar *start;
-        gchar *param_name, *param_value;
-
-        while (isspace (*c))
-            c++;
-        start = c;
-        while (*c && !isspace (*c) && *c != '=')
-            c++;
-        if (*c == '\0')
-            break;
-
-        param_name = g_strdup_printf ("%.*s", (int) (c - start), start);
-
-        if (*c == '=')
-        {
-            c++;
-            while (isspace (*c))
-                c++;
-            if (*c == '\"')
-            {
-                gboolean escaped = FALSE;
-                GString *value;
-
-                c++;
-                value = g_string_new ("");
-                while (*c)
-                {
-                    if (*c == '\\')
-                    {
-                        if (escaped)
-                        {
-                            g_string_append_c (value, '\\');
-                            escaped = FALSE;
-                        }
-                        else
-                            escaped = TRUE;
-                    }
-                    else if (!escaped && *c == '\"')
-                        break;
-                    if (!escaped)
-                        g_string_append_c (value, *c);
-                    c++;
-                }
-                param_value = value->str;
-                g_string_free (value, FALSE);
-                if (*c == '\"')
-                    c++;
-            }
-            else
-            {
-                start = c;
-                while (*c && !isspace (*c))
-                    c++;
-                param_value = g_strdup_printf ("%.*s", (int) (c - start), start);
-            }
-        }
-        else
-            param_value = g_strdup ("");
+    if (strcmp (name, "CRASH") == 0)
+        kill (getpid (), SIGSEGV);
 
-        g_hash_table_insert (params, param_name, param_value);
-    }
-  
-    if (strcmp (name, "AUTHENTICATE") == 0)
+    else if (strcmp (name, "AUTHENTICATE") == 0)
         lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME"));
 
-    if (strcmp (name, "AUTHENTICATE-GUEST") == 0)
+    else if (strcmp (name, "AUTHENTICATE-GUEST") == 0)
         lightdm_greeter_authenticate_as_guest (greeter);
 
-    if (strcmp (name, "AUTHENTICATE-AUTOLOGIN") == 0)
+    else if (strcmp (name, "AUTHENTICATE-AUTOLOGIN") == 0)
         lightdm_greeter_authenticate_autologin (greeter);
 
-    if (strcmp (name, "AUTHENTICATE-REMOTE") == 0)
+    else if (strcmp (name, "AUTHENTICATE-REMOTE") == 0)
         lightdm_greeter_authenticate_remote (greeter, g_hash_table_lookup (params, "SESSION"), NULL);
 
-    if (strcmp (name, "RESPOND") == 0)
+    else if (strcmp (name, "RESPOND") == 0)
         lightdm_greeter_respond (greeter, g_hash_table_lookup (params, "TEXT"));
 
-    if (strcmp (name, "CANCEL-AUTHENTICATION") == 0)
+    else if (strcmp (name, "CANCEL-AUTHENTICATION") == 0)
         lightdm_greeter_cancel_authentication (greeter);
 
-    if (strcmp (name, "START-SESSION") == 0)
+    else if (strcmp (name, "START-SESSION") == 0)
+    {
         if (!lightdm_greeter_start_session_sync (greeter, g_hash_table_lookup (params, "SESSION"), NULL))
-            status_notify ("%s SESSION-FAILED", greeter_id); 
+            status_notify ("%s SESSION-FAILED", greeter_id);
+    }
 
-    if (strcmp (name, "LOG-DEFAULT-SESSION") == 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));
 
-    if (strcmp (name, "LOG-USER-LIST-LENGTH") == 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 ()));
 
-    if (strcmp (name, "WATCH-USER") == 0)
+    else if (strcmp (name, "WRITE-SHARED-DATA") == 0)
+    {
+        gchar *dir;
+
+        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);
+    }
+
+    else if (strcmp (name, "READ-SHARED-DATA") == 0)
+    {
+        gchar *dir;
+
+        dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME"));
+        if (dir)
+        {
+            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);
+    }
+
+    else if (strcmp (name, "WATCH-USER") == 0)
     {
         LightDMUser *user;
         const gchar *username;
@@ -215,7 +209,7 @@ request_cb (const gchar *request)
         status_notify ("%s WATCH-USER USERNAME=%s", greeter_id, username);
     }
 
-    if (strcmp (name, "LOG-USER") == 0)
+    else if (strcmp (name, "LOG-USER") == 0)
     {
         LightDMUser *user;
         const gchar *username, *image, *background, *language, *layout, *session;
@@ -275,7 +269,7 @@ request_cb (const gchar *request)
         g_string_free (status_text, TRUE);
     }
 
-    if (strcmp (name, "LOG-USER-LIST") == 0)
+    else if (strcmp (name, "LOG-USER-LIST") == 0)
     {
         GList *users, *link;
 
@@ -287,13 +281,13 @@ request_cb (const gchar *request)
         }
     }
 
-    if (strcmp (name, "GET-CAN-SUSPEND") == 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");
     }
 
-    if (strcmp (name, "SUSPEND") == 0)
+    else if (strcmp (name, "SUSPEND") == 0)
     {
         GError *error = NULL;
         if (!lightdm_suspend (&error))
@@ -301,13 +295,13 @@ request_cb (const gchar *request)
         g_clear_error (&error);
     }
 
-    if (strcmp (name, "GET-CAN-HIBERNATE") == 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");
     }
 
-    if (strcmp (name, "HIBERNATE") == 0)
+    else if (strcmp (name, "HIBERNATE") == 0)
     {
         GError *error = NULL;
         if (!lightdm_hibernate (&error))
@@ -315,13 +309,13 @@ request_cb (const gchar *request)
         g_clear_error (&error);
     }
 
-    if (strcmp (name, "GET-CAN-RESTART") == 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");
     }
 
-    if (strcmp (name, "RESTART") == 0)
+    else if (strcmp (name, "RESTART") == 0)
     {
         GError *error = NULL;
         if (!lightdm_restart (&error))
@@ -329,22 +323,19 @@ request_cb (const gchar *request)
         g_clear_error (&error);
     }
 
-    if (strcmp (name, "GET-CAN-SHUTDOWN") == 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");
     }
 
-    if (strcmp (name, "SHUTDOWN") == 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 (name);
-    g_hash_table_unref (params);
 }
 
 static void
@@ -396,7 +387,7 @@ main (int argc, char **argv)
     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);
@@ -446,6 +437,13 @@ main (int argc, char **argv)
         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))
     {
@@ -455,20 +453,7 @@ main (int argc, char **argv)
 
     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);