File gs-fate318433-prevent-same-account-multi-logins.patch of Package gnome-shell

Index: gnome-shell-3.25.4/js/gdm/loginDialog.js
===================================================================
--- gnome-shell-3.25.4.orig/js/gdm/loginDialog.js
+++ gnome-shell-3.25.4/js/gdm/loginDialog.js
@@ -926,6 +926,8 @@ var LoginDialog = new Lang.Class({
                                                           this._authPrompt.updateSensitivity(false);
                                                           let answer = this._authPrompt.getAnswer();
                                                           this._user = this._userManager.get_user(answer);
+                                                          this._userLoginForbidden =
+                                                              this._user.is_x_logged_in_remotely();
                                                           this._authPrompt.clear();
                                                           this._authPrompt.startSpinning();
                                                           this._authPrompt.begin({ userName: answer });
@@ -990,6 +992,8 @@ var LoginDialog = new Lang.Class({
                                                         let answer = this._authPrompt.getAnswer();
                             let domain_answer = this._domainMenuButton.getDomainUser(answer);
                                                         this._user = this._userManager.get_user(domain_answer);
+                                                        this._userLoginForbidden =
+                                                            this._user.is_x_logged_in_remotely();
                                                         this._authPrompt.clear();
                                                         this._authPrompt.startSpinning();
                                                         this._authPrompt.begin({ userName: domain_answer});
@@ -1023,6 +1027,28 @@ var LoginDialog = new Lang.Class({
     },
 
     _onSessionOpened: function(client, serviceName) {
+        if ( this._userLoginForbidden ) {
+            this._authPrompt.setMessage(
+                _('Sorry, you have to log out a previous session first. Multiple logins are not supported.'),
+                GdmUtil.MessageType.ERROR);
+            // TODO: The following logic relies on the unverified fact that
+            // `AuthPrompt::_onVerificationComplete` seems to always run after
+            // current handler. This might root from the interaction between
+            // greeter and verifier, both are external programs.
+            this._authPrompt.verificationStatus = AuthPrompt.AuthPromptStatus.VERIFIED_BUT_FORBIDDEN;
+
+            // NOTE: Failed Attempts as references
+            //
+            // NOTE: reset is too heavy, it skips the error prompt all together
+            // this._authPrompt.reset();
+            //
+            // NOTE: Diconnect at this stage is not working
+            //
+            // this._authPrompt._userVerifier.disconnect(this._authPrompt._userVerifierCompleteId);
+
+            return;
+        }
+
         this._authPrompt.finish(Lang.bind(this, function() {
             this._startSession(serviceName);
         }));
@@ -1206,6 +1232,7 @@ var LoginDialog = new Lang.Class({
 
     _onUserListActivated: function(activatedItem) {
         this._user = activatedItem.user;
+        this._userLoginForbidden = this._user.is_x_logged_in_remotely();
 
         this._updateCancelButton();
 
Index: gnome-shell-3.25.4/js/gdm/authPrompt.js
===================================================================
--- gnome-shell-3.25.4.orig/js/gdm/authPrompt.js
+++ gnome-shell-3.25.4/js/gdm/authPrompt.js
@@ -30,7 +30,9 @@ var AuthPromptStatus = {
     NOT_VERIFYING: 0,
     VERIFYING: 1,
     VERIFICATION_FAILED: 2,
-    VERIFICATION_SUCCEEDED: 3
+    VERIFICATION_SUCCEEDED: 3,
+    // NOTE fate#318433 extra state to track multi-login situation
+    VERIFIED_BUT_FORBIDDEN: 4
 };
 
 var BeginRequestType = {
@@ -261,7 +263,12 @@ var AuthPrompt = new Lang.Class({
     },
 
     _onVerificationComplete: function() {
+        // NOTE update the spinning icon
         this.setActorInDefaultButtonWell(null);
+
+        if (this.verificationStatus === AuthPromptStatus.VERIFIED_BUT_FORBIDDEN) {
+            return;
+        }
         this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
         this.cancelButton.reactive = false;
     },