Commit 4979786d authored by William Jon McCann's avatar William Jon McCann Committed by William Jon McCann

Add support for a real automatic login. Make automatic and timed login

2008-10-23  William Jon McCann  <jmccann@redhat.com>

	* daemon/gdm-display.c (gdm_display_real_get_timed_login_details),
	(gdm_display_get_timed_login_details), (gdm_display_real_unmanage),
	(gdm_display_class_init):
	* daemon/gdm-display.h:
	* daemon/gdm-display.xml:
	* daemon/gdm-simple-slave.c (greeter_reset_timeout),
	(on_session_setup_failed), (on_session_authentication_failed),
	(on_session_authorized), (on_session_authorization_failed),
	(stop_greeter), (start_session_timeout), (on_session_accredited),
	(on_session_accreditation_failed), (on_session_info),
	(on_session_opened), (on_session_selected_user_changed),
	(on_default_language_name_changed),
	(on_default_layout_name_changed),
	(on_default_session_name_changed), (start_greeter),
	(idle_connect_to_display), (gdm_simple_slave_stop):
	* daemon/gdm-slave.c (gdm_slave_get_timed_login_details):
	* daemon/gdm-slave.h:
	* daemon/gdm-static-display.c (gdm_static_display_unmanage),
	(gdm_static_display_get_timed_login_details),
	(gdm_static_display_class_init), (gdm_static_display_init):
	* daemon/gdm-transient-display.c
	(gdm_transient_display_get_timed_login_details),
	(gdm_transient_display_class_init):
	* daemon/gdm-xdmcp-display.c
	(gdm_xdmcp_display_get_timed_login_details),
	(gdm_xdmcp_display_class_init):
	Add support for a real automatic login.  Make
	automatic and timed login only work the first time a display
	is managed.  Also prevent automatic and timed login
	from working on transient and xdmcp displays.


