#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "Login/Password Management Utilities"

INSERT

config FEATURE_SHADOWPASSWDS
	bool "Support for shadow passwords"
	default y
	help
	  Build support for shadow password in /etc/shadow. This file is only
	  readable by root and thus the encrypted passwords are no longer
	  publicly readable.

config USE_BB_PWD_GRP
	bool "Use internal password and group functions rather than system functions"
	default y
	help
	  If you leave this disabled, busybox will use the system's password
	  and group functions. And if you are using the GNU C library
	  (glibc), you will then need to install the /etc/nsswitch.conf
	  configuration file and the required /lib/libnss_* libraries in
	  order for the password and group functions to work. This generally
	  makes your embedded system quite a bit larger.

	  Enabling this option will cause busybox to directly access the
	  system's /etc/password, /etc/group files (and your system will be
	  smaller, and I will get fewer emails asking about how glibc NSS
	  works). When this option is enabled, you will not be able to use
	  PAM to access remote LDAP password servers and whatnot. And if you
	  want hostname resolution to work with glibc, you still need the
	  /lib/libnss_* libraries.

	  If you need to use glibc's nsswitch.conf mechanism
	  (e.g. if user/group database is NOT stored in /etc/passwd etc),
	  you must NOT use this option.

	  If you enable this option, it will add about 1.5k.

config USE_BB_SHADOW
	bool "Use internal shadow password functions"
	default y
	depends on USE_BB_PWD_GRP && FEATURE_SHADOWPASSWDS
	help
	  If you leave this disabled, busybox will use the system's shadow
	  password handling functions. And if you are using the GNU C library
	  (glibc), you will then need to install the /etc/nsswitch.conf
	  configuration file and the required /lib/libnss_* libraries in
	  order for the shadow password functions to work. This generally
	  makes your embedded system quite a bit larger.

	  Enabling this option will cause busybox to directly access the
	  system's /etc/shadow file when handling shadow passwords. This
	  makes your system smaller (and I will get fewer emails asking about
	  how glibc NSS works). When this option is enabled, you will not be
	  able to use PAM to access shadow passwords from remote LDAP
	  password servers and whatnot.

config USE_BB_CRYPT
	bool "Use internal crypt functions"
	default y
	help
	  Busybox has internal DES and MD5 crypt functions.
	  They produce results which are identical to corresponding
	  standard C library functions.

	  If you leave this disabled, busybox will use the system's
	  crypt functions. Most C libraries use large (~70k)
	  static buffers there, and also combine them with more general
	  DES encryption/decryption.

	  For busybox, having large static buffers is undesirable,
	  especially on NOMMU machines. Busybox also doesn't need
	  DES encryption/decryption and can do with smaller code.

	  If you enable this option, it will add about 4.8k of code
	  if you are building dynamically linked executable.
	  In static build, it makes code _smaller_ by about 1.2k,
	  and likely many kilobytes less of bss.

config USE_BB_CRYPT_SHA
	bool "Enable SHA256/512 crypt functions"
	default y
	depends on USE_BB_CRYPT
	help
	  Enable this if you have passwords starting with "$5$" or "$6$"
	  in your /etc/passwd or /etc/shadow files. These passwords
	  are hashed using SHA256 and SHA512 algorithms. Support for them
	  was added to glibc in 2008.
	  With this option off, login will fail password check for any
	  user which has password encrypted with these algorithms.

config ADDUSER
	bool "adduser"
	default y
	help
	  Utility for creating a new user account.

config FEATURE_ADDUSER_LONG_OPTIONS
	bool "Enable long options"
	default y
	depends on ADDUSER && LONG_OPTS
	help
	  Support long options for the adduser applet.

config FEATURE_CHECK_NAMES
	bool "Enable sanity check on user/group names in adduser and addgroup"
	default n
	depends on ADDUSER || ADDGROUP
	help
	  Enable sanity check on user and group names in adduser and addgroup.
	  To avoid problems, the user or group name should consist only of
	  letters, digits, underscores, periods, at signs and dashes,
	  and not start with a dash (as defined by IEEE Std 1003.1-2001).
	  For compatibility with Samba machine accounts "$" is also supported
	  at the end of the user or group name.

config LAST_ID
	int "Last valid uid or gid for adduser and addgroup"
	depends on ADDUSER || ADDGROUP
	default 60000
	help
	  Last valid uid or gid for adduser and addgroup

config FIRST_SYSTEM_ID
	int "First valid system uid or gid for adduser and addgroup"
	depends on ADDUSER || ADDGROUP
	range 0 LAST_ID
	default 100
	help
	  First valid system uid or gid for adduser and addgroup

config LAST_SYSTEM_ID
	int "Last valid system uid or gid for adduser and addgroup"
	depends on ADDUSER || ADDGROUP
	range FIRST_SYSTEM_ID LAST_ID
	default 999
	help
	  Last valid system uid or gid for adduser and addgroup

config ADDGROUP
	bool "addgroup"
	default y
	help
	  Utility for creating a new group account.

