Hi Vincent,
Thanks for your report. Yes, I understand it from the messages that on
your machines getpwuid() returns a username including this "@domain"
part, but the server_xscreensaver_version() which queries the server,
strips away all "@" parts (I don't even know if XGetWindowProperty()
returns the @domain part here).
First, I am not familiar enough with SSSD to know if pw_name should
include the "@domain" part, but I will assume it for the following
suggestions, in preferred order:
1) if XGetWindowProperty() returns user@domain@host, this simple patch
could solve it by only stripping the last "@" part:
diff --git a/driver/remote.c b/driver/remote.c
index 83254e0..e409ebc 100644
--- a/driver/remote.c
+++ b/driver/remote.c
@@ -681,7 +681,7 @@ server_xscreensaver_version (Display *dpy,
{
char *o = 0, *p = 0, *c = 0;
o = strchr ((char *) id, '(');
- if (o) p = strchr (o, '@');
+ if (o) p = strrchr (o, '@');
if (p) c = strchr (p, ')');
if (c)
{
2) in case XGetWindowProperty() doesn't return the "@domain" part,
canonicalize the username received via server_xscreensaver_version so
it should match the getpwuid() result:
diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c
index da98c53..14f82c1 100644
--- a/driver/demo-Gtk.c
+++ b/driver/demo-Gtk.c
@@ -4477,6 +4477,17 @@ the_network_is_not_the_computer (state *s)
server_xscreensaver_version (dpy, &rversion, &ruser, &rhost);
+ /* canonical name in case of directory service */
+ if (ruser)
+ {
+ const char *new_ruser = getpwnam(ruser)->pw_name;
+ if (new_ruser)
+ {
+ free(ruser);
+ ruser = strdup(new_ruser);
+ }
+ }
+
/* Make a buffer that's big enough for a number of copies of all the
strings, plus some. */
msg = (char *) malloc (10 * ((rversion ? strlen(rversion) : 0
3) the hammer, strip away any "@" part in the getpwuid() result:
diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c
index da98c53..d2c9b6a 100644
--- a/driver/demo-Gtk.c
+++ b/driver/demo-Gtk.c
@@ -4471,7 +4471,13 @@ the_network_is_not_the_computer (state *s)
# endif /* !HAVE_UNAME && !VMS */
if (p && p->pw_name)
- luser = p->pw_name;
+ {
+ char *domain;
+ luser = p->pw_name;
+ domain = strchr(luser, '@');
+ if (domain)
+ *domain = '\0';
+ }
else
luser = "???";
@@ -4496,7 +4502,7 @@ the_network_is_not_the_computer (state *s)
"on display \"%s\". Launch it now?"),
d);
}
- else if (p && ruser && *ruser && !!strcmp (ruser, p->pw_name))
+ else if (p && ruser && *ruser && !!strcmp (ruser, luser))
{
/* Warn that the two processes are running as different users.
*/
(Presenting all three just because I already have them, having jumped
on (3) then (2) before I had thought through it)
If you are willing to build and test, please try it on the latest
version from https://salsa.debian.org/debian/xscreensaver
Regards,
Tormod
On Wed, Apr 8, 2020 at 10:57 PM Vincent Danjean wrote:
>
> I run xscreensaver (with xfce4) on machines that use SSSD
> to managed its users. There are several source of authentification
> (as allowed by SSSD) but the main one (and default one) is to
> authenticate against an AD (windows kind of ldap/kerberos).
> The important thing is that user names (ie logins) are of the
> form name@domain
> I suspect the message is due to the fact that xscreensaver(-demo?)
> stores the login and the machine name under the form login@machine
> but fails to correctly parse such string when login contains a '@'
> character, as this is the case here.
>
> Regards,
> Vincent