On Fri, Sep 11, 2015 at 11:23:38AM +0200, tilt! wrote:
> Unadressed remains the lifecycle of $XDG_RUNTIME_DIR, specifically:
> 
> * When is $XDG_RUNTIME_PREFIX created?
> 
>   If $XDG_RUNTIME_PREFIX hosts every user's runtime directory,
>   it may not be created with ownership of the user, so to do
>   this alone:
> 
>      # as user:
> 
>      mkdir -p -m 700 "$XDG_RUNTIME_DIR" # wrong!
> 
>   is the wrong approach, the prefix has to be created owned by
>   root, readable by all, and subdirectories have to be created
>   owned by user, read/writeable for user only.
> 
>      # as root:
> 
>      mkdir -p -m 755 "$XDG_RUNTIME_PREFIX"
> 
>   Currently my best guess is that this should be performed
>   at system startup.

Yes.

> * When is $XDG_RUNTIME_DIR created?
> 
>   If the prefix is created like described above, it requires
>   root permissions to create the per-user directory:
> 
>     # as root:
> 
>     # let $uid be the user ID of the affected user;
>     # let $xdg:runtime_dir be the requested runtime directory:
> 
>     if ! test -d "$xdg_runtime_dir" ; then
>        mkdir -p -m 700 "$xdg_runtime_dir"
>        chown $uid:$(id -g $uid) "$xdg_runtime_dir"
>     fi
> 
>   Currently my best guess is that this should be performed
>   everytime the user starts an X session (it's an X thing
>   after all, right), but Xsession.d is executed as the
>   user, not root. Changing into the user ID is a thing of
>   the display manager, there's no general way to hook in.
>   Remains PAM. Probably.

PAM would probably work well.

If I were implementing it (note: I'm the sort of guy who doesn't use
PAM, or logind, or policykit...), I'd use a setuid helper that will
construct a path based on a fixed prefix, the user ID, and optionally
a six-character random string (ie, the "-n" option appends _XXXXXX and
calls mktemp).
It will then create this directory, change the owner and permissions,
and print it to stdout, so that you could do:
XDG_RUNTIME_DIR=`mkxdgrt -n`
if you want a new session.
This helper would be called from the login or X startup scripts.

Alternately, you could theoretically create a new mount namespace for
each user (at login, check if there are any processes with the target
uid, and if so join their namespace).
If you created a new namespace, mount some sort of RAM-backed filesystem
with a size limit at XDG_RUNTIME_DIR; its contents will go away with the
last user process.

> * When is $XDG_RUNTIME_DIR deleted?
> 
>   If the per-user runtime directory is created as i described
>   above, user permissions suffice to delete it, so it was
>   sufficent to
> 
>     # as user:
> 
>     rm -rf "$XDG_RUNTIME_DIR"
> 
>   Unfortunately i am in the dark over what it means that a
>   user has "fully logged out". Does it mean that no processes
>   run with the user's identity anymore? That the user has no
>   X session running? That the user has no PAM session running?
>   And, if any of these mean that the user has "fully logged
>   out", how to hook into such an event and perform the code
>   suggested above?

Officially, when the last process owned by the user exits.
(This is the main advantage of the mount-namespace based approach.)
In practice, *I* would be fine with "at shutdown, and make sure it's
gone at boot."

HTH,
Isaac Dunham
_______________________________________________
Dng mailing list
Dng@lists.dyne.org
https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng

Reply via email to