config FEATURE_ADDGROUP_LONG_OPTIONS
	bool "Enable long options"
	default y
	depends on ADDGROUP && LONG_OPTS
	help
	  Support long options for the addgroup applet.

config FEATURE_ADDUSER_TO_GROUP
	bool "Support for adding users to groups"
	default y
	depends on ADDGROUP
	help
	  If  called  with two non-option arguments,
	  addgroup will add an existing user to an
	  existing group.

config DELUSER
	bool "deluser"
	default y
	help
	  Utility for deleting a user account.

config DELGROUP
	bool "delgroup"
	default y
	help
	  Utility for deleting a group account.

config FEATURE_DEL_USER_FROM_GROUP
	bool "Support for removing users from groups"
	default y
	depends on DELGROUP
	help
	  If called with two non-option arguments, deluser
	  or delgroup will remove an user from a specified group.

config GETTY
	bool "getty"
	default y
	select FEATURE_SYSLOG
	help
	  getty lets you log in on a tty. It is normally invoked by init.

	  Note that you can save a few bytes by disabling it and
	  using login applet directly.
	  If you need to reset tty attributes before calling login,
	  this script approximates getty:

	  exec </dev/$1 >/dev/$1 2>&1 || exit 1
	  reset
	  stty sane; stty ispeed 38400; stty ospeed 38400
	  printf "%s login: " "`hostname`"
	  read -r login
	  exec /bin/login "$login"

config LOGIN
	bool "login"
	default y
	select FEATURE_SYSLOG
	help
	  login is used when signing onto a system.

	  Note that Busybox binary must be setuid root for this applet to
	  work properly.

config LOGIN_SESSION_AS_CHILD
	bool "Run logged in session in a child process"
	default y if PAM
	depends on LOGIN
	help
	  Run the logged in session in a child process.  This allows
	  login to clean up things such as utmp entries or PAM sessions
	  when the login session is complete.  If you use PAM, you
	  almost always would want this to be set to Y, else PAM session
	  will not be cleaned up.

config LOGIN_SCRIPTS
	bool "Support for login scripts"
	depends on LOGIN
	default y
	help
	  Enable this if you want login to execute $LOGIN_PRE_SUID_SCRIPT
	  just prior to switching from root to logged-in user.

config FEATURE_NOLOGIN
	bool "Support for /etc/nologin"
	default y
	depends on LOGIN
	help
	  The file /etc/nologin is used by (some versions of) login(1).
	  If it exists, non-root logins are prohibited.

config FEATURE_SECURETTY
	bool "Support for /etc/securetty"
	default y
	depends on LOGIN
	help
	  The file /etc/securetty is used by (some versions of) login(1).
	  The file contains the device names of tty lines (one per line,
	  without leading /dev/) on which root is allowed to login.

config PASSWD
	bool "passwd"
	default y
	select FEATURE_SYSLOG
	help
	  passwd changes passwords for user and group accounts. A normal user
	  may only change the password for his/her own account, the super user
	  may change the password for any account. The administrator of a group
	  may change the password for the group.

	  Note that Busybox binary must be setuid root for this applet to
	  work properly.

config FEATURE_PASSWD_WEAK_CHECK
	bool "Check new passwords for weakness"
	default y
	depends on PASSWD
	help
	  With this option passwd will refuse new passwords which are "weak".

config CRYPTPW
	bool "cryptpw"
	default y
	help
	  Encrypts the given password with the crypt(3) libc function
	  using the given salt. Debian has this utility under mkpasswd
	  name. Busybox provides mkpasswd as an alias for cryptpw.

config CHPASSWD
	bool "chpasswd"
	default y
	help
	  Reads a file of user name and password pairs from standard input
	  and uses this information to update a group of existing users.

config FEATURE_DEFAULT_PASSWD_ALGO
	string "Default password encryption method (passwd -a, cryptpw -m parameter)"
	default "des"
	depends on PASSWD || CRYPTPW
	help
	  Possible choices are "d[es]", "m[d5]", "s[ha256]" or "sha512".

config SU
	bool "su"
	default y
	select FEATURE_SYSLOG
	help
	  su is used to become another user during a login session.
	  Invoked without a username, su defaults to becoming the super user.

	  Note that Busybox binary must be setuid root for this applet to
	  work properly.

config FEATURE_SU_SYSLOG
	bool "Enable su to write to syslog"
	default y
	depends on SU

config FEATURE_SU_CHECKS_SHELLS
	bool "Enable su to check user's shell to be listed in /etc/shells"
	depends on SU
	default y

config SULOGIN
	bool "sulogin"
	default y
	select FEATURE_SYSLOG
	help
	  sulogin is invoked when the system goes into single user
	  mode (this is done through an entry in inittab).

config VLOCK
	bool "vlock"
	default y
	help
	  Build the "vlock" applet which allows you to lock (virtual) terminals.

	  Note that Busybox binary must be setuid root for this applet to
	  work properly.

endmenu
