[RFC] Input design

Daniel Stone daniel at fooishbar.org
Fri Apr 20 16:46:46 PDT 2007


Hi,

On Fri, Apr 20, 2007 at 04:16:58PM -0400, David Zeuthen wrote:
> On Thu, 2007-04-19 at 16:16 +0000, an Daniel Stone wrote:
> >  * Too much onus on the client
> >    Right now, we rely on an intelligent config client to get things
> >    done: you cannot simply have the server add all devices, or do
> >    something otherwise sensible.  This, IMO, is a big mark against us.
> 
> I can see why some people object to this. Still, I think an intelligent
> client is what most of the desktop projects (e.g. GNOME, KDE) wants to
> do - your thoughts on that?

Intelligent clients should absolutely be possible.  Anything which
blocks the creation of intelligent config clients is, IMO, dumb.

> (Just because I have this point of view doesn't mean I object to it
> being easy to use dumb clients or have the server do _some_
> autoconfiguration if that's what the user wants.)

Right.  For a few usecases (embedded/consumer devices in particular, as
well as minimal systems, LTSP-type setups, et al, not to mention systems
which are merely misconfigured or incomplete -- it's kind of hard to fix
that without input), we really want the server to be able to bring up
our devices.

If people want complexity, they can install a smart client.  If they
just want every device added, they can go with the server, or a really
dumb client.

Consider this analagous to xcompmgr -a vs. client-side compositing (as
well as no compositing at all), and to xrandr: you don't _need_ the
client tool.  If you want to do various complex setups, you can use one,
but by default, the server will attempt to DTRT for you.

> for rebuttal and also surrounding messages. Anyway, I don't think it's
> useful to rehash that discussion, at least not right now. It's more an
> implementation detail at this point I think...

On this we agree. :)

> >  * Security issues not even solved properly
> >    Right now, we need someone to write a D-Bus authentication plugin to
> >    map X servers to users, in order to come up with a sensible security
> >    policy.  Plus, MPX kind of blows this out of the water.
> 
> There's things like ConsoleKit that is already shipped with Fedora 7;
> I've copied some docs here for consideration
> 
>  http://people.freedesktop.org/~david/ConsoleKit.html

Thanks, I'll have a read through this.  My point was that it's not a
magic bullet for these kind of issues out of the box.

> > Here's the proposed new approach:
> >   * More server-centric configuration
> >     The server should at least be aware of which input devices are
> >     around it.  We can do this by adding HAL support to the server, and
> >     having it enumerate input devices via HAL.  This way, it always
> >     keeps a list of active input devices, and enabling them is just one
> >     step away from enumerating.  This provides for an xcompmgr -a type
> >     situation where the server can just DTRT for us.
> 
> Adding HAL support to the server means it needs to talk to HAL - this
> can only be done via D-Bus (the system bus specifically) so your
> complaints about libdbus may apply here. It's true, however, that
> there's a C library, libhal, that does this for you (via libdbus) and it
> checks everything (or tries to) to make sure it doesn't send garbage to
> libdbus. And this works fine.

Sure, but if libdbus is effectively an implementation detail of libhal,
then that's not something I'm bothered with, as you say.

