Compare commits
	
		
			20 Commits
		
	
	
		
			wip/mcrha/
			...
			wip/waylan
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 28f4030aa2 | ||
|   | 67fe376564 | ||
|   | fb824131ae | ||
|   | 056375cbcf | ||
|   | 84431cbc65 | ||
|   | 92c283da4d | ||
|   | 6e27ef8ff9 | ||
|   | 0c511c884b | ||
|   | 7afb503666 | ||
|   | 0b9d01a1c0 | ||
|   | b978d99820 | ||
|   | 6d8d094e0c | ||
|   | 97e0175f48 | ||
|   | ebef4ff174 | ||
|   | 82b8b32355 | ||
|   | 5b4337f716 | ||
|   | 5eb377bd3b | ||
|   | 8173110842 | ||
|   | fee97da26b | ||
|   | 0cc10e0c5d | 
| @@ -2,7 +2,7 @@ | |||||||
| Type=Application | Type=Application | ||||||
| _Name=GNOME Shell (wayland compositor) | _Name=GNOME Shell (wayland compositor) | ||||||
| _Comment=Window management and application launching | _Comment=Window management and application launching | ||||||
| Exec=@bindir@/mutter-launch -- gnome-shell-wayland --wayland | Exec=@bindir@/gnome-shell-wayland --wayland --display-server | ||||||
| X-GNOME-Bugzilla-Bugzilla=GNOME | X-GNOME-Bugzilla-Bugzilla=GNOME | ||||||
| X-GNOME-Bugzilla-Product=gnome-shell | X-GNOME-Bugzilla-Product=gnome-shell | ||||||
| X-GNOME-Bugzilla-Component=general | X-GNOME-Bugzilla-Component=general | ||||||
|   | |||||||
| @@ -24,24 +24,10 @@ const AuthPromptMode = { | |||||||
|     UNLOCK_OR_LOG_IN: 1 |     UNLOCK_OR_LOG_IN: 1 | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const AuthPromptStatus = { |  | ||||||
|     NOT_VERIFYING: 0, |  | ||||||
|     VERIFYING: 1, |  | ||||||
|     VERIFICATION_FAILED: 2, |  | ||||||
|     VERIFICATION_SUCCEEDED: 3 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| const BeginRequestType = { |  | ||||||
|     PROVIDE_USERNAME: 0, |  | ||||||
|     DONT_PROVIDE_USERNAME: 1 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| const AuthPrompt = new Lang.Class({ | const AuthPrompt = new Lang.Class({ | ||||||
|     Name: 'AuthPrompt', |     Name: 'AuthPrompt', | ||||||
|  |  | ||||||
|     _init: function(gdmClient, mode) { |     _init: function(gdmClient, mode) { | ||||||
|         this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; |  | ||||||
|  |  | ||||||
|         this._gdmClient = gdmClient; |         this._gdmClient = gdmClient; | ||||||
|         this._mode = mode; |         this._mode = mode; | ||||||
|  |  | ||||||
| @@ -53,14 +39,11 @@ const AuthPrompt = new Lang.Class({ | |||||||
|  |  | ||||||
|         this._userVerifier = new GdmUtil.ShellUserVerifier(this._gdmClient, { reauthenticationOnly: reauthenticationOnly }); |         this._userVerifier = new GdmUtil.ShellUserVerifier(this._gdmClient, { reauthenticationOnly: reauthenticationOnly }); | ||||||
|  |  | ||||||
|  |         this._userVerifier.connect('needs-username', Lang.bind(this, this._onNeedsUserName)); | ||||||
|         this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion)); |         this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion)); | ||||||
|         this._userVerifier.connect('show-message', Lang.bind(this, this._onShowMessage)); |         this._userVerifier.connect('show-message', Lang.bind(this, this._onShowMessage)); | ||||||
|         this._userVerifier.connect('verification-failed', Lang.bind(this, this._onVerificationFailed)); |         this._userVerifier.connect('verification-failed', Lang.bind(this, this._onVerificationFailed)); | ||||||
|         this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete)); |  | ||||||
|         this._userVerifier.connect('reset', Lang.bind(this, this._onReset)); |         this._userVerifier.connect('reset', Lang.bind(this, this._onReset)); | ||||||
|         this._userVerifier.connect('smartcard-status-changed', Lang.bind(this, this._onSmartcardStatusChanged)); |  | ||||||
|         this._userVerifier.connect('ovirt-user-authenticated', Lang.bind(this, this._onOVirtUserAuthenticated)); |  | ||||||
|         this.smartcardDetected = this._userVerifier.smartcardDetected; |  | ||||||
|  |  | ||||||
|         this.connect('next', Lang.bind(this, function() { |         this.connect('next', Lang.bind(this, function() { | ||||||
|                          this.updateSensitivity(false); |                          this.updateSensitivity(false); | ||||||
| @@ -133,6 +116,10 @@ const AuthPrompt = new Lang.Class({ | |||||||
|         this._defaultButtonWell.add_child(this._spinner.actor); |         this._defaultButtonWell.add_child(this._spinner.actor); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     get verificationStatus() { | ||||||
|  |         return this._userVerifier.verificationStatus; | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     _onDestroy: function() { |     _onDestroy: function() { | ||||||
|         this._userVerifier.clear(); |         this._userVerifier.clear(); | ||||||
|         this._userVerifier.disconnectAll(); |         this._userVerifier.disconnectAll(); | ||||||
| @@ -193,6 +180,14 @@ const AuthPrompt = new Lang.Class({ | |||||||
|         })); |         })); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _onNeedsUserName: function() { | ||||||
|  |         this.emit('needs-username'); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     gotUserName: function(userName) { | ||||||
|  |         this._userVerifier.gotUserName(userName); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     _onAskQuestion: function(verifier, serviceName, question, passwordChar) { |     _onAskQuestion: function(verifier, serviceName, question, passwordChar) { | ||||||
|         if (this._preemptiveAnswer) { |         if (this._preemptiveAnswer) { | ||||||
|             if (this._queryingService) |             if (this._queryingService) | ||||||
| @@ -221,30 +216,6 @@ const AuthPrompt = new Lang.Class({ | |||||||
|         this.emit('prompted'); |         this.emit('prompted'); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onOVirtUserAuthenticated: function() { |  | ||||||
|         if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) |  | ||||||
|             this.reset(); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _onSmartcardStatusChanged: function() { |  | ||||||
|         this.smartcardDetected = this._userVerifier.smartcardDetected; |  | ||||||
|  |  | ||||||
|         // Most of the time we want to reset if the user inserts or removes |  | ||||||
|         // a smartcard. Smartcard insertion "preempts" what the user was |  | ||||||
|         // doing, and smartcard removal aborts the preemption. |  | ||||||
|         // The exceptions are: 1) Don't reset on smartcard insertion if we're already verifying |  | ||||||
|         //                        with a smartcard |  | ||||||
|         //                     2) Don't reset if we've already succeeded at verification and |  | ||||||
|         //                        the user is getting logged in. |  | ||||||
|         if (this._userVerifier.serviceIsDefault(GdmUtil.SMARTCARD_SERVICE_NAME) && |  | ||||||
|             this.verificationStatus == AuthPromptStatus.VERIFYING && |  | ||||||
|             this.smartcardDetected) |  | ||||||
|             return; |  | ||||||
|  |  | ||||||
|         if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) |  | ||||||
|             this.reset(); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _onShowMessage: function(userVerifier, message, type) { |     _onShowMessage: function(userVerifier, message, type) { | ||||||
|         this.setMessage(message, type); |         this.setMessage(message, type); | ||||||
|         this.emit('prompted'); |         this.emit('prompted'); | ||||||
| @@ -256,15 +227,11 @@ const AuthPrompt = new Lang.Class({ | |||||||
|  |  | ||||||
|         this.updateSensitivity(true); |         this.updateSensitivity(true); | ||||||
|         this.setActorInDefaultButtonWell(null); |         this.setActorInDefaultButtonWell(null); | ||||||
|         this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED; |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _onVerificationComplete: function() { |         this.emit('failed'); | ||||||
|         this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED; |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onReset: function() { |     _onReset: function() { | ||||||
|         this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; |  | ||||||
|         this.reset(); |         this.reset(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
| @@ -428,39 +395,13 @@ const AuthPrompt = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     reset: function() { |     reset: function() { | ||||||
|         let oldStatus = this.verificationStatus; |  | ||||||
|         this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; |  | ||||||
|  |  | ||||||
|         if (oldStatus == AuthPromptStatus.VERIFYING) |  | ||||||
|             this._userVerifier.cancel(); |  | ||||||
|  |  | ||||||
|         this._queryingService = null; |         this._queryingService = null; | ||||||
|         this.clear(); |         this.clear(); | ||||||
|         this._message.opacity = 0; |         this._message.opacity = 0; | ||||||
|         this.setUser(null); |         this.setUser(null); | ||||||
|         this.stopSpinning(); |         this.stopSpinning(); | ||||||
|  |  | ||||||
|         if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED) |         this.emit('reset'); | ||||||
|             this.emit('failed'); |  | ||||||
|  |  | ||||||
|         let beginRequestType; |  | ||||||
|  |  | ||||||
|         if (this._mode == AuthPromptMode.UNLOCK_ONLY) { |  | ||||||
|             // The user is constant at the unlock screen, so it will immediately |  | ||||||
|             // respond to the request with the username |  | ||||||
|             beginRequestType = BeginRequestType.PROVIDE_USERNAME; |  | ||||||
|         } else if (this._userVerifier.serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) || |  | ||||||
|                    (this.smartcardDetected && |  | ||||||
|                     this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME))) { |  | ||||||
|             // We don't need to know the username if the user preempted the login screen |  | ||||||
|             // with a smartcard or with preauthenticated oVirt credentials |  | ||||||
|             beginRequestType = BeginRequestType.DONT_PROVIDE_USERNAME; |  | ||||||
|         } else { |  | ||||||
|             // In all other cases, we should get the username up front. |  | ||||||
|             beginRequestType = BeginRequestType.PROVIDE_USERNAME; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         this.emit('reset', beginRequestType); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     addCharacter: function(unichar) { |     addCharacter: function(unichar) { | ||||||
| @@ -471,18 +412,13 @@ const AuthPrompt = new Lang.Class({ | |||||||
|         this._entry.clutter_text.insert_unichar(unichar); |         this._entry.clutter_text.insert_unichar(unichar); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     begin: function(params) { |     begin: function() { | ||||||
|         params = Params.parse(params, { userName: null, |  | ||||||
|                                         hold: null }); |  | ||||||
|  |  | ||||||
|         this.updateSensitivity(false); |         this.updateSensitivity(false); | ||||||
|  |         this._userVerifier.begin(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|         let hold = params.hold; |     needsUsername: function() { | ||||||
|         if (!hold) |         this._userVerifier.begin(userName); | ||||||
|             hold = new Batch.Hold(); |  | ||||||
|  |  | ||||||
|         this._userVerifier.begin(params.userName, hold); |  | ||||||
|         this.verificationStatus = AuthPromptStatus.VERIFYING; |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     finish: function(onComplete) { |     finish: function(onComplete) { | ||||||
| @@ -500,7 +436,6 @@ const AuthPrompt = new Lang.Class({ | |||||||
|  |  | ||||||
|     cancel: function() { |     cancel: function() { | ||||||
|         this.reset(); |         this.reset(); | ||||||
|         this.emit('cancelled'); |  | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
| Signals.addSignalMethods(AuthPrompt.prototype); | Signals.addSignalMethods(AuthPrompt.prototype); | ||||||
|   | |||||||
| @@ -421,6 +421,7 @@ const LoginDialog = new Lang.Class({ | |||||||
|         this._authPrompt = new AuthPrompt.AuthPrompt(gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_OR_LOG_IN); |         this._authPrompt = new AuthPrompt.AuthPrompt(gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_OR_LOG_IN); | ||||||
|         this._authPrompt.connect('prompted', Lang.bind(this, this._onPrompted)); |         this._authPrompt.connect('prompted', Lang.bind(this, this._onPrompted)); | ||||||
|         this._authPrompt.connect('reset', Lang.bind(this, this._onReset)); |         this._authPrompt.connect('reset', Lang.bind(this, this._onReset)); | ||||||
|  |         this._authPrompt.connect('needs-username', Lang.bind(this, this._onNeedsUserName)); | ||||||
|         this._authPrompt.hide(); |         this._authPrompt.hide(); | ||||||
|         this.actor.add_child(this._authPrompt.actor); |         this.actor.add_child(this._authPrompt.actor); | ||||||
|  |  | ||||||
| @@ -469,14 +470,15 @@ const LoginDialog = new Lang.Class({ | |||||||
|         this._sessionMenuButton.actor.show(); |         this._sessionMenuButton.actor.show(); | ||||||
|         this._authPrompt.addActorToDefaultButtonWell(this._sessionMenuButton.actor); |         this._authPrompt.addActorToDefaultButtonWell(this._sessionMenuButton.actor); | ||||||
|  |  | ||||||
|         this._disableUserList = undefined; |         this._updateDisableUserList(); | ||||||
|         this._userListLoaded = false; |         this._userListLoaded = false; | ||||||
|  |  | ||||||
|  |         LoginManager.getLoginManager().getCurrentSessionProxy(Lang.bind(this, this._gotGreeterSessionProxy)); | ||||||
|  |  | ||||||
|         // If the user list is enabled, it should take key focus; make sure the |         // If the user list is enabled, it should take key focus; make sure the | ||||||
|         // screen shield is initialized first to prevent it from stealing the |         // screen shield is initialized first to prevent it from stealing the | ||||||
|         // focus later |         // focus later | ||||||
|         Main.layoutManager.connect('startup-complete', |         Main.layoutManager.connect('startup-complete', Lang.bind(this, this._reset)); | ||||||
|                                    Lang.bind(this, this._updateDisableUserList)); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _ensureUserListLoaded: function() { |     _ensureUserListLoaded: function() { | ||||||
| @@ -493,15 +495,20 @@ const LoginDialog = new Lang.Class({ | |||||||
|             GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, this._loadUserList)); |             GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, this._loadUserList)); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _reset: function() { | ||||||
|  |         this._authPrompt.reset(); | ||||||
|  |         this._authPrompt.begin(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     _updateDisableUserList: function() { |     _updateDisableUserList: function() { | ||||||
|         let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY); |         let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY); | ||||||
|  |         if (disableUserList == this._disableUserList) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|         if (disableUserList != this._disableUserList) { |         this._disableUserList = disableUserList; | ||||||
|             this._disableUserList = disableUserList; |  | ||||||
|  |  | ||||||
|             if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) |         if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.ASKING_FOR_USERNAME) | ||||||
|                 this._authPrompt.reset(); |             this._reset(); | ||||||
|         } |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _updateCancelButton: function() { |     _updateCancelButton: function() { | ||||||
| @@ -509,7 +516,7 @@ const LoginDialog = new Lang.Class({ | |||||||
|  |  | ||||||
|         // Hide the cancel button if the user list is disabled and we're asking for |         // Hide the cancel button if the user list is disabled and we're asking for | ||||||
|         // a username |         // a username | ||||||
|         if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING && this._disableUserList) |         if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.ASKING_FOR_USERNAME && this._disableUserList) | ||||||
|             cancelVisible = false; |             cancelVisible = false; | ||||||
|         else |         else | ||||||
|             cancelVisible = true; |             cancelVisible = true; | ||||||
| @@ -554,19 +561,18 @@ const LoginDialog = new Lang.Class({ | |||||||
|         this._showPrompt(); |         this._showPrompt(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onReset: function(authPrompt, beginRequest) { |     _onReset: function() { | ||||||
|         this._sessionMenuButton.updateSensitivity(true); |         this._sessionMenuButton.updateSensitivity(true); | ||||||
|  |  | ||||||
|         this._user = null; |         this._user = null; | ||||||
|  |  | ||||||
|         if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) { |         this._reset(); | ||||||
|             if (!this._disableUserList) |     }, | ||||||
|                 this._showUserList(); |  | ||||||
|             else |     _onNeedsUserName: function() { | ||||||
|                 this._hideUserListAskForUsernameAndBeginVerification(); |         if (!this._disableUserList) | ||||||
|         } else { |             this._showUserList(); | ||||||
|             this._hideUserListAndBeginVerification(); |         else | ||||||
|         } |             this._hideUserListAskForUsernameAndBeginVerification(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onDefaultSessionChanged: function(client, sessionId) { |     _onDefaultSessionChanged: function(client, sessionId) { | ||||||
| @@ -574,8 +580,8 @@ const LoginDialog = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _shouldShowSessionMenuButton: function() { |     _shouldShowSessionMenuButton: function() { | ||||||
|         if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING && |         if (this._authPrompt.verificationStatus != GdmUtil.VerificationStatus.VERIFYING && | ||||||
|             this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED) |             this._authPrompt.verificationStatus != GdmUtil.VerificationStatus.VERIFICATION_FAILED) | ||||||
|           return false; |           return false; | ||||||
|  |  | ||||||
|         if (this._user && this._user.is_loaded && this._user.is_logged_in()) |         if (this._user && this._user.is_loaded && this._user.is_logged_in()) | ||||||
| @@ -625,7 +631,7 @@ const LoginDialog = new Lang.Class({ | |||||||
|                                                         this._user = this._userManager.get_user(answer); |                                                         this._user = this._userManager.get_user(answer); | ||||||
|                                                         this._authPrompt.clear(); |                                                         this._authPrompt.clear(); | ||||||
|                                                         this._authPrompt.startSpinning(); |                                                         this._authPrompt.startSpinning(); | ||||||
|                                                         this._authPrompt.begin({ userName: answer }); |                                                         this._authPrompt.gotUserName(answer); | ||||||
|                                                         this._updateCancelButton(); |                                                         this._updateCancelButton(); | ||||||
|  |  | ||||||
|                                                         realmManager.disconnect(realmSignalId) |                                                         realmManager.disconnect(realmSignalId) | ||||||
| @@ -635,6 +641,32 @@ const LoginDialog = new Lang.Class({ | |||||||
|         this._showPrompt(); |         this._showPrompt(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     _sessionActivated: function() { | ||||||
|  |         // We fade out the shell after logging in, and then re-set | ||||||
|  |         // the greeter wen we're VT switched to again. | ||||||
|  |  | ||||||
|  |         // XXX: re-trigger startup animation | ||||||
|  |         if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.VERIFICATION_SUCCEEDED) { | ||||||
|  |             this._reset(); | ||||||
|  |  | ||||||
|  |             // XXX: do something better here | ||||||
|  |             this.actor.opacity = 255; | ||||||
|  |  | ||||||
|  |             let children = Main.layoutManager.uiGroup.get_children(); | ||||||
|  |             for (let i = 0; i < children.length; i++) { | ||||||
|  |                 if (children[i] != Main.layoutManager.screenShieldGroup) | ||||||
|  |                     children[i].opacity = 255; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _gotGreeterSessionProxy: function(proxy) { | ||||||
|  |         proxy.connect('g-properties-changed', Lang.bind(this, function() { | ||||||
|  |             if (proxy.Active) | ||||||
|  |                 this._sessionActivated(); | ||||||
|  |         })); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     _startSession: function(serviceName) { |     _startSession: function(serviceName) { | ||||||
|         Tweener.addTween(this.actor, |         Tweener.addTween(this.actor, | ||||||
|                          { opacity: 0, |                          { opacity: 0, | ||||||
| @@ -805,11 +837,6 @@ const LoginDialog = new Lang.Class({ | |||||||
|         this._askForUsernameAndBeginVerification(); |         this._askForUsernameAndBeginVerification(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _hideUserListAndBeginVerification: function() { |  | ||||||
|         this._hideUserList(); |  | ||||||
|         this._authPrompt.begin(); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _showUserList: function() { |     _showUserList: function() { | ||||||
|         this._ensureUserListLoaded(); |         this._ensureUserListLoaded(); | ||||||
|         this._authPrompt.hide(); |         this._authPrompt.hide(); | ||||||
| @@ -823,11 +850,7 @@ const LoginDialog = new Lang.Class({ | |||||||
|         this._authPrompt.setUser(item.user); |         this._authPrompt.setUser(item.user); | ||||||
|  |  | ||||||
|         let userName = item.user.get_user_name(); |         let userName = item.user.get_user_name(); | ||||||
|         let hold = new Batch.Hold(); |         this._authPrompt.gotUserName(userName); | ||||||
|  |  | ||||||
|         this._authPrompt.begin({ userName: userName, |  | ||||||
|                                  hold: hold }); |  | ||||||
|         return hold; |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onUserListActivated: function(activatedItem) { |     _onUserListActivated: function(activatedItem) { | ||||||
| @@ -842,9 +865,9 @@ const LoginDialog = new Lang.Class({ | |||||||
|  |  | ||||||
|         this._updateCancelButton(); |         this._updateCancelButton(); | ||||||
|  |  | ||||||
|         let batch = new Batch.ConcurrentBatch(this, [new Batch.ConsecutiveBatch(this, tasks), |         let batch = new Batch.ConsecutiveBatch(this, tasks); | ||||||
|                                                      this._beginVerificationForItem(activatedItem)]); |  | ||||||
|         batch.run(); |         batch.run(); | ||||||
|  |         this._beginVerificationForItem(activatedItem); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onDestroy: function() { |     _onDestroy: function() { | ||||||
|   | |||||||
							
								
								
									
										214
									
								
								js/gdm/util.js
									
									
									
									
									
								
							
							
						
						
									
										214
									
								
								js/gdm/util.js
									
									
									
									
									
								
							| @@ -119,6 +119,14 @@ function cloneAndFadeOutActor(actor) { | |||||||
|     return hold; |     return hold; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const VerificationStatus = { | ||||||
|  |     NOT_VERIFYING: 0, | ||||||
|  |     ASKING_FOR_USERNAME: 1, | ||||||
|  |     VERIFYING: 2, | ||||||
|  |     VERIFICATION_FAILED: 3, | ||||||
|  |     VERIFICATION_SUCCEEDED: 4, | ||||||
|  | }; | ||||||
|  |  | ||||||
| const ShellUserVerifier = new Lang.Class({ | const ShellUserVerifier = new Lang.Class({ | ||||||
|     Name: 'ShellUserVerifier', |     Name: 'ShellUserVerifier', | ||||||
|  |  | ||||||
| @@ -131,7 +139,6 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|         this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA }); |         this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA }); | ||||||
|         this._settings.connect('changed', |         this._settings.connect('changed', | ||||||
|                                Lang.bind(this, this._updateDefaultService)); |                                Lang.bind(this, this._updateDefaultService)); | ||||||
|         this._updateDefaultService(); |  | ||||||
|  |  | ||||||
|         this._fprintManager = new Fprint.FprintManager(); |         this._fprintManager = new Fprint.FprintManager(); | ||||||
|         this._smartcardManager = SmartcardManager.getSmartcardManager(); |         this._smartcardManager = SmartcardManager.getSmartcardManager(); | ||||||
| @@ -152,45 +159,69 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|         this.hasPendingMessages = false; |         this.hasPendingMessages = false; | ||||||
|         this.reauthenticating = false; |         this.reauthenticating = false; | ||||||
|  |  | ||||||
|         this._failCounter = 0; |  | ||||||
|  |  | ||||||
|         this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager(); |         this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager(); | ||||||
|  |         this._oVirtCredentialsManager.connect('user-authenticated', Lang.bind(this, this._oVirtUserAuthenticated)); | ||||||
|         if (this._oVirtCredentialsManager.hasToken()) |         if (this._oVirtCredentialsManager.hasToken()) | ||||||
|             this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken()); |             this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken()); | ||||||
|  |  | ||||||
|         this._oVirtCredentialsManager.connect('user-authenticated', |         this._reset(); | ||||||
|                                               Lang.bind(this, this._oVirtUserAuthenticated)); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     begin: function(userName, hold) { |     _reset: function() { | ||||||
|         this._cancellable = new Gio.Cancellable(); |         // Clear previous attempts to authenticate | ||||||
|         this._hold = hold; |         this.verificationStatus = VerificationStatus.NOT_VERIFYING; | ||||||
|  |         this._userName = null; | ||||||
|  |         this._failCounter = 0; | ||||||
|  |         this._updateDefaultService(); | ||||||
|  |         this.emit('reset'); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     begin: function() { | ||||||
|  |         if (this._mode == AuthPromptMode.UNLOCK_ONLY) { | ||||||
|  |             // The user is constant at the unlock screen, so it will immediately | ||||||
|  |             // respond to the request with the username | ||||||
|  |             needsUsername = true; | ||||||
|  |         } else if (this._serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) || | ||||||
|  |                    (this._smartcardDetected && | ||||||
|  |                     this._serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME))) { | ||||||
|  |             // We don't need to know the username if the user preempted the login screen | ||||||
|  |             // with a smartcard or with preauthenticated oVirt credentials | ||||||
|  |             needsUsername = false; | ||||||
|  |         } else { | ||||||
|  |             // In all other cases, we should get the username up front. | ||||||
|  |             needsUsername = true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (needsUsername) { | ||||||
|  |             this.verificationStatus = VerificationStatus.ASKING_FOR_USERNAME; | ||||||
|  |             this.emit('needs-username'); | ||||||
|  |         } else { | ||||||
|  |             this._beginAuthentication(); | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     gotUserName: function(userName) { | ||||||
|         this._userName = userName; |         this._userName = userName; | ||||||
|  |         this._beginAuthentication(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _beginAuthentication: function() { | ||||||
|  |         this.verificationStatus = VerificationStatus.VERIFYING; | ||||||
|  |         this._cancellable = new Gio.Cancellable(); | ||||||
|         this.reauthenticating = false; |         this.reauthenticating = false; | ||||||
|  |  | ||||||
|         this._checkForFingerprintReader(); |         this._checkForFingerprintReader(); | ||||||
|  |  | ||||||
|         if (userName) { |         if (this._userName) { | ||||||
|             // If possible, reauthenticate an already running session, |             // If possible, reauthenticate an already running session, | ||||||
|             // so any session specific credentials get updated appropriately |             // so any session specific credentials get updated appropriately | ||||||
|             this._client.open_reauthentication_channel(userName, this._cancellable, |             this._client.open_reauthentication_channel(this._userName, this._cancellable, | ||||||
|                                                        Lang.bind(this, this._reauthenticationChannelOpened)); |                                                        Lang.bind(this, this._reauthenticationChannelOpened)); | ||||||
|         } else { |         } else { | ||||||
|             this._client.get_user_verifier(this._cancellable, Lang.bind(this, this._userVerifierGot)); |             this._client.get_user_verifier(this._cancellable, Lang.bind(this, this._userVerifierGot)); | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     cancel: function() { |  | ||||||
|         if (this._cancellable) |  | ||||||
|             this._cancellable.cancel(); |  | ||||||
|  |  | ||||||
|         if (this._userVerifier) { |  | ||||||
|             this._userVerifier.call_cancel_sync(null); |  | ||||||
|             this.clear(); |  | ||||||
|         } |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     clear: function() { |     clear: function() { | ||||||
|         if (this._cancellable) { |         if (this._cancellable) { | ||||||
|             this._cancellable.cancel(); |             this._cancellable.cancel(); | ||||||
| @@ -198,6 +229,7 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (this._userVerifier) { |         if (this._userVerifier) { | ||||||
|  |             this._userVerifier.call_cancel_sync(null); | ||||||
|             this._userVerifier.run_dispose(); |             this._userVerifier.run_dispose(); | ||||||
|             this._userVerifier = null; |             this._userVerifier = null; | ||||||
|         } |         } | ||||||
| @@ -205,24 +237,29 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|         this._clearMessageQueue(); |         this._clearMessageQueue(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     answerQuery: function(serviceName, answer) { |     _doAfterPendingMessages: function(func) { | ||||||
|         if (!this.hasPendingMessages) { |         if (this.hasPendingMessages) { | ||||||
|             this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); |             let signalId = this.connect('no-more-messages', Lang.bind(this, function() { | ||||||
|  |                 this.disconnect(signalId); | ||||||
|  |                 func(); | ||||||
|  |             })); | ||||||
|         } else { |         } else { | ||||||
|             let signalId = this.connect('no-more-messages', |             func(); | ||||||
|                                         Lang.bind(this, function() { |  | ||||||
|                                             this.disconnect(signalId); |  | ||||||
|                                             this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); |  | ||||||
|                                         })); |  | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|  |     answerQuery: function(serviceName, answer) { | ||||||
|  |         this._doAfterPendingMessages(Lang.bind(this, function() { | ||||||
|  |             this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); | ||||||
|  |         })); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|     _getIntervalForMessage: function(message) { |     _getIntervalForMessage: function(message) { | ||||||
|         // We probably could be smarter here |         // We probably could be smarter here | ||||||
|         return message.length * USER_READ_TIME; |         return message.length * USER_READ_TIME; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     finishMessageQueue: function() { |     _finishMessageQueue: function() { | ||||||
|         if (!this.hasPendingMessages) |         if (!this.hasPendingMessages) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
| @@ -234,7 +271,7 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|  |  | ||||||
|     _queueMessageTimeout: function() { |     _queueMessageTimeout: function() { | ||||||
|         if (this._messageQueue.length == 0) { |         if (this._messageQueue.length == 0) { | ||||||
|             this.finishMessageQueue(); |             this._finishMessageQueue(); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -263,7 +300,7 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _clearMessageQueue: function() { |     _clearMessageQueue: function() { | ||||||
|         this.finishMessageQueue(); |         this._finishMessageQueue(); | ||||||
|  |  | ||||||
|         if (this._messageQueueTimeoutId != 0) { |         if (this._messageQueueTimeoutId != 0) { | ||||||
|             GLib.source_remove(this._messageQueueTimeoutId); |             GLib.source_remove(this._messageQueueTimeoutId); | ||||||
| @@ -288,9 +325,9 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|             })); |             })); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _oVirtUserAuthenticated: function(token) { |     _oVirtUserAuthenticated: function() { | ||||||
|         this._preemptingService = OVIRT_SERVICE_NAME; |         if (this.verificationStatus != GdmUtil.VerificationStatus.VERIFICATION_SUCCEEDED) | ||||||
|         this.emit('ovirt-user-authenticated'); |             this._reset(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _checkForSmartcard: function() { |     _checkForSmartcard: function() { | ||||||
| @@ -303,21 +340,29 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|         else |         else | ||||||
|             smartcardDetected = this._smartcardManager.hasInsertedTokens(); |             smartcardDetected = this._smartcardManager.hasInsertedTokens(); | ||||||
|  |  | ||||||
|         if (smartcardDetected != this.smartcardDetected) { |         if (this._smartcardDetected == smartcardDetected) | ||||||
|             this.smartcardDetected = smartcardDetected; |             return; | ||||||
|  |  | ||||||
|             if (this.smartcardDetected) |         this._smartcardDetected = smartcardDetected; | ||||||
|                 this._preemptingService = SMARTCARD_SERVICE_NAME; |  | ||||||
|             else if (this._preemptingService == SMARTCARD_SERVICE_NAME) |  | ||||||
|                 this._preemptingService = null; |  | ||||||
|  |  | ||||||
|             this.emit('smartcard-status-changed'); |         // Most of the time we want to reset if the user inserts or removes | ||||||
|         } |         // a smartcard. Smartcard insertion "preempts" what the user was | ||||||
|  |         // doing, and smartcard removal aborts the preemption. | ||||||
|  |         // The exceptions are: 1) Don't reset on smartcard insertion if we're already verifying | ||||||
|  |         //                        with a smartcard | ||||||
|  |         //                     2) Don't reset if we've already succeeded at verification and | ||||||
|  |         //                        the user is getting logged in. | ||||||
|  |         if (this._serviceIsDefault(SMARTCARD_SERVICE_NAME) && | ||||||
|  |             this.verificationStatus == VerificationStatus.VERIFYING && | ||||||
|  |             this._smartcardDetected) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         if (this.verificationStatus != VerificationStatus.VERIFICATION_SUCCEEDED) | ||||||
|  |             this._reset(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _reportInitError: function(where, error) { |     _reportInitError: function(where, error) { | ||||||
|         logError(error, where); |         logError(error, where); | ||||||
|         this._hold.release(); |  | ||||||
|  |  | ||||||
|         this._queueMessage(_("Authentication error"), MessageType.ERROR); |         this._queueMessage(_("Authentication error"), MessageType.ERROR); | ||||||
|         this._verificationFailed(false); |         this._verificationFailed(false); | ||||||
| @@ -343,7 +388,6 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|         this.reauthenticating = true; |         this.reauthenticating = true; | ||||||
|         this._connectSignals(); |         this._connectSignals(); | ||||||
|         this._beginVerification(); |         this._beginVerification(); | ||||||
|         this._hold.release(); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _userVerifierGot: function(client, result) { |     _userVerifierGot: function(client, result) { | ||||||
| @@ -358,7 +402,6 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|  |  | ||||||
|         this._connectSignals(); |         this._connectSignals(); | ||||||
|         this._beginVerification(); |         this._beginVerification(); | ||||||
|         this._hold.release(); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _connectSignals: function() { |     _connectSignals: function() { | ||||||
| @@ -372,31 +415,32 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _getForegroundService: function() { |     _getForegroundService: function() { | ||||||
|         if (this._preemptingService) |         if (this._oVirtCredentialsManager.hasToken()) | ||||||
|             return this._preemptingService; |             return OVIRT_SERVICE_NAME; | ||||||
|  |         if (this._smartcardDetected) | ||||||
|  |             return SMARTCARD_SERVICE_NAME; | ||||||
|  |  | ||||||
|         return this._defaultService; |         return this._defaultService; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     serviceIsForeground: function(serviceName) { |     _serviceIsForeground: function(serviceName) { | ||||||
|         return serviceName == this._getForegroundService(); |         return serviceName == this._getForegroundService(); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     serviceIsDefault: function(serviceName) { |     _serviceIsDefault: function(serviceName) { | ||||||
|         return serviceName == this._defaultService; |         return serviceName == this._defaultService; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _updateDefaultService: function() { |     _updateDefaultService: function() { | ||||||
|         if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY)) |         if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY)) | ||||||
|             this._defaultService = PASSWORD_SERVICE_NAME; |             this._defaultService = PASSWORD_SERVICE_NAME; | ||||||
|         else if (this.smartcardDetected) |         else if (this._smartcardDetected) | ||||||
|             this._defaultService = SMARTCARD_SERVICE_NAME; |             this._defaultService = SMARTCARD_SERVICE_NAME; | ||||||
|         else if (this._haveFingerprintReader) |         else if (this._haveFingerprintReader) | ||||||
|             this._defaultService = FINGERPRINT_SERVICE_NAME; |             this._defaultService = FINGERPRINT_SERVICE_NAME; | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _startService: function(serviceName) { |     _startService: function(serviceName) { | ||||||
|         this._hold.acquire(); |  | ||||||
|         if (this._userName) { |         if (this._userName) { | ||||||
|            this._userVerifier.call_begin_verification_for_user(serviceName, |            this._userVerifier.call_begin_verification_for_user(serviceName, | ||||||
|                                                                this._userName, |                                                                this._userName, | ||||||
| @@ -410,8 +454,6 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|                    this._reportInitError('Failed to start verification for user', e); |                    this._reportInitError('Failed to start verification for user', e); | ||||||
|                    return; |                    return; | ||||||
|                } |                } | ||||||
|  |  | ||||||
|                this._hold.release(); |  | ||||||
|            })); |            })); | ||||||
|         } else { |         } else { | ||||||
|            this._userVerifier.call_begin_verification(serviceName, |            this._userVerifier.call_begin_verification(serviceName, | ||||||
| @@ -425,8 +467,6 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|                    this._reportInitError('Failed to start verification', e); |                    this._reportInitError('Failed to start verification', e); | ||||||
|                    return; |                    return; | ||||||
|                } |                } | ||||||
|  |  | ||||||
|                this._hold.release(); |  | ||||||
|            })); |            })); | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
| @@ -434,12 +474,12 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|     _beginVerification: function() { |     _beginVerification: function() { | ||||||
|         this._startService(this._getForegroundService()); |         this._startService(this._getForegroundService()); | ||||||
|  |  | ||||||
|         if (this._userName && this._haveFingerprintReader && !this.serviceIsForeground(FINGERPRINT_SERVICE_NAME)) |         if (this._userName && this._haveFingerprintReader && !this._serviceIsForeground(FINGERPRINT_SERVICE_NAME)) | ||||||
|             this._startService(FINGERPRINT_SERVICE_NAME); |             this._startService(FINGERPRINT_SERVICE_NAME); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onInfo: function(client, serviceName, info) { |     _onInfo: function(client, serviceName, info) { | ||||||
|         if (this.serviceIsForeground(serviceName)) { |         if (this._serviceIsForeground(serviceName)) { | ||||||
|             this._queueMessage(info, MessageType.INFO); |             this._queueMessage(info, MessageType.INFO); | ||||||
|         } else if (serviceName == FINGERPRINT_SERVICE_NAME && |         } else if (serviceName == FINGERPRINT_SERVICE_NAME && | ||||||
|             this._haveFingerprintReader) { |             this._haveFingerprintReader) { | ||||||
| @@ -454,21 +494,21 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onProblem: function(client, serviceName, problem) { |     _onProblem: function(client, serviceName, problem) { | ||||||
|         if (!this.serviceIsForeground(serviceName)) |         if (!this._serviceIsForeground(serviceName)) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         this._queueMessage(problem, MessageType.ERROR); |         this._queueMessage(problem, MessageType.ERROR); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onInfoQuery: function(client, serviceName, question) { |     _onInfoQuery: function(client, serviceName, question) { | ||||||
|         if (!this.serviceIsForeground(serviceName)) |         if (!this._serviceIsForeground(serviceName)) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         this.emit('ask-question', serviceName, question, ''); |         this.emit('ask-question', serviceName, question, ''); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onSecretInfoQuery: function(client, serviceName, secretQuestion) { |     _onSecretInfoQuery: function(client, serviceName, secretQuestion) { | ||||||
|         if (!this.serviceIsForeground(serviceName)) |         if (!this._serviceIsForeground(serviceName)) | ||||||
|             return; |             return; | ||||||
|  |  | ||||||
|         if (serviceName == OVIRT_SERVICE_NAME) { |         if (serviceName == OVIRT_SERVICE_NAME) { | ||||||
| @@ -481,24 +521,11 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onReset: function() { |     _onReset: function() { | ||||||
|         // Clear previous attempts to authenticate |         this._reset(); | ||||||
|         this._failCounter = 0; |  | ||||||
|         this._updateDefaultService(); |  | ||||||
|  |  | ||||||
|         this.emit('reset'); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onVerificationComplete: function() { |     _onVerificationComplete: function() { | ||||||
|         this.emit('verification-complete'); |         this.verificationStatus = VerificationStatus.VERIFICATION_SUCCEEDED; | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _cancelAndReset: function() { |  | ||||||
|         this.cancel(); |  | ||||||
|         this._onReset(); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     _retry: function() { |  | ||||||
|         this.begin(this._userName, new Batch.Hold()); |  | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _verificationFailed: function(retry) { |     _verificationFailed: function(retry) { | ||||||
| @@ -511,38 +538,23 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|         let canRetry = retry && this._userName && |         let canRetry = retry && this._userName && | ||||||
|             this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY); |             this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY); | ||||||
|  |  | ||||||
|         if (canRetry) { |         this.verificationStatus = VerificationStatus.VERIFICATION_FAILED; | ||||||
|             if (!this.hasPendingMessages) { |  | ||||||
|                 this._retry(); |  | ||||||
|             } else { |  | ||||||
|                 let signalId = this.connect('no-more-messages', |  | ||||||
|                                             Lang.bind(this, function() { |  | ||||||
|                                                 this.disconnect(signalId); |  | ||||||
|                                                 this._retry(); |  | ||||||
|                                             })); |  | ||||||
|             } |  | ||||||
|         } else { |  | ||||||
|             if (!this.hasPendingMessages) { |  | ||||||
|                 this._cancelAndReset(); |  | ||||||
|             } else { |  | ||||||
|                 let signalId = this.connect('no-more-messages', |  | ||||||
|                                             Lang.bind(this, function() { |  | ||||||
|                                                 this.disconnect(signalId); |  | ||||||
|                                                 this._cancelAndReset(); |  | ||||||
|                                             })); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         this.emit('verification-failed'); |         this.emit('verification-failed'); | ||||||
|  |  | ||||||
|  |         this._doAfterPendingMessages(Lang.bind(this, function() { | ||||||
|  |             if (canRetry) | ||||||
|  |                 this._beginAuthentication(); | ||||||
|  |             else | ||||||
|  |                 this.clear(); | ||||||
|  |         })); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onConversationStopped: function(client, serviceName) { |     _onConversationStopped: function(client, serviceName) { | ||||||
|         // If the login failed with the preauthenticated oVirt credentials |         // If the login failed with the preauthenticated oVirt credentials | ||||||
|         // then discard the credentials and revert to default authentication |         // then discard the credentials and revert to default authentication | ||||||
|         // mechanism. |         // mechanism. | ||||||
|         if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) { |         if (this._serviceIsForeground(OVIRT_SERVICE_NAME)) { | ||||||
|             this._oVirtCredentialsManager.resetToken(); |             this._oVirtCredentialsManager.resetToken(); | ||||||
|             this._preemptingService = null; |  | ||||||
|             this._verificationFailed(false); |             this._verificationFailed(false); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| @@ -550,7 +562,7 @@ const ShellUserVerifier = new Lang.Class({ | |||||||
|         // if the password service fails, then cancel everything. |         // if the password service fails, then cancel everything. | ||||||
|         // But if, e.g., fingerprint fails, still give |         // But if, e.g., fingerprint fails, still give | ||||||
|         // password authentication a chance to succeed |         // password authentication a chance to succeed | ||||||
|         if (this.serviceIsForeground(serviceName)) { |         if (this._serviceIsForeground(serviceName)) { | ||||||
|             this._verificationFailed(true); |             this._verificationFailed(true); | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|   | |||||||
| @@ -39,6 +39,7 @@ const SystemdLoginSessionIface = '<node> \ | |||||||
| <interface name="org.freedesktop.login1.Session"> \ | <interface name="org.freedesktop.login1.Session"> \ | ||||||
| <signal name="Lock" /> \ | <signal name="Lock" /> \ | ||||||
| <signal name="Unlock" /> \ | <signal name="Unlock" /> \ | ||||||
|  | <property name="Active" access="readonly" /> \ | ||||||
| </interface> \ | </interface> \ | ||||||
| </node>'; | </node>'; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -203,6 +203,10 @@ function _initializeUI() { | |||||||
|     ExtensionDownloader.init(); |     ExtensionDownloader.init(); | ||||||
|     ExtensionSystem.init(); |     ExtensionSystem.init(); | ||||||
|  |  | ||||||
|  |     layoutManager.connect('startup-prepared', function() { | ||||||
|  |         Meta.activate_session(); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|     if (sessionMode.isGreeter && screenShield) { |     if (sessionMode.isGreeter && screenShield) { | ||||||
|         layoutManager.connect('startup-prepared', function() { |         layoutManager.connect('startup-prepared', function() { | ||||||
|             screenShield.showDialog(); |             screenShield.showDialog(); | ||||||
|   | |||||||
| @@ -53,8 +53,8 @@ const UnlockDialog = new Lang.Class({ | |||||||
|  |  | ||||||
|         this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY); |         this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY); | ||||||
|         this._authPrompt.connect('failed', Lang.bind(this, this._fail)); |         this._authPrompt.connect('failed', Lang.bind(this, this._fail)); | ||||||
|         this._authPrompt.connect('cancelled', Lang.bind(this, this._fail)); |  | ||||||
|         this._authPrompt.connect('reset', Lang.bind(this, this._onReset)); |         this._authPrompt.connect('reset', Lang.bind(this, this._onReset)); | ||||||
|  |         this._authPrompt.connect('needs-username', Lang.bind(this, this._onNeedsUserName)); | ||||||
|         this._authPrompt.setPasswordChar('\u25cf'); |         this._authPrompt.setPasswordChar('\u25cf'); | ||||||
|         this._authPrompt.nextButton.label = _("Unlock"); |         this._authPrompt.nextButton.label = _("Unlock"); | ||||||
|  |  | ||||||
| @@ -101,6 +101,10 @@ const UnlockDialog = new Lang.Class({ | |||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _onReset: function(authPrompt, beginRequest) { |     _onReset: function(authPrompt, beginRequest) { | ||||||
|  |         this._authPrompt.begin(); | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     _onNeedsUserName: function() { | ||||||
|         let userName; |         let userName; | ||||||
|         if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) { |         if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) { | ||||||
|             this._authPrompt.setUser(this._user); |             this._authPrompt.setUser(this._user); | ||||||
| @@ -109,7 +113,7 @@ const UnlockDialog = new Lang.Class({ | |||||||
|             userName = null; |             userName = null; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         this._authPrompt.begin({ userName: userName }); |         this._authPrompt.gotUserName(userName); | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     _escape: function() { |     _escape: function() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user