1
0
mirror of https://git.FreeBSD.org/ports.git synced 2025-01-28 10:08:24 +00:00

x11/slim: fix to honour login.conf, WWW

PR:		195759
Requested by:	Jonathan Chen <jonc@chen.org.nz>
Approved by:	Henry Hu <henry.hu.sh@gmail.com> (maintainer)
This commit is contained in:
Kurt Jaeger 2015-02-22 14:50:25 +00:00
parent 40be0b24f0
commit 2a628ae13f
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=379608
6 changed files with 132 additions and 19 deletions

View File

@ -3,7 +3,7 @@
PORTNAME= slim
PORTVERSION= 1.3.6
PORTREVISION= 6
PORTREVISION= 7
CATEGORIES= x11
MASTER_SITES= ftp://ftp.berlios.de/pub/slim/ \
SF/slim.berlios

View File

@ -1,5 +1,5 @@
--- ./CMakeLists.txt.orig 2013-10-01 22:38:05.000000000 +0000
+++ ./CMakeLists.txt 2014-03-08 16:26:46.000000000 +0000
--- CMakeLists.txt.orig 2013-10-01 18:38:05.000000000 -0400
+++ CMakeLists.txt 2014-12-15 21:35:53.000000000 -0500
@@ -14,6 +14,7 @@
INCLUDE(CheckCCompilerFlag)
INCLUDE(CheckCXXCompilerFlag)
@ -60,7 +60,15 @@
include_directories(${PAM_INCLUDE_DIR})
else(PAM_FOUND)
message("\tPAM Not Found")
@@ -221,7 +235,9 @@
@@ -195,6 +209,7 @@
${FREETYPE_LIBRARY}
${JPEG_LIBRARIES}
${PNG_LIBRARIES}
+ util
libslim
)
@@ -221,7 +236,9 @@
####### install
# slim
install(TARGETS slim RUNTIME DESTINATION bin)
@ -71,7 +79,7 @@
if (BUILD_SHARED_LIBS)
set_target_properties(libslim PROPERTIES
@@ -236,9 +252,11 @@
@@ -236,9 +253,11 @@
# man file
install(FILES slim.1 DESTINATION ${MANDIR}/man1/)

View File

@ -1,6 +1,76 @@
--- ./app.cpp.orig 2012-12-31 07:03:42.000000000 -0600
+++ ./app.cpp 2013-03-23 14:10:35.000000000 -0500
@@ -931,7 +931,7 @@
--- app.cpp.orig 2013-10-01 18:38:05.000000000 -0400
+++ app.cpp 2014-12-18 00:18:29.000000000 -0500
@@ -14,6 +14,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <stdint.h>
+#include <login_cap.h>
#include <cstring>
#include <cstdio>
#include <iostream>
@@ -32,6 +33,20 @@
using namespace std;
+static const int LOGIN_CAP_VAR_COUNT = 4;
+static const char* LOGIN_CAP_VARS[] = {
+ "lang",
+ "charset",
+ "timezone",
+ "manpath",
+};
+static const char* LOGIN_CAP_ENVS[] = {
+ "LANG",
+ "MM_CHARSET",
+ "TZ",
+ "MANPATH",
+};
+
#ifdef USE_PAM
#include <string>
@@ -123,6 +138,22 @@
signal(sig, User1Signal);
}
+static void AddToEnv(char*** curr_env, const char *name, const char *value) {
+ int n;
+ for (n = 0; (*curr_env)[n] != NULL; n++) ;
+ n++;
+ char** new_env = static_cast<char**>(malloc(sizeof(char*) * (n + 1)));
+ memcpy(new_env, *curr_env, sizeof(char*) * n);
+ char* entry = static_cast<char*>(malloc(strlen(name) + strlen(value) + 2));
+ strcpy(entry, name);
+ strcat(entry, "=");
+ strcat(entry, value);
+ new_env[n-1] = entry;
+ new_env[n] = NULL;
+ free(*curr_env);
+ *curr_env = new_env;
+}
+
#ifdef USE_PAM
App::App(int argc, char** argv)
: pam(conv, static_cast<void*>(&LoginPanel)),
@@ -627,6 +658,17 @@
#endif
+ login_cap_t *lc = login_getpwclass(pw);
+ if (lc != NULL) {
+ for (int i = 0; i < LOGIN_CAP_VAR_COUNT; i++) {
+ const char *value = login_getcapstr(lc, LOGIN_CAP_VARS[i], NULL, NULL);
+ if (value != NULL) {
+ AddToEnv(&child_env, LOGIN_CAP_ENVS[i], value);
+ }
+ }
+ login_close(lc);
+ }
+
/* Login process starts here */
SwitchUser Su(pw, cfg, DisplayName, child_env);
string session = LoginPanel->getSession();
@@ -941,7 +983,7 @@
}
if (!hasVtSet && daemonmode) {

View File

@ -7,7 +7,7 @@
-default_xserver /usr/bin/X
-#xserver_arguments -dpi 75
+# Use default path from /etc/login.conf
+default_path /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:%%LOCALBASE%%/sbin:%%LOCALBASE%%/bin:$HOME/bin
+default_path /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:%%LOCALBASE%%/sbin:%%LOCALBASE%%/bin
+default_xserver %%LOCALBASE%%/bin/X
+# The X server needs to be started on an unused virtual terminal,
+# for FreeBSD in a default configuration, the first one of those is #09

View File

@ -1,11 +1,46 @@
--- ./switchuser.cpp.orig 2012-12-31 07:03:42.000000000 -0600
+++ ./switchuser.cpp 2013-03-23 14:10:35.000000000 -0500
@@ -36,6 +36,8 @@
--- switchuser.cpp.orig 2013-10-01 18:38:05.000000000 -0400
+++ switchuser.cpp 2014-12-15 22:14:16.000000000 -0500
@@ -9,6 +9,9 @@
(at your option) any later version.
*/
+#include <sys/types.h>
+#include <login_cap.h>
+
#include <cstdio>
#include "switchuser.h"
#include "util.h"
@@ -35,13 +38,27 @@
}
void SwitchUser::SetUserId() {
if( (Pw == 0) ||
+ (setsid() == -1) ||
+ (setlogin(Pw->pw_name) != 0) ||
(initgroups(Pw->pw_name, Pw->pw_gid) != 0) ||
(setgid(Pw->pw_gid) != 0) ||
(setuid(Pw->pw_uid) != 0) ) {
- if( (Pw == 0) ||
- (initgroups(Pw->pw_name, Pw->pw_gid) != 0) ||
- (setgid(Pw->pw_gid) != 0) ||
- (setuid(Pw->pw_uid) != 0) ) {
- logStream << APPNAME << ": could not switch user id" << endl;
- exit(ERR_EXIT);
+ if ((Pw != 0) && (setsid() != -1)) {
+ // TODO: allow users to override settings with .login.conf
+ login_cap_t *lc = login_getpwclass(Pw);
+ if ((lc != NULL) &&
+ (setusercontext(lc, Pw, Pw->pw_uid, LOGIN_SETALL) == 0)) {
+ login_close(lc);
+ return;
+ }
+ login_close(lc);
+ logStream << APPNAME << ": fail to set user context" << endl;
+ // fallback to old method
+ if ((setlogin(Pw->pw_name) == 0) &&
+ (initgroups(Pw->pw_name, Pw->pw_gid) == 0) &&
+ (setgid(Pw->pw_gid) == 0) &&
+ (setuid(Pw->pw_uid) == 0) ) {
+ return;
+ }
}
+
+ logStream << APPNAME << ": could not switch user id" << endl;
+ exit(ERR_EXIT);
}
void SwitchUser::Execute(const char* cmd) {

View File

@ -5,4 +5,4 @@ It aims to be light and simple, although completely configurable through
themes and an option file; is suitable for machines on which remote login
functionalities are not needed.
WWW: http://slim.berlios.de/
WWW: http://sourceforge.net/projects/slim.berlios/