diff --git a/libuser.c b/libuser.c index 06c6200..7a36520 100644 --- a/libuser.c +++ b/libuser.c @@ -245,7 +245,6 @@ pwdb_display_status(const char *username) struct lu_ent *ent; struct lu_error *error = NULL; char *current; - char *current_user; char *realname; const char *msg; int shadow = 1; @@ -269,10 +268,9 @@ pwdb_display_status(const char *username) goto bail; } current = lu_ent_get_first_value_strdup(ent, LU_SHADOWPASSWORD); - current_user = lu_ent_get_first_value_strdup(ent, LU_USERPASSWORD); if (current == NULL) { shadow = 0; - current = current_user; + current = lu_ent_get_first_value_strdup(ent, LU_USERPASSWORD); } else { sp_lstchg = (time_t) ent_value_int64(ent, LU_SHADOWLASTCHANGE); sp_min = ent_value_int64(ent, LU_SHADOWMIN); @@ -312,13 +310,6 @@ pwdb_display_status(const char *username) msg = _("Password set, DES crypt."); } if (shadow) { - if (status[0] != 'N' && current_user && strlen(current_user) == 0) { - fprintf(stderr, "%s: %s\n", progname, - _("There is a password information set in /etc/shadow," - " but the password field in /etc/passwd is empty.")); - msg = _("Empty password."); - status = "NP"; - } sp_lstchg = sp_lstchg * 24L * 3600L; localtime_r(&sp_lstchg, &tm); strftime(date, sizeof(date), "%Y-%m-%d", &tm); @@ -328,9 +319,6 @@ pwdb_display_status(const char *username) printf("%s %s (%s)\n", realname, status, msg); } g_free(current); - if (shadow && current_user) { - g_free(current_user); - } } else { printf(_("No password set.\n")); } diff --git a/libuser.c.S-output b/libuser.c.S-output deleted file mode 100644 index 7a36520..0000000 --- a/libuser.c.S-output +++ /dev/null @@ -1,429 +0,0 @@ -/* - * Copyright Red Hat, Inc., 2002, 2006, 2015. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, and the entire permission notice in its entirety, - * including the disclaimer of warranties. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * ALTERNATIVELY, this product may be distributed under the terms of - * the GNU Public License, in which case the provisions of the GPL are - * required INSTEAD OF the above restrictions. (This clause is - * necessary due to a potential bad interaction between the GPL and - * the restrictions contained in a BSD-style copyright.) - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * This file contains libuser wrappers with prototypes which match the - * declarations in pwdb.h. Where possible, behavior is kept as close - * to that of the previous versions as possible. - */ - -#include "config.h" - -#include -#include -#include -#include - -/* GValueArray is a part of external API of libuser; warnings about it being - deprecated do no good. */ -#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_30 - -#include -#include -#include "pwdb.h" - -extern const char *progname; - -#define CHECK_ERROR(x) \ -if (x != NULL) { \ - fprintf(stderr, "%s: Libuser error at line: %d - %s.\n", \ - progname, __LINE__, lu_strerror(x)); \ - lu_error_free(&x); \ - return -1; \ -} - -static struct lu_context *libuser = NULL; - -/* Shut down libuser. */ -static void -shutdown_libuser(void) -{ - lu_end(libuser); - libuser = NULL; -} - -/* Start up the library, suggesting the name of the user which was - * passed in as the name the library should use if it needs to - * authenticate to data sources. */ -static void -startup_libuser(const char *user) -{ - struct lu_error *error = NULL; - if (libuser != NULL) { - shutdown_libuser(); - } - libuser = lu_start(user, lu_user, NULL, NULL, - lu_prompt_console, NULL, &error); - if (error != NULL || libuser == NULL) { - fprintf(stderr, - _("%s: libuser initialization error:"), progname); - } - if (error != NULL) { - fprintf(stderr, - " %s\n", lu_strerror(error)); - _exit(1); - } - if (libuser == NULL) { - fprintf(stderr, - " unknown error\n"); - _exit(1); - } -} - -/* Lock an account. */ -int -pwdb_lock_password(const char *username) -{ - int retval = 1; - struct lu_ent *ent; - struct lu_error *error = NULL; - gboolean started = FALSE; - if (libuser == NULL) { - startup_libuser("root"); - started = TRUE; - } - ent = lu_ent_new(); - if (lu_user_lookup_name(libuser, username, ent, &error)) { - if (lu_user_lock(libuser, ent, &error)) { - retval = 0; - } - } - lu_ent_free(ent); - CHECK_ERROR(error); - if (started) { - shutdown_libuser(); - } - return retval; -} - -int -pwdb_unlock_password(const char *username, int force) -{ - int retval = 1, i; - struct lu_ent *ent; - struct lu_error *error = NULL; - const char *current = NULL; - gboolean started = FALSE; - if (libuser == NULL) { - startup_libuser("root"); - started = TRUE; - } - ent = lu_ent_new(); - if (lu_user_lookup_name(libuser, username, ent, &error)) { - current = lu_ent_get_first_value_strdup(ent, LU_SHADOWPASSWORD); - if (current == NULL) - lu_ent_get_first_value_strdup(ent, LU_USERPASSWORD); - if (current && (force == 0)) { - /* Search for a non-locking character. */ - for (i = 0; (current[i] == '!'); i++) { - /*nothing */ - }; - /* If the first non-locking character is the end of the - * string, */ - if (current[i] == '\0') { - fprintf(stderr, "%s: %s\n", progname, - _("Warning: unlocked password would be empty.")); - /* warn the admin, because this is probably a - * bad idea. */ - retval = -2; - } - } - if (retval != -2) { - /* Go blind, or force it. */ - if (lu_user_unlock(libuser, ent, &error)) { - retval = 0; - } - } - } - lu_ent_free(ent); - CHECK_ERROR(error); - if (started) { - shutdown_libuser(); - } - return retval; -} - -/* Try to remove a user's password. Note that some of the underlying modules - * libuser uses don't support this. */ -int -pwdb_clear_password(const char *username) -{ - int retval = 1; - struct lu_ent *ent; - struct lu_error *error = NULL; - gboolean started = FALSE; - if (libuser == NULL) { - startup_libuser("root"); - started = TRUE; - } - ent = lu_ent_new(); - if (lu_user_lookup_name(libuser, username, ent, &error)) { - const char *current; - - current = lu_ent_get_first_value_strdup(ent, LU_SHADOWPASSWORD); - if (current == NULL) - lu_ent_get_first_value_strdup(ent, LU_USERPASSWORD); - if (current != NULL && *current == '!') - /* Just note this, do not abort, do not change exit - * code; if someone wants to use -d at all, let's not - * break their scripts. */ - fprintf(stderr, "%s: %s\n", progname, - _("Note: deleting a password also unlocks the " - "password.")); - if (lu_user_removepass(libuser, ent, &error)) { - retval = 0; - } - } - lu_ent_free(ent); - CHECK_ERROR(error); - if (started) { - shutdown_libuser(); - } - return retval; -} - -static long long -ent_value_int64(struct lu_ent *ent, const char *attribute) -{ - GValueArray *values; - GValue *value; - value = NULL; - values = lu_ent_get(ent, attribute); - if (values) { - value = g_value_array_get_nth(values, 0); - } - if (value) { - if (G_VALUE_HOLDS_STRING(value)) { - return strtoll(g_value_get_string(value), NULL, 10); - } - else if (G_VALUE_HOLDS_LONG(value)) { - return g_value_get_long(value); - } - else if (G_VALUE_HOLDS_INT64(value)) { - return (long long)g_value_get_int64(value); - } - } - return -1; -} - -int -pwdb_display_status(const char *username) -{ - int retval = 1; - struct lu_ent *ent; - struct lu_error *error = NULL; - char *current; - char *realname; - const char *msg; - int shadow = 1; - time_t sp_lstchg = 0; - long long sp_min = 0; - long long sp_max = 0; - long long sp_warn = 0; - long long sp_inact= 0; - char date[80]; - const char *status; - struct tm tm; - - startup_libuser(username); - - ent = lu_ent_new(); - if (lu_user_lookup_name(libuser, username, ent, &error)) { - realname = lu_ent_get_first_value_strdup(ent, LU_USERNAME); - if (realname == NULL) { - fprintf(stderr, "%s: %s\n", progname, - _("Corrupted passwd entry.")); - goto bail; - } - current = lu_ent_get_first_value_strdup(ent, LU_SHADOWPASSWORD); - if (current == NULL) { - shadow = 0; - current = lu_ent_get_first_value_strdup(ent, LU_USERPASSWORD); - } else { - sp_lstchg = (time_t) ent_value_int64(ent, LU_SHADOWLASTCHANGE); - sp_min = ent_value_int64(ent, LU_SHADOWMIN); - sp_max = ent_value_int64(ent, LU_SHADOWMAX); - sp_warn = ent_value_int64(ent, LU_SHADOWWARNING); - sp_inact = ent_value_int64(ent, LU_SHADOWINACTIVE); - } - if (current) { - status = "PS"; - if (strlen(current) == 0) { - msg = _("Empty password."); - status = "NP"; - } else if (current[0] == '!') { - msg = _("Password locked."); - status = "LK"; - } else if (current[0] == '$') { - if (strncmp(current, "$1$", 3) == 0) { - msg = _("Password set, MD5 crypt."); - } else if (strncmp(current, "$2a$", 4) == - 0) { - msg = _("Password set, blowfish crypt."); - } else if (strncmp(current, "$5$", 3) == - 0) { - msg = _("Password set, SHA256 crypt."); - } else if (strncmp(current, "$6$", 3) == - 0) { - msg = _("Password set, SHA512 crypt."); - } else { - msg = _("Password set, unknown crypt variant."); - } - } else if (strlen(current) < 11) { - msg = _("Alternate authentication scheme in use."); - if (current[0] == '*' || current[0] == 'x') { - status = "LK"; - } - } else { - msg = _("Password set, DES crypt."); - } - if (shadow) { - sp_lstchg = sp_lstchg * 24L * 3600L; - localtime_r(&sp_lstchg, &tm); - strftime(date, sizeof(date), "%Y-%m-%d", &tm); - printf("%s %s %s %lld %lld %lld %lld (%s)\n", realname, status, - date, sp_min, sp_max, sp_warn, sp_inact, msg); - } else { - printf("%s %s (%s)\n", realname, status, msg); - } - g_free(current); - } else { - printf(_("No password set.\n")); - } - g_free(realname); - retval = 0; - } else { - printf(_("Unknown user.\n")); - retval = 2; - } -bail: - CHECK_ERROR(error); - - shutdown_libuser(); - return retval; -} - -int -pwdb_update_gecos(const char *username, const char *gecos) -{ - int retval = 1; - struct lu_ent *ent; - struct lu_error *error = NULL; - - startup_libuser(username); - - ent = lu_ent_new(); - if (lu_user_lookup_name(libuser, username, ent, &error)) { - lu_ent_set_string(ent, LU_GECOS, gecos); - - if (lu_user_modify(libuser, ent, &error)) { - retval = 0; - } - } - - CHECK_ERROR(error); - - shutdown_libuser(); - return retval; -} - -int -pwdb_update_shell(const char *username, const char *shell) -{ - int retval = 1; - struct lu_ent *ent; - struct lu_error *error = NULL; - - startup_libuser(username); - - ent = lu_ent_new(); - if (lu_user_lookup_name(libuser, username, ent, &error)) { - lu_ent_set_string(ent, LU_LOGINSHELL, shell); - - if (lu_user_modify(libuser, ent, &error)) { - retval = 0; - } - } - - CHECK_ERROR(error); - - shutdown_libuser(); - return retval; -} - - -int -pwdb_update_aging(const char *username, - long min, long max, long warn, long inact, long lastchg) -{ - int retval = 1; - struct lu_ent *ent; - struct lu_error *error = NULL; - - startup_libuser(username); - - ent = lu_ent_new(); - if (lu_user_lookup_name(libuser, username, ent, &error)) { - if (!lu_ent_get(ent, LU_SHADOWMIN) && - !lu_ent_get(ent, LU_SHADOWMAX) && - !lu_ent_get(ent, LU_SHADOWWARNING) && - !lu_ent_get(ent, LU_SHADOWINACTIVE)) { - fprintf(stderr, _("%s: user account has no support " - "for password aging.\n"), progname); - shutdown_libuser(); - return retval; - } - - if (min != -2) - lu_ent_set_long(ent, LU_SHADOWMIN, min); - if (max != -2) - lu_ent_set_long(ent, LU_SHADOWMAX, max); - if (warn != -2) - lu_ent_set_long(ent, LU_SHADOWWARNING, warn); - if (inact != -2) - lu_ent_set_long(ent, LU_SHADOWINACTIVE, inact); - if (lastchg != -2) - lu_ent_set_long(ent, LU_SHADOWLASTCHANGE, lastchg); - - if (lu_user_modify(libuser, ent, &error)) { - retval = 0; - } - } - - CHECK_ERROR(error); - - shutdown_libuser(); - return retval; -} diff --git a/man/passwd.1 b/man/passwd.1 index 9727b88..1bc2a6e 100644 --- a/man/passwd.1 +++ b/man/passwd.1 @@ -40,7 +40,7 @@ passwd \- update user's authentication tokens .SH SYNOPSIS -.B passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [-?] [--usage] [username] +.B passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username] .sp 2 .SH DESCRIPTION The passwd utility is used to update user's authentication token(s). @@ -82,7 +82,7 @@ function correctly. .SH OPTIONS .TP -\fB\-k\fR, \fB\-\-keep\-tokens\fR +\fB\-k\fR, \fB\-\-keep\fR The option .B \-k is used to indicate that the update should only be for expired @@ -158,8 +158,8 @@ root only. This will output a short information about the status of the password for a given account. The status information consists of 7 fields. The first field is the user's login name. The second field indicates if the -user account has a locked password (LK), has no password (NP), or has a -usable password (PS). The third field gives the date of the last password +user account has a locked password (L), has no password (NP), or has a +usable password (P). The third field gives the date of the last password change. The next four fields are the minimum age, maximum age, warning period, and inactivity period for the password. These ages are expressed in days. @@ -174,14 +174,6 @@ from the real date of the last password change by ±1 day. .sp This option is available to root only. -.TP -\fB\-?\fR, \fB\-\-help\fR -Print a help message and exit. - -.TP -\fB\-\-usage\fR -Print a short usage message and exit. - .SH "Remember the following two principles" .IP \fBProtect\ your\ password.\fR diff --git a/man/passwd.1.manpage b/man/passwd.1.manpage deleted file mode 100644 index 1bc2a6e..0000000 --- a/man/passwd.1.manpage +++ /dev/null @@ -1,290 +0,0 @@ -.\" Copyright Red Hat, Inc., 1998, 1999, 2002, 2009, 2012, 2015, 2018. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, and the entire permission notice in its entirety, -.\" including the disclaimer of warranties. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. The name of the author may not be used to endorse or promote -.\" products derived from this software without specific prior -.\" written permission. -.\" -.\" ALTERNATIVELY, this product may be distributed under the terms of -.\" the GNU Public License, in which case the provisions of the GPL are -.\" required INSTEAD OF the above restrictions. (This clause is -.\" necessary due to a potential bad interaction between the GPL and -.\" the restrictions contained in a BSD-style copyright.) -.\" -.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED -.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -.\" DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -.\" INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -.\" OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.\" Copyright (c) Cristian Gafton, 1998, -.\" Copyright (c) Tomas Mraz, 2009, 2012, -.\" -.TH PASSWD 1 "Mar 28 2018" "GNU/Linux" "User utilities" -.SH NAME - -passwd \- update user's authentication tokens - -.SH SYNOPSIS -.B passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username] -.sp 2 -.SH DESCRIPTION -The passwd utility is used to update user's authentication token(s). - -This task is achieved through calls to the -.BR "Linux-PAM" " and " -.BR "Libuser API" ". " -Essentially, it initializes itself as a "passwd" service with -.I Linux-PAM -and utilizes configured -.I "password" -modules to authenticate and then update a user's password. - -.sp -A simple entry in the global -.I Linux-PAM -configuration file for this service would be: -.br - -.br - # -.br - # passwd service entry that does strength checking of -.br - # a proposed password before updating it. -.br - # -.br - passwd password requisite pam_cracklib.so retry=3 -.br - passwd password required pam_unix.so use_authtok -.br - # - -.sp -Note, other module types are not required for this application to -function correctly. - -.SH OPTIONS - -.TP -\fB\-k\fR, \fB\-\-keep\fR -The option -.B \-k -is used to indicate that the update should only be for expired -authentication tokens (passwords); the user wishes to keep their -non-expired tokens as before. - -.TP -\fB\-l\fR, \fB\-\-lock\fP -This option is used to lock the password of specified account and -it is available to root only. The locking is performed by rendering -the encrypted password into an invalid string (by prefixing the -encrypted string with an !). Note that the account is not fully -locked - the user can still log in by other means of authentication -such as the ssh public key authentication. Use \fBchage -E 0 user\fR -command instead for full account locking. - -.IP \fB--stdin\fR -This option is used to indicate that \fBpasswd\fR should read the new -password from standard input, which can be a pipe. - -.TP -\fB\-u\fR, \fB\-\-unlock\fR -This is the reverse of the -.BR -l " option - it will unlock the account" -password by removing the ! prefix. This option is available to root -only. By default passwd will refuse to create a passwordless account -(it will not unlock an account that has only "!" as a password). The -force option \fB-f\fR will override this protection. - -.TP -\fB\-d\fR, \fB\-\-delete\fR -This is a quick way to delete a password for an account. It will set -the named account passwordless. Available to root only. - -Note that if the password was locked, -this implicitly removes the password lock as well. - -.TP -\fB\-e\fR, \fB\-\-expire\fR -This is a quick way to expire a password for an account. The user will be -forced to change the password during the next login attempt. -Available to root only. - -.TP -\fB\-f\fR, \fB\-\-force\fR -Force the specified operation. - -.TP -\fB\-n\fR, \fB\-\-minimum\fR \fIDAYS\fR -This will set the minimum password lifetime, in days, if the user's -account supports password lifetimes. Available to root only. - -.TP -\fB\-x\fR, \fB\-\-maximum\fR \fIDAYS\fR -This will set the maximum password lifetime, in days, if the user's -account supports password lifetimes. Available to root only. - -.TP -\fB\-w\fR, \fB\-\-warning\fR \fIDAYS\fR -This will set the number of days in advance the user will begin receiving -warnings that her password will expire, if the user's account supports -password lifetimes. Available to root only. - -.TP -\fB\-i\fR, \fB\-\-inactive\fR \fIDAYS\fR -This will set the number of days which will pass before an expired password -for this account will be taken to mean that the account is inactive and should -be disabled, if the user's account supports password lifetimes. Available to -root only. - -.TP -\fB\-S\fR, \fB\-\-status\fR -This will output a short information about the status of the password -for a given account. The status information consists of 7 fields. The -first field is the user's login name. The second field indicates if the -user account has a locked password (L), has no password (NP), or has a -usable password (P). The third field gives the date of the last password -change. The next four fields are the minimum age, maximum age, warning -period, and inactivity period for the password. These ages are expressed -in days. -.sp -\fBNotes:\fR -The date of the last password change is stored as a number of days -since epoch. Depending on the current time zone, the -\fBpasswd \-S\fR -\fIusername\fR -may show the date of the last password change that is different -from the real date of the last password change by ±1 day. -.sp -This option is available to root only. - -.SH "Remember the following two principles" - -.IP \fBProtect\ your\ password.\fR -Don't write down your password - memorize it. -In particular, don't write it down and leave it anywhere, and don't -place it in an unencrypted file! Use unrelated passwords for -systems controlled by different organizations. Don't give or share your -password, in particular to someone claiming to be from -computer support or a vendor. Don't let anyone watch you enter your -password. Don't enter your password to a computer you don't trust or -if things "look funny"; someone may be trying to hijack your password. -Use the password for a limited time and change it periodically. - -.IP \fBChoose\ a\ hard-to-guess\ password.\fR -.I passwd -through the calls to the -.BR pam_cracklib " PAM module" -will try to prevent you from choosing a really bad password, -but it isn't foolproof; create your password wisely. -Don't use something you'd find in a dictionary (in any language or jargon). -Don't use a name (including that of a spouse, parent, child, pet, -fantasy character, famous person, and location) or any -variation of your personal or account name. Don't use accessible -information about you (such as your phone number, license plate, or -social security number) or your environment. Don't use a birthday or a -simple pattern (such as "qwerty", "abc", or "aaa"). Don't use any of those -backwards, followed by a digit, or preceded by a digit. Instead, use -a mixture of upper and lower case letters, as well as digits or -punctuation. When choosing a new password, make sure it's unrelated -to any previous password. Use long passwords (say at least 8 characters -long). You might use a word pair with punctuation inserted, a -passphrase (an understandable sequence of words), or the first -letter of each word in a passphrase. - -.SH "" -These principles are partially enforced by the system, but only partly so. -Vigilance on your part will make the system much more secure. - -.SH "EXIT CODE" - -The -.B passwd -command exits with the following codes: -.PP -\fI0\fR -.RS 4 -success -.RE -.PP -\fI1\fR -.RS 4 -passwd/libuser operation failed -.RE -.PP -\fI2\fR -.RS 4 -unknown user -.RE -.PP -\fI252\fR -.RS 4 -unknown user name -.RE -.PP -\fI253\fR -.RS 4 -bad arguments or passwordless account -.RE -.PP -\fI254\fR -.RS 4 -invalid application of arguments -.RE -.PP -\fI255\fR -.RS 4 -libuser operation failed -.RE -.PP -Error messages are written to the standard error stream. - -.SH "CONFORMING TO" -.br -.BR Linux-PAM -(Pluggable Authentication modules for Linux). - -.SH "FILES" -.br -.B /etc/pam.d/passwd -- the -.BR Linux-PAM -configuration file - -.SH BUGS -.sp 2 -None known. - -.SH "SEE ALSO" - -.BR pam "(8), " -.BR pam.d "(5), " -.BR libuser.conf "(5), " -and -.BR pam_chauthtok "(3). " - -.sp -For more complete information on how to configure this application -with -.BR Linux-PAM ", " -see the -.BR "Linux-PAM System Administrators' Guide" "." - -.SH AUTHOR -Cristian Gafton