pax_global_header00006660000000000000000000000064134136760560014525gustar00rootroot0000000000000052 comment=660e193473824085a55d9bc14adb0f7ff27c93a0 libnss-unknown-v0.0.2/000077500000000000000000000000001341367605600147015ustar00rootroot00000000000000libnss-unknown-v0.0.2/.gitlab-ci.yml000066400000000000000000000005671341367605600173450ustar00rootroot00000000000000image: debian:buster-slim before_script: - apt update - apt-get install --no-install-recommends -y build-essential meson libnss3-dev sharness libnss-wrapper test: script: - meson _build/ . - cd _build/ - ninja - meson test -v artifacts: when: always paths: - _build/meson-logs - _build/test-results libnss-unknown-v0.0.2/meson.build000066400000000000000000000005701341367605600170450ustar00rootroot00000000000000project('libnss-unknown', 'c', version: '0.0.2') sources = [ 'src/nss-unknown.c' ] shlib = shared_library('nss_unknown', sources, soversion: '2', install: true) testenv = environment() testenv.set('MESON_BUILD_ROOT', meson.build_root()) test('Resolve unknown current user', find_program('tests/resolve-unknown-current-user.t'), env: testenv, depends:shlib) libnss-unknown-v0.0.2/src/000077500000000000000000000000001341367605600154705ustar00rootroot00000000000000libnss-unknown-v0.0.2/src/nss-unknown.c000066400000000000000000000043461341367605600201430ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1+ * * Copyright (C) 2018 Collabora ltd. * @author Sjoerd Simons */ #include #include #include #include #include #include #include #include #define UNKNOWN_USER_GECOS "Unknown user" #define UNKNOWN_USER_PASSWD "*" #define UNKNOWN_USER_DIR "/" #define UNKNOWN_USER_SHELL "/sbin/nologin" #define NOGROUP 65534 #define UNKNOWN_FORMAT "uid-%d" static char * determine_homedir (uid_t uid, char *buffer, size_t buflen) { char *home; if (uid != getuid()) return UNKNOWN_USER_DIR; home = getenv ("NSS_UNKNOWN_HOME"); if (home == NULL) home = getenv ("HOME"); if (home == NULL) return UNKNOWN_USER_DIR; strncpy (buffer, home, buflen); return buffer; } enum nss_status _nss_unknown_getpwnam_r (const char *name, struct passwd *pwd, char *buffer, size_t buflen, int *errnop) { uid_t uid = 0; size_t n; if (sscanf (name, UNKNOWN_FORMAT, &uid) != 1) return NSS_STATUS_NOTFOUND; strncpy (buffer, name, buflen); pwd->pw_name = buffer; n = strlen (name) + 1; buffer += n; buflen -= n; pwd->pw_dir = determine_homedir (uid, buffer, buflen); pwd->pw_uid = uid; pwd->pw_gid = NOGROUP; pwd->pw_gecos = UNKNOWN_USER_GECOS; pwd->pw_passwd = UNKNOWN_USER_PASSWD; pwd->pw_shell = UNKNOWN_USER_SHELL; return NSS_STATUS_SUCCESS; } enum nss_status _nss_unknown_getpwuid_r (uid_t uid, struct passwd *pwd, char *buffer, size_t buflen, int *errnop) { size_t n; snprintf (buffer, buflen, UNKNOWN_FORMAT, uid); pwd->pw_name = buffer; n = strlen (buffer) + 1; buffer += n; buflen -= n; pwd->pw_dir = determine_homedir (uid, buffer, buflen); pwd->pw_uid = uid; pwd->pw_gid = NOGROUP; pwd->pw_gecos = UNKNOWN_USER_GECOS; pwd->pw_passwd = UNKNOWN_USER_PASSWD; pwd->pw_shell = UNKNOWN_USER_SHELL; return NSS_STATUS_SUCCESS; } libnss-unknown-v0.0.2/tests/000077500000000000000000000000001341367605600160435ustar00rootroot00000000000000libnss-unknown-v0.0.2/tests/resolve-unknown-current-user.t000077500000000000000000000040051341367605600240420ustar00rootroot00000000000000#!/bin/sh # SPDX-License-Identifier: LGPL-2.1+ # # Copyright (C) 2018 Collabora ltd. # @author Emanuele Aina test_description="Use nss_wrapper to pretend the current user is not in the db" . /usr/share/sharness/sharness.sh test_debug "export NSS_WRAPPER_DEBUGLEVEL=3" get_passwd_entry () { USERID=$1 env -i \ ${HOME+HOME=$HOME} \ ${NSS_WRAPPER_DEBUGLEVEL+NSS_WRAPPER_DEBUGLEVEL=$NSS_WRAPPER_DEBUGLEVEL} \ ${NSS_UNKNOWN_HOME+NSS_UNKNOWN_HOME=$NSS_UNKNOWN_HOME} \ LD_PRELOAD=libnss_wrapper.so \ NSS_WRAPPER_PASSWD=/dev/null \ NSS_WRAPPER_GROUP=/dev/null \ NSS_WRAPPER_MODULE_SO_PATH="${MESON_BUILD_ROOT}/libnss_unknown.so" \ NSS_WRAPPER_MODULE_FN_PREFIX=unknown \ getent passwd "$USERID" } export HOME="/fakehome" entry=$(get_passwd_entry $(id -u)) test_debug "echo entry = '$entry'" test_expect_success 'A passwd entry is returned' \ 'test -n "$entry"' username=$(echo "$entry" | cut -f 1 -d ":") shell=$(echo "$entry" | cut -f 7 -d ":") home=$(echo "$entry" | cut -f 6 -d ":") test_debug "echo username = '$username'" test_expect_success 'A made-up username is returned for the unknown user' \ 'test "$username" = uid-$(id -u)' test_debug "echo shell = '$shell'" test_expect_success 'The nologin command is returned as the user shell' \ 'test "$shell" = /sbin/nologin' test_debug "echo home = '$home'" test_expect_success 'The $HOME env var is returned as the user homedir' \ 'test "$home" = "$HOME"' unset HOME entry=$(get_passwd_entry $(id -u)) home=$(echo "$entry" | cut -f 6 -d ":") test_debug "echo entry = '$entry'" test_debug "echo home = '$home'" test_expect_success 'Fallback to "/" if $HOME is not set' \ 'test "$home" = "/"' export NSS_UNKNOWN_HOME="/unknownhome" export HOME="/fakehome" entry=$(get_passwd_entry $(id -u)) home=$(echo "$entry" | cut -f 6 -d ":") test_debug "echo entry = '$entry'" test_debug "echo home = '$home'" test_expect_success 'Check that NSS_UNKNOWN_HOME overrides HOME' \ 'test "$home" = "$NSS_UNKNOWN_HOME"' test_done