diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lock-helper.c | 142 | ||||
-rw-r--r-- | src/lock-helper.h | 3 | ||||
-rw-r--r-- | src/session-service.c | 87 | ||||
-rw-r--r-- | src/users-service-dbus.c | 66 | ||||
-rw-r--r-- | src/users-service-dbus.h | 2 |
5 files changed, 94 insertions, 206 deletions
diff --git a/src/lock-helper.c b/src/lock-helper.c index f9c46cc..b38be65 100644 --- a/src/lock-helper.c +++ b/src/lock-helper.c @@ -27,13 +27,9 @@ static GMainLoop * gss_mainloop = NULL; static guint cookie = 0; static DBusGProxyCall * cookie_call = NULL; -static DBusGProxy * gdm_settings_proxy = NULL; -static gboolean gdm_auto_login = FALSE; -static const gchar * gdm_auto_login_string = "daemon/AutomaticLoginEnable"; - static gboolean is_guest = FALSE; -static gdm_autologin_cb_t gdm_autologin_cb = NULL; +void build_gss_proxy (void); /* Checks to see if there is an error and reports it. Not much else we can do. */ @@ -56,6 +52,9 @@ screensaver_unthrottle (void) { g_return_if_fail(cookie != 0); + build_gss_proxy(); + g_return_if_fail(gss_proxy != NULL); + dbus_g_proxy_begin_call(gss_proxy, "UnThrottle", unthrottle_return, NULL, NULL, @@ -103,6 +102,9 @@ screensaver_throttle (gchar * reason) screensaver_unthrottle(); } + build_gss_proxy(); + g_return_if_fail(gss_proxy != NULL); + cookie_call = dbus_g_proxy_begin_call(gss_proxy, "Throttle", throttle_return, NULL, NULL, @@ -113,28 +115,11 @@ screensaver_throttle (gchar * reason) return; } -/* Setting up a call back */ -void -lock_screen_gdm_cb_set (gdm_autologin_cb_t cb) -{ - if (gdm_autologin_cb) { - g_warning("Already had a callback, setting up a new one..."); - } - - gdm_autologin_cb = cb; - return; -} - /* This is our logic on whether the screen should be locked or not. It effects everything else. */ gboolean will_lock_screen (void) { -/* - if (gdm_auto_login) { - return FALSE; - } -*/ if (is_guest) { return FALSE; } @@ -142,95 +127,6 @@ will_lock_screen (void) return TRUE; } -/* Respond to the signal of autologin changing to see if the - setting for timed login changes. */ -static void -gdm_settings_change (DBusGProxy * proxy, const gchar * value, const gchar * old, const gchar * new, gpointer data) -{ - if (g_strcmp0(value, gdm_auto_login_string)) { - /* This is not a setting that we care about, - there is only one. */ - return; - } - g_debug("GDM Settings change: %s", new); - - if (g_strcmp0(new, "true") == 0) { - gdm_auto_login = TRUE; - } else { - gdm_auto_login = FALSE; - } - - if (gdm_autologin_cb != NULL) { - gdm_autologin_cb(); - } - - return; -} - -/* Get back the data from querying to see if there is auto - login enabled in GDM */ -static void -gdm_get_autologin (DBusGProxy * proxy, DBusGProxyCall * call, gpointer data) -{ - GError * error = NULL; - gchar * value = NULL; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_STRING, &value, G_TYPE_INVALID)) { - g_warning("Unable to get autologin setting: %s", error != NULL ? error->message : "null"); - g_error_free(error); - return; - } - - g_return_if_fail(value != NULL); - gdm_settings_change(proxy, gdm_auto_login_string, NULL, value, NULL); - - return; -} - -/* Sets up the proxy and queries for the setting to know - whether we're doing an autologin. */ -static void -build_gdm_proxy (void) -{ - g_return_if_fail(gdm_settings_proxy == NULL); - - /* Grab the system bus */ - DBusGConnection * bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL); - g_return_if_fail(bus != NULL); - - /* Get the settings proxy */ - gdm_settings_proxy = dbus_g_proxy_new_for_name_owner(bus, - "org.gnome.DisplayManager", - "/org/gnome/DisplayManager/Settings", - "org.gnome.DisplayManager.Settings", NULL); - g_return_if_fail(gdm_settings_proxy != NULL); - - /* Signal for value changed */ - dbus_g_proxy_add_signal(gdm_settings_proxy, - "ValueChanged", - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal(gdm_settings_proxy, - "ValueChanged", - G_CALLBACK(gdm_settings_change), - NULL, - NULL); - - /* Start to get the initial value */ - dbus_g_proxy_begin_call(gdm_settings_proxy, - "GetValue", - gdm_get_autologin, - NULL, - NULL, - G_TYPE_STRING, - gdm_auto_login_string, - G_TYPE_INVALID); - - return; -} - /* When the screensave go active, if we've got a mainloop running we should quit it. */ static void @@ -247,17 +143,19 @@ gss_active_changed (DBusGProxy * proxy, gboolean active, gpointer data) void build_gss_proxy (void) { - DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); - g_return_if_fail(session_bus != NULL); + if (gss_proxy == NULL) { + DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + g_return_if_fail(session_bus != NULL); - gss_proxy = dbus_g_proxy_new_for_name(session_bus, - "org.gnome.ScreenSaver", - "/", - "org.gnome.ScreenSaver"); - g_return_if_fail(gss_proxy != NULL); + gss_proxy = dbus_g_proxy_new_for_name(session_bus, + "org.gnome.ScreenSaver", + "/", + "org.gnome.ScreenSaver"); + g_return_if_fail(gss_proxy != NULL); - dbus_g_proxy_add_signal(gss_proxy, "ActiveChanged", G_TYPE_BOOLEAN, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(gss_proxy, "ActiveChanged", G_CALLBACK(gss_active_changed), NULL, NULL); + dbus_g_proxy_add_signal(gss_proxy, "ActiveChanged", G_TYPE_BOOLEAN, G_TYPE_INVALID); + dbus_g_proxy_connect_signal(gss_proxy, "ActiveChanged", G_CALLBACK(gss_active_changed), NULL, NULL); + } return; } @@ -288,6 +186,7 @@ lock_screen (DbusmenuMenuitem * mi, guint timestamp, gpointer data) return; } + build_gss_proxy(); g_return_if_fail(gss_proxy != NULL); dbus_g_proxy_call_no_reply(gss_proxy, @@ -319,9 +218,6 @@ lock_screen_setup (gpointer data) is_guest = TRUE; } - build_gdm_proxy(); - build_gss_proxy(); - return FALSE; } diff --git a/src/lock-helper.h b/src/lock-helper.h index ebcd635..37f1448 100644 --- a/src/lock-helper.h +++ b/src/lock-helper.h @@ -24,14 +24,11 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <libdbusmenu-glib/menuitem.h> -typedef void (*gdm_autologin_cb_t) (void); - void screensaver_throttle (gchar * reason); void screensaver_unthrottle (void); gboolean will_lock_screen (void); void lock_screen (DbusmenuMenuitem * mi, guint timestamp, gpointer data); gboolean lock_screen_setup (gpointer data); -void lock_screen_gdm_cb_set (gdm_autologin_cb_t cb); #endif /* LOCK_HELPER_H__ */ diff --git a/src/session-service.c b/src/session-service.c index 8306d02..e89a9a0 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -50,6 +50,9 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch" +#define LOCKDOWN_DIR "/desktop/gnome/lockdown" +#define LOCKDOWN_KEY LOCKDOWN_DIR "/disable_user_switching" + typedef struct _ActivateData ActivateData; struct _ActivateData { @@ -62,6 +65,7 @@ static DBusGProxy *gdm_proxy = NULL; static UsersServiceDbus *dbus_interface = NULL; static DbusmenuMenuitem *lock_menuitem = NULL; +static DbusmenuMenuitem *switch_menuitem = NULL; static gint count; static GList *users; @@ -80,6 +84,53 @@ static DbusmenuMenuitem * logout_mi = NULL; static DbusmenuMenuitem * restart_mi = NULL; static DbusmenuMenuitem * shutdown_mi = NULL; +static GConfClient * gconf_client = NULL; +static guint notify_lockdown_id = 0; + +static void +lockdown_changed (GConfClient *client, + guint cnxd_id, + GConfEntry *entry, + gpointer user_data) +{ + GConfValue *value = gconf_entry_get_value (entry); + const gchar *key = gconf_entry_get_key (entry); + + if (!value || !key) + return; + + if (g_strcmp0 (key, LOCKDOWN_KEY) == 0) + { + if (switch_menuitem) + { + if (gconf_value_get_bool (value)) + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + } + else + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + } + } + } +} + +static void +ensure_gconf_client (void) +{ + if (!gconf_client) + { + gconf_client = gconf_client_get_default (); + + notify_lockdown_id = gconf_client_notify_add (gconf_client, + LOCKDOWN_KEY, + lockdown_changed, + NULL, + NULL, + NULL); + } +} + /* A return from the command to sleep the system. Make sure that we unthrottle the screensaver. */ static void @@ -264,20 +315,6 @@ show_dialog (DbusmenuMenuitem * mi, guint timestamp, gchar * type) return; } -/* Respond to the signal of autologin changing to see if the - setting for timed login changes. */ -static void -gdm_settings_change (void) -{ - if (!will_lock_screen()) { - dbusmenu_menuitem_property_set_bool(lock_menuitem, DBUSMENU_MENUITEM_PROP_ENABLED, FALSE); - } else { - dbusmenu_menuitem_property_set_bool(lock_menuitem, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE); - } - - return; -} - /* Checks to see if we should show the guest suession item */ static gboolean check_guest_session (void) @@ -441,13 +478,24 @@ rebuild_items (DbusmenuMenuitem *root, if (check_new_session ()) { - mi = dbusmenu_menuitem_new (); - dbusmenu_menuitem_property_set (mi, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch User...")); - dbusmenu_menuitem_child_append (root, mi); - g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL); + ensure_gconf_client (); + + switch_menuitem = dbusmenu_menuitem_new (); + dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_LABEL, _("Switch User...")); + dbusmenu_menuitem_child_append (root, switch_menuitem); + g_signal_connect (G_OBJECT (switch_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL); + + if (gconf_client_get_bool (gconf_client, LOCKDOWN_KEY, NULL)) + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE); + } + else + { + dbusmenu_menuitem_property_set_bool (switch_menuitem, DBUSMENU_MENUITEM_PROP_VISIBLE, TRUE); + } } } - + DbusmenuMenuitem * separator = dbusmenu_menuitem_new(); dbusmenu_menuitem_property_set(separator, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_CLIENT_TYPES_SEPARATOR); dbusmenu_menuitem_child_append(root, separator); @@ -574,7 +622,6 @@ main (int argc, char ** argv) G_CALLBACK(service_shutdown), NULL); g_idle_add(lock_screen_setup, NULL); - lock_screen_gdm_cb_set(gdm_settings_change); root_menuitem = dbusmenu_menuitem_new(); g_debug("Root ID: %d", dbusmenu_menuitem_get_id(root_menuitem)); diff --git a/src/users-service-dbus.c b/src/users-service-dbus.c index e05eaf5..d377089 100644 --- a/src/users-service-dbus.c +++ b/src/users-service-dbus.c @@ -443,37 +443,6 @@ get_unix_user (UsersServiceDbus *service, return TRUE; } -static gchar * -get_session_for_user (UsersServiceDbus *service, - UserData *user) -{ - GList *l; - - if (!users_service_dbus_can_activate_session (service)) - { - return NULL; - } - - if (!user->sessions || g_list_length (user->sessions) == 0) - { - return NULL; - } - - for (l = user->sessions; l != NULL; l = l->next) - { - const char *ssid; - - ssid = l->data; - - if (ssid) - { - return g_strdup (ssid); - } - } - - return NULL; -} - static gboolean do_add_session (UsersServiceDbus *service, UserData *user, @@ -1035,17 +1004,6 @@ users_service_dbus_get_user_list (UsersServiceDbus *self) return g_hash_table_get_values (priv->users); } -/* - * XXX - TODO: Right now we switch to a session that another user - * already has open, but if there are no open sessions - * for this user we go to the login screen and the - * user at the seat must select a user and enter a - * password. This kind of defeats the purpose of - * actually selecting a username, since selecting any - * user will do the same thing here. We need to change - * it so you only need to enter a password for the - * specified user. - */ gboolean users_service_dbus_activate_user_session (UsersServiceDbus *self, UserData *user) @@ -1054,32 +1012,20 @@ users_service_dbus_activate_user_session (UsersServiceDbus *self, DBusMessage *message = NULL; DBusMessage *reply = NULL; DBusError error; - gchar *ssid; dbus_error_init (&error); - if (!priv->seat) - priv->seat = get_seat (self); - - ssid = get_session_for_user (self, user); - - if (!ssid) - { - return start_new_user_session (self, user); - } - - if (!(message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit", - priv->seat, - "org.freedesktop.ConsoleKit.Seat", - "ActivateSession"))) + if (!(message = dbus_message_new_method_call ("org.gnome.DisplayManager", + "/org/gnome/DisplayManager/LocalDisplayFactory", + "org.gnome.DisplayManager.LocalDisplayFactory", + "SwitchToUser"))) { g_warning ("failed to create new message"); return FALSE; } if (!dbus_message_append_args (message, - DBUS_TYPE_OBJECT_PATH, - &ssid, + DBUS_TYPE_STRING, &user->user_name, DBUS_TYPE_INVALID)) { g_warning ("failed to append args"); @@ -1110,6 +1056,8 @@ users_service_dbus_activate_user_session (UsersServiceDbus *self, dbus_message_unref (reply); } + dbus_error_free (&error); + return TRUE; } diff --git a/src/users-service-dbus.h b/src/users-service-dbus.h index 9ba05c9..41052f8 100644 --- a/src/users-service-dbus.h +++ b/src/users-service-dbus.h @@ -54,7 +54,7 @@ struct _UserData * got some gdm issues worked out. */ #define MINIMUM_USERS 1 -#define MAXIMUM_USERS 1 +#define MAXIMUM_USERS 7 struct _UsersServiceDbus { GObject parent; |