gdm: Add network login hint
Different networks have different user identifers. This can be confusing to the user, so to make it clearer, we try to provide a hint. https://bugzilla.gnome.org/show_bug.cgi?id=681975
This commit is contained in:
parent
9024c5d7ac
commit
0a1f0e58d0
@ -20,6 +20,7 @@ nobase_dist_js_DATA = \
|
|||||||
gdm/fingerprint.js \
|
gdm/fingerprint.js \
|
||||||
gdm/loginDialog.js \
|
gdm/loginDialog.js \
|
||||||
gdm/powerMenu.js \
|
gdm/powerMenu.js \
|
||||||
|
gdm/realmd.js \
|
||||||
gdm/util.js \
|
gdm/util.js \
|
||||||
extensionPrefs/main.js \
|
extensionPrefs/main.js \
|
||||||
misc/config.js \
|
misc/config.js \
|
||||||
|
139
js/gdm/realmd.js
Normal file
139
js/gdm/realmd.js
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Shell = imports.gi.Shell;
|
||||||
|
const Signals = imports.signals;
|
||||||
|
|
||||||
|
const ProviderIface = <interface name='org.freedesktop.realmd.Provider'>
|
||||||
|
<property name="Name" type="s" access="read"/>
|
||||||
|
<property name="Version" type="s" access="read"/>
|
||||||
|
<property name="Realms" type="ao" access="read"/>
|
||||||
|
<method name="Discover">
|
||||||
|
<arg name="string" type="s" direction="in"/>
|
||||||
|
<arg name="options" type="a{sv}" direction="in"/>
|
||||||
|
<arg name="relevance" type="i" direction="out"/>
|
||||||
|
<arg name="realm" type="ao" direction="out"/>
|
||||||
|
</method>
|
||||||
|
</interface>;
|
||||||
|
const Provider = Gio.DBusProxy.makeProxyWrapper(ProviderIface);
|
||||||
|
|
||||||
|
const ServiceIface = <interface name="org.freedesktop.realmd.Service">
|
||||||
|
<method name="Cancel">
|
||||||
|
<arg name="operation" type="s" direction="in"/>
|
||||||
|
</method>
|
||||||
|
<method name="Release" />
|
||||||
|
<method name="SetLocale">
|
||||||
|
<arg name="locale" type="s" direction="in"/>
|
||||||
|
</method>
|
||||||
|
<signal name="Diagnostics">
|
||||||
|
<arg name="data" type="s"/>
|
||||||
|
<arg name="operation" type="s"/>
|
||||||
|
</signal>
|
||||||
|
</interface>;
|
||||||
|
const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface);
|
||||||
|
|
||||||
|
const RealmIface = <interface name="org.freedesktop.realmd.Realm">
|
||||||
|
<property name="Name" type="s" access="read"/>
|
||||||
|
<property name="Configured" type="s" access="read"/>
|
||||||
|
<property name="Details" type="a(ss)" access="read"/>
|
||||||
|
<property name="LoginFormats" type="as" access="read"/>
|
||||||
|
<property name="LoginPolicy" type="s" access="read"/>
|
||||||
|
<property name="PermittedLogins" type="as" access="read"/>
|
||||||
|
<property name="SupportedInterfaces" type="as" access="read"/>
|
||||||
|
<method name="ChangeLoginPolicy">
|
||||||
|
<arg name="login_policy" type="s" direction="in"/>
|
||||||
|
<arg name="permitted_add" type="as" direction="in"/>
|
||||||
|
<arg name="permitted_remove" type="as" direction="in"/>
|
||||||
|
<arg name="options" type="a{sv}" direction="in"/>
|
||||||
|
</method>
|
||||||
|
<method name="Deconfigure">
|
||||||
|
<arg name="options" type="a{sv}" direction="in"/>
|
||||||
|
</method>
|
||||||
|
</interface>;
|
||||||
|
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
|
||||||
|
|
||||||
|
const Manager = new Lang.Class({
|
||||||
|
Name: 'Manager',
|
||||||
|
|
||||||
|
_init: function(parentActor) {
|
||||||
|
this._aggregateProvider = Provider(Gio.DBus.system,
|
||||||
|
'org.freedesktop.realmd',
|
||||||
|
'/org/freedesktop/realmd',
|
||||||
|
Lang.bind(this, this._reloadRealms))
|
||||||
|
this._realms = {};
|
||||||
|
|
||||||
|
this._aggregateProvider.connect('g-properties-changed',
|
||||||
|
Lang.bind(this, function(proxy, properties) {
|
||||||
|
if ('Realms' in properties.deep_unpack())
|
||||||
|
this._reloadRealms();
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_reloadRealms: function() {
|
||||||
|
let realmPaths = this._aggregateProvider.Realms;
|
||||||
|
|
||||||
|
if (!realmPaths)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (let i = 0; i < realmPaths.length; i++) {
|
||||||
|
let realm = Realm(Gio.DBus.system,
|
||||||
|
'org.freedesktop.realmd',
|
||||||
|
realmPaths[i],
|
||||||
|
Lang.bind(this, this._onRealmLoaded));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_reloadRealm: function(realm) {
|
||||||
|
if (!realm.Configured) {
|
||||||
|
if (this._realms[realm.get_object_path()])
|
||||||
|
delete this._realms[realm.get_object_path()];
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._realms[realm.get_object_path()] = realm;
|
||||||
|
|
||||||
|
this._updateLoginFormat();
|
||||||
|
},
|
||||||
|
|
||||||
|
_onRealmLoaded: function(realm, error) {
|
||||||
|
if (error)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._reloadRealm(realm);
|
||||||
|
|
||||||
|
realm.connect('g-properties-changed',
|
||||||
|
Lang.bind(this, function(proxy, properties) {
|
||||||
|
if ('Configured' in properties.deep_unpack())
|
||||||
|
this._reloadRealm();
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateLoginFormat: function() {
|
||||||
|
let newLoginFormat;
|
||||||
|
|
||||||
|
for (let realmPath in this._realms) {
|
||||||
|
let realm = this._realms[realmPath];
|
||||||
|
if (realm.LoginFormats && realm.LoginFormats.length > 0) {
|
||||||
|
newLoginFormat = realm.LoginFormats[0];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._loginFormat != newLoginFormat) {
|
||||||
|
this._loginFormat = newLoginFormat;
|
||||||
|
this.emit('login-format-changed', newLoginFormat);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
get loginFormat() {
|
||||||
|
if (this._loginFormat !== undefined)
|
||||||
|
return this._loginFormat;
|
||||||
|
|
||||||
|
this._updateLoginFormat();
|
||||||
|
|
||||||
|
return this._loginFormat;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Signals.addSignalMethods(Manager.prototype)
|
@ -6,6 +6,7 @@ const Signals = imports.signals;
|
|||||||
|
|
||||||
const Batch = imports.gdm.batch;
|
const Batch = imports.gdm.batch;
|
||||||
const Fprint = imports.gdm.fingerprint;
|
const Fprint = imports.gdm.fingerprint;
|
||||||
|
const Realmd = imports.gdm.realmd;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
@ -82,6 +83,8 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
|
|
||||||
this._fprintManager = new Fprint.FprintManager();
|
this._fprintManager = new Fprint.FprintManager();
|
||||||
this._checkForFingerprintReader();
|
this._checkForFingerprintReader();
|
||||||
|
|
||||||
|
this._realmManager = new Realmd.Manager();
|
||||||
},
|
},
|
||||||
|
|
||||||
begin: function(userName, hold) {
|
begin: function(userName, hold) {
|
||||||
@ -228,11 +231,30 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
Main.notifyError(problem);
|
Main.notifyError(problem);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_showRealmLoginHint: function() {
|
||||||
|
if (this._realmManager.loginFormat) {
|
||||||
|
let hint = this._realmManager.loginFormat;
|
||||||
|
|
||||||
|
hint = hint.replace(/%U/g, 'user');
|
||||||
|
hint = hint.replace(/%D/g, 'DOMAIN');
|
||||||
|
hint = hint.replace(/%[^UD]/g, '');
|
||||||
|
|
||||||
|
// Translators: this message is shown below the username entry field
|
||||||
|
// to clue the user in on how to login to the local network realm
|
||||||
|
this.emit('show-login-hint',
|
||||||
|
_("(e.g., user or %s)").format(hint));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_onInfoQuery: function(client, serviceName, question) {
|
_onInfoQuery: function(client, serviceName, question) {
|
||||||
// We only expect questions to come from the main auth service
|
// We only expect questions to come from the main auth service
|
||||||
if (serviceName != PASSWORD_SERVICE_NAME)
|
if (serviceName != PASSWORD_SERVICE_NAME)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
this._showRealmLoginHint();
|
||||||
|
this._realmLoginHintSignalId = this._realmManager.connect('login-format-changed',
|
||||||
|
Lang.bind(this, this._showRealmLoginHint));
|
||||||
|
|
||||||
this.emit('ask-question', serviceName, question, '');
|
this.emit('ask-question', serviceName, question, '');
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -263,8 +285,13 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
// password authentication a chance to succeed
|
// password authentication a chance to succeed
|
||||||
if (serviceName == PASSWORD_SERVICE_NAME) {
|
if (serviceName == PASSWORD_SERVICE_NAME) {
|
||||||
this.emit('verification-failed');
|
this.emit('verification-failed');
|
||||||
} else if (serviceName == FINGERPRINT_SERVICE_NAME) {
|
}
|
||||||
|
|
||||||
this.emit('hide-login-hint');
|
this.emit('hide-login-hint');
|
||||||
|
|
||||||
|
if (this._realmLoginHintSignalId) {
|
||||||
|
this._realmManager.disconnect(this._realmLoginHintSignalId);
|
||||||
|
this._realmLoginHintSignalId = 0;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user