> (As the maintainer of HAL, I usually tell people _not_ to use libhal; I
> tell them to use native bindings (glib, Qt, Mono, Java, Python,
> whatever) for D-Bus instead. For the X server, I don't know; I guess if
> using libhal makes your life easier (and you don't mind blocking calls),
> then why not. But if it was me, I'd use libdbus directly and just make
> sure my code isn't buggy.)

For us, our native binding is libdbus.  GLib is unacceptable due to the
whole abort()-on-malloc()-failure thing, and for obvious reasons we're
not about to start requiring Qt/C++, Mono/C#, Java, or Python.  So we're
stuck with the low-level lib (which no-one is ever supposed to use, but
we lack for alternatives), and its incredibly awkward API.

> >   * Move from D-Bus back to wire protocol
> 
> For the record, whether you use D-Bus or X protocol to do this both
> works as long as you can get the information you need about the client
> (e.g. uid, pid whatever) to make a security decision. It's not like I'm
> religiously attached to D-Bus; I just don't think your complaints about
> libdbus are valid.

Sure.  The benefit here isn't in getting rid of D-Bus, but in reducing
the number of client/server interfaces from two to one.  I'm not
convinced that the benefits brought by doing things out-of-band outweigh
the downsides of making sure everyone has D-Bus, requiring relatively
complex setups to manage it from a remote machine, and doubling the
number of communication channels that need to be doubled and deal with
authentication.

(i.e., I was wrong.)

> >     So, if we have a list of devices (optionally filtered by the admin;
> >     we'll have to provide some mechanism of filtering the list), our
> >     interaction with the client moves from 'add/remove this device' to
> >     'enable/disable' this device.  This is a relatively safe operation:
> >     HAL won't let us trash someone's partition table by writing the PS/2
> >     init sequence to /dev/hda.  Multi-user issues will require a
> >     security policy; this should probably be dealt with via the
> >     server-side security framework.  Right now, we already allow random
> >     users to steal other peoples' pointers with MPX, so that issue needs
> >     to be solved through the security framework anyway.
> 
> Btw, I don't see why it's useful to let the server keep this list; I'd
> just stick it in a library and let the client use it; I mean, what
> really is the big win between
> 
>  1) client using X protocol to enumerate devices AND select device; vs.
> 
>  2) client using some library to enumerate devices AND then use X
>     protocol to select device
> 
> Maybe there's something I don't get?

3) Server adds all input devices in the absence of a client, is the
killer feature here.  I don't really want to have to run a full config
client on the N800, and I'm pretty sure quite a number of others don't
want to, either.

> > I think we can do this reasonably quickly, and once that's settled down,
> > we can start shoving the 1.3.99.x releases out.
> > 
> > Questions? Opinions?
> 
> The ideas Jon (ConsoleKit author) and myself have for multi-user (e.g.
> fast-user-switching and multi-seat) might be interesting to review in
> this context. Allow me to list them
> 
>  1. HAL will know about what devices are attached to what seats
> 
>  2. ConsoleKit knows about what sessions belongs to what seats and
>     whether they are active or inactive; what /dev/tty device, what
>     X server and so on.
> 
>  3. HAL maintains ACL's on devices; whether a user get an ACL depends
>     on security policy; one such security policy is to grant access
>     to a device only if a user is in an active session that is local to
>     the seat that the session goes on at.
> 
>     So if you fast-user-switch away from a session, the user owning that
>     session will get his ACL removed from one or more device files.
> 
>     (In the future when Linux gains revoke() we will also revoke access
>     to devices; e.g. do more than just remove user from the ACL)

All of the above are certainly useful.

> My point really is that, security policy wise, when a user is requesting
> an X input device to be added to the server, then 
> 
>  1. X.org checks it's really an input device - you need to do this
>     check anyway and it's probably sufficient just checking major/minor
>     numbers

I'm not overly interested in dealing with the platform specifics, to be
honest.  I'd rather just check for an input capability.

>  3. Keep in mind that access to the device may be revoked at any point
>     in the future for the user that added the device; Since the server
>     (currently) runs as root, perhaps that means you want to run your X
>     input driver in a child process with  the uid of the user that added
>     the device... and then handle ENXIO or SIGBUS [1]. 

We're not going down the child user path, nor are we going to strongly
tie users and servers (see, e.g. MPX, which gives you one display for
multiple seats; you might say ConsoleKit here, but think of display
walls and shared collaborative systems).

We can catch the signals and just shut down the device.  That's not a
problem.

> So I guess I'm saying that it would be appropriate if the X server,
> instead of X inventing it's own security access scheme, just uses access
> checks on device nodes as the security check whether a user should be
> allowed to add/remove a device.

I have no intention of encoding any more complex policy than the above
in the server.  If the admin wants to specifically develop a reasonably
involved policy, far be it from me to stop them.  Ditto HAL/ConsoleKit
passing me a device list dependent on what the current seat has access
to, or whatever.

Thanks for your, er, input.

Cheers,
Daniel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.x.org/archives/xorg/attachments/20070421/6b6fb731/attachment.pgp>


More information about the xorg mailing list