# Copyright 1999-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: pam.eclass # @MAINTAINER: # base-system@gentoo.org # @AUTHOR: # Diego Pettenò # @SUPPORTED_EAPIS: 7 8 # @BLURB: Handles pam related tasks # @DESCRIPTION: # This eclass contains functions to install pamd configuration files and # pam modules. case ${EAPI} in 7|8) ;; *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; esac if [[ -z ${_PAM_ECLASS} ]]; then _PAM_ECLASS=1 inherit flag-o-matic # @FUNCTION: _pam_flag_disabled # @INTERNAL # @DESCRIPTION: # Check whether pam support is disabled. _pam_flag_disabled() { in_iuse pam && ! use pam } # @FUNCTION: dopamd # @USAGE: [more files] # @DESCRIPTION: # Install pam auth config file in /etc/pam.d dopamd() { [[ -z $1 ]] && die "dopamd requires at least one argument" _pam_flag_disabled && return 0 ( # dont want to pollute calling env insinto /etc/pam.d insopts -m 0644 doins "$@" ) cleanpamd "$@" } # @FUNCTION: newpamd # @USAGE: # @DESCRIPTION: # Install pam file as in /etc/pam.d newpamd() { [[ $# -ne 2 ]] && die "newpamd requires two arguments" _pam_flag_disabled && return 0 ( # dont want to pollute calling env insinto /etc/pam.d insopts -m 0644 newins "$1" "$2" ) cleanpamd $2 } # @FUNCTION: dopamsecurity # @USAGE:
[more files] # @DESCRIPTION: # Installs the config files in /etc/security/
/ dopamsecurity() { [[ $# -lt 2 ]] && die "dopamsecurity requires at least two arguments" _pam_flag_disabled && return 0 ( # dont want to pollute calling env insinto /etc/security/$1 insopts -m 0644 doins "${@:2}" ) } # @FUNCTION: newpamsecurity # @USAGE:
# @DESCRIPTION: # Installs the config file as in /etc/security/
/ newpamsecurity() { [[ $# -ne 3 ]] && die "newpamsecurity requires three arguments" _pam_flag_disabled && return 0 ( # dont want to pollute calling env insinto /etc/security/$1 insopts -m 0644 newins "$2" "$3" ) } # @FUNCTION: getpam_mod_dir # @DESCRIPTION: # Returns the pam modules' directory for current implementation getpam_mod_dir() { PAM_MOD_DIR=/$(get_libdir)/security echo ${PAM_MOD_DIR} } # @FUNCTION: pammod_hide_symbols # @DESCRIPTION: # Hide all non-PAM-used symbols from the module; this function creates a # simple ld version script that hides all the symbols that are not # necessary for PAM to load the module, then uses append-flags to make # sure that it gets used. pammod_hide_symbols() { cat - > "${T}"/pam-eclass-pam_symbols.ver < [more files] # @DESCRIPTION: # Install pam module file in the pam modules' dir for current implementation dopammod() { [[ -z $1 ]] && die "dopammod requires at least one argument" _pam_flag_disabled && return 0 exeinto $(getpam_mod_dir) doexe "$@" } # @FUNCTION: newpammod # @USAGE: # @DESCRIPTION: # Install pam module file as in the pam # modules' dir for current implementation newpammod() { [[ $# -ne 2 ]] && die "newpammod requires two arguments" _pam_flag_disabled && return 0 exeinto $(getpam_mod_dir) newexe "$1" "$2" } # @FUNCTION: pamd_mimic_system # @USAGE: [auth levels] # @DESCRIPTION: # This function creates a pamd file which mimics system-auth file # for the given levels in the /etc/pam.d directory. pamd_mimic_system() { [[ $# -lt 2 ]] && die "pamd_mimic_system requires at least two arguments" pamd_mimic system-auth "$@" } # @FUNCTION: pamd_mimic # @USAGE: [auth levels] # @DESCRIPTION: # This function creates a pamd file which mimics the given stack # for the given levels in the /etc/pam.d directory. pamd_mimic() { [[ $# -lt 3 ]] && die "pamd_mimic requires at least three arguments" _pam_flag_disabled && return 0 dodir /etc/pam.d local pamdfile="${ED}/etc/pam.d/$2" echo -e "# File autogenerated by pamd_mimic in pam eclass\n\n" \ >> "${pamdfile}" || die local authlevels="auth account password session" local mimic="\tsubstack\t\t$1" shift; shift while [[ -n $1 ]]; do has $1 ${authlevels} || die "unknown level type" echo -e "$1${mimic}" >> "${pamdfile}" || die shift done } # @FUNCTION: cleanpamd # @USAGE: # @DESCRIPTION: # Cleans a pam.d file from modules that might not be present on the system # where it's going to be installed cleanpamd() { while [[ -n $1 ]]; do if ! has_version sys-libs/pam; then sed -i -e '/pam_shells\|pam_console/s:^:#:' "${ED}/etc/pam.d/$1" || die fi shift done } fi