Template Version: @(#)sac_nextcase 1.68 02/23/09 SMI
This information is Copyright 2009 Sun Microsystems
1. Introduction
    1.1. Project/Component Working Name:
         ConsoleKit
    1.2. Name of Document Author/Supplier:
         Author:  Brian Cameron
    1.3  Date of This Document:
        11 August, 2009
4. Technical Description

1. Introduction

   1.1. Project/Component Working Name:

        ConsoleKit

   1.2. Name of Document Author/Supplier:
        Brian Cameron

   1.3. Date of This Document:
        08/11/2009

   1.4. Name of Major Document Customer(s)/Consumer(s):
        1.4.1. The PAC or CPT you expect to review your project:
               Solaris PAC

        1.4.2. The ARC(s) you expect to review your project:
               LSARC

        1.4.3. The Director/VP who is "Sponsoring" this project:
               Robert O'Dea

        1.4.4. The name of your business unit:
               Software - OPG

   1.5. Email Aliases:
        1.5.1. Responsible Manager: 
               leo.binchy at sun.com

        1.5.2. Responsible Engineer:
               brian.cameron at sun.com

        1.5.3  Marketing Manager:
               dan.robert at sun.com

        1.5.4. Interest List: 
               desktop-discuss at opensolaris.org 

2. Project Summary
   2.1. Project Description:

        ConsoleKit is a FreeDesktop framework for defining and tracking users,
        login sessions and seats.  ConsoleKit has two main purposes:

        - To maintain a database of information about each running session
          which the display manager (GDM) uses.  The old GDM keeps track of
          this information internally, but new versions of GDM (2.21 and
          later) use ConsoleKit.
        - To support switching sessions and session migration when using
          mechanisms such as VT.  Note that Sun Ray uses its own separate
          session migration techniques.  While there may be some value in
          Sun Ray making use of ConsoleKit in the future to avoid replicating
          functionality, there are no immediate plans for Sun Ray to use
          ConsoleKit directly for this.

        Today, Solaris does not support graphical VT sessions.  However,
        the virtual console team is currently targeting build 124 to add
        this feature.  Refer to PSARC 2006/591 Virtual Console.  VT support
        is not needed to use ConsoleKit, but will support it as soon as it
        is available.
         
4. Technical Description:
   4.1. Details:

        ConsoleKit maintains a database of which users are logged into the
        system.  ConsoleKit groups sessions by seats which represent a set of
        hardware (usually a keyboard and mouse).  Other process communicate
        with ConsoleKit via D-Bus.

        One session leader process is responsible for asking ConsoleKit to open
        a new session.  In the typical case, the session leader would be a
        ConsoleKit enabled display manager, such as GDM.  This leader makes a
        connection to the D-Bus system bus and asks ConsoleKit to open a
        session when needed.

        If the operation succeeds, ConsoleKit will return a cookie to the
        session leader. The session leader should store this variable in the
        environment as XDG_SESSION_COOKIE so that it may be shared with its
        child processes.  The environment variable contains the UUID used to
        tie processes to a session. 

        Note that the XDG_SESSION_COOKIE variable is only meaningful to help
        manage session switching and migration, which currently only works
        with graphical VT sessions running on the console.  Although ConsoleKit
        will assign the variable for all sessions, it is ignored if the session
        does not support migration via ConsoleKit.  Note Sun Ray uses its own
        mechanisms for user switching, and is not affected by ConsoleKit.

        At this point the session will be registered with ConsoleKit and a
        particular set of information about the session will be stored along
        with it. 

        The Session will remain open until the Session Leader disconnects from
        the D-Bus system bus. The session will be removed from its seat, and
        deregistered.

        Various other programs need to know information about running user
        sessions, such as the Fast User Switch Applet and other mechanisms
        for switching the console to use a different VT display.  Such 
        programs make use of ConsoleKit interfaces to determine if user
        switching is supported and to manage the switching of different
        sessions on the same seat.

        On some Linux systems, the pam_ck_connector is used to ensure that
        non-graphical logins (e.g. telnet, ssh, etc.) are registered with
        ConsoleKit.  Thus ConsoleKit can be used as a utmp/wtmp replacement
        since it stores a superset of the information as in the utmp/wtmp
        database.  However, this is not an appropriate use of PAM and there are
        no plans to support this feature on Solaris since there is no
        immediate need to replace utmp/wtmp at this point in time.  Instead,
        GDM will make use of ConsoleKit to manage its displays.

        ConsoleKit source code contains the programs
        /usr/sbin/ck-log-system-start, /usr/sbin/ck-log-system-restart, and
        /usr/sbin/ck-log-system-stop.  These are intended to be helper tools to
        log system start, restart, and stop events.  These are intended to make
        ConsoleKit more like utmp/wtmp which also logs these events.  Since
        there are no plans to support ConsoleKit as a utmp/wtmp replacement,
        these programs are not included with the Solaris ConsoleKit packages.

        The ConsoleKit database is stored in /var/run/ConsoleKit/database.
        It stores information about active Seats, Sessions, and the current
        SessionLeader.  The following is an example of what this file contains.
        Comments (lines beginning with "#" are comments added to explain the
        purpose of each line:

   4.1.1 Detail About ConsoleKit Database

        # Seat configuration section.
        [Seat /org/freedesktop/ConsoleKit/Seat1]

        # Kind value=0 indicates a static seat, value=1 indicates a dynamic
        # seat.
        kind=0

        # Sessions running on the display.
        sessions=/org/freedesktop/ConsoleKit/SessionSeat1Local

        # Devices associated with the display.  Currently not used.
        devices=

        # Active session on the display.
        active_session=/org/freedesktop/ConsoleKit/SessionSeat1Local

        # Session configuration section.
        [Session /org/freedesktop/ConsoleKit/SessionSeat1Local]

        # UID of user running the session.
        uid=50

        # Seat associated with the session
        seat=/org/freedesktop/ConsoleKit/Seat1

        # Session cookie value.  Note XDG_SESSION_COOKIE environment variable.
        cookie=4008fb789ce5f1a7f346407e4a669cfe-1249973209.172145-1566549659

        # Session type.
        type=LoginWindow

        # Device associated with session (if any).
        display_device=/dev/console

        # Device associated with Xserver running session (if any).
        x11_display_device=/dev/console

        # Display value associated with session (if any).
        x11_display=:0

        # Remote hostname if a remote connection, e.g. XDMCP.
        remote_host_name=

        # Boolean.  Set to "true" if the active session, "false otherwise"
        is_active=false

        # Boolean.  Set to "true" if a local session, "false" if remote.
        is_local=true

        # Timestamp of when the session started.
        creation_time=2009-08-11T06:46:42.941134Z

        # Session leader configuration section.
        [SessionLeader /org/freedesktop/ConsoleKit/SessionSeat1Local]

        # Session associated with the leader.
        session=/org/freedesktop/ConsoleKit/SessionSeat1Local

        # UID and PID of session leader process
        uid=0
        pid=24768

        # Session leader cookie value.
        cookie=4008fb789ce5f1a7f346407e4a669cfe-1249973209.172145-1566549659

        # Session leader service name
        service_name=:1.203

   4.1.2 Detail About ConsoleKit Program And Library Interfaces
        
        + /usr/sbin/console-kit-daemon [--debug] [--no-daemon] [--timed-exit]

          The main consoleKit daemon.  Supports --debug, --no-daemon, and
          --timed-exit arguments for debugging purposes.

        + /usr/bin/ck-history [--frequent] [--last] [--last-compat] [--log]
                              [--seat=SEAT] [--session-type=TYPE] [--user=USER]

          A program that shows historical information about which users have
          logged in most recently (--last) or most frequently (--frequent).
          A 'last' compatible listing of last logged in users can be specified
          with the --last-compat argument.  The entire log can be viewed with
          the --log argument.  Users can specify to show entries for a specific
          seat, session type, or user via the --seat, --session-type, and
          --user arguments.

          This is used in GDM when showing the face browser.  When GDM is
          configured to use the face browser, users who have logged in most
          frequently are displayed first.

        + /usr/bin/ck-launch-session COMMAND

          A program used for starting a command in its own ConsoleKit session.
          This would be useful if a user wanted to start their own session via
          a startx script and have it registered with ConsoleKit, for example.

        + /usr/bin/ck-list-sessions [--format=VAR1,VAR2...]

          Program that displays information from the ConsoleKit database about
          active sessions on the system.  It returns information about each
          ConsoleKit session.  Users can specify what properties to show via
          --format arguments.

          Example 1: output for a login single session without --format follows:

          SessionSeat1Local:
                  unix-user = '50'
                  realname = 'GDM Reserved UID'
                  seat = 'Seat1'
                  session-type = 'LoginWindow'
                  display-type = 'Local'
                  open = 'TRUE'
                  active = 'TRUE'
                  x11-display = ':0'
                  x11-display-device = '/dev/console'
                  display-device = '/dev/console'
                  remote-host-name = ''
                  is-local = 'TRUE'
                  on-since = '2009-08-11T06:46:42.941134Z'
                  login-session-id = ''
                  idle-since-hint = ''

          Example 2: output for a login single session with argument
                     "--format=session-id,unix-user,display-type"
          
          SessionSeat1Local       50      Local

        + /usr/bin/ck-seat-tool [--add --session-type=SESSION_TYPE
          --display-type=DISPLAY_TYPE [--seat-id=SEAT_ID] [variables...]
          | --delete --session-id=SESSION_ID]

          This program tells ConsoleKit to add or delete a session on a given
          parameters.  This interface will be used by Sun Ray for starting and
          stopping sessions on Sun Ray devices, but could also be used for
          dynamically managing other kinds of displays.

          To use ck-seat-tool, it must be run as the same user which is running
          the main ConsoleKit daemon, which is normally root.  Otherwise the
          request is ignored.

          Currently this program is added by a Solaris-specific patch to
          support the gdmdynamic program, needed for backwards compatibility.
          The Sun GNOME team is working with the external community to 
          upstream this feature.

        + /usr/lib/ck-collect-session-info --uid UID --pid PID

          This program is passed the UID and PID of a process, and it returns
          the following information from the ConsoleKit database about that
          process.  This is useful for determining which Xserver is associated
          with a given process.  Example output for a process running in a
          session:

          unix-user = 100
          x11-display = :0.0
          x11-display-device = /dev/console
          display-device = /dev/pts/1
          is-local = true

          This program is a private interface used by the console-kit-daemon
          when opening a session.

        + /usr/lib/ck-get-x11-display-device [--display=DISPLAY]

          Returns the display device associated with an Xserver.  GDM uses this
          program to determine the TTY value associated with an Xserver
          process, and this value is passed into PAM_TTY, logindevperm, and the
          audit interfaces.  If no --display argument is provided, the current
          $DISPLAY environment value is used.

        + /usr/lib/ck-get-x11-server-pid

          Returns the PID of the Xserver process running on the current
          $DISPLAY environment variable.

        + /usr/lib/libck-connector.so

          Library used by GDM and other programs which access ConsoleKit
          interfaces.

   4.1.3 TTY Settings And Use Of proc Interfaces

        ConsoleKit keeps track of the device associated with the Xserver.
        The display manager, such as GDM, will use this value when calling
        logindevperm, when setting PAM_TTY, and when interacting with Sun
        audit interfaces.  This device is called the x11-display-device by
        ConsoleKit.

        When using graphical VT displays, the x11-display-device device is
        named "/dev/vt/#" where "#" is the number of the VT display.  On
        Solaris, "attached" non-console displays use the value "/dev/dtlocal"
        and remote displays use the value "/dev/dtremote".  The "/dev/dtlocal"
        and "/dev/dtremote" are considered pseudo-devices and are symlinks to
        /dev/null.  It is necessary to set up the symlinks before they are used
        by the display manager.  When VT support is not enabled or available,
        then the value "/dev/console" is used for the main console display. 
        ConsoleKit is responsible for making sure that the value is set
        properly in all these situations.

        Note that the ConsoleKit ck-collect-session-info program is used
        privately by ConsoleKit to access information about a running session
        including the x11-display-device.  It makes use of the
        ck-get-x11-server-pid program to access the x11-display-device value.

        GDM uses the ck-get-x11-display-device application to get the
        x11-display-device value.  When a display is running via graphical VT,
        ConsoleKit uses the following mechanism to get the TTY value.  This
        mechanism works on other operating systems, such as Linux, and also
        works on Solaris when VT is being used.  When VT is used, these
        programs make use of proc interfaces to collect some of this
        information, as follows:

        The ConsoleKit ck-get-x11-display-device, ck-get-x11-server-pid, and
        ck-collect-session-info programs call XOpenDisplay on a given $DISPLAY,
        and then calls ConnectionNumber to get the socket associated with
        that display.  getpeerucred is used to get the UID and PID of the
        process.

        The ck-get-x11-display-device and ck-collect-session-info programs
        then open /proc/<pid>/psinfo on the Xserver process in order to access
        environment values associated with that process.  The tty_text value
        from the psinfo structure is then used to determine the TTY device
        associated with the Xserver.

        These interfaces are highlighted because this is a somewhat roundabout
        way to get the TTY value associated with a given display.  That said,
        this mechanism works well when VT is enabled in the Xserver.

        Note that the intent of ConsoleKit is that the daemon should be able to
        determine this information without needing to be informed by the
        display manager.  

        Obviously, when VT is not used, the above mechanism does not work, so
        ConsoleKit will heuristically set the value in the non-VT case
        depending on whether the display is the console display, a local
        non-console display, or a remote display.

   4.1.4 Script Directories

      ConsoleKit provides two directories which may contain scripts that get
      run when a ConsoleKit session starts.  By default these directories are
      empty on Solaris.

      - /usr/lib/ConsoleKit/run-session.d - For scripts shipped by the distro.
      - /etc/ConsoleKit/run-session.d     - For scripts installed by the system
                                            administrator.

   4.1.5 Environment Variables

      ConsoleKit makes use of the following environment variables:

      XDG_SESSION_COOKIE           - Environment variable that ConsoleKit
                                     provides to the session leader.  The
                                     session leader is expected to ensure this
                                     is set for the session process started.
                                     It contains a UUID used to tie the
                                     processes to the session.  This is used
                                     to support user switching on displays
                                     that support it (currently only graphical
                                     VT displays on the console).

      The following environment variables are set when running scripts in
      the script directories described in section 4.1.4.  This way the scripts
      can support conditional logic based on the settings of the session.

      CK_SESSION_SEAT_ID            - Seat ID associated with the session.
      CK_SESSION_USER_UID           - UID associated with the session.
      CK_SESSION_DISPLAY_DEVICE     - The device associated with the 
      CK_SESSION_X11_DISPLAY_DEVICE - The device associated with the Xserver.
      CK_SESSION_X11_DISPLAY        - Display value, such as ":0"
      CK_SESSION_REMOTE_HOST_NAME   - Set to the remote host name if the
                                      session is not local (e.g. XDMCP).
      CK_SESSION_IS_ACTIVE          - Set to "true" or "false".  Is "true" if
                                      the session is active.  For example, VT
                                      displays not running on the display would
                                      be "false"
      CK_SESSION_IS_LOCAL           - Set to "true" or "false".  Is "true" if
                                      the session is local.  Is "false" if the
                                      session is remote (e.g. XDMCP).
      CK_SESSION_IS_DYNAMIC         - Set to "true" or "false".  Is "true" if
                                      the session was started via ck-dynamic,
                                      "false" otherwise.

   4.1.6 Stop/Restart Scripts

       ConsoleKit manages stopping and restarting the system.  On Solaris, when
       the display manager informs ConsoleKit that such an action is requested,
       the chkauthattr function is called to see if the calling user has RBAC
       permissions for the "solaris.system.shutdown" key.  If yes, then the
       /usr/lib/ConsoleKit/scripts/ck-system-restart script is run if a restart
       action was requested.  If a shutdown action was requested, then the 
       /usr/lib/ConsoleKit/scripts/ck-system-stop script is run.

       On Solaris, the ck-system-stop script runs "/sbin/init 5" and the
       ck-system-restart script runs "/sbin/init 6".

   4.1.7. D-Bus Interfaces

       The ConsoleKit D-Bus interfaces are documented here:

       http://people.freedesktop.org/~mccann/doc/ConsoleKit/ConsoleKit.html

       A copy of the above interface documentation is included with the case
       materials.

   4.1.8 Usage of /var/run

       The /var/run interfaces are not installed with the ConsoleKit packages.
       They are created at runtime when the /usr/sbin/console-kit-daemon
       starts.

   4.1.9 SMF integration

       ConsoleKit includes SMF integration files to start and stop the 
       /usr/sbin/console-kit-daemon program as a service.

   4.2. Interfaces:
        
      Exported Interfaces                            Stability    Comments
      ---------------------------------------        -----------  -------------
      SUNWconsolekit                                 Uncommitted  Package name.
      SUNWconsolekit-devel                           Uncommitted  Package name.
      SUNWconsolekit-root                            Uncommitted  Package name.
      /usr/lib/pkgconfig/ck-connector.pc             Uncommitted  pkg-config
                                                                  file.
      /var/svc/manifest/system/consolekit.xml        Uncommitted  SMF
                                                                  integration
                                                                  file.
      /usr/bin/ck-history                            Volatile     See 4.1.2.
      /usr/bin/ck-launch-session                     Volatile     See 4.1.2.
      /usr/bin/ck-list-sessions                      Volatile     See 4.1.2.
      /usr/sbin/ck-seat-tool                         Volatile     See 4.1.2.
      /usr/sbin/console-kit-daemon                   Volatile     See 4.1.2.
      /usr/lib/ck-collect-session-info               Private      See 4.1.2.
      /usr/lib/ck-get-x11-display-device             Volatile     See 4.1.2.
      /usr/lib/ck-get-x11-server-pid                 Private      See 4.1.2.
      /usr/lib/ConsoleKit/scripts/ck-system-restart  Private      See 4.1.6.
      /usr/lib/ConsoleKit/scripts/ck-system-stop     Private      See 4.1.6.
      /usr/lib/libck-connector.so                    Volatile     ConsoleKit
                                                                  library.
      /usr/include/ConsoleKit                        Volatile     Header files.
      /usr/lib/ConsoleKit/run-session.d              Volatile     See 4.1.4.
      /etc/ConsoleKit/run-session.d                  Volatile     See 4.1.4.
      /etc/ConsoleKit/seats.d/                       Volatile     Directory for
                                                                  Seat
                                                                  configuration
                                                                  files
      /etc/ConsoleKit/seats.d/00-primary.seat        Volatile     Configuration
                                                                  for default
                                                                  seat, DISPLAY
                                                                  ":0".
      /etc/ConsoleKit/displays.d/                    Volatile     Directory for
                                                                  display 
                                                                  template
                                                                  configuration
                                                                  files
      /etc/ConsoleKit/displays.d/Local.display       Volatile     Configuration
                                                                  for local
                                                                  display X11
                                                                  command
      /etc/ConsoleKit/sessions.d/                    Volatile     Directory for
                                                                  session
                                                                  variables
                                                                  configuration
                                                                  files
      /etc/ConsoleKit/sessions.d/Local.session       Volatile     Configuration
                                                                  for local
                                                                  display X11
                                                                  variables
      /etc/dbus-1/system.d/ConsoleKit.conf           Volatile     D-Bus
                                                                  Integration.
                                                                  [1]
      /var/log/ConsoleKit/history                    Volatile     History
                                                                  database.
      /var/run/ConsoleKit/database                   Volatile     Session
                                                                  database.
                                                                  See 4.1.8.
      /var/run/ConsoleKit/pid                        Volatile     ConsoleKit
                                                                  daemon PID.
                                                                  See 4.1.8.
      /usr/share/dbus-1/interfaces/*ConsoleKit*      Volatile     D-Bus
                                                                  integration.
      /usr/share/dbus-1/system-services/*ConsoleKit* Volatile     D-Bus
                                                                  integration.
      XDG_SESSION_COOKIE                             Volatile     See 4.1.5.
      CK_SESSION_SEAT_ID                             Volatile     See 4.1.5.
      CK_SESSION_USER_UID                            Volatile     See 4.1.5.
      CK_SESSION_DISPLAY_DEVICE                      Volatile     See 4.1.5.
      CK_SESSION_X11_DISPLAY_DEVICE                  Volatile     See 4.1.5.
      CK_SESSION_X11_DISPLAY                         Volatile     See 4.1.5.
      CK_SESSION_REMOTE_HOST_NAME                    Volatile     See 4.1.5.
      CK_SESSION_IS_ACTIVE                           Volatile     See 4.1.5.
      CK_SESSION_IS_LOCAL                            Volatile     See 4.1.5.
      CK_SESSION_IS_DYNAMIC                          Volatile     See 4.1.5.
 
      Imported Interfaces       Stability          Comments
      -----------------------   ---------------    -----------------------
      GObject & GThread (GLib)  Committed          LSARC 2006/202
      D-Bus & dbus-glib         Volatile           LSARC 2006/368
      /proc & /proc/pid         Public             PSARC 1992/073
      chkauthattr               Stable             PSARC 1997/332
      X11                       Standard           PSARC 1998/299
      Virtual Console           Committed          PSARC 2006/591
      /sbin/init                ?     

   4.3. Doc Impact:

        Man page is needed.

   4.4. Packaging & Delivery:
        
        SUNWconsolekit, SUNWconsolekit-root, SUNWconsolekit-devel - packages
        for ConsoleKit.

   4.5. Dependencies:

        For VT features to work, the following case will need to integrate:
        PSARC 2006/591 Virtual Console

   4.6. L10N Impact:

        The Desktop team and the G11N team are working together to evaluate and
        provide I18N/L10N support.

   4.7. Security Impact:

        ConsoleKit makes use of RBAC so that the Shutdown and Reboot options
        are only available if the requesting user has solaris.system.shutdown
        authority.

        The /var/run/ConsoleKit/database file contains all information about
        each user's session.  This is owned by root:root with 600 permissions
        to prevent snooping or tampering.
       
5. Reference Documents:

        [1] The ./ConsoleKit.conf file is also included with the case materials
            for reference.

        The ConsoleKit documentation from the ConsoleKit website is also
        included with the case materials as the file ./ConsoleKit.html

        ConsoleKit Website:
        http://www.freedesktop.org/wiki/Software/ConsoleKit

        ConsoleKit Documentation:
        http://people.freedesktop.org/~mccann/doc/ConsoleKit/ConsoleKit.html


6. Resources and Schedule
    6.4. Steering Committee requested information
        6.4.1. Consolidation C-team Name:
                Desktop
    6.5. ARC review type: OnePager
    6.6. ARC Exposure: open


Reply via email to