[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#615020: xdm: ConsoleKit support



Hi,

2011/2/24 Cyril Brulebois <kibi@debian.org>:
> Fernando Tarlá Cardoso Lemos <fernandotcl@gmail.com> (24/02/2011):
>> This patch is not mine. It's from OpenSUSE and I believe similar
>> patches are also being used by Mandriva. Upstream did not show much
>> interest in those patches when they were posted in the upstream
>> bugtracker, but I believe this has never been discussed in their
>> mailing list. Anyways, the patch is small and libck-connector
>> abstracts the whole thing very nicely (it's intended to be used by
>> display managers).
>
> you know the process already:
>  http://wiki.x.org/wiki/Development/Documentation/SubmittingPatches
>
> I'm not sure why you think we'd be happy to carry patches that aren't
> even submitted upstream through the xorg-devel list? There's already
> plenty of work to do.

I understand your concerns. I've posted the patch upstream now:

http://lists.x.org/archives/xorg-devel/2011-February/019615.html

I'm attaching a revised patch that points the DEP-3 header to that
URL, for the sake of completeness.

Regards,
From 15576342cc54d7e37a002cbf42ea7c0c017eade5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fernando=20Tarl=C3=A1=20Cardoso=20Lemos?= <fernandotcl@gmail.com>
Date: Sat, 19 Feb 2011 13:40:15 -0200
Subject: [PATCH] Add a patch for ConsoleKit support.

---
 debian/control                 |    1 +
 debian/patches/consolekit.diff |  231 ++++++++++++++++++++++++++++++++++++++++
 debian/patches/series          |    1 +
 debian/rules                   |    3 +-
 4 files changed, 235 insertions(+), 1 deletions(-)
 create mode 100644 debian/patches/consolekit.diff

diff --git a/debian/control b/debian/control
index 7c2da31..6e7439c 100644
--- a/debian/control
+++ b/debian/control
@@ -14,6 +14,7 @@ Build-Depends:
  libselinux1-dev [!hurd-i386 !kfreebsd-i386 !kfreebsd-amd64],
  libxinerama-dev (>= 1:1.0.1),
  libxft-dev,
+ libck-connector-dev,
  quilt,
  automake,
  libtool,
diff --git a/debian/patches/consolekit.diff b/debian/patches/consolekit.diff
new file mode 100644
index 0000000..dc38cc7
--- /dev/null
+++ b/debian/patches/consolekit.diff
@@ -0,0 +1,231 @@
+Description: Implement ConsoleKit support
+ Starting from 0.4.2, ConsoleKit has more strict securty requirements
+ and ck-launch-session doesn't create a local and active session
+ anymore.
+Forwarded: http://lists.x.org/archives/xorg-devel/2011-February/019615.html
+Origin: https://build.opensuse.org/package/view_file?file=xdm-consolekit.diff&package=xorg-x11&project=openSUSE:11.3:Update:Test&srcmd5=5e43d91b0bf84c8a82fc23b1cb550931
+--- a/configure.ac
++++ b/configure.ac
+@@ -434,6 +434,20 @@
+ 
+ AM_CONDITIONAL(DYNAMIC_GREETER, test x$DYNAMIC_GREETER = xyes)
+ 
++# ConsoleKit support
++AC_ARG_WITH(consolekit, AC_HELP_STRING([--with-consolekit], [Use ConsoleKit]),
++	[USE_CONSOLEKIT=$withval], [USE_CONSOLEKIT=yes])
++if test x"$USE_CONSOLEKIT" != xno; then
++	PKG_CHECK_MODULES(CK_CONNECTOR, ck-connector,
++		[USE_CONSOLEKIT=yes], [USE_CONSOLEKIT=no])
++	if test x"$USE_CONSOLEKIT" = xyes; then
++		AC_DEFINE([USE_CONSOLEKIT], 1, [Define to 1 to use ConsoleKit])
++		XDM_CFLAGS="$XDM_CFLAGS $CK_CONNECTOR_CFLAGS"
++		XDM_LIBS="$XDM_LIBS $CK_CONNECTOR_LIBS"
++	fi
++fi
++dnl AM_CONDITIONAL(USE_CONSOLEKIT, test$USE_CONSOLEKIT = xyes)
++
+ #
+ #  XDM
+ #
+--- a/dm.h
++++ b/dm.h
+@@ -323,6 +323,9 @@
+ extern char	*prngdSocket;
+ extern int	prngdPort;
+ # endif
++#ifdef USE_CONSOLEKIT
++extern int	use_consolekit;
++#endif
+ 
+ extern char	*greeterLib;
+ extern char	*willing;
+--- a/resource.c
++++ b/resource.c
+@@ -65,6 +65,9 @@
+ char	*prngdSocket;
+ int	prngdPort;
+ #endif
++#ifdef USE_CONSOLEKIT
++int	use_consolekit;
++#endif
+ 
+ char	*greeterLib;
+ char	*willing;
+@@ -196,6 +199,10 @@
+ 				"false"} ,
+ { "willing",	"Willing",	DM_STRING,	&willing,
+ 				""} ,
++#ifdef USE_CONSOLEKIT
++{ "consoleKit",	"ConsoleKit",	DM_BOOL,	(char **) &use_consolekit,
++				"true"} ,
++#endif
+ };
+ 
+ #define NUM_DM_RESOURCES	(sizeof DmResources / sizeof DmResources[0])
+@@ -378,7 +385,11 @@
+ {"-debug",	"*debugLevel",		XrmoptionSepArg,	(caddr_t) NULL },
+ {"-xrm",	NULL,			XrmoptionResArg,	(caddr_t) NULL },
+ {"-daemon",	".daemonMode",		XrmoptionNoArg,		"true"         },
+-{"-nodaemon",	".daemonMode",		XrmoptionNoArg,		"false"        }
++{"-nodaemon",	".daemonMode",		XrmoptionNoArg,		"false"        },
++#ifdef USE_CONSOLEKIT
++{"-consolekit",	".consoleKit",		XrmoptionNoArg,		"true"  },
++{"-noconsolekit", ".consoleKit",	XrmoptionNoArg,		"false" }
++#endif
+ };
+ 
+ static int	originalArgc;
+--- a/session.c
++++ b/session.c
+@@ -67,6 +67,11 @@
+ # endif
+ #endif /* USE_PAM */
+ 
++#ifdef USE_CONSOLEKIT
++#include <ck-connector.h>
++#include <dbus/dbus.h>
++#endif
++
+ #ifdef __SCO__
+ # include <prot.h>
+ #endif
+@@ -514,6 +519,97 @@
+     }
+ }
+ 
++#ifdef USE_CONSOLEKIT
++
++static CkConnector *connector;
++
++static int openCKSession(struct verify_info *verify, struct display *d)
++{
++    int ret;
++    DBusError error;
++    char  *remote_host_name = "";
++    dbus_bool_t is_local;
++    char *display_name = "";
++    char *display_device = "";
++    char devtmp[16];
++
++    if (!use_consolekit)
++	return 1;
++
++    is_local = d->displayType.location == Local;
++    if (d->peerlen > 0 && d->peer)
++	remote_host_name = d->peer;
++    if (d->name)
++	display_name = d->name;
++    /* how can we get the corresponding tty at best...? */
++    if (d->windowPath) {
++	display_device = strchr(d->windowPath, ':');
++	if (display_device && display_device[1])
++	    display_device++;
++	else
++	    display_device = d->windowPath;
++	snprintf(devtmp, sizeof(devtmp), "/dev/tty%s", display_device);
++	display_device = devtmp;
++    }
++
++    connector = ck_connector_new();
++    if (!connector) {
++	LogOutOfMem("ck_connector");
++	return 0;
++    }
++
++    dbus_error_init(&error);
++    ret = ck_connector_open_session_with_parameters(
++		connector, &error,
++		"unix-user", &verify->uid,
++		"x11-display", &display_name,
++		"x11-display-device", &display_device,
++		"remote-host-name", &remote_host_name,
++		"is-local", &is_local,
++		NULL);
++    if (!ret) {
++	if (dbus_error_is_set(&error)) {
++	    LogError("Dbus error: %s\n", error.message);
++	    dbus_error_free(&error);
++	} else {
++	    LogError("ConsoleKit error\n");
++	}
++	LogError("console-kit-daemon not running?\n");
++	ck_connector_unref(connector);
++	connector = NULL;
++	return 0;
++    }
++
++    verify->userEnviron = setEnv(verify->userEnviron,
++		"XDG_SESSION_COOKIE", ck_connector_get_cookie(connector));
++    return 1;
++}
++
++static void closeCKSession(void)
++{
++    DBusError error;
++
++    if (!connector)
++	return;
++
++    dbus_error_init(&error);
++    if (!ck_connector_close_session(connector, &error)) {
++	if (dbus_error_is_set(&error)) {
++	    LogError("Dbus error: %s\n", error.message);
++	    dbus_error_free(&error);
++	} else {
++	    LogError("ConsoleKit close error\n");
++	}
++	LogError("console-kit-daemon not running?\n");
++    }
++    ck_connector_unref(connector);
++    connector = NULL;
++}
++#else
++#define openCKSession(v,d)	1
++#define closeCKSession()
++#endif
++
+ void
+ SessionExit (struct display *d, int status, int removeAuth)
+ {
+@@ -528,6 +624,8 @@
+     }
+ #endif
+ 
++    closeCKSession();
++
+     /* make sure the server gets reset after the session is over */
+     if (d->serverPid >= 2 && d->resetSignal)
+ 	kill (d->serverPid, d->resetSignal);
+@@ -610,6 +708,10 @@
+ #ifdef USE_PAM
+     if (pamh) pam_open_session(pamh, 0);
+ #endif
++
++    if (!openCKSession(verify, d))
++	return 0;
++
+     switch (pid = fork ()) {
+     case 0:
+ 	CleanUpChild ();
+--- a/xdm.man.cpp
++++ b/xdm.man.cpp
+@@ -48,6 +48,8 @@
+ ] [
+ .B \-session
+ .I session_program
++] [
++.B \-noconsolekit
+ ]
+ .SH DESCRIPTION
+ .I Xdm
+@@ -215,6 +217,10 @@
+ .IP "\fB\-xrm\fP \fIresource_specification\fP"
+ Allows an arbitrary resource to be specified, as in most
+ X Toolkit applications.
++.IP "\fB\-noconsolekit\fP"
++Specifies ``false'' as the value for the \fBDisplayManager.consoleKit\fP
++resource.
++This suppresses the session management using ConsoleKit.
+ .SH RESOURCES
+ At many stages the actions of
+ .I xdm
diff --git a/debian/patches/series b/debian/patches/series
index 15eddf7..e37ea22 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -9,3 +9,4 @@ support_logfile_rotation.diff
 
 debian.diff
 doc_mention_xdm.options.diff
+consolekit.diff
diff --git a/debian/rules b/debian/rules
index 57b33e8..81ccf3b 100755
--- a/debian/rules
+++ b/debian/rules
@@ -22,7 +22,8 @@ confflags += --with-pam \
 	--with-bw-pixmap=debianbw.xpm \
 	--disable-dynamic-greeter \
 	--disable-xdm-auth \
-	--with-xft
+	--with-xft \
+	--with-consolekit
 
 CFLAGS = -Wall -g
 ifneq (,$(filter noopt,$(DEB_BUILD_OPTIONS)))
-- 
1.7.4.1


Reply to: