X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Fpam-module.c;h=3b2966b30cf833fa37d78f13922c19ee3cedeb8c;hb=90b2de37b80603168f4e9c9c81cff7eea4efa21a;hp=c67e677384b11e0ce4b37c5ec099786924838dfb;hpb=8b255ecd99dfee4e27b40a075b15d1e117f819fa;p=elogind.git diff --git a/src/login/pam-module.c b/src/login/pam-module.c index c67e67738..3b2966b30 100644 --- a/src/login/pam-module.c +++ b/src/login/pam-module.c @@ -46,6 +46,7 @@ static int parse_argv( pam_handle_t *handle, int argc, const char **argv, const char **class, + const char **type, bool *debug) { unsigned i; @@ -53,11 +54,15 @@ static int parse_argv( assert(argc >= 0); assert(argc == 0 || argv); - for (i = 0; i < (unsigned) argc; i++) + for (i = 0; i < (unsigned) argc; i++) { if (startswith(argv[i], "class=")) { if (class) *class = argv[i] + 6; + } else if (startswith(argv[i], "type=")) { + if (type) + *type = argv[i] + 5; + } else if (streq(argv[i], "debug")) { if (debug) *debug = true; @@ -73,6 +78,7 @@ static int parse_argv( } else pam_syslog(handle, LOG_WARNING, "Unknown parameter '%s', ignoring", argv[i]); + } return 0; } @@ -173,7 +179,11 @@ static int export_legacy_dbus_address( _cleanup_free_ char *s = NULL; int r; - if (asprintf(&s, "kernel:path=/dev/kdbus/%lu-user/bus;unix:path=%s/bus", + /* skip export if kdbus is not active */ + if (access("/dev/kdbus", F_OK) < 0) + return PAM_SUCCESS; + + if (asprintf(&s, KERNEL_USER_BUS_FMT ";" UNIX_USER_BUS_FMT, (unsigned long) uid, runtime) < 0) { pam_syslog(handle, LOG_ERR, "Failed to set bus variable."); return PAM_BUF_ERR; @@ -202,7 +212,7 @@ _public_ PAM_EXTERN int pam_sm_open_session( *remote_user = NULL, *remote_host = NULL, *seat = NULL, *type = NULL, *class = NULL, - *class_pam = NULL, *cvtnr = NULL; + *class_pam = NULL, *type_pam = NULL, *cvtnr = NULL, *desktop = NULL; _cleanup_bus_unref_ sd_bus *bus = NULL; int session_fd = -1, existing, r; bool debug = false, remote; @@ -219,6 +229,7 @@ _public_ PAM_EXTERN int pam_sm_open_session( if (parse_argv(handle, argc, argv, &class_pam, + &type_pam, &debug) < 0) return PAM_SESSION_ERR; @@ -280,8 +291,23 @@ _public_ PAM_EXTERN int pam_sm_open_session( if (isempty(cvtnr)) cvtnr = getenv("XDG_VTNR"); + type = pam_getenv(handle, "XDG_SESSION_TYPE"); + if (isempty(type)) + type = getenv("XDG_SESSION_TYPE"); + if (isempty(type)) + type = type_pam; + + class = pam_getenv(handle, "XDG_SESSION_CLASS"); + if (isempty(class)) + class = getenv("XDG_SESSION_CLASS"); + if (isempty(class)) + class = class_pam; + + desktop = pam_getenv(handle, "XDG_SESSION_DESKTOP"); + if (isempty(desktop)) + desktop = getenv("XDG_SESSION_DESKTOP"); + tty = strempty(tty); - display = strempty(display); if (strchr(tty, ':')) { /* A tty with a colon is usually an X11 display, @@ -291,19 +317,21 @@ _public_ PAM_EXTERN int pam_sm_open_session( if (isempty(display)) display = tty; - tty = ""; + tty = NULL; } else if (streq(tty, "cron")) { /* cron has been setting PAM_TTY to "cron" for a very * long time and it probably shouldn't stop doing that * for compatibility reasons. */ - tty = ""; type = "unspecified"; + class = "background"; + tty = NULL; } else if (streq(tty, "ssh")) { /* ssh has been setting PAM_TTY to "ssh" for a very * long time and probably shouldn't stop doing that * for compatibility reasons. */ - tty = ""; type ="tty"; + class = "user"; + tty = NULL; } /* If this fails vtnr will be 0, that's intended */ @@ -317,15 +345,15 @@ _public_ PAM_EXTERN int pam_sm_open_session( get_seat_from_display(display, NULL, &vtnr); } - if (!type) + if (seat && !streq(seat, "seat0") && vtnr != 0) { + pam_syslog(handle, LOG_DEBUG, "Ignoring vtnr %d for %s which is not seat0", vtnr, seat); + vtnr = 0; + } + + if (isempty(type)) type = !isempty(display) ? "x11" : - !isempty(tty) ? "tty" : "unspecified"; + !isempty(tty) ? "tty" : "unspecified"; - class = pam_getenv(handle, "XDG_SESSION_CLASS"); - if (isempty(class)) - class = getenv("XDG_SESSION_CLASS"); - if (isempty(class)) - class = class_pam; if (isempty(class)) class = streq(type, "unspecified") ? "background" : "user"; @@ -343,11 +371,11 @@ _public_ PAM_EXTERN int pam_sm_open_session( if (debug) pam_syslog(handle, LOG_DEBUG, "Asking logind to create session: " - "uid=%u pid=%u service=%s type=%s class=%s seat=%s vtnr=%u tty=%s display=%s remote=%s remote_user=%s remote_host=%s", + "uid=%u pid=%u service=%s type=%s class=%s desktop=%s seat=%s vtnr=%u tty=%s display=%s remote=%s remote_user=%s remote_host=%s", pw->pw_uid, getpid(), strempty(service), - type, class, - strempty(seat), vtnr, tty, strempty(display), + type, class, desktop, + strempty(seat), vtnr, strempty(tty), strempty(display), yes_no(remote), strempty(remote_user), strempty(remote_host)); r = sd_bus_call_method(bus, @@ -357,19 +385,20 @@ _public_ PAM_EXTERN int pam_sm_open_session( "CreateSession", &error, &reply, - "uussssussbssa(sv)", + "uusssssussbssa(sv)", (uint32_t) pw->pw_uid, (uint32_t) getpid(), - strempty(service), + service, type, class, - strempty(seat), + desktop, + seat, vtnr, tty, - strempty(display), + display, remote, - strempty(remote_user), - strempty(remote_host), + remote_user, + remote_host, 0); if (r < 0) { pam_syslog(handle, LOG_ERR, "Failed to create session: %s", bus_error_message(&error, r));