xdm-consolekit.patch 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. http://bugs.gentoo.org/360987
  2. http://projects.archlinux.org/svntogit/packages.git/plain/trunk/xdm-consolekit.patch?h=packages/xorg-xdm
  3. http://lists.x.org/archives/xorg-devel/2011-February/019615.html
  4. http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=615020
  5. --- a/configure.ac
  6. +++ b/configure.ac
  7. @@ -362,6 +362,20 @@
  8. AM_CONDITIONAL(DYNAMIC_GREETER, test x$DYNAMIC_GREETER = xyes)
  9. +# ConsoleKit support
  10. +AC_ARG_WITH(consolekit, AC_HELP_STRING([--with-consolekit], [Use ConsoleKit]),
  11. + [USE_CONSOLEKIT=$withval], [USE_CONSOLEKIT=yes])
  12. +if test x"$USE_CONSOLEKIT" != xno; then
  13. + PKG_CHECK_MODULES(CK_CONNECTOR, ck-connector,
  14. + [USE_CONSOLEKIT=yes], [USE_CONSOLEKIT=no])
  15. + if test x"$USE_CONSOLEKIT" = xyes; then
  16. + AC_DEFINE([USE_CONSOLEKIT], 1, [Define to 1 to use ConsoleKit])
  17. + XDM_CFLAGS="$XDM_CFLAGS $CK_CONNECTOR_CFLAGS -DUSE_CONSOLEKIT"
  18. + XDM_LIBS="$XDM_LIBS $CK_CONNECTOR_LIBS"
  19. + fi
  20. +fi
  21. +dnl AM_CONDITIONAL(USE_CONSOLEKIT, test$USE_CONSOLEKIT = xyes)
  22. +
  23. #
  24. # XDM
  25. #
  26. --- a/xdm/session.c
  27. +++ b/xdm/session.c
  28. @@ -66,6 +66,11 @@
  29. #endif
  30. #endif /* USE_PAM */
  31. +#ifdef USE_CONSOLEKIT
  32. +#include <ck-connector.h>
  33. +#include <dbus/dbus.h>
  34. +#endif
  35. +
  36. #ifdef __SCO__
  37. #include <prot.h>
  38. #endif
  39. @@ -472,6 +477,97 @@
  40. }
  41. }
  42. +#ifdef USE_CONSOLEKIT
  43. +
  44. +static CkConnector *connector;
  45. +
  46. +static int openCKSession(struct verify_info *verify, struct display *d)
  47. +{
  48. + int ret;
  49. + DBusError error;
  50. + char *remote_host_name = "";
  51. + dbus_bool_t is_local;
  52. + char *display_name = "";
  53. + char *display_device = "";
  54. + char devtmp[16];
  55. +
  56. + if (!use_consolekit)
  57. + return 1;
  58. +
  59. + is_local = d->displayType.location == Local;
  60. + if (d->peerlen > 0 && d->peer)
  61. + remote_host_name = d->peer;
  62. + if (d->name)
  63. + display_name = d->name;
  64. + /* how can we get the corresponding tty at best...? */
  65. + if (d->windowPath) {
  66. + display_device = strchr(d->windowPath, ':');
  67. + if (display_device && display_device[1])
  68. + display_device++;
  69. + else
  70. + display_device = d->windowPath;
  71. + snprintf(devtmp, sizeof(devtmp), "/dev/tty%s", display_device);
  72. + display_device = devtmp;
  73. + }
  74. +
  75. + connector = ck_connector_new();
  76. + if (!connector) {
  77. + LogOutOfMem("ck_connector");
  78. + return 0;
  79. + }
  80. +
  81. + dbus_error_init(&error);
  82. + ret = ck_connector_open_session_with_parameters(
  83. + connector, &error,
  84. + "unix-user", &verify->uid,
  85. + "x11-display", &display_name,
  86. + "x11-display-device", &display_device,
  87. + "remote-host-name", &remote_host_name,
  88. + "is-local", &is_local,
  89. + NULL);
  90. + if (!ret) {
  91. + if (dbus_error_is_set(&error)) {
  92. + LogError("Dbus error: %s\n", error.message);
  93. + dbus_error_free(&error);
  94. + } else {
  95. + LogError("ConsoleKit error\n");
  96. + }
  97. + LogError("console-kit-daemon not running?\n");
  98. + ck_connector_unref(connector);
  99. + connector = NULL;
  100. + return 0;
  101. + }
  102. +
  103. + verify->userEnviron = setEnv(verify->userEnviron,
  104. + "XDG_SESSION_COOKIE", ck_connector_get_cookie(connector));
  105. + return 1;
  106. +}
  107. +
  108. +static void closeCKSession(void)
  109. +{
  110. + DBusError error;
  111. +
  112. + if (!connector)
  113. + return;
  114. +
  115. + dbus_error_init(&error);
  116. + if (!ck_connector_close_session(connector, &error)) {
  117. + if (dbus_error_is_set(&error)) {
  118. + LogError("Dbus error: %s\n", error.message);
  119. + dbus_error_free(&error);
  120. + } else {
  121. + LogError("ConsoleKit close error\n");
  122. + }
  123. + LogError("console-kit-daemon not running?\n");
  124. + }
  125. + ck_connector_unref(connector);
  126. + connector = NULL;
  127. +}
  128. +#else
  129. +#define openCKSession(v,d) 1
  130. +#define closeCKSession()
  131. +#endif
  132. +
  133. void
  134. SessionExit (struct display *d, int status, int removeAuth)
  135. {
  136. @@ -486,6 +580,8 @@
  137. }
  138. #endif
  139. + closeCKSession();
  140. +
  141. /* make sure the server gets reset after the session is over */
  142. if (d->serverPid >= 2 && d->resetSignal)
  143. kill (d->serverPid, d->resetSignal);
  144. @@ -568,6 +664,10 @@
  145. #ifdef USE_PAM
  146. if (pamh) pam_open_session(pamh, 0);
  147. #endif
  148. +
  149. + if (!openCKSession(verify, d))
  150. + return 0;
  151. +
  152. switch (pid = fork ()) {
  153. case 0:
  154. CleanUpChild ();
  155. --- a/include/dm.h
  156. +++ b/include/dm.h
  157. @@ -325,6 +325,9 @@
  158. extern char *prngdSocket;
  159. extern int prngdPort;
  160. # endif
  161. +#ifdef USE_CONSOLEKIT
  162. +extern int use_consolekit;
  163. +#endif
  164. extern char *greeterLib;
  165. extern char *willing;
  166. --- a/xdm/resource.c
  167. +++ b/xdm/resource.c
  168. @@ -68,6 +68,9 @@
  169. char *prngdSocket;
  170. int prngdPort;
  171. #endif
  172. +#ifdef USE_CONSOLEKIT
  173. +int use_consolekit;
  174. +#endif
  175. char *greeterLib;
  176. char *willing;
  177. @@ -258,6 +261,10 @@
  178. "false"} ,
  179. { "willing", "Willing", DM_STRING, &willing,
  180. ""} ,
  181. +#ifdef USE_CONSOLEKIT
  182. +{ "consoleKit", "ConsoleKit", DM_BOOL, (char **) &use_consolekit,
  183. + "true"} ,
  184. +#endif
  185. };
  186. # define NUM_DM_RESOURCES (sizeof DmResources / sizeof DmResources[0])
  187. @@ -440,7 +447,11 @@
  188. {"-debug", "*debugLevel", XrmoptionSepArg, (caddr_t) NULL },
  189. {"-xrm", NULL, XrmoptionResArg, (caddr_t) NULL },
  190. {"-daemon", ".daemonMode", XrmoptionNoArg, "true" },
  191. -{"-nodaemon", ".daemonMode", XrmoptionNoArg, "false" }
  192. +{"-nodaemon", ".daemonMode", XrmoptionNoArg, "false" },
  193. +#ifdef USE_CONSOLEKIT
  194. +{"-consolekit", ".consoleKit", XrmoptionNoArg, "true" },
  195. +{"-noconsolekit", ".consoleKit", XrmoptionNoArg, "false" }
  196. +#endif
  197. };
  198. static int originalArgc;
  199. --- a/man/xdm.man
  200. +++ b/man/xdm.man
  201. @@ -51,6 +51,8 @@
  202. ] [
  203. .B \-session
  204. .I session_program
  205. +] [
  206. +.B \-noconsolekit
  207. ]
  208. .SH DESCRIPTION
  209. .I Xdm
  210. @@ -218,6 +220,10 @@
  211. .IP "\fB\-xrm\fP \fIresource_specification\fP"
  212. Allows an arbitrary resource to be specified, as in most
  213. X Toolkit applications.
  214. +.IP "\fB\-noconsolekit\fP"
  215. +Specifies ``false'' as the value for the \fBDisplayManager.consoleKit\fP
  216. +resource.
  217. +This suppresses the session management using ConsoleKit.
  218. .SH RESOURCES
  219. At many stages the actions of
  220. .I xdm