svn path=/trunk/; revision=6582
parent a467db48
2008-10-23 William Jon McCann <jmccann@redhat.com>
* daemon/gdm-display.c (gdm_display_real_get_timed_login_details),
(gdm_display_get_timed_login_details), (gdm_display_real_unmanage),
(gdm_display_class_init):
* daemon/gdm-display.h:
* daemon/gdm-display.xml:
* daemon/gdm-simple-slave.c (greeter_reset_timeout),
(on_session_setup_failed), (on_session_authentication_failed),
(on_session_authorized), (on_session_authorization_failed),
(stop_greeter), (start_session_timeout), (on_session_accredited),
(on_session_accreditation_failed), (on_session_info),
(on_session_opened), (on_session_selected_user_changed),
(on_default_language_name_changed),
(on_default_layout_name_changed),
(on_default_session_name_changed), (start_greeter),
(idle_connect_to_display), (gdm_simple_slave_stop):
* daemon/gdm-slave.c (gdm_slave_get_timed_login_details):
* daemon/gdm-slave.h:
* daemon/gdm-static-display.c (gdm_static_display_unmanage),
(gdm_static_display_get_timed_login_details),
(gdm_static_display_class_init), (gdm_static_display_init):
* daemon/gdm-transient-display.c
(gdm_transient_display_get_timed_login_details),
(gdm_transient_display_class_init):
* daemon/gdm-xdmcp-display.c
(gdm_xdmcp_display_get_timed_login_details),
(gdm_xdmcp_display_class_init):
Add support for a real automatic login. Make
automatic and timed login only work the first time a display
is managed. Also prevent automatic and timed login
from working on transient and xdmcp displays.
2008-10-22 William Jon McCann <jmccann@redhat.com>
* gui/user-switch-applet/gdm-entry-menu-item.c
......
......@@ -37,6 +37,9 @@
#include "gdm-display-glue.h"
#include "gdm-display-access-file.h"
#include "gdm-settings-direct.h"
#include "gdm-settings-keys.h"
#include "gdm-slave-proxy.h"
static guint32 display_serial = 1;
......@@ -299,6 +302,90 @@ gdm_display_set_slave_bus_name (GdmDisplay *display,
return ret;
}
static void
gdm_display_real_get_timed_login_details (GdmDisplay *display,
gboolean *enabledp,
char **usernamep,
int *delayp)
{
gboolean res;
gboolean enabled;
int delay;
char *username;
enabled = FALSE;
username = NULL;
delay = 0;
res = gdm_settings_direct_get_boolean (GDM_KEY_AUTO_LOGIN_ENABLE, &enabled);
if (enabled) {
res = gdm_settings_direct_get_string (GDM_KEY_AUTO_LOGIN_USER, &username);
}
if (enabled && username != NULL && username[0] != '\0') {
goto out;
}
g_free (username);
username = NULL;
enabled = FALSE;
res = gdm_settings_direct_get_boolean (GDM_KEY_TIMED_LOGIN_ENABLE, &enabled);
if (! enabled) {
goto out;
}
res = gdm_settings_direct_get_string (GDM_KEY_TIMED_LOGIN_USER, &username);
if (username == NULL || username[0] == '\0') {
enabled = FALSE;
g_free (username);
username = NULL;
/* FIXME: check if a valid username? */
goto out;
}
delay = 0;
res = gdm_settings_direct_get_int (GDM_KEY_TIMED_LOGIN_DELAY, &delay);
if (delay <= 0) {
/* we don't allow the timed login to have a zero delay */
delay = 10;
}
out:
if (enabledp != NULL) {
*enabledp = enabled;
}
if (usernamep != NULL) {
*usernamep = username;
} else {
g_free (username);
}
if (delayp != NULL) {
*delayp = delay;
}
}
gboolean
gdm_display_get_timed_login_details (GdmDisplay *display,
gboolean *enabled,
char **username,
int *delay,
GError **error)
{
g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
GDM_DISPLAY_GET_CLASS (display)->get_timed_login_details (display, enabled, username, delay);
g_debug ("GdmSlave: Got timed login details for display %s: %d '%s' %d",
display->priv->x11_display_name,
*enabled,
*username,
*delay);
return TRUE;
}
static gboolean
gdm_display_real_remove_user_authorization (GdmDisplay *display,
const char *username,
......@@ -579,7 +666,7 @@ gdm_display_real_unmanage (GdmDisplay *display)
}
elapsed = g_timer_elapsed (display->priv->slave_timer, NULL);
if (elapsed < 10) {
if (elapsed < 3) {
g_warning ("GdmDisplay: display lasted %lf seconds", elapsed);
_gdm_display_set_status (display, GDM_DISPLAY_FAILED);
} else {
......@@ -897,6 +984,7 @@ gdm_display_class_init (GdmDisplayClass *klass)
klass->add_user_authorization = gdm_display_real_add_user_authorization;
klass->remove_user_authorization = gdm_display_real_remove_user_authorization;
klass->set_slave_bus_name = gdm_display_real_set_slave_bus_name;
klass->get_timed_login_details = gdm_display_real_get_timed_login_details;
klass->manage = gdm_display_real_manage;
klass->finish = gdm_display_real_finish;
klass->unmanage = gdm_display_real_unmanage;
......
......@@ -68,6 +68,10 @@ typedef struct
gboolean (*manage) (GdmDisplay *display);
gboolean (*finish) (GdmDisplay *display);
gboolean (*unmanage) (GdmDisplay *display);
void (*get_timed_login_details) (GdmDisplay *display,
gboolean *enabled,
char **username,
int *delay);
} GdmDisplayClass;
typedef enum
......@@ -110,6 +114,11 @@ gboolean gdm_display_get_seat_id (GdmDisplay *disp
gboolean gdm_display_is_local (GdmDisplay *display,
gboolean *local,
GError **error);
gboolean gdm_display_get_timed_login_details (GdmDisplay *display,
gboolean *enabled,
char **username,
int *delay,
GError **error);
/* exported but protected */
gboolean gdm_display_get_x11_cookie (GdmDisplay *display,
......
......@@ -35,5 +35,10 @@
<method name="SetSlaveBusName">
<arg name="name" direction="in" type="s"/>
</method>
<method name="GetTimedLoginDetails">
<arg name="enabled" direction="out" type="b"/>
<arg name="username" direction="out" type="s"/>
<arg name="delay" direction="out" type="i"/>
</method>
</interface>
</node>
......@@ -74,9 +74,10 @@ struct GdmSimpleSlavePrivate
guint connection_attempts;
GdmServer *server;
GdmSessionDirect *session;
GdmGreeterServer *greeter_server;
GdmGreeterSession *greeter;
GdmSessionDirect *session;
guint start_session_when_ready : 1;
guint waiting_to_start_session : 1;
......@@ -93,6 +94,7 @@ static void gdm_simple_slave_finalize (GObject *object);
G_DEFINE_TYPE (GdmSimpleSlave, gdm_simple_slave, GDM_TYPE_SLAVE)
static void create_new_session (GdmSimpleSlave *slave);
static void start_greeter (GdmSimpleSlave *slave);
static void
on_session_started (GdmSession *session,
......@@ -176,8 +178,14 @@ static gboolean
greeter_reset_timeout (GdmSimpleSlave *slave)
{
g_debug ("GdmSimpleSlave: resetting greeter");
gdm_greeter_server_reset (slave->priv->greeter_server);
reset_session (slave);
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_reset (slave->priv->greeter_server);
reset_session (slave);
} else {
start_greeter (slave);
create_new_session (slave);
}
slave->priv->greeter_reset_id = 0;
return FALSE;
}
......@@ -204,7 +212,10 @@ on_session_setup_failed (GdmSession *session,
const char *message,
GdmSimpleSlave *slave)
{
gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to initialize login system"));
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_problem (slave->priv->greeter_server,
_("Unable to initialize login system"));
}
destroy_session (slave);
queue_greeter_reset (slave);
......@@ -237,7 +248,10 @@ on_session_authentication_failed (GdmSession *session,
const char *message,
GdmSimpleSlave *slave)
{
gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to authenticate user"));
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_problem (slave->priv->greeter_server,
_("Unable to authenticate user"));
}
destroy_session (slave);
queue_greeter_reset (slave);
}
......@@ -274,8 +288,13 @@ static void
on_session_authorized (GdmSession *session,
GdmSimpleSlave *slave)
{
gdm_greeter_server_user_authorized (slave->priv->greeter_server);
gdm_simple_slave_accredit_when_ready (slave);
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_user_authorized (slave->priv->greeter_server);
gdm_simple_slave_accredit_when_ready (slave);
} else {
slave->priv->start_session_when_ready = TRUE;
gdm_simple_slave_accredit_when_ready (slave);
}
}
static void
......@@ -283,7 +302,10 @@ on_session_authorization_failed (GdmSession *session,
const char *message,
GdmSimpleSlave *slave)
{
gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to authorize user"));
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_problem (slave->priv->greeter_server,
_("Unable to authorize user"));
}
destroy_session (slave);
queue_greeter_reset (slave);
......@@ -306,6 +328,25 @@ try_migrate_session (GdmSimpleSlave *slave)
return res;
}
static void
stop_greeter (GdmSimpleSlave *slave)
{
g_debug ("GdmSimpleSlave: Stopping greeter");
if (slave->priv->greeter == NULL) {
g_debug ("GdmSimpleSlave: No greeter running");
return;
}
/* Run the PostLogin script. gdmslave suspends until script has terminated */
gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/PostLogin", GDM_USERNAME);
gdm_welcome_session_stop (GDM_WELCOME_SESSION (slave->priv->greeter));
gdm_greeter_server_stop (slave->priv->greeter_server);
g_object_unref (slave->priv->greeter);
slave->priv->greeter = NULL;
}
static gboolean
start_session_timeout (GdmSimpleSlave *slave)
......@@ -330,8 +371,7 @@ start_session_timeout (GdmSimpleSlave *slave)
goto out;
}
gdm_welcome_session_stop (GDM_WELCOME_SESSION (slave->priv->greeter));
gdm_greeter_server_stop (slave->priv->greeter_server);
stop_greeter (slave);
auth_file = NULL;
add_user_authorization (slave, &auth_file);
......@@ -365,9 +405,6 @@ on_session_accredited (GdmSession *session,
GdmSimpleSlave *slave)
{
queue_start_session (slave);
/* Run the PostLogin script. gdmslave suspends until script has terminated */
gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/PostLogin", GDM_USERNAME);
}
static void
......@@ -384,7 +421,10 @@ on_session_accreditation_failed (GdmSession *session,
/* If we switched to another session we don't care if
accreditation fails */
if (! migrated) {
gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable establish credentials"));
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_problem (slave->priv->greeter_server,
_("Unable establish credentials"));
}
}
/* We don't stop the slave here after migrating because
......@@ -402,7 +442,9 @@ on_session_info (GdmSession *session,
GdmSimpleSlave *slave)
{
g_debug ("GdmSimpleSlave: Info: %s", text);
gdm_greeter_server_info (slave->priv->greeter_server, text);
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_info (slave->priv->greeter_server, text);
}
}
static void
......@@ -433,64 +475,39 @@ on_session_secret_info_query (GdmSession *session,
gdm_greeter_server_secret_info_query (slave->priv->greeter_server, text);
}
static gboolean
get_timed_login_details (GdmSimpleSlave *slave,
char **username,
int *delay)
{
gboolean enabled;
gboolean res;
enabled = FALSE;
res = gdm_settings_client_get_boolean (GDM_KEY_AUTO_LOGIN_ENABLE, &enabled);
if (enabled) {
*username = NULL;
res = gdm_settings_client_get_string (GDM_KEY_AUTO_LOGIN_USER, username);
}
if (enabled && *username != NULL)
{
*delay = 0;
return TRUE;
}
*username = NULL;
enabled = FALSE;
res = gdm_settings_client_get_boolean (GDM_KEY_TIMED_LOGIN_ENABLE, &enabled);
if (! enabled) {
return FALSE;
}
res = gdm_settings_client_get_string (GDM_KEY_TIMED_LOGIN_USER, username);
if (username == NULL) {
return FALSE;
}
res = gdm_settings_client_get_int (GDM_KEY_TIMED_LOGIN_DELAY, delay);
return TRUE;
}
static void
on_session_opened (GdmSession *session,
GdmSimpleSlave *slave)
{
gboolean res;
gboolean enabled;
char *username;
int delay;
g_debug ("GdmSimpleSlave: session opened");
res = gdm_greeter_server_ready (slave->priv->greeter_server);
if (! res) {
g_warning ("Unable to send ready");
if (slave->priv->greeter_server != NULL) {
res = gdm_greeter_server_ready (slave->priv->greeter_server);
if (! res) {
g_warning ("Unable to send ready");
}
}
if (get_timed_login_details (slave, &username, &delay)) {
enabled = FALSE;
gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, &username, &delay);
if (! enabled) {
return;
}
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_request_timed_login (slave->priv->greeter_server, username, delay);
g_free (username);
} else {
g_debug ("GdmSimpleSlave: begin auto login for user '%s'", username);
gdm_session_setup_for_user (GDM_SESSION (slave->priv->session),
"gdm-autologin",
username);
}
g_free (username);
}
static void
......@@ -500,7 +517,9 @@ on_session_selected_user_changed (GdmSession *session,
{
g_debug ("GdmSimpleSlave: Selected user changed: %s", text);
gdm_greeter_server_selected_user_changed (slave->priv->greeter_server, text);
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_selected_user_changed (slave->priv->greeter_server, text);
}
}
static void
......@@ -510,7 +529,9 @@ on_default_language_name_changed (GdmSession *session,
{
g_debug ("GdmSimpleSlave: Default language name changed: %s", text);
gdm_greeter_server_default_language_name_changed (slave->priv->greeter_server, text);
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_default_language_name_changed (slave->priv->greeter_server, text);
}
}
static void
......@@ -520,7 +541,9 @@ on_default_layout_name_changed (GdmSession *session,
{
g_debug ("GdmSimpleSlave: Default layout name changed: %s", text);
gdm_greeter_server_default_layout_name_changed (slave->priv->greeter_server, text);
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_default_layout_name_changed (slave->priv->greeter_server, text);
}
}
static void
......@@ -530,7 +553,9 @@ on_default_session_name_changed (GdmSession *session,
{
g_debug ("GdmSimpleSlave: Default session name changed: %s", text);
gdm_greeter_server_default_session_name_changed (slave->priv->greeter_server, text);
if (slave->priv->greeter_server != NULL) {
gdm_greeter_server_default_session_name_changed (slave->priv->greeter_server, text);
}
}
static void
......@@ -828,7 +853,7 @@ setup_server (GdmSimpleSlave *slave)
}
static void
run_greeter (GdmSimpleSlave *slave)
start_greeter (GdmSimpleSlave *slave)
{
gboolean display_is_local;
char *display_id;
......@@ -871,8 +896,6 @@ run_greeter (GdmSimpleSlave *slave)
/* Run the init script. gdmslave suspends until script has terminated */
gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/Init", GDM_USERNAME);
create_new_session (slave);
slave->priv->greeter_server = gdm_greeter_server_new (display_id);
g_signal_connect (slave->priv->greeter_server,
"begin-auto-login",
......@@ -971,10 +994,22 @@ idle_connect_to_display (GdmSimpleSlave *slave)
res = gdm_slave_connect_to_x11_display (GDM_SLAVE (slave));
if (res) {
gboolean enabled;
int delay;
/* FIXME: handle wait-for-go */
setup_server (slave);
run_greeter (slave);
delay = 0;
enabled = FALSE;
gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, NULL, &delay);
if (! enabled || delay > 0) {
start_greeter (slave);
create_new_session (slave);
} else {
reset_session (slave);
}
} else {
if (slave->priv->connection_attempts >= MAX_CONNECT_ATTEMPTS) {
g_warning ("Unable to connect to display after %d tries - bailing out", slave->priv->connection_attempts);
......@@ -1099,9 +1134,7 @@ gdm_simple_slave_stop (GdmSlave *slave)
GDM_SLAVE_CLASS (gdm_simple_slave_parent_class)->stop (slave);
if (GDM_SIMPLE_SLAVE (slave)->priv->greeter != NULL) {
gdm_welcome_session_stop (GDM_WELCOME_SESSION (GDM_SIMPLE_SLAVE (slave)->priv->greeter));
g_object_unref (GDM_SIMPLE_SLAVE (slave)->priv->greeter);
GDM_SIMPLE_SLAVE (slave)->priv->greeter = NULL;
stop_greeter (GDM_SIMPLE_SLAVE (slave));
}
if (GDM_SIMPLE_SLAVE (slave)->priv->session != NULL) {
......
......@@ -701,6 +701,60 @@ gdm_slave_add_user_authorization (GdmSlave *slave,
return res;
}
gboolean
gdm_slave_get_timed_login_details (GdmSlave *slave,
gboolean *enabledp,
char **usernamep,
int *delayp)
{
GError *error;
gboolean res;
gboolean enabled;
char *username;
int delay;
username = NULL;
enabled = FALSE;
delay = 0;
g_debug ("GdmSlave: Requesting timed login details");
error = NULL;
res = dbus_g_proxy_call (slave->priv->display_proxy,
"GetTimedLoginDetails",
&error,
G_TYPE_INVALID,
G_TYPE_BOOLEAN, &enabled,
G_TYPE_STRING, &username,
G_TYPE_INT, &delay,
G_TYPE_INVALID);
if (! res) {
if (error != NULL) {
g_warning ("Failed to get timed login details: %s", error->message);
g_error_free (error);
} else {
g_warning ("Failed to get timed login details");
}
} else {
g_debug ("GdmSlave: Got timed login details: %d %s %d", enabled, username, delay);
}
if (usernamep != NULL) {
*usernamep = username;
} else {
g_free (username);
}
if (enabledp != NULL) {
*enabledp = enabled;
}
if (delayp != NULL) {
*delayp = delay;
}
return res;
}
static gboolean
_get_uid_and_gid_for_user (const char *username,
uid_t *uid,
......
......@@ -60,6 +60,11 @@ gboolean gdm_slave_stop (GdmSlave *slave);
char * gdm_slave_get_primary_session_id_for_user (GdmSlave *slave,
const char *username);
gboolean gdm_slave_get_timed_login_details (GdmSlave *slave,
gboolean *enabled,
char **username,
int *delay);
gboolean gdm_slave_add_user_authorization (GdmSlave *slave,
const char *username,
char **filename);
......
......@@ -45,7 +45,7 @@
struct GdmStaticDisplayPrivate
{
gpointer dummy;
gboolean enable_timed_login;
};
enum {
......@@ -121,6 +121,9 @@ gdm_static_display_unmanage (GdmDisplay *display)
{
g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
/* Only allow timed/automatic login once */
GDM_STATIC_DISPLAY (display)->priv->enable_timed_login = FALSE;
GDM_DISPLAY_CLASS (gdm_static_display_parent_class)->unmanage (display);
return TRUE;
......@@ -152,6 +155,21 @@ gdm_static_display_get_property (GObject *object,
}
}
static void
gdm_static_display_get_timed_login_details (GdmDisplay *display,
gboolean *enabledp,
char **usernamep,
int *delayp)
{
if (GDM_STATIC_DISPLAY (display)->priv->enable_timed_login) {
GDM_DISPLAY_CLASS (gdm_static_display_parent_class)->get_timed_login_details (display, enabledp, usernamep, delayp);
} else {
*enabledp = FALSE;
*usernamep = g_strdup ("");
*delayp = 0;
}
}
static void
gdm_static_display_class_init (GdmStaticDisplayClass *klass)
{
......@@ -168,6 +186,7 @@ gdm_static_display_class_init (GdmStaticDisplayClass *klass)
display_class->manage = gdm_static_display_manage;
display_class->finish = gdm_static_display_finish;
display_class->unmanage = gdm_static_display_unmanage;
display_class->get_timed_login_details = gdm_static_display_get_timed_login_details;
g_type_class_add_private (klass, sizeof (GdmStaticDisplayPrivate));
......@@ -179,6 +198,8 @@ gdm_static_display_init (GdmStaticDisplay *static_display)
{
static_display->priv = GDM_STATIC_DISPLAY_GET_PRIVATE (static_display);
static_display->priv->enable_timed_login = TRUE;
}
static void
......
......@@ -144,6 +144,17 @@ gdm_transient_display_get_property (GObject *object,
}
}
static void
gdm_transient_display_get_timed_login_details (GdmDisplay *display,
gboolean *enabledp,
char **usernamep,
int *delayp)
{
*enabledp = FALSE;
*usernamep = g_strdup ("");
*delayp = 0;
}
static void
gdm_transient_display_class_init (GdmTransientDisplayClass *klass)
{
......@@ -160,6 +171,7 @@ gdm_transient_display_class_init (GdmTransientDisplayClass *klass)
display_class->manage = gdm_transient_display_manage;
display_class->finish = gdm_transient_display_finish;
display_class->unmanage = gdm_transient_display_unmanage;
display_class->get_timed_login_details = gdm_transient_display_get_timed_login_details;
g_type_class_add_private (klass, sizeof (GdmTransientDisplayPrivate));
......
......@@ -181,6 +181,17 @@ gdm_xdmcp_display_get_property (GObject *object,
}
}
static void
gdm_xdmcp_display_get_timed_login_details (GdmDisplay *display,
gboolean *enabledp,
char **usernamep,
int *delayp)
{
*enabledp = FALSE;
*usernamep = g_strdup ("");
*delayp = 0;
}
static void
gdm_xdmcp_display_class_init (GdmXdmcpDisplayClass *klass)
{
......@@ -196,6 +207,7 @@ gdm_xdmcp_display_class_init (GdmXdmcpDisplayClass *klass)
display_class->remove_user_authorization = gdm_xdmcp_display_remove_user_authorization;
display_class->manage = gdm_xdmcp_display_manage;
display_class->unmanage = gdm_xdmcp_display_unmanage;
display_class->get_timed_login_details = gdm_xdmcp_display_get_timed_login_details;
g_type_class_add_private (klass, sizeof (GdmXdmcpDisplayPrivate));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment