Blame as-fate318433-prevent-same-account-multi-logins.patch

Bernhard M. Wiedemann 1defcc
Index: accountsservice-0.6.40/src/libaccountsservice/act-user-manager.c
Bernhard M. Wiedemann 1defcc
===================================================================
Bernhard M. Wiedemann 1defcc
--- accountsservice-0.6.40.orig/src/libaccountsservice/act-user-manager.c
Bernhard M. Wiedemann 1defcc
+++ accountsservice-0.6.40/src/libaccountsservice/act-user-manager.c
Bernhard M. Wiedemann 1defcc
@@ -751,8 +751,17 @@ _get_systemd_seat_id (ActUserManager *ma
Bernhard M. Wiedemann 1defcc
         char *seat_id;
Bernhard M. Wiedemann 1defcc
 
Bernhard M. Wiedemann 1defcc
         res = sd_session_get_seat (NULL, &seat_id);
Bernhard M. Wiedemann 1defcc
-
Bernhard M. Wiedemann 1defcc
-        if (res == -ENOENT) {
Bernhard M. Wiedemann 1defcc
+        /**
Bernhard M. Wiedemann 1defcc
+         * NOTE: There is no -ENOENT errnum for `sd_session_get_seat`. This
Bernhard M. Wiedemann 1defcc
+         * possibly an upstream bug. There are also other dubious occurrences of
Bernhard M. Wiedemann 1defcc
+         * -ENOENT within the source.
Bernhard M. Wiedemann 1defcc
+         *
Bernhard M. Wiedemann 1defcc
+         * Change to -ENODATA as this is the normal return for non-seated
Bernhard M. Wiedemann 1defcc
+         * session like VNC ones and should not report errors. O/w no user
Bernhard M. Wiedemann 1defcc
+         * sessions will be analyzed.
Bernhard M. Wiedemann 1defcc
+         */
Bernhard M. Wiedemann 1defcc
+        /* see https://www.freedesktop.org/software/systemd/man/sd_session_is_active.html */
Bernhard M. Wiedemann 1defcc
+        if (res == -ENODATA) {
Bernhard M. Wiedemann 1defcc
                 seat_id = NULL;
Bernhard M. Wiedemann 1defcc
         } else if (res < 0) {
Bernhard M. Wiedemann 1defcc
                 g_warning ("Could not get current seat: %s",
Bernhard M. Wiedemann 1defcc
@@ -1700,12 +1709,22 @@ maybe_add_new_session (ActUserManagerNew
Bernhard M. Wiedemann 1defcc
         if (new_session->x11_display == NULL) {
Bernhard M. Wiedemann 1defcc
                 g_debug ("AcUserManager: (mostly) ignoring session '%s' since it's not graphical",
Bernhard M. Wiedemann 1defcc
                          new_session->id);
Bernhard M. Wiedemann 1defcc
-                is_ours = FALSE;
Bernhard M. Wiedemann 1defcc
+                /* SLE: ignore non-graphical session completely */
Bernhard M. Wiedemann 1defcc
+                /* see `act_user_is_logged_in_anywhere` */
Bernhard M. Wiedemann 1defcc
+                unload_new_session (new_session);
Bernhard M. Wiedemann 1defcc
+                return;
Bernhard M. Wiedemann 1defcc
         } else if (session_is_login_window (manager, new_session->id)) {
Bernhard M. Wiedemann 1defcc
                 new_session->state = ACT_USER_MANAGER_NEW_SESSION_STATE_LOADED;
Bernhard M. Wiedemann 1defcc
                 unload_new_session (new_session);
Bernhard M. Wiedemann 1defcc
                 return;
Bernhard M. Wiedemann 1defcc
         } else if (!session_is_on_our_seat (manager, new_session->id)) {
Bernhard M. Wiedemann 1defcc
+                /**
Bernhard M. Wiedemann 1defcc
+                 * NOTE: if `manager->priv->seat.id` or `new_session->id` is
Bernhard M. Wiedemann 1defcc
+                 * either NULL, it's not on our seat: this is reasonable, as
Bernhard M. Wiedemann 1defcc
+                 * non-seat session is not switchable and thus no need to be
Bernhard M. Wiedemann 1defcc
+                 * ours. However, this nondiscrimination for all non-seated
Bernhard M. Wiedemann 1defcc
+                 * sessions is possibly a source for bugs.
Bernhard M. Wiedemann 1defcc
+                 */
Bernhard M. Wiedemann 1defcc
                 is_ours = FALSE;
Bernhard M. Wiedemann 1defcc
         }
Bernhard M. Wiedemann 1defcc
 
Bernhard M. Wiedemann 1defcc
Index: accountsservice-0.6.40/src/libaccountsservice/act-user.c
Bernhard M. Wiedemann 1defcc
===================================================================
Bernhard M. Wiedemann 1defcc
--- accountsservice-0.6.40.orig/src/libaccountsservice/act-user.c
Bernhard M. Wiedemann 1defcc
+++ accountsservice-0.6.40/src/libaccountsservice/act-user.c
Bernhard M. Wiedemann 1defcc
@@ -936,6 +936,8 @@ act_user_is_logged_in (ActUser *user)
Bernhard M. Wiedemann 1defcc
  * (Currently, this function is only implemented for systemd-logind.
Bernhard M. Wiedemann 1defcc
  * For ConsoleKit, it is equivalent to act_user_is_logged_in.)
Bernhard M. Wiedemann 1defcc
  *
Bernhard M. Wiedemann 1defcc
+ * (SLE-12 SP2: 'other_sessions' have been modified to contain only X sessions)
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
  * Returns: %TRUE or %FALSE
Bernhard M. Wiedemann 1defcc
  */
Bernhard M. Wiedemann 1defcc
 gboolean
Bernhard M. Wiedemann 1defcc
@@ -945,6 +947,24 @@ act_user_is_logged_in_anywhere (ActUser
Bernhard M. Wiedemann 1defcc
 }
Bernhard M. Wiedemann 1defcc
 
Bernhard M. Wiedemann 1defcc
 /**
Bernhard M. Wiedemann 1defcc
+ * act_user_is_x_logged_in_remotely:
Bernhard M. Wiedemann 1defcc
+ * @user: a #ActUser
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * Returns whether or not #ActUser is currently graphically logged in on a
Bernhard M. Wiedemann 1defcc
+ * different seat or no seat.
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * (For SLE12-SP2: fate#318433)
Bernhard M. Wiedemann 1defcc
+ *
Bernhard M. Wiedemann 1defcc
+ * Returns: %TRUE or %FALSE
Bernhard M. Wiedemann 1defcc
+ */
Bernhard M. Wiedemann 1defcc
+gboolean
Bernhard M. Wiedemann 1defcc
+act_user_is_x_logged_in_remotely (ActUser *user)
Bernhard M. Wiedemann 1defcc
+{
Bernhard M. Wiedemann 1defcc
+        /* return user->remote_x_sessions; */
Bernhard M. Wiedemann 1defcc
+        return (user->other_sessions != NULL);
Bernhard M. Wiedemann 1defcc
+}
Bernhard M. Wiedemann 1defcc
+
Bernhard M. Wiedemann 1defcc
+/**
Bernhard M. Wiedemann 1defcc
  * act_user_get_locked:
Bernhard M. Wiedemann 1defcc
  * @user: a #ActUser
Bernhard M. Wiedemann 1defcc
  *
Bernhard M. Wiedemann 1defcc
Index: accountsservice-0.6.40/src/libaccountsservice/act-user.h
Bernhard M. Wiedemann 1defcc
===================================================================
Bernhard M. Wiedemann 1defcc
--- accountsservice-0.6.40.orig/src/libaccountsservice/act-user.h
Bernhard M. Wiedemann 1defcc
+++ accountsservice-0.6.40/src/libaccountsservice/act-user.h
Bernhard M. Wiedemann 1defcc
@@ -67,6 +67,7 @@ guint          act_user_get_num_sessions
Bernhard M. Wiedemann 1defcc
 guint          act_user_get_num_sessions_anywhere (ActUser   *user);
Bernhard M. Wiedemann 1defcc
 gboolean       act_user_is_logged_in              (ActUser   *user);
Bernhard M. Wiedemann 1defcc
 gboolean       act_user_is_logged_in_anywhere     (ActUser   *user);
Bernhard M. Wiedemann 1defcc
+gboolean       act_user_is_x_logged_in_remotely   (ActUser   *user);
Bernhard M. Wiedemann 1defcc
 int            act_user_get_login_frequency       (ActUser   *user);
Bernhard M. Wiedemann 1defcc
 gint64         act_user_get_login_time            (ActUser   *user);
Bernhard M. Wiedemann 1defcc
 const GVariant*act_user_get_login_history         (ActUser   *user);