From 95f5cbeec6c07afa357793e6da6db5cbedd08fc8 Mon Sep 17 00:00:00 2001
From: Juan RP <xtraeme@gmail.com>
Date: Fri, 20 Apr 2012 10:22:48 +0200
Subject: [PATCH] lightdm: misc improvements.

---
 srcpkgs/lightdm/files/Xsession              | 194 --------------------
 srcpkgs/lightdm/files/lightdm-autologin.pam |  13 ++
 srcpkgs/lightdm/files/lightdm.pam           |  19 +-
 srcpkgs/lightdm/files/xsession              |  69 +++++++
 srcpkgs/lightdm/template                    |  26 ++-
 5 files changed, 109 insertions(+), 212 deletions(-)
 delete mode 100755 srcpkgs/lightdm/files/Xsession
 create mode 100644 srcpkgs/lightdm/files/lightdm-autologin.pam
 create mode 100644 srcpkgs/lightdm/files/xsession

diff --git a/srcpkgs/lightdm/files/Xsession b/srcpkgs/lightdm/files/Xsession
deleted file mode 100755
index 0634a44d35..0000000000
--- a/srcpkgs/lightdm/files/Xsession
+++ /dev/null
@@ -1,194 +0,0 @@
-#!/bin/sh
-#
-# This is SORT OF LIKE an X session, but not quite.  You get a command as the
-# first argument (it could be multiple words, so run it with "eval").  As a
-# special case, the command can be:
-#  default - Run the appropriate Xclients startup (see the code below)
-#  custom - Run ~/.xsession and if that's not available run 'default'
-#
-# (Note that other arguments could also follow, but only the command one is
-# right now relevant and supported)
-#
-# The output is ALREADY redirected to .xsession-errors in GDM.  This way
-# .xsession-errors actually gets more output such as if the PreSession script
-# is failing.  This also prevents DoS attacks if some app in the users session
-# can be prodded to dump lots of stuff on the stdout/stderr.  We wish to be
-# robust don't we?  In case you wish to use an existing script for other DM's,
-# you can just not redirect when GDMSESSION is set.  GDMSESSION will always
-# be set from gdm.
-#
-# Also note that this is not run as a login shell, this is just executed.
-# This is why we source the profile files below.
-#
-# based on:
-# $XConsortium: Xsession /main/10 1995/12/18 18:21:28 gildea $
-
-command="$@"
-
-# this will go into the .xsession-errors along with all other echo's
-# good for debugging where things went wrong
-echo "$0: Beginning session setup..."
-
-# First read /etc/profile and .profile
-test -f /etc/profile && . /etc/profile
-test -f "$HOME/.profile" && . "$HOME/.profile"
-
-# Note that this should only go to zenity dialogs which always expect utf8
-gettextfunc () {
-  if [ "x$gdmtranslate" != "x" ] ; then
-    "$gdmtranslate" --utf8 "$1"
-  else
-    echo "$1"
-  fi
-}
-
-OLD_IFS=$IFS
-
-gdmwhich () {
-  COMMAND="$1"
-  OUTPUT=
-  IFS=:
-  for dir in $PATH
-  do
-    if test -x "$dir/$COMMAND" ; then
-      if test "x$OUTPUT" = "x" ; then
-        OUTPUT="$dir/$COMMAND"
-      fi
-    fi
-  done
-  IFS=$OLD_IFS 
-  echo "$OUTPUT"
-}
-
-zenity=`gdmwhich zenity`
-
-# Note: ~/.xsession-errors is now done in the daemon so that it
-# works for ALL sessions (except ones named 'Failsafe')
-
-# clean up after xbanner
-freetemp=`gdmwhich freetemp`
-if [ -n "$freetemp" ] ; then
-	"$freetemp"
-fi
-
-userresources="$HOME/.Xresources"
-usermodmap="$HOME/.Xmodmap"
-userxkbmap="$HOME/.Xkbmap"
-
-sysresources=/etc/X11/Xresources 
-sysmodmap=/etc/X11/Xmodmap 
-sysxkbmap=/etc/X11/Xkbmap
-
-rh6sysresources=/etc/X11/xinit/Xresources 
-rh6sysmodmap=/etc/X11/xinit/Xmodmap 
-
-# merge in defaults
-if [ -f "$rh6sysresources" ]; then
-    xrdb -nocpp -merge "$rh6sysresources"
-fi
-
-if [ -f "$sysresources" ]; then
-    xrdb -nocpp -merge "$sysresources"
-fi
-
-if [ -f "$userresources" ]; then
-    xrdb -nocpp -merge "$userresources"
-fi
-
-# merge in keymaps
-if [ -f "$sysxkbmap" ]; then
-    setxkbmap `cat "$sysxkbmap"`
-    XKB_IN_USE=yes
-fi
-
-if [ -f "$userxkbmap" ]; then
-    setxkbmap `cat "$userxkbmap"`
-    XKB_IN_USE=yes
-fi
-
-#
-# Eeek, this seems like too much magic here
-#
-if [ -z "$XKB_IN_USE" -a ! -L /etc/X11/X ]; then
-    if grep '^exec.*/Xsun' /etc/X11/X > /dev/null 2>&1 && [ -f /etc/X11/XF86Config ]; then
-       xkbsymbols=`sed -n -e 's/^[     ]*XkbSymbols[   ]*"\(.*\)".*$/\1/p' /etc/X11/XF86Config`
-       if [ -n "$xkbsymbols" ]; then
-           setxkbmap -symbols "$xkbsymbols"
-           XKB_IN_USE=yes
-       fi
-    fi
-fi
-
-# xkb and xmodmap don't play nice together
-if [ -z "$XKB_IN_USE" ]; then
-    if [ -f "$rh6sysmodmap" ]; then
-       xmodmap "$rh6sysmodmap"
-    fi
-
-    if [ -f "$sysmodmap" ]; then
-       xmodmap "$sysmodmap"
-    fi
-
-    if [ -f "$usermodmap" ]; then
-       xmodmap "$usermodmap"
-    fi
-fi
-
-unset XKB_IN_USE
-
-# run all system xinitrc shell scripts.
-if [ -d /etc/X11/xinit/xinitrc.d ]; then
-    for i in /etc/X11/xinit/xinitrc.d/* ; do
-        if [ -x "$i" -a ! -d "$i" ]; then
-	    . "$i"
-        fi
-    done
-fi
-
-if [ "x$command" = "xcustom" ] ; then
-  if [ -x "$HOME/.xsession" ]; then
-    command="$HOME/.xsession"
-  else
-    echo "$0: Cannot find ~/.xsession will try the default session"
-    command="default"
-  fi
-fi
-
-if [ "x$command" = "xdefault" ] ; then
-  if [ -x "$HOME/.Xclients" ]; then
-    command="$HOME/.Xclients"
-  elif [ -x /etc/X11/xinit/Xclients ]; then
-    command="/etc/X11/xinit/Xclients"
-  elif [ -x /etc/X11/Xclients ]; then
-    command="/etc/X11/Xclients"
-  else
-    if [ -n "$zenity" ] ; then
-	disptext=`gettextfunc "System has no Xclients file, so starting a failsafe xterm session.  Windows will have focus only if the mouse pointer is above them.  To get out of this mode type 'exit' in the window."`
-      "$zenity" --info --text "$disptext"
-    else
-      echo "$0: Cannot find Xclients"
-    fi
-    exec xterm -geometry 80x24+0+0
-  fi
-fi
-
-# add ssh-agent if found
-sshagent="`gdmwhich ssh-agent`"
-if [ -n "$sshagent" ] && [ -x "$sshagent" ] && [ -z "$SSH_AUTH_SOCK" ]; then
-    command="$sshagent -- $command"
-elif [ -z "$sshagent" ] ; then
-    echo "$0: ssh-agent not found!"
-fi
-
-echo "$0: Setup done, will execute: $command"
-
-eval exec $command
-
-echo "$0: Executing $command failed, will run xterm"
-
-if [ -n "$zenity" ] ; then
-	disptext=`gettextfunc "Failed to start the session, so starting a failsafe xterm session.  Windows will have focus only if the mouse pointer is above them.  To get out of this mode type 'exit' in the window."`
-	"$zenity" --info --text "$disptext"
-fi
-
-exec xterm -geometry 80x24+0+0
diff --git a/srcpkgs/lightdm/files/lightdm-autologin.pam b/srcpkgs/lightdm/files/lightdm-autologin.pam
new file mode 100644
index 0000000000..3d4389cf0f
--- /dev/null
+++ b/srcpkgs/lightdm/files/lightdm-autologin.pam
@@ -0,0 +1,13 @@
+#%PAM-1.0
+auth requisite pam_nologin.so
+auth required pam_env.so
+auth requisite pam_permit.so
+auth sufficient pam_succeed_if.so uid >= 1000 quiet
+auth required pam_deny.so
+account required pam_unix.so
+password required pam_deny.so
+session required pam_loginuid.so
+-session optional pam_systemd.so
+session optional pam_keyinit.so revoke
+session required pam_limits.so
+session required pam_unix.so
\ No newline at end of file
diff --git a/srcpkgs/lightdm/files/lightdm.pam b/srcpkgs/lightdm/files/lightdm.pam
index 655299cb7c..d877644da5 100644
--- a/srcpkgs/lightdm/files/lightdm.pam
+++ b/srcpkgs/lightdm/files/lightdm.pam
@@ -1,10 +1,11 @@
 #%PAM-1.0
-auth            requisite       pam_nologin.so
-auth            required        pam_env.so
-auth            required        pam_unix.so
-auth            optional        pam_gnome_keyring.so
-account         required        pam_unix.so
-session         required        pam_limits.so
-session         required        pam_unix.so
-session         optional        pam_gnome_keyring.so auto_start
-password        required        pam_unix.so
+auth requisite pam_nologin.so
+auth required pam_env.so
+auth required pam_unix.so
+auth optional pam_gnome_keyring.so
+account required pam_unix.so
+session required pam_limits.so
+session required pam_unix.so
+session optional pam_systemd.so
+password required pam_unix.so
+session optional pam_gnome_keyring.so auto_start
diff --git a/srcpkgs/lightdm/files/xsession b/srcpkgs/lightdm/files/xsession
new file mode 100644
index 0000000000..5da041e6d7
--- /dev/null
+++ b/srcpkgs/lightdm/files/xsession
@@ -0,0 +1,69 @@
+#!/bin/sh
+#
+# LightDM wrapper to run around X sessions.
+
+echo "Running X session wrapper"
+
+# Load profile
+for file in "/etc/profile" "$HOME/.profile" "/etc/xprofile" "$HOME/.xprofile"; do
+    if [ -f "$file" ]; then
+        echo "Loading profile from $file";
+        . "$file"
+    fi
+done
+
+# Load resources
+for file in "/etc/X11/Xresources" "$HOME/.Xresources"; do
+    if [ -f "$file" ]; then
+        echo "Loading resource: $file"
+        xrdb -nocpp -merge "$file"
+    fi
+done
+
+# Load keymaps
+for file in "/etc/X11/Xkbmap" "$HOME/.Xkbmap"; do
+    if [ -f "$file" ]; then
+        echo "Loading keymap: $file"
+        setxkbmap `cat "$file"`
+        XKB_IN_USE=yes
+    fi
+done    
+
+# Load xmodmap if not using XKB
+if [ -z "$XKB_IN_USE" ]; then
+    for file in "/etc/X11/Xmodmap" "$HOME/.Xmodmap"; do
+        if [ -f "$file" ]; then
+           echo "Loading modmap: $file"
+           xmodmap "$file"
+        fi
+    done
+fi
+
+unset XKB_IN_USE
+
+# Run all system xinitrc shell scripts.
+xinitdir="/etc/X11/xinit/xinitrc.d"
+if [ -d "$xinitdir" ]; then
+    for script in $xinitdir/*; do
+        echo "Loading xinit script $script"
+        if [ -x "$script" -a ! -d "$script" ]; then
+            . "$script"
+        fi
+    done
+fi
+
+# Load Xsession scripts
+xsessionddir="/etc/X11/Xsession.d"
+if [ -d "$xsessionddir" ]; then
+    for i in `ls $xsessionddir`; do
+        script="$xsessionddir/$i"
+        echo "Loading X session script $script"
+        if [ -r "$script"  -a -f "$script" ] && expr "$i" : '^[[:alnum:]_-]\+$' > /dev/null; then
+            . "$script"
+        fi
+    done
+fi
+
+echo "X session wrapper complete, running session $@"
+
+exec $@
diff --git a/srcpkgs/lightdm/template b/srcpkgs/lightdm/template
index 27888e5929..966ea930ba 100644
--- a/srcpkgs/lightdm/template
+++ b/srcpkgs/lightdm/template
@@ -1,11 +1,12 @@
 # Template file for 'lightdm'
 pkgname=lightdm
 version=1.2.2
-revision=1
+revision=2
 homepage="https://launchpad.net/lightdm"
 distfiles="https://launchpad.net/lightdm/1.2/$version/+download/$pkgname-$version.tar.gz"
 build_style=gnu-configure
-configure_args="--with-greeter-user=lightdm --disable-static"
+configure_args="--with-greeter-session=lightdm-gtk-greeter
+--with-greeter-user=lightdm --disable-static --disable-tests"
 short_desc="Light Display Manager"
 maintainer="Juan RP <xtraeme@gmail.com>"
 license="GPL-3, LGPL-3"
@@ -21,7 +22,9 @@ long_desc="
 conf_files="
 /etc/lightdm/keys.conf
 /etc/lightdm/lightdm.conf
-/etc/lightdm/users.conf"
+/etc/lightdm/users.conf
+/etc/pam.d/lightdm
+/etc/pam.d/lightdm-autologin"
 
 provides="display-manager-1"
 replaces="display-manager>=0"
@@ -48,21 +51,26 @@ Add_dependency build gobject-introspection
 Add_dependency full gnome-icon-theme
 Add_dependency full dbus
 
-post_install()
-{
-	local xs="/usr/share/lightdm/Xsession"
+Add_dependency run accountsservice
 
+post_install() {
 	# Remove provided init file and use our own.
 	rm -rf ${DESTDIR}/etc/init
 	vinstall ${FILESDIR}/lightdm.service 644 lib/systemd/system
 	vinstall ${FILESDIR}/lightdm.pam 644 etc/pam.d lightdm
-	vinstall ${FILESDIR}/Xsession 755 usr/share/lightdm
-	vmkdir var/cache/lightdm
+	vinstall ${FILESDIR}/lightdm-autologin.pam 644 etc/pam.d lightdm-autologin
+	vinstall ${FILESDIR}/xsession 755 etc/lightdm
 
 	# Minimum UID shall be 1000 for ordinary users.
 	sed -i -e "s|^\(minimum-uid=\).*|\11000|" \
 		${DESTDIR}/etc/lightdm/users.conf
+	# Fix path to nologin.
+	sed -i -e "s|/usr/sbin/nologin|/sbin/nologin|g" \
+		${DESTDIR}/etc/lightdm/users.conf
 	# Provide a working session wrapper.
-	sed -i -e "s|^\#\(session-wrapper=\).*|\1${xs}|" \
+	sed -i -e "s|#session-wrapper=lightdm-session|session-wrapper=/etc/lightdm/xsession|g" \
+		${DESTDIR}/etc/lightdm/lightdm.conf
+	# Provide a working PAM autologin service.
+	sed -i -e "s|#autologin-session=UNIMPLEMENTED|#autologin-session=UNIMPLEMENTED\n#pam-service=lightdm-autologin|g" \
 		${DESTDIR}/etc/lightdm/lightdm.conf
 }