diff options
53 files changed, 1855 insertions, 1169 deletions
diff --git a/configure.ac b/configure.ac index 5f5f7211..f0c9d20f 100644 --- a/configure.ac +++ b/configure.ac @@ -177,7 +177,6 @@ greeters/gtk/Makefile greeters/qt/Makefile liblightdm-gobject/liblightdm-gobject-1.pc liblightdm-gobject/Makefile -liblightdm-gobject/lightdm/Makefile liblightdm-qt/Makefile liblightdm-qt/liblightdm-qt-1.pc liblightdm-qt/QLightDM/Makefile diff --git a/doc/Makefile.am b/doc/Makefile.am index e67c158b..6594a626 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -4,7 +4,7 @@ DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml DOC_SOURCE_DIR=$(top_srcdir)/liblightdm-gobject -HFILE_GLOB=$(top_srcdir)/liblightdm-gobject/lightdm/*.h +HFILE_GLOB=$(top_srcdir)/liblightdm-gobject/lightdm.h CFILE_GLOB=$(top_srcdir)/liblightdm-gobject/*.c INCLUDES = \ diff --git a/doc/lightdm-gobject-1-docs.sgml b/doc/lightdm-gobject-1-docs.sgml index a8be08d3..31fdcb2b 100644 --- a/doc/lightdm-gobject-1-docs.sgml +++ b/doc/lightdm-gobject-1-docs.sgml @@ -20,5 +20,7 @@ <xi:include href="xml/layout.xml"/> <xi:include href="xml/session.xml"/> <xi:include href="xml/user.xml"/> + <xi:include href="xml/power.xml"/> + <xi:include href="xml/system.xml"/> </part> </book> diff --git a/doc/lightdm-gobject-1-sections.txt b/doc/lightdm-gobject-1-sections.txt index 86eaf37a..0e71ca85 100644 --- a/doc/lightdm-gobject-1-sections.txt +++ b/doc/lightdm-gobject-1-sections.txt @@ -1,8 +1,29 @@ -<INCLUDE>lightdm/greeter.h</INCLUDE> +<INCLUDE>lightdm.h</INCLUDE> + +<SECTION> +<FILE>system</FILE> +<TITLE>System Information</TITLE> +lightdm_get_hostname +</SECTION> + +<SECTION> +<FILE>power</FILE> +<TITLE>Power Management</TITLE> +lightdm_get_can_suspend +lightdm_suspend +lightdm_get_can_hibernate +lightdm_hibernate +lightdm_get_can_restart +lightdm_restart +lightdm_get_can_shutdown +lightdm_shutdown +</SECTION> <SECTION> <FILE>language</FILE> -<TITLE>LightDMLanguage</TITLE> +<TITLE>Languages</TITLE> +lightdm_get_languages +lightdm_get_language lightdm_language_get_code lightdm_language_get_name lightdm_language_get_territory @@ -20,7 +41,10 @@ lightdm_language_get_type <SECTION> <FILE>layout</FILE> -<TITLE>LightDMLayout</TITLE> +<TITLE>Keyboard Layout</TITLE> +lightdm_get_layouts +lightdm_get_layout +lightdm_set_layout lightdm_layout_get_name lightdm_layout_get_short_description lightdm_layout_get_description @@ -36,32 +60,9 @@ lightdm_layout_get_type </SECTION> <SECTION> -<FILE>user</FILE> -<TITLE>LightDMUser</TITLE> -changed -lightdm_user_get_name -lightdm_user_get_real_name -lightdm_user_get_display_name -lightdm_user_get_home_directory -lightdm_user_get_image -lightdm_user_get_language -lightdm_user_get_layout -lightdm_user_get_session -lightdm_user_get_logged_in -<SUBSECTION Standard> -LIGHTDM_USER -LIGHTDM_IS_USER -LIGHTDM_TYPE_USER -lightdm_user_get_type -LIGHTDM_USER_CLASS -LIGHTDM_IS_USER_CLASS -LIGHTDM_USER_GET_CLASS -<SUBSECTION Private> -</SECTION> - -<SECTION> <FILE>session</FILE> -<TITLE>LightDMSession</TITLE> +<TITLE>Sessions</TITLE> +lightdm_get_sessions lightdm_session_get_key lightdm_session_get_name lightdm_session_get_comment @@ -77,16 +78,33 @@ LIGHTDM_SESSION_GET_CLASS </SECTION> <SECTION> -<FILE>user-list</FILE> -<TITLE>LightDMUserList</TITLE> +<FILE>user</FILE> +<TITLE>User Accounts</TITLE> +changed +lightdm_user_get_display_name +lightdm_user_get_home_directory +lightdm_user_get_image +lightdm_user_get_language +lightdm_user_get_layout +lightdm_user_get_logged_in +lightdm_user_get_name +lightdm_user_get_real_name +lightdm_user_get_session user_added user_changed user_removed -lightdm_user_list_new -lightdm_user_list_get_num_users +lightdm_user_list_get_instance +lightdm_user_list_get_length lightdm_user_list_get_user_by_name lightdm_user_list_get_users <SUBSECTION Standard> +LIGHTDM_IS_USER +LIGHTDM_IS_USER_CLASS +LIGHTDM_TYPE_USER +lightdm_user_get_type +LIGHTDM_USER +LIGHTDM_USER_CLASS +LIGHTDM_USER_GET_CLASS LIGHTDM_USER_LIST LIGHTDM_IS_USER_LIST LIGHTDM_TYPE_USER_LIST @@ -99,7 +117,7 @@ LIGHTDM_USER_LIST_GET_CLASS <SECTION> <FILE>greeter</FILE> -<TITLE>LightDMGreeter</TITLE> +<TITLE>Greeter Interface</TITLE> connected autologin_timer_expired show_message @@ -111,13 +129,6 @@ LightDMMessageType LightDMPromptType lightdm_greeter_new lightdm_greeter_connect_to_server -lightdm_greeter_get_hostname -lightdm_greeter_get_default_language -lightdm_greeter_get_languages -lightdm_greeter_get_layouts -lightdm_greeter_get_layout -lightdm_greeter_set_layout -lightdm_greeter_get_sessions lightdm_greeter_get_default_session_hint lightdm_greeter_get_hint lightdm_greeter_get_has_guest_account_hint @@ -127,10 +138,9 @@ lightdm_greeter_get_select_guest_hint lightdm_greeter_get_autologin_user_hint lightdm_greeter_get_autologin_guest_hint lightdm_greeter_get_autologin_timeout_hint -lightdm_greeter_cancel_timed_login -lightdm_greeter_login -lightdm_greeter_login_with_user_prompt -lightdm_greeter_login_as_guest +lightdm_greeter_cancel_autologin +lightdm_greeter_authenticate +lightdm_greeter_authenticate_as_guest lightdm_greeter_respond lightdm_greeter_cancel_authentication lightdm_greeter_get_in_authentication @@ -138,14 +148,6 @@ lightdm_greeter_get_is_authenticated lightdm_greeter_get_authentication_user lightdm_greeter_start_session lightdm_greeter_start_default_session -lightdm_greeter_get_can_suspend -lightdm_greeter_suspend -lightdm_greeter_get_can_hibernate -lightdm_greeter_hibernate -lightdm_greeter_get_can_restart -lightdm_greeter_restart -lightdm_greeter_get_can_shutdown -lightdm_greeter_shutdown <SUBSECTION Standard> LIGHTDM_GREETER LIGHTDM_IS_GREETER diff --git a/doc/tmpl/greeter.sgml b/doc/tmpl/greeter.sgml index fc6c4803..c3e2761e 100644 --- a/doc/tmpl/greeter.sgml +++ b/doc/tmpl/greeter.sgml @@ -1,8 +1,8 @@ <!-- ##### SECTION Title ##### --> -LightDMGreeter +Greeter Interface <!-- ##### SECTION Short_Description ##### --> -Manages connection to LightDM server and provides greeter functionality +Make a connection to the LightDM daemon and authenticate users <!-- ##### SECTION Long_Description ##### --> <para> @@ -31,7 +31,7 @@ int main () static void connected_cb (LightDMGreeter *greeter) { // Start authentication - lightdm_greeter_login_with_user_prompt (greeter); + lightdm_greeter_authenticate (greeter, NULL); } static void show_prompt_cb (LightDMGreeter *greeter, const char *text, LightDMPromptType type) @@ -177,69 +177,6 @@ static void quit_cb (LightDMGreeter *greeter) @Returns: -<!-- ##### FUNCTION lightdm_greeter_get_hostname ##### --> -<para> - -</para> - -@greeter: -@Returns: - - -<!-- ##### FUNCTION lightdm_greeter_get_default_language ##### --> -<para> - -</para> - -@greeter: -@Returns: - - -<!-- ##### FUNCTION lightdm_greeter_get_languages ##### --> -<para> - -</para> - -@greeter: -@Returns: - - -<!-- ##### FUNCTION lightdm_greeter_get_layouts ##### --> -<para> - -</para> - -@greeter: -@Returns: - - -<!-- ##### FUNCTION lightdm_greeter_get_layout ##### --> -<para> - -</para> - -@greeter: -@Returns: - - -<!-- ##### FUNCTION lightdm_greeter_set_layout ##### --> -<para> - -</para> - -@greeter: -@layout: - - -<!-- ##### FUNCTION lightdm_greeter_get_sessions ##### --> -<para> - -</para> - -@greeter: -@Returns: - - <!-- ##### FUNCTION lightdm_greeter_get_default_session_hint ##### --> <para> @@ -322,7 +259,7 @@ static void quit_cb (LightDMGreeter *greeter) @Returns: -<!-- ##### FUNCTION lightdm_greeter_cancel_timed_login ##### --> +<!-- ##### FUNCTION lightdm_greeter_cancel_autologin ##### --> <para> </para> @@ -330,7 +267,7 @@ static void quit_cb (LightDMGreeter *greeter) @greeter: -<!-- ##### FUNCTION lightdm_greeter_login ##### --> +<!-- ##### FUNCTION lightdm_greeter_authenticate ##### --> <para> </para> @@ -339,15 +276,7 @@ static void quit_cb (LightDMGreeter *greeter) @username: -<!-- ##### FUNCTION lightdm_greeter_login_with_user_prompt ##### --> -<para> - -</para> - -@greeter: - - -<!-- ##### FUNCTION lightdm_greeter_login_as_guest ##### --> +<!-- ##### FUNCTION lightdm_greeter_authenticate_as_guest ##### --> <para> </para> @@ -416,71 +345,3 @@ static void quit_cb (LightDMGreeter *greeter) @greeter: -<!-- ##### FUNCTION lightdm_greeter_get_can_suspend ##### --> -<para> - -</para> - -@greeter: -@Returns: - - -<!-- ##### FUNCTION lightdm_greeter_suspend ##### --> -<para> - -</para> - -@greeter: - - -<!-- ##### FUNCTION lightdm_greeter_get_can_hibernate ##### --> -<para> - -</para> - -@greeter: -@Returns: - - -<!-- ##### FUNCTION lightdm_greeter_hibernate ##### --> -<para> - -</para> - -@greeter: - - -<!-- ##### FUNCTION lightdm_greeter_get_can_restart ##### --> -<para> - -</para> - -@greeter: -@Returns: - - -<!-- ##### FUNCTION lightdm_greeter_restart ##### --> -<para> - -</para> - -@greeter: - - -<!-- ##### FUNCTION lightdm_greeter_get_can_shutdown ##### --> -<para> - -</para> - -@greeter: -@Returns: - - -<!-- ##### FUNCTION lightdm_greeter_shutdown ##### --> -<para> - -</para> - -@greeter: - - diff --git a/doc/tmpl/language.sgml b/doc/tmpl/language.sgml index c78ffc5d..e8f7269b 100644 --- a/doc/tmpl/language.sgml +++ b/doc/tmpl/language.sgml @@ -1,8 +1,8 @@ <!-- ##### SECTION Title ##### --> -LightDMLanguage +Languages <!-- ##### SECTION Short_Description ##### --> -Information about an available language +Get information on available languges <!-- ##### SECTION Long_Description ##### --> <para> @@ -20,6 +20,24 @@ Information about an available language <!-- ##### SECTION Image ##### --> +<!-- ##### FUNCTION lightdm_get_languages ##### --> +<para> + +</para> + +@void: +@Returns: + + +<!-- ##### FUNCTION lightdm_get_language ##### --> +<para> + +</para> + +@void: +@Returns: + + <!-- ##### FUNCTION lightdm_language_get_code ##### --> <para> diff --git a/doc/tmpl/layout.sgml b/doc/tmpl/layout.sgml index 5dc905c6..91db412b 100644 --- a/doc/tmpl/layout.sgml +++ b/doc/tmpl/layout.sgml @@ -1,8 +1,8 @@ <!-- ##### SECTION Title ##### --> -LightDMLayout +Keyboard Layouts <!-- ##### SECTION Short_Description ##### --> -Information about an available keyboard layout +Control the keyboard layout <!-- ##### SECTION Long_Description ##### --> <para> @@ -20,6 +20,32 @@ Information about an available keyboard layout <!-- ##### SECTION Image ##### --> +<!-- ##### FUNCTION lightdm_get_layouts ##### --> +<para> + +</para> + +@void: +@Returns: + + +<!-- ##### FUNCTION lightdm_get_layout ##### --> +<para> + +</para> + +@void: +@Returns: + + +<!-- ##### FUNCTION lightdm_set_layout ##### --> +<para> + +</para> + +@layout: + + <!-- ##### FUNCTION lightdm_layout_get_name ##### --> <para> diff --git a/doc/tmpl/power.sgml b/doc/tmpl/power.sgml new file mode 100644 index 00000000..2d1f5ff5 --- /dev/null +++ b/doc/tmpl/power.sgml @@ -0,0 +1,90 @@ +<!-- ##### SECTION Title ##### --> +Power Management + +<!-- ##### SECTION Short_Description ##### --> +Shutdown, restart, sleep the system + +<!-- ##### SECTION Long_Description ##### --> +<para> + +</para> + +<!-- ##### SECTION See_Also ##### --> +<para> + +</para> + +<!-- ##### SECTION Stability_Level ##### --> + + +<!-- ##### SECTION Image ##### --> + + +<!-- ##### FUNCTION lightdm_get_can_suspend ##### --> +<para> + +</para> + +@void: +@Returns: + + +<!-- ##### FUNCTION lightdm_suspend ##### --> +<para> + +</para> + +@void: + + +<!-- ##### FUNCTION lightdm_get_can_hibernate ##### --> +<para> + +</para> + +@void: +@Returns: + + +<!-- ##### FUNCTION lightdm_hibernate ##### --> +<para> + +</para> + +@void: + + +<!-- ##### FUNCTION lightdm_get_can_restart ##### --> +<para> + +</para> + +@void: +@Returns: + + +<!-- ##### FUNCTION lightdm_restart ##### --> +<para> + +</para> + +@void: + + +<!-- ##### FUNCTION lightdm_get_can_shutdown ##### --> +<para> + +</para> + +@void: +@Returns: + + +<!-- ##### FUNCTION lightdm_shutdown ##### --> +<para> + +</para> + +@void: + + diff --git a/doc/tmpl/session.sgml b/doc/tmpl/session.sgml index 7fe247c7..96f850ba 100644 --- a/doc/tmpl/session.sgml +++ b/doc/tmpl/session.sgml @@ -1,8 +1,8 @@ <!-- ##### SECTION Title ##### --> -LightDMSession +User Sessions <!-- ##### SECTION Short_Description ##### --> -Information about an available session +Choose the session to use <!-- ##### SECTION Long_Description ##### --> <para> @@ -20,6 +20,15 @@ Object containing information about a session type. #LightDMSession objects are <!-- ##### SECTION Image ##### --> +<!-- ##### FUNCTION lightdm_get_sessions ##### --> +<para> + +</para> + +@void: +@Returns: + + <!-- ##### FUNCTION lightdm_session_get_key ##### --> <para> diff --git a/doc/tmpl/system.sgml b/doc/tmpl/system.sgml new file mode 100644 index 00000000..c8cdb54c --- /dev/null +++ b/doc/tmpl/system.sgml @@ -0,0 +1,31 @@ +<!-- ##### SECTION Title ##### --> +System Information + +<!-- ##### SECTION Short_Description ##### --> +Get system infomation + +<!-- ##### SECTION Long_Description ##### --> +<para> + +</para> + +<!-- ##### SECTION See_Also ##### --> +<para> + +</para> + +<!-- ##### SECTION Stability_Level ##### --> + + +<!-- ##### SECTION Image ##### --> + + +<!-- ##### FUNCTION lightdm_get_hostname ##### --> +<para> + +</para> + +@void: +@Returns: + + diff --git a/doc/tmpl/user.sgml b/doc/tmpl/user.sgml index c5aa4750..515d2ba2 100644 --- a/doc/tmpl/user.sgml +++ b/doc/tmpl/user.sgml @@ -1,8 +1,8 @@ <!-- ##### SECTION Title ##### --> -LightDMUser +User Accounts <!-- ##### SECTION Short_Description ##### --> -Information about a user account +Get information on user accounts on this system <!-- ##### SECTION Long_Description ##### --> <para> @@ -44,7 +44,7 @@ A user has the following properties: @user: -<!-- ##### FUNCTION lightdm_user_get_name ##### --> +<!-- ##### FUNCTION lightdm_user_get_display_name ##### --> <para> </para> @@ -53,7 +53,7 @@ A user has the following properties: @Returns: -<!-- ##### FUNCTION lightdm_user_get_real_name ##### --> +<!-- ##### FUNCTION lightdm_user_get_home_directory ##### --> <para> </para> @@ -62,7 +62,7 @@ A user has the following properties: @Returns: -<!-- ##### FUNCTION lightdm_user_get_display_name ##### --> +<!-- ##### FUNCTION lightdm_user_get_image ##### --> <para> </para> @@ -71,7 +71,7 @@ A user has the following properties: @Returns: -<!-- ##### FUNCTION lightdm_user_get_home_directory ##### --> +<!-- ##### FUNCTION lightdm_user_get_language ##### --> <para> </para> @@ -80,7 +80,7 @@ A user has the following properties: @Returns: -<!-- ##### FUNCTION lightdm_user_get_image ##### --> +<!-- ##### FUNCTION lightdm_user_get_layout ##### --> <para> </para> @@ -89,7 +89,7 @@ A user has the following properties: @Returns: -<!-- ##### FUNCTION lightdm_user_get_language ##### --> +<!-- ##### FUNCTION lightdm_user_get_logged_in ##### --> <para> </para> @@ -98,7 +98,16 @@ A user has the following properties: @Returns: -<!-- ##### FUNCTION lightdm_user_get_layout ##### --> +<!-- ##### FUNCTION lightdm_user_get_name ##### --> +<para> + +</para> + +@user: +@Returns: + + +<!-- ##### FUNCTION lightdm_user_get_real_name ##### --> <para> </para> @@ -116,12 +125,67 @@ A user has the following properties: @Returns: -<!-- ##### FUNCTION lightdm_user_get_logged_in ##### --> +<!-- ##### USER_FUNCTION user_added ##### --> +<para> + +</para> + +@user_list: +@user: + + +<!-- ##### USER_FUNCTION user_changed ##### --> <para> </para> +@user_list: @user: + + +<!-- ##### USER_FUNCTION user_removed ##### --> +<para> + +</para> + +@user_list: +@user: + + +<!-- ##### FUNCTION lightdm_user_list_get_instance ##### --> +<para> + +</para> + +@void: +@Returns: + + +<!-- ##### FUNCTION lightdm_user_list_get_length ##### --> +<para> + +</para> + +@user_list: +@Returns: + + +<!-- ##### FUNCTION lightdm_user_list_get_user_by_name ##### --> +<para> + +</para> + +@user_list: +@username: +@Returns: + + +<!-- ##### FUNCTION lightdm_user_list_get_users ##### --> +<para> + +</para> + +@user_list: @Returns: diff --git a/greeters/gtk/lightdm-gtk-greeter.c b/greeters/gtk/lightdm-gtk-greeter.c index bab73f67..c89d85c0 100644 --- a/greeters/gtk/lightdm-gtk-greeter.c +++ b/greeters/gtk/lightdm-gtk-greeter.c @@ -16,10 +16,9 @@ #include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h> -#include "lightdm/greeter.h" +#include "lightdm.h" static LightDMGreeter *greeter; -static LightDMUserList *user_list; static GtkWidget *window, *message_label, *user_view; static GdkPixbuf *background_pixbuf = NULL; static GtkWidget *prompt_box, *prompt_label, *prompt_entry, *session_combo; @@ -71,22 +70,22 @@ start_authentication (const gchar *username) if (strcmp (username, "*other") == 0) { - lightdm_greeter_login_with_user_prompt (greeter); + lightdm_greeter_authenticate (greeter, NULL); } else if (strcmp (username, "*guest") == 0) { - lightdm_greeter_login_as_guest (greeter); + lightdm_greeter_authenticate_as_guest (greeter); } else { LightDMUser *user; - user = lightdm_user_list_get_user_by_name (user_list, username); + user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username); if (user) set_session (lightdm_user_get_session (user)); else set_session (lightdm_greeter_get_default_session_hint (greeter)); - lightdm_greeter_login (greeter, username); + lightdm_greeter_authenticate (greeter, username); } } @@ -192,7 +191,7 @@ authentication_complete_cb (LightDMGreeter *greeter) gtk_label_set_text (GTK_LABEL (message_label), "Failed to authenticate"); gtk_widget_show (message_label); if (lightdm_greeter_get_hide_users_hint (greeter)) - lightdm_greeter_login_with_user_prompt (greeter); + lightdm_greeter_authenticate (greeter, NULL); } } @@ -201,9 +200,9 @@ autologin_timer_expired_cb (LightDMGreeter *greeter) { set_session (lightdm_greeter_get_default_session_hint (greeter)); if (lightdm_greeter_get_autologin_guest_hint (greeter)) - lightdm_greeter_login_as_guest (greeter); + lightdm_greeter_authenticate_as_guest (greeter); else if (lightdm_greeter_get_autologin_user_hint (greeter)) - lightdm_greeter_login (greeter, lightdm_greeter_get_autologin_user_hint (greeter)); + lightdm_greeter_authenticate (greeter, lightdm_greeter_get_autologin_user_hint (greeter)); } void suspend_cb (GtkWidget *widget, LightDMGreeter *greeter); @@ -211,7 +210,7 @@ G_MODULE_EXPORT void suspend_cb (GtkWidget *widget, LightDMGreeter *greeter) { - lightdm_greeter_suspend (greeter); + lightdm_suspend (); } void hibernate_cb (GtkWidget *widget, LightDMGreeter *greeter); @@ -219,7 +218,7 @@ G_MODULE_EXPORT void hibernate_cb (GtkWidget *widget, LightDMGreeter *greeter) { - lightdm_greeter_hibernate (greeter); + lightdm_hibernate (); } static void @@ -258,7 +257,7 @@ restart_cb (GtkWidget *widget, LightDMGreeter *greeter) center_window (GTK_WINDOW (dialog)); if (gtk_dialog_run (GTK_DIALOG (dialog))) - lightdm_greeter_restart (greeter); + lightdm_restart (); gtk_widget_destroy (dialog); } @@ -280,7 +279,7 @@ shutdown_cb (GtkWidget *widget, LightDMGreeter *greeter) center_window (GTK_WINDOW (dialog)); if (gtk_dialog_run (GTK_DIALOG (dialog))) - lightdm_greeter_shutdown (greeter); + lightdm_shutdown (); gtk_widget_destroy (dialog); } @@ -435,12 +434,11 @@ load_user_list () GtkTreeModel *model; GtkTreeIter iter; - user_list = lightdm_user_list_new (); - g_signal_connect (user_list, "user-added", G_CALLBACK (user_added_cb), NULL); - g_signal_connect (user_list, "user-changed", G_CALLBACK (user_changed_cb), NULL); - g_signal_connect (user_list, "user-removed", G_CALLBACK (user_removed_cb), NULL); + g_signal_connect (lightdm_user_list_get_instance (), "user-added", G_CALLBACK (user_added_cb), NULL); + g_signal_connect (lightdm_user_list_get_instance (), "user-changed", G_CALLBACK (user_changed_cb), NULL); + g_signal_connect (lightdm_user_list_get_instance (), "user-removed", G_CALLBACK (user_removed_cb), NULL); - items = lightdm_user_list_get_users (user_list); + items = lightdm_user_list_get_users (lightdm_user_list_get_instance ()); model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_view)); for (item = items; item; item = item->next) @@ -533,7 +531,7 @@ connected_cb (LightDMGreeter *greeter) message_label = GTK_WIDGET (gtk_builder_get_object (builder, "message_label")); session_combo = GTK_WIDGET (gtk_builder_get_object (builder, "session_combobox")); - gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_greeter_get_hostname (greeter)); + gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ()); background_image = NULL; // FIXME if (background_image) @@ -568,13 +566,13 @@ connected_cb (LightDMGreeter *greeter) gdk_window_set_back_pixmap (root, pixmap, FALSE); } - if (!lightdm_greeter_get_can_suspend (greeter)) + if (!lightdm_get_can_suspend ()) gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "suspend_menuitem"))); - if (!lightdm_greeter_get_can_hibernate (greeter)) + if (!lightdm_get_can_hibernate ()) gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "hibernate_menuitem"))); - if (!lightdm_greeter_get_can_restart (greeter)) + if (!lightdm_get_can_restart ()) gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "restart_menuitem"))); - if (!lightdm_greeter_get_can_shutdown (greeter)) + if (!lightdm_get_can_shutdown ()) gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "shutdown_menuitem"))); user_view = GTK_WIDGET (gtk_builder_get_object (builder, "user_treeview")); @@ -582,20 +580,20 @@ connected_cb (LightDMGreeter *greeter) gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (user_view), 1, "Name", gtk_cell_renderer_text_new(), "text", 1, NULL); if (lightdm_greeter_get_hide_users_hint (greeter)) - lightdm_greeter_login_with_user_prompt (greeter); + lightdm_greeter_authenticate (greeter, NULL); else { load_user_list (); gtk_widget_show (user_view); } - // FIXME: Select the requested user if lightdm_greeter_get_timed_login_user () && lightdm_greeter_get_timed_login_delay () == 0 + // FIXME: Select the requested user if lightdm_greeter_get_select_user_hint () set renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (session_combo), renderer, TRUE); gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (session_combo), renderer, "text", 0); model = gtk_combo_box_get_model (GTK_COMBO_BOX (session_combo)); - items = lightdm_greeter_get_sessions (greeter); + items = lightdm_get_sessions (); for (item = items; item; item = item->next) { LightDMSession *session = item->data; diff --git a/greeters/qt/loginprompt.cpp b/greeters/qt/loginprompt.cpp index 53e4df68..5a7f6251 100644 --- a/greeters/qt/loginprompt.cpp +++ b/greeters/qt/loginprompt.cpp @@ -49,7 +49,7 @@ void LoginPrompt::onLoginButtonClicked() ui->feedbackLabel->setText(QString()); QModelIndex currentIndex = ui->userListView->currentIndex(); if (currentIndex.isValid()) { - m_greeter->login(currentIndex.data(QLightDM::UsersModel::NameRole).toString()); + m_greeter->authenticate(currentIndex.data(QLightDM::UsersModel::NameRole).toString()); } } diff --git a/liblightdm-gobject/Makefile.am b/liblightdm-gobject/Makefile.am index 11ac8785..ed25e59f 100644 --- a/liblightdm-gobject/Makefile.am +++ b/liblightdm-gobject/Makefile.am @@ -1,5 +1,3 @@ -SUBDIRS = lightdm - lib_LTLIBRARIES = liblightdm-gobject-1.la CLEANFILES = @@ -9,19 +7,28 @@ liblightdm_gobject_1_la_CFLAGS = $(LIBLIGHTDM_GOBJECT_CFLAGS) \ $(WARN_CFLAGS) \ -DXSESSIONS_DIR=\"$(datadir)/xsessions\" +mainheader_HEADERS = lightdm.h +mainheaderdir=$(includedir)/lightdm-gobject-1 + +liblightdm_gobject_1include_HEADERS = \ + lightdm/greeter.h \ + lightdm/system.h \ + lightdm/language.h \ + lightdm/layout.h \ + lightdm/power.h \ + lightdm/session.h \ + lightdm/user.h +liblightdm_gobject_1includedir=$(mainheaderdir)/lightdm + liblightdm_gobject_1_la_SOURCES= \ greeter.c \ + system.c \ language.c \ layout.c \ + power.c \ session.c \ user.c \ - user-list.c \ - lightdm/greeter.h \ - lightdm/language.h \ - lightdm/layout.h \ - lightdm/session.h \ - lightdm/user-list.h \ - lightdm/user.h + $(liblightdm_gobject_1include_HEADERS) if HAVE_INTROSPECTION diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index 42461332..fe821030 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -12,24 +12,13 @@ #include <config.h> #include <stdlib.h> -#include <errno.h> #include <string.h> -#include <locale.h> -#include <sys/utsname.h> -#include <pwd.h> -#include <gio/gdesktopappinfo.h> #include <security/pam_appl.h> -#include <libxklavier/xklavier.h> #include "lightdm/greeter.h" enum { PROP_0, - PROP_HOSTNAME, - PROP_DEFAULT_LANGUAGE, - PROP_LAYOUTS, - PROP_LAYOUT, - PROP_SESSIONS, PROP_DEFAULT_SESSION_HINT, PROP_HIDE_USERS_HINT, PROP_HAS_GUEST_ACCOUNT_HINT, @@ -41,10 +30,6 @@ enum { PROP_AUTHENTICATION_USER, PROP_IN_AUTHENTICATION, PROP_IS_AUTHENTICATED, - PROP_CAN_SUSPEND, - PROP_CAN_HIBERNATE, - PROP_CAN_RESTART, - PROP_CAN_SHUTDOWN }; enum { @@ -61,39 +46,18 @@ static guint signals[LAST_SIGNAL] = { 0 }; typedef struct { - GDBusConnection *system_bus; - GIOChannel *to_server_channel, *from_server_channel; guint8 *read_buffer; gsize n_read; - Display *display; - - gchar *hostname; - - LightDMUserList *user_list; - - gboolean have_languages; - GList *languages; - - XklEngine *xkl_engine; - XklConfigRec *xkl_config; - gboolean have_layouts; - GList *layouts; - gchar *layout; - - gboolean have_sessions; - GList *sessions; + GHashTable *hints; + guint autologin_timeout; gchar *authentication_user; gboolean in_authentication; gboolean is_authenticated; guint32 authenticate_sequence_number; gboolean cancelling_authentication; - - GHashTable *hints; - - guint login_timeout; } LightDMGreeterPrivate; G_DEFINE_TYPE (LightDMGreeter, lightdm_greeter, G_TYPE_OBJECT); @@ -107,8 +71,8 @@ G_DEFINE_TYPE (LightDMGreeter, lightdm_greeter, G_TYPE_OBJECT); typedef enum { GREETER_MESSAGE_CONNECT = 0, - GREETER_MESSAGE_LOGIN, - GREETER_MESSAGE_LOGIN_AS_GUEST, + GREETER_MESSAGE_AUTHENTICATE, + GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, GREETER_MESSAGE_CONTINUE_AUTHENTICATION, GREETER_MESSAGE_START_SESSION, GREETER_MESSAGE_CANCEL_AUTHENTICATION @@ -143,7 +107,7 @@ timed_login_cb (gpointer data) LightDMGreeter *greeter = data; LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - priv->login_timeout = 0; + priv->autologin_timeout = 0; g_signal_emit (G_OBJECT (greeter), signals[AUTOLOGIN_TIMER_EXPIRED], 0); return FALSE; @@ -282,7 +246,7 @@ handle_connected (LightDMGreeter *greeter, guint32 length, gsize *offset) if (timeout) { g_debug ("Setting autologin timer for %d seconds", timeout); - priv->login_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter); + priv->autologin_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter); } g_signal_emit (G_OBJECT (greeter), signals[CONNECTED], 0); } @@ -481,7 +445,6 @@ gboolean lightdm_greeter_connect_to_server (LightDMGreeter *greeter) { LightDMGreeterPrivate *priv; - GError *error = NULL; const gchar *fd; guint8 message[MAX_MESSAGE_LENGTH]; gsize offset = 0; @@ -490,12 +453,7 @@ lightdm_greeter_connect_to_server (LightDMGreeter *greeter) priv = GET_PRIVATE (greeter); - priv->system_bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); - if (!priv->system_bus) - g_warning ("Failed to connect to system bus: %s", error->message); - g_clear_error (&error); - - fd = getenv ("LIGHTDM_TO_SERVER_FD"); + fd = g_getenv ("LIGHTDM_TO_SERVER_FD"); if (!fd) { g_warning ("No LIGHTDM_TO_SERVER_FD environment variable"); @@ -504,7 +462,7 @@ lightdm_greeter_connect_to_server (LightDMGreeter *greeter) priv->to_server_channel = g_io_channel_unix_new (atoi (fd)); g_io_channel_set_encoding (priv->to_server_channel, NULL, NULL); - fd = getenv ("LIGHTDM_FROM_SERVER_FD"); + fd = g_getenv ("LIGHTDM_FROM_SERVER_FD"); if (!fd) { g_warning ("No LIGHTDM_FROM_SERVER_FD environment variable"); @@ -523,324 +481,6 @@ lightdm_greeter_connect_to_server (LightDMGreeter *greeter) } /** - * lightdm_greeter_get_hostname: - * @greeter: a #LightDMGreeter - * - * Return value: The host this greeter is displaying - **/ -const gchar * -lightdm_greeter_get_hostname (LightDMGreeter *greeter) -{ - LightDMGreeterPrivate *priv; - - g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL); - - priv = GET_PRIVATE (greeter); - - if (!priv->hostname) - { - struct utsname info; - uname (&info); - priv->hostname = g_strdup (info.nodename); - } - - return priv->hostname; -} - -static void -update_languages (LightDMGreeter *greeter) -{ - LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - gchar *stdout_text = NULL, *stderr_text = NULL; - gint exit_status; - gboolean result; - GError *error = NULL; - - if (priv->have_languages) - return; - - result = g_spawn_command_line_sync ("locale -a", &stdout_text, &stderr_text, &exit_status, &error); - if (!result || exit_status != 0) - g_warning ("Failed to get languages, locale -a returned %d: %s", exit_status, error->message); - else - { - gchar **tokens; - int i; - - tokens = g_strsplit_set (stdout_text, "\n\r", -1); - for (i = 0; tokens[i]; i++) - { - LightDMLanguage *language; - gchar *code; - - code = g_strchug (tokens[i]); - if (code[0] == '\0') - continue; - - /* Ignore the non-interesting languages */ - if (strcmp (code, "C") == 0 || strcmp (code, "POSIX") == 0) - continue; - - language = g_object_new (LIGHTDM_TYPE_LANGUAGE, "code", code, NULL); - priv->languages = g_list_append (priv->languages, language); - } - - g_strfreev (tokens); - } - - g_clear_error (&error); - g_free (stdout_text); - g_free (stderr_text); - - priv->have_languages = TRUE; -} - -/** - * lightdm_greeter_get_default_language: - * @greeter: A #LightDMGreeter - * - * Get the default language. - * - * Return value: The default language. - **/ -const gchar * -lightdm_greeter_get_default_language (LightDMGreeter *greeter) -{ - gchar *lang; - g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL); - lang = getenv ("LANG"); - if (lang) - return lang; - else - return "C"; -} - -/** - * lightdm_greeter_get_languages: - * @greeter: A #LightDMGreeter - * - * Get a list of languages to present to the user. - * - * Return value: (element-type LightDMLanguage) (transfer none): A list of #LightDMLanguage that should be presented to the user. - **/ -GList * -lightdm_greeter_get_languages (LightDMGreeter *greeter) -{ - g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL); - update_languages (greeter); - return GET_PRIVATE (greeter)->languages; -} - -static void -layout_cb (XklConfigRegistry *config, - const XklConfigItem *item, - gpointer data) -{ - LightDMGreeter *greeter = data; - LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - LightDMLayout *layout; - - layout = g_object_new (LIGHTDM_TYPE_LAYOUT, "name", item->name, "short-description", item->short_description, "description", item->description, NULL); - priv->layouts = g_list_append (priv->layouts, layout); -} - -static void -setup_display (LightDMGreeter *greeter) -{ - LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - if (!priv->display) - priv->display = XOpenDisplay (NULL); -} - -static void -setup_xkl (LightDMGreeter *greeter) -{ - LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - - setup_display (greeter); - - priv->xkl_engine = xkl_engine_get_instance (priv->display); - priv->xkl_config = xkl_config_rec_new (); - if (!xkl_config_rec_get_from_server (priv->xkl_config, priv->xkl_engine)) - g_warning ("Failed to get Xkl configuration from server"); - priv->layout = g_strdup (priv->xkl_config->layouts[0]); -} - -/** - * lightdm_greeter_get_layouts: - * @greeter: A #LightDMGreeter - * - * Get a list of keyboard layouts to present to the user. - * - * Return value: (element-type LightDMLayout) (transfer none): A list of #LightDMLayout that should be presented to the user. - **/ -GList * -lightdm_greeter_get_layouts (LightDMGreeter *greeter) -{ - LightDMGreeterPrivate *priv; - XklConfigRegistry *registry; - - g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL); - - priv = GET_PRIVATE (greeter); - - if (priv->have_layouts) - return priv->layouts; - - setup_xkl (greeter); - - registry = xkl_config_registry_get_instance (priv->xkl_engine); - xkl_config_registry_load (registry, FALSE); - xkl_config_registry_foreach_layout (registry, layout_cb, greeter); - g_object_unref (registry); - priv->have_layouts = TRUE; - - return priv->layouts; -} - -/** - * lightdm_greeter_set_layout: - * @greeter: A #LightDMGreeter - * @layout: The layout to use - * - * Set the layout for this session. - **/ -void -lightdm_greeter_set_layout (LightDMGreeter *greeter, const gchar *layout) -{ - LightDMGreeterPrivate *priv; - XklConfigRec *config; - - g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); - g_return_if_fail (layout != NULL); - - priv = GET_PRIVATE (greeter); - - g_debug ("Setting keyboard layout to %s", layout); - - setup_xkl (greeter); - - config = xkl_config_rec_new (); - config->layouts = g_malloc (sizeof (gchar *) * 2); - config->model = g_strdup (priv->xkl_config->model); - config->layouts[0] = g_strdup (layout); - config->layouts[1] = NULL; - if (!xkl_config_rec_activate (config, priv->xkl_engine)) - g_warning ("Failed to activate XKL config"); - else - priv->layout = g_strdup (layout); - g_object_unref (config); -} - -/** - * lightdm_greeter_get_layout: - * @greeter: A #LightDMGreeter - * - * Get the current keyboard layout. - * - * Return value: The currently active layout for this user. - **/ -const gchar * -lightdm_greeter_get_layout (LightDMGreeter *greeter) -{ - g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL); - setup_xkl (greeter); - return GET_PRIVATE (greeter)->layout; -} - -static void -update_sessions (LightDMGreeter *greeter) -{ - LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - GDir *directory; - GError *error = NULL; - - if (priv->have_sessions) - return; - - directory = g_dir_open (XSESSIONS_DIR, 0, &error); - if (!directory) - g_warning ("Failed to open sessions directory: %s", error->message); - g_clear_error (&error); - if (!directory) - return; - - while (TRUE) - { - const gchar *filename; - GKeyFile *key_file; - gchar *key, *path; - gboolean result; - - filename = g_dir_read_name (directory); - if (filename == NULL) - break; - - if (!g_str_has_suffix (filename, ".desktop")) - continue; - - key = g_strndup (filename, strlen (filename) - strlen (".desktop")); - path = g_build_filename (XSESSIONS_DIR, filename, NULL); - g_debug ("Loading session %s", path); - - key_file = g_key_file_new (); - result = g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error); - if (!result) - g_warning ("Failed to load session file %s: %s:", path, error->message); - g_clear_error (&error); - - if (result && !g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, NULL)) - { - gchar *domain, *name, *comment; - -#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 - domain = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-GNOME-Gettext-Domain", NULL); -#endif - name = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, domain, NULL); - comment = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, domain, NULL); - if (!comment) - comment = g_strdup (""); - if (name) - { - g_debug ("Loaded session %s (%s, %s)", key, name, comment); - priv->sessions = g_list_append (priv->sessions, g_object_new (LIGHTDM_TYPE_SESSION, "key", key, "name", name, "comment", comment, NULL)); - } - else - g_warning ("Invalid session %s: %s", path, error->message); - g_free (domain); - g_free (name); - g_free (comment); - } - - g_free (key); - g_free (path); - g_key_file_free (key_file); - } - - g_dir_close (directory); - - priv->have_sessions = TRUE; -} - -/** - * lightdm_greeter_get_sessions: - * @greeter: A #LightDMGreeter - * - * Get the available sessions. - * - * Return value: (element-type LightDMSession) (transfer none): A list of #LightDMSession - **/ -GList * -lightdm_greeter_get_sessions (LightDMGreeter *greeter) -{ - g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL); - update_sessions (greeter); - return GET_PRIVATE (greeter)->sessions; -} - -/** * lightdm_greeter_get_hint: * @greeter: A #LightDMGreeter * @name: The hint name to query. @@ -1002,13 +642,13 @@ lightdm_greeter_get_autologin_timeout_hint (LightDMGreeter *greeter) } /** - * lightdm_greeter_cancel_timed_login: + * lightdm_greeter_cancel_autologin: * @greeter: A #LightDMGreeter * - * Cancel the login as the default user. + * Cancel the automatic login. */ void -lightdm_greeter_cancel_timed_login (LightDMGreeter *greeter) +lightdm_greeter_cancel_autologin (LightDMGreeter *greeter) { LightDMGreeterPrivate *priv; @@ -1016,20 +656,20 @@ lightdm_greeter_cancel_timed_login (LightDMGreeter *greeter) priv = GET_PRIVATE (greeter); - if (priv->login_timeout) - g_source_remove (priv->login_timeout); - priv->login_timeout = 0; + if (priv->autologin_timeout) + g_source_remove (priv->autologin_timeout); + priv->autologin_timeout = 0; } /** - * lightdm_greeter_login: + * lightdm_greeter_authenticate: * @greeter: A #LightDMGreeter * @username: (allow-none): A username or #NULL to prompt for a username. * * Starts the authentication procedure for a user. **/ void -lightdm_greeter_login (LightDMGreeter *greeter, const char *username) +lightdm_greeter_authenticate (LightDMGreeter *greeter, const char *username) { LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); guint8 message[MAX_MESSAGE_LENGTH]; @@ -1048,32 +688,20 @@ lightdm_greeter_login (LightDMGreeter *greeter, const char *username) priv->authentication_user = g_strdup (username); g_debug ("Starting authentication for user %s...", username); - write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_LOGIN, int_length () + string_length (username), &offset); + write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE, int_length () + string_length (username), &offset); write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset); write_string (message, MAX_MESSAGE_LENGTH, username, &offset); write_message (greeter, message, offset); } /** - * lightdm_greeter_login_with_user_prompt: - * @greeter: A #LightDMGreeter - * - * Starts the authentication procedure, prompting the greeter for a username. - **/ -void -lightdm_greeter_login_with_user_prompt (LightDMGreeter *greeter) -{ - lightdm_greeter_login (greeter, NULL); -} - -/** - * lightdm_greeter_login_as_guest: + * lightdm_greeter_authenticate_as_guest: * @greeter: A #LightDMGreeter * * Starts the authentication procedure for the guest user. **/ void -lightdm_greeter_login_as_guest (LightDMGreeter *greeter) +lightdm_greeter_authenticate_as_guest (LightDMGreeter *greeter) { LightDMGreeterPrivate *priv; guint8 message[MAX_MESSAGE_LENGTH]; @@ -1091,7 +719,7 @@ lightdm_greeter_login_as_guest (LightDMGreeter *greeter) priv->authentication_user = NULL; g_debug ("Starting authentication for guest account..."); - write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_LOGIN_AS_GUEST, int_length (), &offset); + write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, int_length (), &offset); write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset); write_message (greeter, message, offset); } @@ -1212,10 +840,10 @@ lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *session) } /** - * lightdm_greeter_start_session_with_defaults: + * lightdm_greeter_start_default_session: * @greeter: A #LightDMGreeter * - * Login a user to a session using default settings for that user. + * Start the default session for the authenticated user. **/ void lightdm_greeter_start_default_session (LightDMGreeter *greeter) @@ -1223,200 +851,6 @@ lightdm_greeter_start_default_session (LightDMGreeter *greeter) lightdm_greeter_start_session (greeter, NULL); } -static gboolean -upower_call_function (LightDMGreeter *greeter, const gchar *function, gboolean has_result) -{ - LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - GDBusProxy *proxy; - GVariant *result; - GError *error = NULL; - gboolean function_result = FALSE; - - if (!priv->system_bus) - return FALSE; - - proxy = g_dbus_proxy_new_sync (priv->system_bus, - G_DBUS_PROXY_FLAGS_NONE, - NULL, - "org.freedesktop.UPower", - "/org/freedesktop/UPower", - "org.freedesktop.UPower", - NULL, NULL); - result = g_dbus_proxy_call_sync (proxy, - function, - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); - g_object_unref (proxy); - - if (!result) - g_warning ("Error calling UPower function %s: %s", function, error->message); - g_clear_error (&error); - if (!result) - return FALSE; - - if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)"))) - g_variant_get (result, "(b)", &function_result); - - g_variant_unref (result); - return function_result; -} - -/** - * lightdm_greeter_get_can_suspend: - * @greeter: A #LightDMGreeter - * - * Checks if the greeter is authorized to do a system suspend. - * - * Return value: #TRUE if the greeter can suspend the system - **/ -gboolean -lightdm_greeter_get_can_suspend (LightDMGreeter *greeter) -{ - g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); - return upower_call_function (greeter, "SuspendAllowed", TRUE); -} - -/** - * lightdm_greeter_suspend: - * @greeter: A #LightDMGreeter - * - * Triggers a system suspend. - **/ -void -lightdm_greeter_suspend (LightDMGreeter *greeter) -{ - g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); - upower_call_function (greeter, "Suspend", FALSE); -} - -/** - * lightdm_greeter_get_can_hibernate: - * @greeter: A #LightDMGreeter - * - * Checks if the greeter is authorized to do a system hibernate. - * - * Return value: #TRUE if the greeter can hibernate the system - **/ -gboolean -lightdm_greeter_get_can_hibernate (LightDMGreeter *greeter) -{ - g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); - return upower_call_function (greeter, "HibernateAllowed", TRUE); -} - -/** - * lightdm_greeter_hibernate: - * @greeter: A #LightDMGreeter - * - * Triggers a system hibernate. - **/ -void -lightdm_greeter_hibernate (LightDMGreeter *greeter) -{ - g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); - upower_call_function (greeter, "Hibernate", FALSE); -} - -static gboolean -ck_call_function (LightDMGreeter *greeter, const gchar *function, gboolean has_result) -{ - LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - GDBusProxy *proxy; - GVariant *result; - GError *error = NULL; - gboolean function_result = FALSE; - - if (!priv->system_bus) - return FALSE; - - proxy = g_dbus_proxy_new_sync (priv->system_bus, - G_DBUS_PROXY_FLAGS_NONE, - NULL, - "org.freedesktop.ConsoleKit", - "/org/freedesktop/ConsoleKit/Manager", - "org.freedesktop.ConsoleKit.Manager", - NULL, NULL); - result = g_dbus_proxy_call_sync (proxy, - function, - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - &error); - g_object_unref (proxy); - - if (!result) - g_warning ("Error calling ConsoleKit function %s: %s", function, error->message); - g_clear_error (&error); - if (!result) - return FALSE; - - if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)"))) - g_variant_get (result, "(b)", &function_result); - - g_variant_unref (result); - return function_result; -} - -/** - * lightdm_greeter_get_can_restart: - * @greeter: A #LightDMGreeter - * - * Checks if the greeter is authorized to do a system restart. - * - * Return value: #TRUE if the greeter can restart the system - **/ -gboolean -lightdm_greeter_get_can_restart (LightDMGreeter *greeter) -{ - g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); - return ck_call_function (greeter, "CanRestart", TRUE); -} - -/** - * lightdm_greeter_restart: - * @greeter: A #LightDMGreeter - * - * Triggers a system restart. - **/ -void -lightdm_greeter_restart (LightDMGreeter *greeter) -{ - g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); - ck_call_function (greeter, "Restart", FALSE); -} - -/** - * lightdm_greeter_get_can_shutdown: - * @greeter: A #LightDMGreeter - * - * Checks if the greeter is authorized to do a system shutdown. - * - * Return value: #TRUE if the greeter can shutdown the system - **/ -gboolean -lightdm_greeter_get_can_shutdown (LightDMGreeter *greeter) -{ - g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE); - return ck_call_function (greeter, "CanStop", TRUE); -} - -/** - * lightdm_greeter_shutdown: - * @greeter: A #LightDMGreeter - * - * Triggers a system shutdown. - **/ -void -lightdm_greeter_shutdown (LightDMGreeter *greeter) -{ - g_return_if_fail (LIGHTDM_IS_GREETER (greeter)); - ck_call_function (greeter, "Stop", FALSE); -} - static void lightdm_greeter_init (LightDMGreeter *greeter) { @@ -1432,18 +866,7 @@ lightdm_greeter_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - LightDMGreeter *self; - - self = LIGHTDM_GREETER (object); - - switch (prop_id) { - case PROP_LAYOUT: - lightdm_greeter_set_layout(self, g_value_get_string (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } static void @@ -1457,19 +880,6 @@ lightdm_greeter_get_property (GObject *object, self = LIGHTDM_GREETER (object); switch (prop_id) { - case PROP_HOSTNAME: - g_value_set_string (value, lightdm_greeter_get_hostname (self)); - break; - case PROP_DEFAULT_LANGUAGE: - g_value_set_string (value, lightdm_greeter_get_default_language (self)); - break; - case PROP_LAYOUTS: - break; - case PROP_LAYOUT: - g_value_set_string (value, lightdm_greeter_get_layout (self)); - break; - case PROP_SESSIONS: - break; case PROP_DEFAULT_SESSION_HINT: g_value_set_string (value, lightdm_greeter_get_default_session_hint (self)); break; @@ -1503,18 +913,6 @@ lightdm_greeter_get_property (GObject *object, case PROP_IS_AUTHENTICATED: g_value_set_boolean (value, lightdm_greeter_get_is_authenticated (self)); break; - case PROP_CAN_SUSPEND: - g_value_set_boolean (value, lightdm_greeter_get_can_suspend (self)); - break; - case PROP_CAN_HIBERNATE: - g_value_set_boolean (value, lightdm_greeter_get_can_hibernate (self)); - break; - case PROP_CAN_RESTART: - g_value_set_boolean (value, lightdm_greeter_get_can_restart (self)); - break; - case PROP_CAN_SHUTDOWN: - g_value_set_boolean (value, lightdm_greeter_get_can_shutdown (self)); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1563,25 +961,10 @@ lightdm_greeter_finalize (GObject *object) LightDMGreeter *self = LIGHTDM_GREETER (object); LightDMGreeterPrivate *priv = GET_PRIVATE (self); - if (priv->system_bus) - g_object_unref (priv->system_bus); if (priv->to_server_channel) g_io_channel_unref (priv->to_server_channel); if (priv->from_server_channel) g_io_channel_unref (priv->from_server_channel); - if (priv->display) - XCloseDisplay (priv->display); - g_free (priv->hostname); - if (priv->user_list) - g_object_unref (priv->user_list); - g_list_free_full (priv->languages, g_object_unref); - if (priv->xkl_engine) - g_object_unref (priv->xkl_engine); - if (priv->xkl_config) - g_object_unref (priv->xkl_config); - g_list_free_full (priv->layouts, g_object_unref); - g_free (priv->layout); - g_list_free_full (priv->sessions, g_object_unref); g_free (priv->authentication_user); g_hash_table_unref (priv->hints); @@ -1600,37 +983,6 @@ lightdm_greeter_class_init (LightDMGreeterClass *klass) object_class->finalize = lightdm_greeter_finalize; g_object_class_install_property (object_class, - PROP_HOSTNAME, - g_param_spec_string ("hostname", - "hostname", - "Hostname displaying greeter for", - NULL, - G_PARAM_READABLE)); - g_object_class_install_property (object_class, - PROP_DEFAULT_LANGUAGE, - g_param_spec_string ("default-language", - "default-language", - "Default language", - NULL, - G_PARAM_READWRITE)); - /*g_object_class_install_property (object_class, - PROP_LAYOUTS, - g_param_spec_list ("layouts", - "layouts", - "Available keyboard layouts"));*/ - g_object_class_install_property (object_class, - PROP_LAYOUT, - g_param_spec_string ("layout", - "layout", - "Current keyboard layout", - NULL, - G_PARAM_READWRITE)); - /*g_object_class_install_property (object_class, - PROP_SESSIONS, - g_param_spec_list ("sessions", - "sessions", - "Available sessions"));*/ - g_object_class_install_property (object_class, PROP_DEFAULT_SESSION_HINT, g_param_spec_string ("default-session-hint", "default-session-hint", @@ -1715,34 +1067,6 @@ lightdm_greeter_class_init (LightDMGreeterClass *klass) "TRUE if the selected user is authenticated", FALSE, G_PARAM_READABLE)); - g_object_class_install_property (object_class, - PROP_CAN_SUSPEND, - g_param_spec_boolean ("can-suspend", - "can-suspend", - "TRUE if allowed to suspend the system", - FALSE, - G_PARAM_READABLE)); - g_object_class_install_property (object_class, - PROP_CAN_HIBERNATE, - g_param_spec_boolean ("can-hibernate", - "can-hibernate", - "TRUE if allowed to hibernate the system", - FALSE, - G_PARAM_READABLE)); - g_object_class_install_property (object_class, - PROP_CAN_RESTART, - g_param_spec_boolean ("can-restart", - "can-restart", - "TRUE if allowed to restart the system", - FALSE, - G_PARAM_READABLE)); - g_object_class_install_property (object_class, - PROP_CAN_SHUTDOWN, - g_param_spec_boolean ("can-shutdown", - "can-shutdown", - "TRUE if allowed to shutdown the system", - FALSE, - G_PARAM_READABLE)); /** * LightDMGreeter::connected: diff --git a/liblightdm-gobject/language.c b/liblightdm-gobject/language.c index 68911ddb..b7f4d7d7 100644 --- a/liblightdm-gobject/language.c +++ b/liblightdm-gobject/language.c @@ -9,6 +9,7 @@ * license. */ +#include <string.h> #include <locale.h> #include <langinfo.h> @@ -32,6 +33,94 @@ G_DEFINE_TYPE (LightDMLanguage, lightdm_language, G_TYPE_OBJECT); #define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_LANGUAGE, LightDMLanguagePrivate) +static gboolean have_languages = FALSE; +static GList *languages = NULL; + +static void +update_languages (void) +{ + gchar *stdout_text = NULL, *stderr_text = NULL; + gint exit_status; + gboolean result; + GError *error = NULL; + + if (have_languages) + return; + + result = g_spawn_command_line_sync ("locale -a", &stdout_text, &stderr_text, &exit_status, &error); + if (!result || exit_status != 0) + g_warning ("Failed to get languages, locale -a returned %d: %s", exit_status, error->message); + else + { + gchar **tokens; + int i; + + tokens = g_strsplit_set (stdout_text, "\n\r", -1); + for (i = 0; tokens[i]; i++) + { + LightDMLanguage *language; + gchar *code; + + code = g_strchug (tokens[i]); + if (code[0] == '\0') + continue; + + /* Ignore the non-interesting languages */ + if (strcmp (code, "C") == 0 || strcmp (code, "POSIX") == 0) + continue; + + language = g_object_new (LIGHTDM_TYPE_LANGUAGE, "code", code, NULL); + languages = g_list_append (languages, language); + } + + g_strfreev (tokens); + } + + g_clear_error (&error); + g_free (stdout_text); + g_free (stderr_text); + + have_languages = TRUE; +} + +/** + * lightdm_get_language: + * + * Get the current language. + * + * Return value: (transfer none): The current language or #NULL if no language. + **/ +const LightDMLanguage * +lightdm_get_language (void) +{ + const gchar *lang; + GList *link; + + lang = g_getenv ("LANG"); + for (link = lightdm_get_languages (); link; link = link->next) + { + LightDMLanguage *language = link->data; + if (lightdm_language_matches (language, lang)) + return language; + } + + return NULL; +} + +/** + * lightdm_get_languages: + * + * Get a list of languages to present to the user. + * + * Return value: (element-type LightDMLanguage) (transfer none): A list of #LightDMLanguage that should be presented to the user. + **/ +GList * +lightdm_get_languages (void) +{ + update_languages (); + return languages; +} + /** * lightdm_language_get_code: * @language: A #LightDMLanguage diff --git a/liblightdm-gobject/layout.c b/liblightdm-gobject/layout.c index 67648223..b5bd5adf 100644 --- a/liblightdm-gobject/layout.c +++ b/liblightdm-gobject/layout.c @@ -9,6 +9,8 @@ * license. */ +#include <libxklavier/xklavier.h> + #include "lightdm/layout.h" enum { @@ -29,6 +31,96 @@ G_DEFINE_TYPE (LightDMLayout, lightdm_layout, G_TYPE_OBJECT); #define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_LAYOUT, LightDMLayoutPrivate) +static gboolean have_layouts = FALSE; +static Display *display = NULL; +static XklEngine *xkl_engine = NULL; +static XklConfigRec *xkl_config = NULL; +static GList *layouts = NULL; + +static void +layout_cb (XklConfigRegistry *config, + const XklConfigItem *item, + gpointer data) +{ + LightDMLayout *layout; + + layout = g_object_new (LIGHTDM_TYPE_LAYOUT, "name", item->name, "short-description", item->short_description, "description", item->description, NULL); + layouts = g_list_append (layouts, layout); +} + +/** + * lightdm_get_layouts: + * + * Get a list of keyboard layouts to present to the user. + * + * Return value: (element-type LightDMLayout) (transfer none): A list of #LightDMLayout that should be presented to the user. + **/ +GList * +lightdm_get_layouts (void) +{ + XklConfigRegistry *registry; + + if (have_layouts) + return layouts; + + display = XOpenDisplay (NULL); + xkl_engine = xkl_engine_get_instance (display); + xkl_config = xkl_config_rec_new (); + if (!xkl_config_rec_get_from_server (xkl_config, xkl_engine)) + g_warning ("Failed to get Xkl configuration from server"); + + registry = xkl_config_registry_get_instance (xkl_engine); + xkl_config_registry_load (registry, FALSE); + xkl_config_registry_foreach_layout (registry, layout_cb, NULL); + g_object_unref (registry); + + have_layouts = TRUE; + + return layouts; +} + +/** + * lightdm_set_layout: + * @layout: The layout to use + * + * Set the layout for this session. + **/ +void +lightdm_set_layout (LightDMLayout *layout) +{ + XklConfigRec *config; + + g_return_if_fail (layout != NULL); + + g_debug ("Setting keyboard layout to %s", lightdm_layout_get_name (layout)); + + config = xkl_config_rec_new (); + config->layouts = g_malloc (sizeof (gchar *) * 2); + config->model = g_strdup (xkl_config->model); + config->layouts[0] = g_strdup (lightdm_layout_get_name (layout)); + config->layouts[1] = NULL; + if (!xkl_config_rec_activate (config, xkl_engine)) + g_warning ("Failed to activate XKL config"); + g_object_unref (config); +} + +/** + * lightdm_get_layout: + * + * Get the current keyboard layout. + * + * Return value: (transfer none): The currently active layout for this user. + **/ +LightDMLayout * +lightdm_get_layout (void) +{ + lightdm_get_layouts (); + if (layouts) + return (LightDMLayout *) g_list_first (layouts); + else + return NULL; +} + /** * lightdm_layout_get_name: * @layout: A #LightDMLayout diff --git a/liblightdm-gobject/liblightdm-gobject-1.vapi b/liblightdm-gobject/liblightdm-gobject-1.vapi index 8373b5cd..051a1eee 100644 --- a/liblightdm-gobject/liblightdm-gobject-1.vapi +++ b/liblightdm-gobject/liblightdm-gobject-1.vapi @@ -1,24 +1,30 @@ [CCode (cprefix = "LightDM", lower_case_cprefix = "lightdm_", cheader_filename = "lightdm/greeter.h")] namespace LightDM { + public unowned string hostname { get; } + public unowned string default_language { get; } + public unowned GLib.List<weak LightDM.Language> get_languages (); + public unowned GLib.List<weak LightDM.Layout> get_layouts (); + public unowned string layout { get; set; } + public bool can_suspend { get; } + public void suspend (); + public bool can_hibernate { get; } + public void hibernate (); + public bool can_restart { get; } + public void restart (); + public bool can_shutdown { get; } + public void shutdown (); + public class Greeter : GLib.Object { public Greeter (); - public virtual signal void connected (); - public virtual signal void show_message (string text, MessageType type); - public virtual signal void show_prompt (string text, PromptType type); - public virtual signal void authentication_complete (); - public virtual signal void session_failed (); - public virtual signal void autologin_timer_expired (); - public virtual signal void user_added (); - public virtual signal void user_changed (); - public virtual signal void user_removed (); - public virtual signal void quit (); + public signal void connected (); + public signal void show_message (string text, MessageType type); + public signal void show_prompt (string text, PromptType type); + public signal void authentication_complete (); + public signal void session_failed (); + public signal void autologin_timer_expired (); + public signal void quit (); public bool connect_to_server (); - public unowned string hostname { get; } - public unowned string default_language { get; } - public unowned GLib.List<weak LightDM.Language> get_languages (); - public unowned GLib.List<weak LightDM.Layout> get_layouts (); - public unowned string layout { get; set; } public unowned string get_hint (string name); public unowned string default_session_hint { get; }; public bool hide_users_hint { get; }; @@ -29,9 +35,8 @@ namespace LightDM { public bool autologin_guest_hint { get; }; public int autologin_timeout_hint { get; }; public void cancel_timed_login (); - public void login (string username); - public void login_with_user_prompt (); - public void login_as_guest (); + public void authenticate (string? username = null); + public void authenticate_as_guest (); public void respond (string response); public void cancel_authentication (); public bool in_authentication { get; } @@ -39,14 +44,6 @@ namespace LightDM { public unowned string authentication_user { get; } public void start_session (string? session); public void start_default_session (); - public bool can_suspend { get; } - public void suspend (); - public bool can_hibernate { get; } - public void hibernate (); - public bool can_restart { get; } - public void restart (); - public bool can_shutdown { get; } - public void shutdown (); } public enum MessageType { INFO, @@ -72,12 +69,18 @@ namespace LightDM { public unowned string name { get; } } public class UserList : GLib.Object { + public signal void user_added (User user); + public signal void user_changed (User user); + public signal void user_removed (User user); + public UserList (); public int num_users { get; } public unowned GLib.List<weak LightDM.User> get_users (); public unowned LightDM.User get_user_by_name (string username); } public class User : GLib.Object { + public signal void changed (); + public unowned string display_name { get; } public unowned string image { get; } public unowned string language { get; } diff --git a/liblightdm-gobject/lightdm.h b/liblightdm-gobject/lightdm.h new file mode 100644 index 00000000..a23ecdfc --- /dev/null +++ b/liblightdm-gobject/lightdm.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2010-2011 Robert Ancell. + * Author: Robert Ancell <robert.ancell@canonical.com> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser 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/lgpl.html the full text of the + * license. + */ + +#ifndef _LIGHTDM_H_ +#define _LIGHTDM_H_ + +#include "lightdm/greeter.h" +#include "lightdm/language.h" +#include "lightdm/layout.h" +#include "lightdm/power.h" +#include "lightdm/session.h" +#include "lightdm/system.h" +#include "lightdm/user.h" + +G_END_DECLS + +#endif /* _LIGHTDM_H_ */ diff --git a/liblightdm-gobject/lightdm/Makefile.am b/liblightdm-gobject/lightdm/Makefile.am deleted file mode 100644 index ca20dda6..00000000 --- a/liblightdm-gobject/lightdm/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -liblightdm_gobject_1include_HEADERS = \ - greeter.h \ - language.h \ - layout.h \ - session.h \ - user.h -liblightdm_gobject_1includedir=$(includedir)/lightdm-gobject-1/lightdm - -DISTCLEANFILES = \ - Makefile.in diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h index 54a6b7c4..f8b98276 100644 --- a/liblightdm-gobject/lightdm/greeter.h +++ b/liblightdm-gobject/lightdm/greeter.h @@ -14,11 +14,6 @@ #include <glib-object.h> -#include "user-list.h" -#include "language.h" -#include "layout.h" -#include "session.h" - G_BEGIN_DECLS #define LIGHTDM_TYPE_GREETER (lightdm_greeter_get_type()) @@ -74,20 +69,6 @@ LightDMGreeter *lightdm_greeter_new (void); gboolean lightdm_greeter_connect_to_server (LightDMGreeter *greeter); -const gchar *lightdm_greeter_get_hostname (LightDMGreeter *greeter); - -const gchar *lightdm_greeter_get_default_language (LightDMGreeter *greeter); - -GList *lightdm_greeter_get_languages (LightDMGreeter *greeter); - -GList *lightdm_greeter_get_layouts (LightDMGreeter *greeter); - -void lightdm_greeter_set_layout (LightDMGreeter *greeter, const gchar *layout); - -const gchar *lightdm_greeter_get_layout (LightDMGreeter *greeter); - -GList *lightdm_greeter_get_sessions (LightDMGreeter *greeter); - const gchar *lightdm_greeter_get_hint (LightDMGreeter *greeter, const gchar *name); const gchar *lightdm_greeter_get_default_session_hint (LightDMGreeter *greeter); @@ -106,13 +87,11 @@ gboolean lightdm_greeter_get_autologin_guest_hint (LightDMGreeter *greeter); gint lightdm_greeter_get_autologin_timeout_hint (LightDMGreeter *greeter); -void lightdm_greeter_cancel_timed_login (LightDMGreeter *greeter); - -void lightdm_greeter_login (LightDMGreeter *greeter, const char *username); +void lightdm_greeter_cancel_autologin (LightDMGreeter *greeter); -void lightdm_greeter_login_with_user_prompt (LightDMGreeter *greeter); +void lightdm_greeter_authenticate (LightDMGreeter *greeter, const char *username); -void lightdm_greeter_login_as_guest (LightDMGreeter *greeter); +void lightdm_greeter_authenticate_as_guest (LightDMGreeter *greeter); void lightdm_greeter_respond (LightDMGreeter *greeter, const gchar *response); @@ -128,22 +107,6 @@ void lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *sessio void lightdm_greeter_start_default_session (LightDMGreeter *greeter); -gboolean lightdm_greeter_get_can_suspend (LightDMGreeter *greeter); - -void lightdm_greeter_suspend (LightDMGreeter *greeter); - -gboolean lightdm_greeter_get_can_hibernate (LightDMGreeter *greeter); - -void lightdm_greeter_hibernate (LightDMGreeter *greeter); - -gboolean lightdm_greeter_get_can_restart (LightDMGreeter *greeter); - -void lightdm_greeter_restart (LightDMGreeter *greeter); - -gboolean lightdm_greeter_get_can_shutdown (LightDMGreeter *greeter); - -void lightdm_greeter_shutdown (LightDMGreeter *greeter); - G_END_DECLS #endif /* _LIGHTDM_GREETER_H_ */ diff --git a/liblightdm-gobject/lightdm/language.h b/liblightdm-gobject/lightdm/language.h index e8a34008..490f20f9 100644 --- a/liblightdm-gobject/lightdm/language.h +++ b/liblightdm-gobject/lightdm/language.h @@ -35,6 +35,10 @@ typedef struct GType lightdm_language_get_type (void); +GList *lightdm_get_languages (void); + +const LightDMLanguage *lightdm_get_language (void); + const gchar *lightdm_language_get_code (LightDMLanguage *language); const gchar *lightdm_language_get_name (LightDMLanguage *language); diff --git a/liblightdm-gobject/lightdm/layout.h b/liblightdm-gobject/lightdm/layout.h index f98dbe20..aea43805 100644 --- a/liblightdm-gobject/lightdm/layout.h +++ b/liblightdm-gobject/lightdm/layout.h @@ -35,6 +35,12 @@ typedef struct GType lightdm_layout_get_type (void); +GList *lightdm_get_layouts (void); + +void lightdm_set_layout (LightDMLayout *layout); + +LightDMLayout *lightdm_get_layout (void); + const gchar *lightdm_layout_get_name (LightDMLayout *layout); const gchar *lightdm_layout_get_short_description (LightDMLayout *layout); diff --git a/liblightdm-gobject/lightdm/power.h b/liblightdm-gobject/lightdm/power.h new file mode 100644 index 00000000..7d37c1c6 --- /dev/null +++ b/liblightdm-gobject/lightdm/power.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2010-2011 Robert Ancell. + * Author: Robert Ancell <robert.ancell@canonical.com> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser 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/lgpl.html the full text of the + * license. + */ + +#ifndef _LIGHTDM_POWER_H_ +#define _LIGHTDM_POWER_H_ + +gboolean lightdm_get_can_suspend (void); + +void lightdm_suspend (void); + +gboolean lightdm_get_can_hibernate (void); + +void lightdm_hibernate (void); + +gboolean lightdm_get_can_restart (void); + +void lightdm_restart (void); + +gboolean lightdm_get_can_shutdown (void); + +void lightdm_shutdown (void); + +G_END_DECLS + +#endif /* _LIGHTDM_POWER_H_ */ diff --git a/liblightdm-gobject/lightdm/session.h b/liblightdm-gobject/lightdm/session.h index 4f9d4a2f..4835299b 100644 --- a/liblightdm-gobject/lightdm/session.h +++ b/liblightdm-gobject/lightdm/session.h @@ -35,6 +35,8 @@ typedef struct GType lightdm_session_get_type (void); +GList *lightdm_get_sessions (void); + const gchar *lightdm_session_get_key (LightDMSession *session); const gchar *lightdm_session_get_name (LightDMSession *session); diff --git a/liblightdm-gobject/lightdm/system.h b/liblightdm-gobject/lightdm/system.h new file mode 100644 index 00000000..f070ec80 --- /dev/null +++ b/liblightdm-gobject/lightdm/system.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2010-2011 Robert Ancell. + * Author: Robert Ancell <robert.ancell@canonical.com> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser 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/lgpl.html the full text of the + * license. + */ + +#ifndef _LIGHTDM_HOSTNAME_H_ +#define _LIGHTDM_HOSTNAME_H_ + +#include <glib-object.h> + +const gchar *lightdm_get_hostname (void); + +G_END_DECLS + +#endif /* _LIGHTDM_HOSTNAME_H_ */ diff --git a/liblightdm-gobject/lightdm/user-list.h b/liblightdm-gobject/lightdm/user-list.h deleted file mode 100644 index 76e4460b..00000000 --- a/liblightdm-gobject/lightdm/user-list.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2010 Robert Ancell. - * Author: Robert Ancell <robert.ancell@canonical.com> - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser 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/lgpl.html the full text of the - * license. - */ - -#ifndef _LIGHTDM_USER_LIST_H_ -#define _LIGHTDM_USER_LIST_H_ - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define LIGHTDM_TYPE_USER_LIST (lightdm_user_list_get_type()) -#define LIGHTDM_USER_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserList)); -#define LIGHTDM_USER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIGHTDM_TYPE_USER_LIST, LightDMUserListClass)) -#define LIGHTDM_IS_USER_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIGHTDM_TYPE_USER_LIST)) -#define LIGHTDM_IS_USER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIGHTDM_TYPE_USER_LIST)) -#define LIGHTDM_USER_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserListClass)) - -#include "user.h" - -typedef struct -{ - GObject parent_instance; -} LightDMUserList; - -typedef struct -{ - GObjectClass parent_class; - - void (*user_added)(LightDMUserList *user_list, LightDMUser *user); - void (*user_changed)(LightDMUserList *user_list, LightDMUser *user); - void (*user_removed)(LightDMUserList *user_list, LightDMUser *user); -} LightDMUserListClass; - -GType lightdm_user_list_get_type (void); - -LightDMUserList *lightdm_user_list_new (void); - -gint lightdm_user_list_get_num_users (LightDMUserList *user_list); - -LightDMUser *lightdm_user_list_get_user_by_name (LightDMUserList *user_list, const gchar *username); - -GList *lightdm_user_list_get_users (LightDMUserList *user_list); - -G_END_DECLS - -#endif /* _LIGHTDM_USER_LIST_H_ */ diff --git a/liblightdm-gobject/lightdm/user.h b/liblightdm-gobject/lightdm/user.h index 6e6e1eb7..20e37299 100644 --- a/liblightdm-gobject/lightdm/user.h +++ b/liblightdm-gobject/lightdm/user.h @@ -16,6 +16,13 @@ G_BEGIN_DECLS +#define LIGHTDM_TYPE_USER_LIST (lightdm_user_list_get_type()) +#define LIGHTDM_USER_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserList)); +#define LIGHTDM_USER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIGHTDM_TYPE_USER_LIST, LightDMUserListClass)) +#define LIGHTDM_IS_USER_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIGHTDM_TYPE_USER_LIST)) +#define LIGHTDM_IS_USER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIGHTDM_TYPE_USER_LIST)) +#define LIGHTDM_USER_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserListClass)) + #define LIGHTDM_TYPE_USER (lightdm_user_get_type()) #define LIGHTDM_USER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIGHTDM_TYPE_USER, LightDMUser)); #define LIGHTDM_USER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIGHTDM_TYPE_USER, LightDMUserClass)) @@ -34,8 +41,32 @@ typedef struct void (*changed)(LightDMUser *user); } LightDMUserClass; +typedef struct +{ + GObject parent_instance; +} LightDMUserList; + +typedef struct +{ + GObjectClass parent_class; + + void (*user_added)(LightDMUserList *user_list, LightDMUser *user); + void (*user_changed)(LightDMUserList *user_list, LightDMUser *user); + void (*user_removed)(LightDMUserList *user_list, LightDMUser *user); +} LightDMUserListClass; + +GType lightdm_user_list_get_type (void); + GType lightdm_user_get_type (void); +LightDMUserList *lightdm_user_list_get_instance (void); + +gint lightdm_user_list_get_length (LightDMUserList *user_list); + +LightDMUser *lightdm_user_list_get_user_by_name (LightDMUserList *user_list, const gchar *username); + +GList *lightdm_user_list_get_users (LightDMUserList *user_list); + const gchar *lightdm_user_get_name (LightDMUser *user); const gchar *lightdm_user_get_real_name (LightDMUser *user); diff --git a/liblightdm-gobject/power.c b/liblightdm-gobject/power.c new file mode 100644 index 00000000..fb0cc96b --- /dev/null +++ b/liblightdm-gobject/power.c @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2010-2011 Robert Ancell. + * Author: Robert Ancell <robert.ancell@canonical.com> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser 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/lgpl.html the full text of the + * license. + */ + +#include <config.h> + +#include <string.h> +#include <gio/gio.h> + +#include "lightdm/power.h" + +static GDBusProxy *upower_proxy = NULL; +static GDBusProxy *ck_proxy = NULL; + +static gboolean +upower_call_function (const gchar *function, gboolean has_result) +{ + GVariant *result; + gboolean function_result = FALSE; + GError *error = NULL; + + if (!upower_proxy) + { + upower_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.UPower", + "/org/freedesktop/UPower", + "org.freedesktop.UPower", + NULL, + &error); + if (!upower_proxy) + g_warning ("Error getting UPower proxy: %s", error->message); + g_clear_error (&error); + if (!upower_proxy) + return FALSE; + } + + result = g_dbus_proxy_call_sync (upower_proxy, + function, + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (!result) + g_warning ("Error calling UPower function %s: %s", function, error->message); + g_clear_error (&error); + if (!result) + return FALSE; + + if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)"))) + g_variant_get (result, "(b)", &function_result); + + g_variant_unref (result); + return function_result; +} + +/** + * lightdm_get_can_suspend: + * + * Checks if authorized to do a system suspend. + * + * Return value: #TRUE if can suspend the system + **/ +gboolean +lightdm_get_can_suspend (void) +{ + return upower_call_function ("SuspendAllowed", TRUE); +} + +/** + * lightdm_suspend: + * + * Triggers a system suspend. + **/ +void +lightdm_suspend (void) +{ + upower_call_function ("Suspend", FALSE); +} + +/** + * lightdm_get_can_hibernate: + * + * Checks if is authorized to do a system hibernate. + * + * Return value: #TRUE if can hibernate the system + **/ +gboolean +lightdm_get_can_hibernate (void) +{ + return upower_call_function ("HibernateAllowed", TRUE); +} + +/** + * lightdm_hibernate: + * + * Triggers a system hibernate. + **/ +void +lightdm_hibernate (void) +{ + upower_call_function ("Hibernate", FALSE); +} + +static gboolean +ck_call_function (const gchar *function, gboolean has_result) +{ + GVariant *result; + gboolean function_result = FALSE; + GError *error = NULL; + + if (!upower_proxy) + { + ck_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.ConsoleKit", + "/org/freedesktop/ConsoleKit/Manager", + "org.freedesktop.ConsoleKit.Manager", + NULL, + &error); + if (!ck_proxy) + g_warning ("Error getting ConsoleKit proxy: %s", error->message); + g_clear_error (&error); + if (!ck_proxy) + return FALSE; + } + + result = g_dbus_proxy_call_sync (ck_proxy, + function, + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + + if (!result) + g_warning ("Error calling ConsoleKit function %s: %s", function, error->message); + g_clear_error (&error); + if (!result) + return FALSE; + + if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)"))) + g_variant_get (result, "(b)", &function_result); + + g_variant_unref (result); + return function_result; +} + +/** + * lightdm_get_can_restart: + * + * Checks if is authorized to do a system restart. + * + * Return value: #TRUE if can restart the system + **/ +gboolean +lightdm_get_can_restart (void) +{ + return ck_call_function ("CanRestart", TRUE); +} + +/** + * lightdm_restart: + * + * Triggers a system restart. + **/ +void +lightdm_restart (void) +{ + ck_call_function ("Restart", FALSE); +} + +/** + * lightdm_get_can_shutdown: + * + * Checks if is authorized to do a system shutdown. + * + * Return value: #TRUE if can shutdown the system + **/ +gboolean +lightdm_get_can_shutdown (void) +{ + return ck_call_function ("CanStop", TRUE); +} + +/** + * lightdm_shutdown: + * + * Triggers a system shutdown. + **/ +void +lightdm_shutdown (void) +{ + ck_call_function ("Stop", FALSE); +} diff --git a/liblightdm-gobject/session.c b/liblightdm-gobject/session.c index 932db539..6b99dbde 100644 --- a/liblightdm-gobject/session.c +++ b/liblightdm-gobject/session.c @@ -9,6 +9,9 @@ * license. */ +#include <string.h> +#include <gio/gdesktopappinfo.h> + #include "lightdm/session.h" enum { @@ -29,6 +32,98 @@ G_DEFINE_TYPE (LightDMSession, lightdm_session, G_TYPE_OBJECT); #define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_SESSION, LightDMSessionPrivate) +static gboolean have_sessions = FALSE; +static GList *sessions = NULL; + +static void +update_sessions (void) +{ + GDir *directory; + GError *error = NULL; + + if (have_sessions) + return; + + directory = g_dir_open (XSESSIONS_DIR, 0, &error); + if (!directory) + g_warning ("Failed to open sessions directory: %s", error->message); + g_clear_error (&error); + if (!directory) + return; + + while (TRUE) + { + const gchar *filename; + GKeyFile *key_file; + gchar *key, *path; + gboolean result; + + filename = g_dir_read_name (directory); + if (filename == NULL) + break; + + if (!g_str_has_suffix (filename, ".desktop")) + continue; + + key = g_strndup (filename, strlen (filename) - strlen (".desktop")); + path = g_build_filename (XSESSIONS_DIR, filename, NULL); + g_debug ("Loading session %s", path); + + key_file = g_key_file_new (); + result = g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error); + if (!result) + g_warning ("Failed to load session file %s: %s:", path, error->message); + g_clear_error (&error); + + if (result && !g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, NULL)) + { + gchar *domain, *name, *comment; + +#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 + domain = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-GNOME-Gettext-Domain", NULL); +#endif + name = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, domain, NULL); + comment = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, domain, NULL); + if (!comment) + comment = g_strdup (""); + if (name) + { + g_debug ("Loaded session %s (%s, %s)", key, name, comment); + sessions = g_list_append (sessions, g_object_new (LIGHTDM_TYPE_SESSION, "key", key, "name", name, "comment", comment, NULL)); + } + else + g_warning ("Invalid session %s: %s", path, error->message); + g_free (domain); + g_free (name); + g_free (comment); + } + + g_free (key); + g_free (path); + g_key_file_free (key_file); + } + + g_dir_close (directory); + + have_sessions = TRUE; +} + +/** + * lightdm_get_sessions: + * + * Get the available sessions. + * + * Return value: (element-type LightDMSession) (transfer none): A list of #LightDMSession + **/ +GList * +lightdm_get_sessions (void) +{ + update_sessions (); + return sessions; +} + /** * lightdm_session_get_key * @session: A #LightDMSession diff --git a/liblightdm-gobject/system.c b/liblightdm-gobject/system.c new file mode 100644 index 00000000..1a339583 --- /dev/null +++ b/liblightdm-gobject/system.c @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2010-2011 Robert Ancell. + * Author: Robert Ancell <robert.ancell@canonical.com> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser 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/lgpl.html the full text of the + * license. + */ + +#include <sys/utsname.h> + +#include "lightdm/system.h" + +static gchar *hostname = NULL; + +/** + * lightdm_get_hostname: + * + * Return value: The name of the host we are running on. + **/ +const gchar * +lightdm_get_hostname (void) +{ + if (!hostname) + { + struct utsname info; + uname (&info); + hostname = g_strdup (info.nodename); + } + + return hostname; +} diff --git a/liblightdm-gobject/user-list.c b/liblightdm-gobject/user-list.c index 1acca818..ba8759be 100644 --- a/liblightdm-gobject/user-list.c +++ b/liblightdm-gobject/user-list.c @@ -560,13 +560,13 @@ update_users (LightDMUserList *user_list) } /** - * lightdm_user_list_get_num_users: + * lightdm_user_list_get_length: * @user_list: a #LightDMUserList * * Return value: The number of users able to log in **/ gint -lightdm_user_list_get_num_users (LightDMUserList *user_list) +lightdm_user_list_get_length (LightDMUserList *user_list) { g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), 0); update_users (user_list); @@ -636,7 +636,7 @@ lightdm_user_list_get_property (GObject *object, switch (prop_id) { case PROP_NUM_USERS: - g_value_set_int (value, lightdm_user_list_get_num_users (self)); + g_value_set_int (value, lightdm_user_list_get_length (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/liblightdm-gobject/user.c b/liblightdm-gobject/user.c index 9641fcbf..6d172ed7 100644 --- a/liblightdm-gobject/user.c +++ b/liblightdm-gobject/user.c @@ -9,28 +9,70 @@ * license. */ +#include <config.h> + +#include <errno.h> #include <string.h> +#include <sys/utsname.h> +#include <pwd.h> +#include <gio/gio.h> #include "lightdm/user.h" enum { - PROP_0, - PROP_NAME, - PROP_REAL_NAME, - PROP_DISPLAY_NAME, - PROP_HOME_DIRECTORY, - PROP_IMAGE, - PROP_LANGUAGE, - PROP_LAYOUT, - PROP_SESSION, - PROP_LOGGED_IN + LIST_PROP_0, + LIST_PROP_NUM_USERS, + LIST_PROP_USERS, +}; + +enum { + USER_PROP_0, + USER_PROP_NAME, + USER_PROP_REAL_NAME, + USER_PROP_DISPLAY_NAME, + USER_PROP_HOME_DIRECTORY, + USER_PROP_IMAGE, + USER_PROP_LANGUAGE, + USER_PROP_LAYOUT, + USER_PROP_SESSION, + USER_PROP_LOGGED_IN +}; + +enum { + USER_ADDED, + USER_CHANGED, + USER_REMOVED, + LAST_LIST_SIGNAL }; +static guint list_signals[LAST_LIST_SIGNAL] = { 0 }; enum { CHANGED, - LAST_SIGNAL + LAST_USER_SIGNAL }; -static guint signals[LAST_SIGNAL] = { 0 }; +static guint user_signals[LAST_USER_SIGNAL] = { 0 }; + +typedef struct +{ + /* Connection to AccountsService */ + GDBusProxy *accounts_service_proxy; + GList *user_account_objects; + + /* File monitor for password file */ + GFileMonitor *passwd_monitor; + + /* TRUE if have scanned users */ + gboolean have_users; + + /* List of users */ + GList *users; +} LightDMUserListPrivate; + +typedef struct +{ + GDBusProxy *proxy; + LightDMUser *user; +} UserAccountObject; typedef struct { @@ -46,9 +88,683 @@ typedef struct gchar *session; } LightDMUserPrivate; +G_DEFINE_TYPE (LightDMUserList, lightdm_user_list, G_TYPE_OBJECT); G_DEFINE_TYPE (LightDMUser, lightdm_user, G_TYPE_OBJECT); -#define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_USER, LightDMUserPrivate) +#define GET_LIST_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_USER_LIST, LightDMUserListPrivate) +#define GET_USER_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_USER, LightDMUserPrivate) + +#define PASSWD_FILE "/etc/passwd" +#define USER_CONFIG_FILE "/etc/lightdm/users.conf" + +static LightDMUserList *singleton = NULL; + +/** + * lightdm_user_list_get_instance: + * + * Get the user list. + * + * Return value: the #LightDMUserList + **/ +LightDMUserList * +lightdm_user_list_get_instance (void) +{ + if (!singleton) + singleton = g_object_new (LIGHTDM_TYPE_USER_LIST, NULL); + return singleton; +} + +static LightDMUser * +get_user_by_name (LightDMUserList *user_list, const gchar *username) +{ + LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list); + GList *link; + + for (link = priv->users; link; link = link->next) + { + LightDMUser *user = link->data; + if (strcmp (lightdm_user_get_name (user), username) == 0) + return user; + } + + return NULL; +} + +static gint +compare_user (gconstpointer a, gconstpointer b) +{ + LightDMUser *user_a = (LightDMUser *) a, *user_b = (LightDMUser *) b; + return strcmp (lightdm_user_get_display_name (user_a), lightdm_user_get_display_name (user_b)); +} + +static gboolean +update_passwd_user (LightDMUser *user, const gchar *real_name, const gchar *home_directory, const gchar *image, gboolean logged_in) +{ + if (g_strcmp0 (lightdm_user_get_real_name (user), real_name) == 0 && + g_strcmp0 (lightdm_user_get_home_directory (user), home_directory) == 0 && + g_strcmp0 (lightdm_user_get_image (user), image) == 0 && + lightdm_user_get_logged_in (user) == logged_in) + return FALSE; + + g_object_set (user, "real-name", real_name, "home-directory", home_directory, "image", image, "logged-in", logged_in, NULL); + + return TRUE; +} + +static void +user_changed_cb (LightDMUser *user, LightDMUserList *user_list) +{ + g_signal_emit (user_list, list_signals[USER_CHANGED], 0, user); +} + +static void +load_passwd_file (LightDMUserList *user_list) +{ + LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list); + GKeyFile *config; + gchar *value; + gint minimum_uid; + gchar **hidden_users, **hidden_shells; + GList *users = NULL, *old_users, *new_users = NULL, *changed_users = NULL, *link; + GError *error = NULL; + + g_debug ("Loading user config from %s", USER_CONFIG_FILE); + + config = g_key_file_new (); + if (!g_key_file_load_from_file (config, USER_CONFIG_FILE, G_KEY_FILE_NONE, &error) && + !g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) + g_warning ("Failed to load configuration from %s: %s", USER_CONFIG_FILE, error->message); // FIXME: Don't make warning on no file, just info + g_clear_error (&error); + + if (g_key_file_has_key (config, "UserList", "minimum-uid", NULL)) + minimum_uid = g_key_file_get_integer (config, "UserList", "minimum-uid", NULL); + else + minimum_uid = 500; + + value = g_key_file_get_string (config, "UserList", "hidden-users", NULL); + if (!value) + value = g_strdup ("nobody nobody4 noaccess"); + hidden_users = g_strsplit (value, " ", -1); + g_free (value); + + value = g_key_file_get_string (config, "UserList", "hidden-shells", NULL); + if (!value) + value = g_strdup ("/bin/false /usr/sbin/nologin"); + hidden_shells = g_strsplit (value, " ", -1); + g_free (value); + + g_key_file_free (config); + + setpwent (); + + while (TRUE) + { + struct passwd *entry; + LightDMUser *user; + char **tokens; + gchar *real_name, *image; + int i; + + errno = 0; + entry = getpwent (); + if (!entry) + break; + + /* Ignore system users */ + if (entry->pw_uid < minimum_uid) + continue; + + /* Ignore users disabled by shell */ + if (entry->pw_shell) + { + for (i = 0; hidden_shells[i] && strcmp (entry->pw_shell, hidden_shells[i]) != 0; i++); + if (hidden_shells[i]) + continue; + } + + /* Ignore certain users */ + for (i = 0; hidden_users[i] && strcmp (entry->pw_name, hidden_users[i]) != 0; i++); + if (hidden_users[i]) + continue; + + tokens = g_strsplit (entry->pw_gecos, ",", -1); + if (tokens[0] != NULL && tokens[0][0] != '\0') + real_name = g_strdup (tokens[0]); + else + real_name = NULL; + g_strfreev (tokens); + + image = g_build_filename (entry->pw_dir, ".face", NULL); + if (!g_file_test (image, G_FILE_TEST_EXISTS)) + { + g_free (image); + image = g_build_filename (entry->pw_dir, ".face.icon", NULL); + if (!g_file_test (image, G_FILE_TEST_EXISTS)) + { + g_free (image); + image = NULL; + } + } + + user = g_object_new (LIGHTDM_TYPE_USER, "name", entry->pw_name, "real-name", real_name, "home-directory", entry->pw_dir, "image", image, "logged-in", FALSE, NULL); + g_free (real_name); + g_free (image); + + /* Update existing users if have them */ + for (link = priv->users; link; link = link->next) + { + LightDMUser *info = link->data; + if (strcmp (lightdm_user_get_name (info), lightdm_user_get_name (user)) == 0) + { + if (update_passwd_user (info, lightdm_user_get_real_name (user), lightdm_user_get_home_directory (user), lightdm_user_get_image (user), lightdm_user_get_logged_in (user))) + changed_users = g_list_insert_sorted (changed_users, info, compare_user); + g_object_unref (user); + user = info; + break; + } + } + if (!link) + { + /* Only notify once we have loaded the user list */ + if (priv->have_users) + new_users = g_list_insert_sorted (new_users, user, compare_user); + } + users = g_list_insert_sorted (users, user, compare_user); + } + g_strfreev (hidden_users); + g_strfreev (hidden_shells); + + if (errno != 0) + g_warning ("Failed to read password database: %s", strerror (errno)); + + endpwent (); + + /* Use new user list */ + old_users = priv->users; + priv->users = users; + + /* Notify of changes */ + for (link = new_users; link; link = link->next) + { + LightDMUser *info = link->data; + g_debug ("User %s added", lightdm_user_get_name (info)); + g_signal_connect (info, "changed", G_CALLBACK (user_changed_cb), user_list); + g_signal_emit (user_list, list_signals[USER_ADDED], 0, info); + } + g_list_free (new_users); + for (link = changed_users; link; link = link->next) + { + LightDMUser *info = link->data; + g_debug ("User %s changed", lightdm_user_get_name (info)); + g_signal_emit_by_name (info, "changed"); + } + g_list_free (changed_users); + for (link = old_users; link; link = link->next) + { + GList *new_link; + + /* See if this user is in the current list */ + for (new_link = priv->users; new_link; new_link = new_link->next) + { + if (new_link->data == link->data) + break; + } + + if (!new_link) + { + LightDMUser *info = link->data; + g_debug ("User %s removed", lightdm_user_get_name (info)); + g_signal_emit (user_list, list_signals[USER_REMOVED], 0, info); + g_object_unref (info); + } + } + g_list_free (old_users); +} + +static void +passwd_changed_cb (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, LightDMUserList *user_list) +{ + if (event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT) + { + g_debug ("%s changed, reloading user list", g_file_get_path (file)); + load_passwd_file (user_list); + } +} + +static gboolean +update_user (UserAccountObject *object) +{ + GVariant *result, *value; + GVariantIter *iter; + gchar *name; + GError *error = NULL; + + result = g_dbus_connection_call_sync (g_dbus_proxy_get_connection (object->proxy), + "org.freedesktop.Accounts", + g_dbus_proxy_get_object_path (object->proxy), + "org.freedesktop.DBus.Properties", + "GetAll", + g_variant_new ("(s)", "org.freedesktop.Accounts.User"), + G_VARIANT_TYPE ("(a{sv})"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (!result) + g_warning ("Error updating user %s: %s", g_dbus_proxy_get_object_path (object->proxy), error->message); + g_clear_error (&error); + if (!result) + return FALSE; + + g_variant_get (result, "(a{sv})", &iter); + while (g_variant_iter_loop (iter, "{&sv}", &name, &value)) + { + g_debug ("%s=?", name); + if (strcmp (name, "UserName") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) + { + gchar *user_name; + g_variant_get (value, "&s", &user_name); + g_object_set (object->user, "name", user_name, NULL); + } + else if (strcmp (name, "RealName") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) + { + gchar *real_name; + g_variant_get (value, "&s", &real_name); + g_object_set (object->user, "real-name", real_name, NULL); + } + else if (strcmp (name, "HomeDirectory") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) + { + gchar *home_directory; + g_variant_get (value, "&s", &home_directory); + g_object_set (object->user, "home-directory", home_directory, NULL); + } + else if (strcmp (name, "IconFile") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) + { + gchar *icon_file; + g_variant_get (value, "&s", &icon_file); + g_object_set (object->user, "image", icon_file, NULL); + } + } + g_debug ("!1"); + g_variant_iter_free (iter); + g_debug ("!2"); + + g_variant_unref (result); + g_debug ("!3"); + + return TRUE; +} + +static void +user_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, UserAccountObject *object) +{ + if (strcmp (signal_name, "Changed") == 0) + { + if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("()"))) + { + g_debug ("User %s changed", g_dbus_proxy_get_object_path (object->proxy)); + update_user (object); + g_signal_emit_by_name (object->user, "changed"); + } + else + g_warning ("Got org.freedesktop.Accounts.User signal Changed with unknown parameters %s", g_variant_get_type_string (parameters)); + } +} + +static UserAccountObject * +user_account_object_new (const gchar *path) +{ + GDBusProxy *proxy; + UserAccountObject *object; + GError *error = NULL; + + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.Accounts", + path, + "org.freedesktop.Accounts.User", + NULL, + &error); + if (!proxy) + g_warning ("Error getting user %s: %s", path, error->message); + g_clear_error (&error); + if (!proxy) + return NULL; + + object = g_malloc0 (sizeof (UserAccountObject)); + object->user = g_object_new (LIGHTDM_TYPE_USER, NULL); + object->proxy = proxy; + g_signal_connect (proxy, "g-signal", G_CALLBACK (user_signal_cb), object); + + return object; +} + +static void +user_account_object_free (UserAccountObject *object) +{ + if (!object) + return; + g_object_unref (object->user); + g_object_unref (object->proxy); + g_free (object); +} + +static void +user_accounts_signal_cb (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, LightDMUserList *user_list) +{ + LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list); + + if (strcmp (signal_name, "UserAdded") == 0) + { + if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)"))) + { + gchar *path; + UserAccountObject *object; + + g_variant_get (parameters, "(&o)", &path); + g_debug ("User %s added", path); + + object = user_account_object_new (path); + if (object && update_user (object)) + { + priv->user_account_objects = g_list_append (priv->user_account_objects, object); + priv->users = g_list_insert_sorted (priv->users, g_object_ref (object->user), compare_user); + g_signal_connect (object->user, "changed", G_CALLBACK (user_changed_cb), user_list); + g_signal_emit (user_list, list_signals[USER_ADDED], 0, object->user); + } + else + user_account_object_free (object); + } + else + g_warning ("Got UserAccounts signal UserAdded with unknown parameters %s", g_variant_get_type_string (parameters)); + } + else if (strcmp (signal_name, "UserDeleted") == 0) + { + if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(o)"))) + { + gchar *path; + GList *link; + + g_variant_get (parameters, "(&o)", &path); + g_debug ("User %s deleted", path); + + for (link = priv->user_account_objects; link; link = link->next) + { + UserAccountObject *object = link->data; + if (strcmp (g_dbus_proxy_get_object_path (object->proxy), path) == 0) + { + priv->users = g_list_remove (priv->users, object->user); + g_object_unref (object->user); + + g_signal_emit (user_list, list_signals[USER_REMOVED], 0, object->user); + + priv->user_account_objects = g_list_remove (priv->user_account_objects, object); + user_account_object_free (object); + break; + } + } + } + else + g_warning ("Got UserAccounts signal UserDeleted with unknown parameters %s", g_variant_get_type_string (parameters)); + } +} + +static void +update_users (LightDMUserList *user_list) +{ + LightDMUserListPrivate *priv = GET_LIST_PRIVATE (user_list); + GFile *passwd_file; + GError *error = NULL; + + if (priv->have_users) + return; + priv->have_users = TRUE; + + priv->accounts_service_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.Accounts", + "/org/freedesktop/Accounts", + "org.freedesktop.Accounts", + NULL, + &error); + if (!priv->accounts_service_proxy) + g_warning ("Error contacting AccountsService: %s", error->message); + g_clear_error (&error); + + if (priv->accounts_service_proxy) + { + GVariant *result; + + g_signal_connect (priv->accounts_service_proxy, "g-signal", G_CALLBACK (user_accounts_signal_cb), user_list); + + result = g_dbus_proxy_call_sync (priv->accounts_service_proxy, + "ListCachedUsers", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (!result) + g_warning ("Error getting user list from AccountsService: %s", error->message); + g_clear_error (&error); + if (!result) + return; + + if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(ao)"))) + { + GVariantIter *iter; + const gchar *path; + + g_debug ("Loading users from AccountsService"); + g_variant_get (result, "(ao)", &iter); + while (g_variant_iter_loop (iter, "&o", &path)) + { + UserAccountObject *object; + + g_debug ("Loading user %s", path); + + object = user_account_object_new (path); + if (object && update_user (object)) + { + priv->user_account_objects = g_list_append (priv->user_account_objects, object); + priv->users = g_list_insert_sorted (priv->users, g_object_ref (object->user), compare_user); + g_signal_connect (object->user, "changed", G_CALLBACK (user_changed_cb), user_list); + } + else + user_account_object_free (object); + } + g_variant_iter_free (iter); + } + else + g_warning ("Unexpected type from ListCachedUsers: %s", g_variant_get_type_string (result)); + + g_variant_unref (result); + } + else + { + load_passwd_file (user_list); + + /* Watch for changes to user list */ + passwd_file = g_file_new_for_path (PASSWD_FILE); + priv->passwd_monitor = g_file_monitor (passwd_file, G_FILE_MONITOR_NONE, NULL, &error); + g_object_unref (passwd_file); + if (!priv->passwd_monitor) + g_warning ("Error monitoring %s: %s", PASSWD_FILE, error->message); + else + g_signal_connect (priv->passwd_monitor, "changed", G_CALLBACK (passwd_changed_cb), user_list); + g_clear_error (&error); + } +} + +/** + * lightdm_user_list_get_length: + * @user_list: a #LightDMUserList + * + * Return value: The number of users able to log in + **/ +gint +lightdm_user_list_get_length (LightDMUserList *user_list) +{ + g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), 0); + update_users (user_list); + return g_list_length (GET_LIST_PRIVATE (user_list)->users); +} + +/** + * lightdm_user_list_get_users: + * @user_list: A #LightDMUserList + * + * Get a list of users to present to the user. This list may be a subset of the + * available users and may be empty depending on the server configuration. + * + * Return value: (element-type LightDMUser) (transfer none): A list of #LightDMUser that should be presented to the user. + **/ +GList * +lightdm_user_list_get_users (LightDMUserList *user_list) +{ + g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), NULL); + update_users (user_list); + return GET_LIST_PRIVATE (user_list)->users; +} + +/** + * lightdm_user_list_get_user_by_name: + * @user_list: A #LightDMUserList + * @username: Name of user to get. + * + * Get infomation about a given user or #NULL if this user doesn't exist. + * + * Return value: (transfer none): A #LightDMUser entry for the given user. + **/ +LightDMUser * +lightdm_user_list_get_user_by_name (LightDMUserList *user_list, const gchar *username) +{ + g_return_val_if_fail (LIGHTDM_IS_USER_LIST (user_list), NULL); + g_return_val_if_fail (username != NULL, NULL); + + update_users (user_list); + + return get_user_by_name (user_list, username); +} + +static void +lightdm_user_list_init (LightDMUserList *user_list) +{ +} + +static void +lightdm_user_list_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +static void +lightdm_user_list_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + LightDMUserList *self; + + self = LIGHTDM_USER_LIST (object); + + switch (prop_id) { + case LIST_PROP_NUM_USERS: + g_value_set_int (value, lightdm_user_list_get_length (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +lightdm_user_list_finalize (GObject *object) +{ + LightDMUserList *self = LIGHTDM_USER_LIST (object); + LightDMUserListPrivate *priv = GET_LIST_PRIVATE (self); + + if (priv->accounts_service_proxy) + g_object_unref (priv->accounts_service_proxy); + g_list_free_full (priv->user_account_objects, (GDestroyNotify) user_account_object_free); + if (priv->passwd_monitor) + g_object_unref (priv->passwd_monitor); + g_list_free_full (priv->users, g_object_unref); + + G_OBJECT_CLASS (lightdm_user_list_parent_class)->finalize (object); +} + +static void +lightdm_user_list_class_init (LightDMUserListClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (LightDMUserListPrivate)); + + object_class->set_property = lightdm_user_list_set_property; + object_class->get_property = lightdm_user_list_get_property; + object_class->finalize = lightdm_user_list_finalize; + + g_object_class_install_property (object_class, + LIST_PROP_NUM_USERS, + g_param_spec_int ("num-users", + "num-users", + "Number of login users", + 0, G_MAXINT, 0, + G_PARAM_READABLE)); + /** + * LightDMUserList::user-added: + * @user_list: A #LightDMUserList + * @user: The #LightDM user that has been added. + * + * The ::user-added signal gets emitted when a user account is created. + **/ + list_signals[USER_ADDED] = + g_signal_new ("user-added", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (LightDMUserListClass, user_added), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, LIGHTDM_TYPE_USER); + + /** + * LightDMUserList::user-changed: + * @user_list: A #LightDMUserList + * @user: The #LightDM user that has been changed. + * + * The ::user-changed signal gets emitted when a user account is modified. + **/ + list_signals[USER_CHANGED] = + g_signal_new ("user-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (LightDMUserListClass, user_changed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, LIGHTDM_TYPE_USER); + + /** + * LightDMUserList::user-removed: + * @user_list: A #LightDMUserList + * @user: The #LightDM user that has been removed. + * + * The ::user-removed signal gets emitted when a user account is removed. + **/ + list_signals[USER_REMOVED] = + g_signal_new ("user-removed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (LightDMUserListClass, user_removed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, LIGHTDM_TYPE_USER); +} /** * lightdm_user_get_name: @@ -62,7 +778,7 @@ const gchar * lightdm_user_get_name (LightDMUser *user) { g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL); - return GET_PRIVATE (user)->name; + return GET_USER_PRIVATE (user)->name; } /** @@ -77,7 +793,7 @@ const gchar * lightdm_user_get_real_name (LightDMUser *user) { g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL); - return GET_PRIVATE (user)->real_name; + return GET_USER_PRIVATE (user)->real_name; } /** @@ -95,7 +811,7 @@ lightdm_user_get_display_name (LightDMUser *user) g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL); - priv = GET_PRIVATE (user); + priv = GET_USER_PRIVATE (user); if (strcmp (priv->real_name, "")) return priv->real_name; else @@ -114,7 +830,7 @@ const gchar * lightdm_user_get_home_directory (LightDMUser *user) { g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL); - return GET_PRIVATE (user)->home_directory; + return GET_USER_PRIVATE (user)->home_directory; } /** @@ -129,13 +845,13 @@ const gchar * lightdm_user_get_image (LightDMUser *user) { g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL); - return GET_PRIVATE (user)->image; + return GET_USER_PRIVATE (user)->image; } static void load_dmrc (LightDMUser *user) { - LightDMUserPrivate *priv = GET_PRIVATE (user); + LightDMUserPrivate *priv = GET_USER_PRIVATE (user); gchar *path; gboolean have_dmrc; @@ -169,7 +885,7 @@ lightdm_user_get_language (LightDMUser *user) { g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL); load_dmrc (user); - return GET_PRIVATE (user)->language; + return GET_USER_PRIVATE (user)->language; } /** @@ -185,7 +901,7 @@ lightdm_user_get_layout (LightDMUser *user) { g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL); load_dmrc (user); - return GET_PRIVATE (user)->layout; + return GET_USER_PRIVATE (user)->layout; } /** @@ -201,7 +917,7 @@ lightdm_user_get_session (LightDMUser *user) { g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL); load_dmrc (user); - return GET_PRIVATE (user)->session; + return GET_USER_PRIVATE (user)->session; } /** @@ -216,13 +932,13 @@ gboolean lightdm_user_get_logged_in (LightDMUser *user) { g_return_val_if_fail (LIGHTDM_IS_USER (user), FALSE); - return GET_PRIVATE (user)->logged_in; + return GET_USER_PRIVATE (user)->logged_in; } static void lightdm_user_init (LightDMUser *user) { - LightDMUserPrivate *priv = GET_PRIVATE (user); + LightDMUserPrivate *priv = GET_USER_PRIVATE (user); priv->name = g_strdup (""); priv->real_name = g_strdup (""); @@ -240,26 +956,26 @@ lightdm_user_set_property (GObject *object, GParamSpec *pspec) { LightDMUser *self = LIGHTDM_USER (object); - LightDMUserPrivate *priv = GET_PRIVATE (self); + LightDMUserPrivate *priv = GET_USER_PRIVATE (self); switch (prop_id) { - case PROP_NAME: + case USER_PROP_NAME: g_free (priv->name); priv->name = g_strdup (g_value_get_string (value)); break; - case PROP_REAL_NAME: + case USER_PROP_REAL_NAME: g_free (priv->real_name); priv->real_name = g_strdup (g_value_get_string (value)); break; - case PROP_HOME_DIRECTORY: + case USER_PROP_HOME_DIRECTORY: g_free (priv->home_directory); priv->home_directory = g_strdup (g_value_get_string (value)); break; - case PROP_IMAGE: + case USER_PROP_IMAGE: g_free (priv->image); priv->image = g_strdup (g_value_get_string (value)); break; - case PROP_LOGGED_IN: + case USER_PROP_LOGGED_IN: priv->logged_in = g_value_get_boolean (value); break; default: @@ -279,31 +995,31 @@ lightdm_user_get_property (GObject *object, self = LIGHTDM_USER (object); switch (prop_id) { - case PROP_NAME: + case USER_PROP_NAME: g_value_set_string (value, lightdm_user_get_name (self)); break; - case PROP_REAL_NAME: + case USER_PROP_REAL_NAME: g_value_set_string (value, lightdm_user_get_real_name (self)); break; - case PROP_DISPLAY_NAME: + case USER_PROP_DISPLAY_NAME: g_value_set_string (value, lightdm_user_get_display_name (self)); break; - case PROP_HOME_DIRECTORY: + case USER_PROP_HOME_DIRECTORY: g_value_set_string (value, lightdm_user_get_home_directory (self)); break; - case PROP_IMAGE: + case USER_PROP_IMAGE: g_value_set_string (value, lightdm_user_get_image (self)); break; - case PROP_LANGUAGE: + case USER_PROP_LANGUAGE: g_value_set_string (value, lightdm_user_get_language (self)); break; - case PROP_LAYOUT: + case USER_PROP_LAYOUT: g_value_set_string (value, lightdm_user_get_layout (self)); break; - case PROP_SESSION: + case USER_PROP_SESSION: g_value_set_string (value, lightdm_user_get_session (self)); break; - case PROP_LOGGED_IN: + case USER_PROP_LOGGED_IN: g_value_set_boolean (value, lightdm_user_get_logged_in (self)); break; default: @@ -316,7 +1032,7 @@ static void lightdm_user_finalize (GObject *object) { LightDMUser *self = LIGHTDM_USER (object); - LightDMUserPrivate *priv = GET_PRIVATE (self); + LightDMUserPrivate *priv = GET_USER_PRIVATE (self); g_free (priv->name); g_free (priv->real_name); @@ -338,63 +1054,63 @@ lightdm_user_class_init (LightDMUserClass *klass) object_class->finalize = lightdm_user_finalize; g_object_class_install_property(object_class, - PROP_NAME, + USER_PROP_NAME, g_param_spec_string("name", "name", "Username", NULL, G_PARAM_READWRITE)); g_object_class_install_property(object_class, - PROP_REAL_NAME, + USER_PROP_REAL_NAME, g_param_spec_string("real-name", "real-name", "Users real name", NULL, G_PARAM_READWRITE)); g_object_class_install_property(object_class, - PROP_DISPLAY_NAME, + USER_PROP_DISPLAY_NAME, g_param_spec_string("display-name", "display-name", "Users display name", NULL, G_PARAM_READABLE)); g_object_class_install_property(object_class, - PROP_HOME_DIRECTORY, + USER_PROP_HOME_DIRECTORY, g_param_spec_string("home-directory", "home-directory", "Home directory", NULL, G_PARAM_READWRITE)); g_object_class_install_property(object_class, - PROP_IMAGE, + USER_PROP_IMAGE, g_param_spec_string("image", "image", "Avatar image", NULL, G_PARAM_READWRITE)); g_object_class_install_property(object_class, - PROP_LANGUAGE, + USER_PROP_LANGUAGE, g_param_spec_string("language", "language", "Language used by this user", NULL, G_PARAM_READABLE)); g_object_class_install_property(object_class, - PROP_LAYOUT, + USER_PROP_LAYOUT, g_param_spec_string("layout", "layout", "Keyboard layout used by this user", NULL, G_PARAM_READABLE)); g_object_class_install_property(object_class, - PROP_SESSION, + USER_PROP_SESSION, g_param_spec_string("session", "session", "Session used by this user", NULL, G_PARAM_READABLE)); g_object_class_install_property(object_class, - PROP_LOGGED_IN, + USER_PROP_LOGGED_IN, g_param_spec_boolean("logged-in", "logged-in", "TRUE if the user is currently in a session", @@ -407,7 +1123,7 @@ lightdm_user_class_init (LightDMUserClass *klass) * * The ::changed signal gets emitted this user account is modified. **/ - signals[CHANGED] = + user_signals[CHANGED] = g_signal_new ("changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, diff --git a/liblightdm-qt/QLightDM/greeter.h b/liblightdm-qt/QLightDM/greeter.h index 51918708..1d5ead3c 100644 --- a/liblightdm-qt/QLightDM/greeter.h +++ b/liblightdm-qt/QLightDM/greeter.h @@ -85,8 +85,8 @@ namespace QLightDM void restart(); void connectToServer(); - void login(const QString &username=QString()); - void loginAsGuest(); + void authenticate(const QString &username=QString()); + void authenticateAsGuest(); void respond(const QString &response); void cancelAuthentication(); void startSession(const QString &session=QString()); diff --git a/liblightdm-qt/greeter.cpp b/liblightdm-qt/greeter.cpp index 249a910c..89ea1808 100644 --- a/liblightdm-qt/greeter.cpp +++ b/liblightdm-qt/greeter.cpp @@ -35,8 +35,8 @@ typedef enum { GREETER_MESSAGE_CONNECT = 0, - GREETER_MESSAGE_LOGIN, - GREETER_MESSAGE_LOGIN_AS_GUEST, + GREETER_MESSAGE_AUTHENTICATE, + GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, GREETER_MESSAGE_CONTINUE_AUTHENTICATION, GREETER_MESSAGE_START_SESSION, GREETER_MESSAGE_CANCEL_AUTHENTICATION @@ -209,21 +209,21 @@ void Greeter::connectToServer() flush(); } -void Greeter::login(const QString &username) +void Greeter::authenticate(const QString &username) { d->inAuthentication = true; d->isAuthenticated = false; d->cancellingAuthentication = false; d->authenticationUser = username; qDebug() << "Starting authentication for user " << username << "..."; - writeHeader(GREETER_MESSAGE_LOGIN, intLength() + stringLength(username)); + writeHeader(GREETER_MESSAGE_AUTHENTICATE, intLength() + stringLength(username)); d->authenticateSequenceNumber++; writeInt(d->authenticateSequenceNumber); writeString(username); flush(); } -void Greeter::loginAsGuest() +void Greeter::authenticateAsGuest() { d->authenticateSequenceNumber++; d->inAuthentication = true; @@ -231,7 +231,7 @@ void Greeter::loginAsGuest() d->cancellingAuthentication = false; d->authenticationUser = ""; qDebug() << "Starting authentication for guest account"; - writeHeader(GREETER_MESSAGE_LOGIN_AS_GUEST, intLength()); + writeHeader(GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, intLength()); writeInt(d->authenticateSequenceNumber); flush(); } diff --git a/src/greeter.c b/src/greeter.c index 62a28103..55157dd2 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -60,8 +60,8 @@ G_DEFINE_TYPE (Greeter, greeter, G_TYPE_OBJECT); typedef enum { GREETER_MESSAGE_CONNECT = 0, - GREETER_MESSAGE_LOGIN, - GREETER_MESSAGE_LOGIN_AS_GUEST, + GREETER_MESSAGE_AUTHENTICATE, + GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, GREETER_MESSAGE_CONTINUE_AUTHENTICATION, GREETER_MESSAGE_START_SESSION, GREETER_MESSAGE_CANCEL_AUTHENTICATION @@ -485,13 +485,13 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) handle_connect (greeter, version); g_free (version); break; - case GREETER_MESSAGE_LOGIN: + case GREETER_MESSAGE_AUTHENTICATE: sequence_number = read_int (greeter, &offset); username = read_string (greeter, &offset); handle_login (greeter, sequence_number, username); g_free (username); break; - case GREETER_MESSAGE_LOGIN_AS_GUEST: + case GREETER_MESSAGE_AUTHENTICATE_AS_GUEST: sequence_number = read_int (greeter, &offset); handle_login_as_guest (greeter, sequence_number); break; diff --git a/tests/scripts/login-gobject-guest-disabled.script b/tests/scripts/login-gobject-guest-disabled.script index 902540e6..dc83a232 100644 --- a/tests/scripts/login-gobject-guest-disabled.script +++ b/tests/scripts/login-gobject-guest-disabled.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login as guest -GREETER LOGIN-GUEST +GREETER AUTHENTICATE-GUEST GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE # Cleanup diff --git a/tests/scripts/login-gobject-guest-fail-setup-script.script b/tests/scripts/login-gobject-guest-fail-setup-script.script index 90968647..8f9ec184 100644 --- a/tests/scripts/login-gobject-guest-fail-setup-script.script +++ b/tests/scripts/login-gobject-guest-fail-setup-script.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login as guest -GREETER LOGIN-GUEST +GREETER AUTHENTICATE-GUEST GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE GREETER SESSION-FAILED diff --git a/tests/scripts/login-gobject-guest-no-config.script b/tests/scripts/login-gobject-guest-no-config.script index 018a7abc..817c7522 100644 --- a/tests/scripts/login-gobject-guest-no-config.script +++ b/tests/scripts/login-gobject-guest-no-config.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login as guest -GREETER LOGIN-GUEST +GREETER AUTHENTICATE-GUEST GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE # Cleanup diff --git a/tests/scripts/login-gobject-guest-no-setup-script.script b/tests/scripts/login-gobject-guest-no-setup-script.script index 3524fffe..f4738239 100644 --- a/tests/scripts/login-gobject-guest-no-setup-script.script +++ b/tests/scripts/login-gobject-guest-no-setup-script.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login as guest -GREETER LOGIN-GUEST +GREETER AUTHENTICATE-GUEST GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE GREETER SESSION-FAILED diff --git a/tests/scripts/login-gobject-guest.script b/tests/scripts/login-gobject-guest.script index 22db7319..56ebe033 100644 --- a/tests/scripts/login-gobject-guest.script +++ b/tests/scripts/login-gobject-guest.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login as guest -GREETER LOGIN-GUEST +GREETER AUTHENTICATE-GUEST GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE GREETER QUIT diff --git a/tests/scripts/login-gobject-invalid-user.script b/tests/scripts/login-gobject-invalid-user.script index 056a01ab..5e54492c 100644 --- a/tests/scripts/login-gobject-invalid-user.script +++ b/tests/scripts/login-gobject-invalid-user.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login as invalid user -GREETER LOGIN USERNAME=notauser +GREETER AUTHENTICATE USERNAME=notauser GREETER SHOW-PROMPT TEXT="Password:" GREETER RESPOND TEXT="password" GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE diff --git a/tests/scripts/login-gobject-logout.script b/tests/scripts/login-gobject-logout.script index 54ddab68..c296e671 100644 --- a/tests/scripts/login-gobject-logout.script +++ b/tests/scripts/login-gobject-logout.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Log in -GREETER LOGIN USERNAME=alice +GREETER AUTHENTICATE USERNAME=alice GREETER SHOW-PROMPT TEXT="Password:" GREETER RESPOND TEXT="password" GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE diff --git a/tests/scripts/login-gobject-manual.script b/tests/scripts/login-gobject-manual.script index 910a7477..ffd6d17f 100644 --- a/tests/scripts/login-gobject-manual.script +++ b/tests/scripts/login-gobject-manual.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login as alice, but let lightdm prompt for a username -GREETER LOGIN +GREETER AUTHENTICATE GREETER SHOW-PROMPT TEXT="login:" GREETER RESPOND TEXT="alice" GREETER SHOW-PROMPT TEXT="Password:" diff --git a/tests/scripts/login-gobject-no-password.script b/tests/scripts/login-gobject-no-password.script index 3eb27124..ce46e851 100644 --- a/tests/scripts/login-gobject-no-password.script +++ b/tests/scripts/login-gobject-no-password.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login as bob (no password required) -GREETER LOGIN USERNAME=bob +GREETER AUTHENTICATE USERNAME=bob GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE GREETER QUIT diff --git a/tests/scripts/login-gobject-session-crash.script b/tests/scripts/login-gobject-session-crash.script index 4f58b15a..1534be8f 100644 --- a/tests/scripts/login-gobject-session-crash.script +++ b/tests/scripts/login-gobject-session-crash.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login as alice -GREETER LOGIN USERNAME=alice +GREETER AUTHENTICATE USERNAME=alice GREETER SHOW-PROMPT TEXT="Password:" GREETER RESPOND TEXT="password" GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE diff --git a/tests/scripts/login-gobject-wrong-password.script b/tests/scripts/login-gobject-wrong-password.script index dc749245..461bce79 100644 --- a/tests/scripts/login-gobject-wrong-password.script +++ b/tests/scripts/login-gobject-wrong-password.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login with invalid password -GREETER LOGIN USERNAME=alice +GREETER AUTHENTICATE USERNAME=alice GREETER SHOW-PROMPT TEXT="Password:" GREETER RESPOND TEXT="rubbish" GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE diff --git a/tests/scripts/login-gobject-xserver-crash.script b/tests/scripts/login-gobject-xserver-crash.script index 786f400f..9d47566d 100644 --- a/tests/scripts/login-gobject-xserver-crash.script +++ b/tests/scripts/login-gobject-xserver-crash.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Log in as alice -GREETER LOGIN USERNAME=alice +GREETER AUTHENTICATE USERNAME=alice GREETER SHOW-PROMPT TEXT="Password:" GREETER RESPOND TEXT="password" GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE diff --git a/tests/scripts/login-gobject.script b/tests/scripts/login-gobject.script index 5c16435a..a9a9f91c 100644 --- a/tests/scripts/login-gobject.script +++ b/tests/scripts/login-gobject.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login -GREETER LOGIN USERNAME=alice +GREETER AUTHENTICATE USERNAME=alice GREETER SHOW-PROMPT TEXT="Password:" GREETER RESPOND TEXT="password" GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE diff --git a/tests/scripts/switch-to-greeter.script b/tests/scripts/switch-to-greeter.script index 71625f0a..b7373b3d 100644 --- a/tests/scripts/switch-to-greeter.script +++ b/tests/scripts/switch-to-greeter.script @@ -16,7 +16,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Login -GREETER LOGIN USERNAME=alice +GREETER AUTHENTICATE USERNAME=alice GREETER SHOW-PROMPT TEXT="Password:" GREETER RESPOND TEXT="password" GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE diff --git a/tests/scripts/switch-to-user.script b/tests/scripts/switch-to-user.script index 7d0cc950..0e3ceec6 100644 --- a/tests/scripts/switch-to-user.script +++ b/tests/scripts/switch-to-user.script @@ -36,7 +36,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Alice is automatically selected -GREETER LOGIN-SELECTED USERNAME=alice +GREETER AUTHENTICATE-SELECTED USERNAME=alice GREETER SHOW-PROMPT TEXT="Password:" # Cleanup diff --git a/tests/scripts/xdmcp-login.script b/tests/scripts/xdmcp-login.script index 334346a4..f3dbef48 100644 --- a/tests/scripts/xdmcp-login.script +++ b/tests/scripts/xdmcp-login.script @@ -24,7 +24,7 @@ GREETER CONNECT-TO-DAEMON GREETER CONNECTED-TO-DAEMON # Log in -GREETER LOGIN USERNAME=alice +GREETER AUTHENTICATE USERNAME=alice GREETER SHOW-PROMPT TEXT="Password:" GREETER RESPOND TEXT="password" GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE diff --git a/tests/src/test-gobject-greeter.c b/tests/src/test-gobject-greeter.c index 7274e688..27ddb2f2 100644 --- a/tests/src/test-gobject-greeter.c +++ b/tests/src/test-gobject-greeter.c @@ -28,8 +28,8 @@ connected_cb (LightDMGreeter *greeter) /* Automatically log in as requested user */ if (lightdm_greeter_get_select_user_hint (greeter)) { - notify_status ("GREETER LOGIN-SELECTED USERNAME=%s", lightdm_greeter_get_select_user_hint (greeter)); - lightdm_greeter_login (greeter, lightdm_greeter_get_select_user_hint (greeter)); + notify_status ("GREETER AUTHENTICATE-SELECTED USERNAME=%s", lightdm_greeter_get_select_user_hint (greeter)); + lightdm_greeter_authenticate (greeter, lightdm_greeter_get_select_user_hint (greeter)); return; } @@ -39,13 +39,13 @@ connected_cb (LightDMGreeter *greeter) { if (g_key_file_get_boolean (config, "test-greeter-config", "login-guest", NULL)) { - notify_status ("GREETER LOGIN-GUEST"); - lightdm_greeter_login_as_guest (greeter); + notify_status ("GREETER AUTHENTICATE-GUEST"); + lightdm_greeter_authenticate_as_guest (greeter); } else if (g_key_file_get_boolean (config, "test-greeter-config", "prompt-username", NULL)) { - notify_status ("GREETER LOGIN"); - lightdm_greeter_login (greeter, NULL); + notify_status ("GREETER AUTHENTICATE"); + lightdm_greeter_authenticate (greeter, NULL); } else { @@ -55,8 +55,8 @@ connected_cb (LightDMGreeter *greeter) if (!username) return; - notify_status ("GREETER LOGIN USERNAME=%s", username); - lightdm_greeter_login (greeter, username); + notify_status ("GREETER AUTHENTICATE USERNAME=%s", username); + lightdm_greeter_authenticate (greeter, username); g_free (username); } |