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
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 = \
<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>
-<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
<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
<SUBSECTION Private>
</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
</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
<SECTION>
<FILE>greeter</FILE>
-<TITLE>LightDMGreeter</TITLE>
+<TITLE>Greeter Interface</TITLE>
connected
autologin_timer_expired
show_message
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
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
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
<!-- ##### 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>
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)
@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>
@Returns:
-<!-- ##### FUNCTION lightdm_greeter_cancel_timed_login ##### -->
+<!-- ##### FUNCTION lightdm_greeter_cancel_autologin ##### -->
<para>
</para>
@greeter:
-<!-- ##### FUNCTION lightdm_greeter_login ##### -->
+<!-- ##### FUNCTION lightdm_greeter_authenticate ##### -->
<para>
</para>
@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>
@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:
-
-
<!-- ##### SECTION Title ##### -->
-LightDMLanguage
+Languages
<!-- ##### SECTION Short_Description ##### -->
-Information about an available language
+Get information on available languges
<!-- ##### SECTION Long_Description ##### -->
<para>
<!-- ##### SECTION Image ##### -->
+<!-- ##### FUNCTION lightdm_get_languages ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_get_language ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
<!-- ##### FUNCTION lightdm_language_get_code ##### -->
<para>
<!-- ##### SECTION Title ##### -->
-LightDMLayout
+Keyboard Layouts
<!-- ##### SECTION Short_Description ##### -->
-Information about an available keyboard layout
+Control the keyboard layout
<!-- ##### SECTION Long_Description ##### -->
<para>
<!-- ##### 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>
--- /dev/null
+<!-- ##### 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:
+
+
<!-- ##### SECTION Title ##### -->
-LightDMSession
+User Sessions
<!-- ##### SECTION Short_Description ##### -->
-Information about an available session
+Choose the session to use
<!-- ##### SECTION Long_Description ##### -->
<para>
<!-- ##### SECTION Image ##### -->
+<!-- ##### FUNCTION lightdm_get_sessions ##### -->
+<para>
+
+</para>
+
+@void:
+@Returns:
+
+
<!-- ##### FUNCTION lightdm_session_get_key ##### -->
<para>
--- /dev/null
+<!-- ##### 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:
+
+
<!-- ##### 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>
@user:
-<!-- ##### FUNCTION lightdm_user_get_name ##### -->
+<!-- ##### FUNCTION lightdm_user_get_display_name ##### -->
<para>
</para>
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_real_name ##### -->
+<!-- ##### FUNCTION lightdm_user_get_home_directory ##### -->
<para>
</para>
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_display_name ##### -->
+<!-- ##### FUNCTION lightdm_user_get_image ##### -->
<para>
</para>
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_home_directory ##### -->
+<!-- ##### FUNCTION lightdm_user_get_language ##### -->
<para>
</para>
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_image ##### -->
+<!-- ##### FUNCTION lightdm_user_get_layout ##### -->
<para>
</para>
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_language ##### -->
+<!-- ##### FUNCTION lightdm_user_get_logged_in ##### -->
<para>
</para>
@Returns:
-<!-- ##### FUNCTION lightdm_user_get_layout ##### -->
+<!-- ##### FUNCTION lightdm_user_get_name ##### -->
+<para>
+
+</para>
+
+@user:
+@Returns:
+
+
+<!-- ##### FUNCTION lightdm_user_get_real_name ##### -->
<para>
</para>
@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:
#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;
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);
}
}
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);
}
}
{
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);
void
suspend_cb (GtkWidget *widget, LightDMGreeter *greeter)
{
- lightdm_greeter_suspend (greeter);
+ lightdm_suspend ();
}
void hibernate_cb (GtkWidget *widget, LightDMGreeter *greeter);
void
hibernate_cb (GtkWidget *widget, LightDMGreeter *greeter)
{
- lightdm_greeter_hibernate (greeter);
+ lightdm_hibernate ();
}
static void
center_window (GTK_WINDOW (dialog));
if (gtk_dialog_run (GTK_DIALOG (dialog)))
- lightdm_greeter_restart (greeter);
+ lightdm_restart ();
gtk_widget_destroy (dialog);
}
center_window (GTK_WINDOW (dialog));
if (gtk_dialog_run (GTK_DIALOG (dialog)))
- lightdm_greeter_shutdown (greeter);
+ lightdm_shutdown ();
gtk_widget_destroy (dialog);
}
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)
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)
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"));
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;
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());
}
}
-SUBDIRS = lightdm
-
lib_LTLIBRARIES = liblightdm-gobject-1.la
CLEANFILES =
$(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
#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,
PROP_AUTHENTICATION_USER,
PROP_IN_AUTHENTICATION,
PROP_IS_AUTHENTICATED,
- PROP_CAN_SUSPEND,
- PROP_CAN_HIBERNATE,
- PROP_CAN_RESTART,
- PROP_CAN_SHUTDOWN
};
enum {
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);
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
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;
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);
}
lightdm_greeter_connect_to_server (LightDMGreeter *greeter)
{
LightDMGreeterPrivate *priv;
- GError *error = NULL;
const gchar *fd;
guint8 message[MAX_MESSAGE_LENGTH];
gsize offset = 0;
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");
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");
return TRUE;
}
-/**
- * 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
}
/**
- * 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;
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];
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];
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);
}
}
/**
- * 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)
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)
{
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
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;
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;
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);
object_class->get_property = lightdm_greeter_get_property;
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",
"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:
* license.
*/
+#include <string.h>
#include <locale.h>
#include <langinfo.h>
#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
* license.
*/
+#include <libxklavier/xklavier.h>
+
#include "lightdm/layout.h"
enum {
#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
[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; };
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; }
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,
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; }
--- /dev/null
+/*
+ * 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_ */
+++ /dev/null
-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
#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())
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);
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);
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_ */
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);
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);
--- /dev/null
+/*
+ * 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_ */
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);
--- /dev/null
+/*
+ * 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_ */
+++ /dev/null
-/*
- * 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_ */
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))
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);
--- /dev/null
+/*
+ * 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);
+}
* license.
*/
+#include <string.h>
+#include <gio/gdesktopappinfo.h>
+
#include "lightdm/session.h"
enum {
#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
--- /dev/null
+/*
+ * 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;
+}
}
/**
- * 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);
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);
* 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
{
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:
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;
}
/**
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;
}
/**
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
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;
}
/**
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;
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
load_dmrc (user);
- return GET_PRIVATE (user)->language;
+ return GET_USER_PRIVATE (user)->language;
}
/**
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
load_dmrc (user);
- return GET_PRIVATE (user)->layout;
+ return GET_USER_PRIVATE (user)->layout;
}
/**
{
g_return_val_if_fail (LIGHTDM_IS_USER (user), NULL);
load_dmrc (user);
- return GET_PRIVATE (user)->session;
+ return GET_USER_PRIVATE (user)->session;
}
/**
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 ("");
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:
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:
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);
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",
*
* 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,
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());
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
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;
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();
}
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
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;
GREETER CONNECTED-TO-DAEMON
# Login as guest
-GREETER LOGIN-GUEST
+GREETER AUTHENTICATE-GUEST
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE
# Cleanup
GREETER CONNECTED-TO-DAEMON
# Login as guest
-GREETER LOGIN-GUEST
+GREETER AUTHENTICATE-GUEST
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
GREETER SESSION-FAILED
GREETER CONNECTED-TO-DAEMON
# Login as guest
-GREETER LOGIN-GUEST
+GREETER AUTHENTICATE-GUEST
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=FALSE
# Cleanup
GREETER CONNECTED-TO-DAEMON
# Login as guest
-GREETER LOGIN-GUEST
+GREETER AUTHENTICATE-GUEST
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
GREETER SESSION-FAILED
GREETER CONNECTED-TO-DAEMON
# Login as guest
-GREETER LOGIN-GUEST
+GREETER AUTHENTICATE-GUEST
GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
GREETER QUIT
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
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
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:"
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
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
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
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
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
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
GREETER CONNECTED-TO-DAEMON
# Alice is automatically selected
-GREETER LOGIN-SELECTED USERNAME=alice
+GREETER AUTHENTICATE-SELECTED USERNAME=alice
GREETER SHOW-PROMPT TEXT="Password:"
# Cleanup
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
/* 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;
}
{
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
{
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);
}