summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Toso <victortoso@redhat.com>2016-04-21 11:29:44 +0200
committerVictor Toso <victortoso@redhat.com>2016-05-04 09:23:34 +0200
commit49c421a82cebeeb47f268d57d30384e650734ae9 (patch)
treedf69f9b4f9ea65358bc8cef614c750669a04253a
parent4c0e9c965e059ba2b884e66f0402e061a9d886a6 (diff)
console-kit: implement check for session type
Implementing the function that was introduced in previous commit: session_info_is_user() In console-kit we can gather the session type with GetSessionType api from Session interface. This function is not well documented but seems reliable enough as GDM was using it [0] [0] session_is_login_window on gui/simple-greeter/gdm-user-manager.c Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1323640 Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
-rw-r--r--src/console-kit.c69
1 files changed, 67 insertions, 2 deletions
diff --git a/src/console-kit.c b/src/console-kit.c
index 489dd61..024a260 100644
--- a/src/console-kit.c
+++ b/src/console-kit.c
@@ -505,8 +505,73 @@ gboolean session_info_session_is_locked(struct session_info *info)
return locked;
}
+/* This function should only be called after session_info_get_active_session
+ * in order to verify if active session belongs to user (non greeter) */
gboolean session_info_is_user(struct session_info *info)
{
- /* TODO */
- return TRUE;
+ DBusError error;
+ DBusMessage *message = NULL;
+ DBusMessage *reply = NULL;
+ gchar *session_type = NULL;
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail (info != NULL, TRUE);
+ g_return_val_if_fail (info->connection != NULL, TRUE);
+ g_return_val_if_fail (info->active_session != NULL, TRUE);
+
+ message = dbus_message_new_method_call(INTERFACE_CONSOLE_KIT,
+ info->active_session,
+ INTERFACE_CONSOLE_KIT_SESSION,
+ "GetSessionType");
+ if (message == NULL) {
+ syslog(LOG_ERR,
+ "(console-kit) Unable to create dbus message for GetSessionType");
+ return TRUE;
+ }
+
+ dbus_error_init(&error);
+ reply = dbus_connection_send_with_reply_and_block(info->connection,
+ message,
+ -1,
+ &error);
+ if (reply == NULL || dbus_error_is_set(&error)) {
+ if (dbus_error_is_set(&error)) {
+ syslog(LOG_ERR, "GetSessionType failed: %s", error.message);
+ dbus_error_free(&error);
+ } else
+ syslog(LOG_ERR, "GetSessionType failed");
+ goto exit;
+ }
+
+ dbus_error_init(&error);
+ if (!dbus_message_get_args(reply,
+ &error,
+ DBUS_TYPE_STRING, &session_type,
+ DBUS_TYPE_INVALID)) {
+ if (dbus_error_is_set(&error)) {
+ syslog(LOG_ERR,
+ "(console-kit) fail to get session-type from reply: %s",
+ error.message);
+ dbus_error_free(&error);
+ } else {
+ syslog(LOG_ERR, "(console-kit) fail to get session-type from reply");
+ }
+ session_type = NULL;
+ goto exit;
+ }
+
+ /* Empty session_type means user */
+ if (info->verbose)
+ syslog(LOG_DEBUG, "(console-kit) session-type is '%s'", session_type);
+
+ ret = (g_strcmp0 (session_type, "LoginWindow") != 0);
+
+exit:
+ if (reply != NULL) {
+ dbus_message_unref(reply);
+ }
+ if (message != NULL) {
+ dbus_message_unref(message);
+ }
+ return ret;
}