|
Packit Service |
3e5a5a |
/*
|
|
Packit Service |
3e5a5a |
* Copyright Red Hat, Inc., 2002, 2006, 2015.
|
|
Packit Service |
3e5a5a |
*
|
|
Packit Service |
3e5a5a |
* Redistribution and use in source and binary forms, with or without
|
|
Packit Service |
3e5a5a |
* modification, are permitted provided that the following conditions
|
|
Packit Service |
3e5a5a |
* are met:
|
|
Packit Service |
3e5a5a |
* 1. Redistributions of source code must retain the above copyright
|
|
Packit Service |
3e5a5a |
* notice, and the entire permission notice in its entirety,
|
|
Packit Service |
3e5a5a |
* including the disclaimer of warranties.
|
|
Packit Service |
3e5a5a |
* 2. Redistributions in binary form must reproduce the above copyright
|
|
Packit Service |
3e5a5a |
* notice, this list of conditions and the following disclaimer in the
|
|
Packit Service |
3e5a5a |
* documentation and/or other materials provided with the distribution.
|
|
Packit Service |
3e5a5a |
* 3. The name of the author may not be used to endorse or promote
|
|
Packit Service |
3e5a5a |
* products derived from this software without specific prior
|
|
Packit Service |
3e5a5a |
* written permission.
|
|
Packit Service |
3e5a5a |
*
|
|
Packit Service |
3e5a5a |
* ALTERNATIVELY, this product may be distributed under the terms of
|
|
Packit Service |
3e5a5a |
* the GNU Public License, in which case the provisions of the GPL are
|
|
Packit Service |
3e5a5a |
* required INSTEAD OF the above restrictions. (This clause is
|
|
Packit Service |
3e5a5a |
* necessary due to a potential bad interaction between the GPL and
|
|
Packit Service |
3e5a5a |
* the restrictions contained in a BSD-style copyright.)
|
|
Packit Service |
3e5a5a |
*
|
|
Packit Service |
3e5a5a |
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
Packit Service |
3e5a5a |
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
Packit Service |
3e5a5a |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
Packit Service |
3e5a5a |
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
Packit Service |
3e5a5a |
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
Packit Service |
3e5a5a |
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
Packit Service |
3e5a5a |
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
Packit Service |
3e5a5a |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
Packit Service |
3e5a5a |
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
Packit Service |
3e5a5a |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
Packit Service |
3e5a5a |
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit Service |
3e5a5a |
*/
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
/*
|
|
Packit Service |
3e5a5a |
* This file contains libuser wrappers with prototypes which match the
|
|
Packit Service |
3e5a5a |
* declarations in pwdb.h. Where possible, behavior is kept as close
|
|
Packit Service |
3e5a5a |
* to that of the previous versions as possible.
|
|
Packit Service |
3e5a5a |
*/
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
#include "config.h"
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
#include <string.h>
|
|
Packit Service |
3e5a5a |
#include <unistd.h>
|
|
Packit Service |
3e5a5a |
#include <stdlib.h>
|
|
Packit Service |
3e5a5a |
#include <time.h>
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
/* GValueArray is a part of external API of libuser; warnings about it being
|
|
Packit Service |
3e5a5a |
deprecated do no good. */
|
|
Packit Service |
3e5a5a |
#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_30
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
#include <libuser/user.h>
|
|
Packit Service |
3e5a5a |
#include <libintl.h>
|
|
Packit Service |
3e5a5a |
#include "pwdb.h"
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
extern const char *progname;
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
#define CHECK_ERROR(x) \
|
|
Packit Service |
3e5a5a |
if (x != NULL) { \
|
|
Packit Service |
3e5a5a |
fprintf(stderr, "%s: Libuser error at line: %d - %s.\n", \
|
|
Packit Service |
3e5a5a |
progname, __LINE__, lu_strerror(x)); \
|
|
Packit Service |
3e5a5a |
lu_error_free(&x); \
|
|
Packit Service |
3e5a5a |
return -1; \
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
static struct lu_context *libuser = NULL;
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
/* Shut down libuser. */
|
|
Packit Service |
3e5a5a |
static void
|
|
Packit Service |
3e5a5a |
shutdown_libuser(void)
|
|
Packit Service |
3e5a5a |
{
|
|
Packit Service |
3e5a5a |
lu_end(libuser);
|
|
Packit Service |
3e5a5a |
libuser = NULL;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
/* Start up the library, suggesting the name of the user which was
|
|
Packit Service |
3e5a5a |
* passed in as the name the library should use if it needs to
|
|
Packit Service |
3e5a5a |
* authenticate to data sources. */
|
|
Packit Service |
3e5a5a |
static void
|
|
Packit Service |
3e5a5a |
startup_libuser(const char *user)
|
|
Packit Service |
3e5a5a |
{
|
|
Packit Service |
3e5a5a |
struct lu_error *error = NULL;
|
|
Packit Service |
3e5a5a |
if (libuser != NULL) {
|
|
Packit Service |
3e5a5a |
shutdown_libuser();
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
libuser = lu_start(user, lu_user, NULL, NULL,
|
|
Packit Service |
3e5a5a |
lu_prompt_console, NULL, &error);
|
|
Packit Service |
3e5a5a |
if (error != NULL || libuser == NULL) {
|
|
Packit Service |
3e5a5a |
fprintf(stderr,
|
|
Packit Service |
3e5a5a |
_("%s: libuser initialization error:"), progname);
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
if (error != NULL) {
|
|
Packit Service |
3e5a5a |
fprintf(stderr,
|
|
Packit Service |
3e5a5a |
" %s\n", lu_strerror(error));
|
|
Packit Service |
3e5a5a |
_exit(1);
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
if (libuser == NULL) {
|
|
Packit Service |
3e5a5a |
fprintf(stderr,
|
|
Packit Service |
3e5a5a |
" unknown error\n");
|
|
Packit Service |
3e5a5a |
_exit(1);
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
/* Lock an account. */
|
|
Packit Service |
3e5a5a |
int
|
|
Packit Service |
3e5a5a |
pwdb_lock_password(const char *username)
|
|
Packit Service |
3e5a5a |
{
|
|
Packit Service |
3e5a5a |
int retval = 1;
|
|
Packit Service |
3e5a5a |
struct lu_ent *ent;
|
|
Packit Service |
3e5a5a |
struct lu_error *error = NULL;
|
|
Packit Service |
3e5a5a |
gboolean started = FALSE;
|
|
Packit Service |
3e5a5a |
if (libuser == NULL) {
|
|
Packit Service |
3e5a5a |
startup_libuser("root");
|
|
Packit Service |
3e5a5a |
started = TRUE;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
ent = lu_ent_new();
|
|
Packit Service |
3e5a5a |
if (lu_user_lookup_name(libuser, username, ent, &error)) {
|
|
Packit Service |
3e5a5a |
if (lu_user_lock(libuser, ent, &error)) {
|
|
Packit Service |
3e5a5a |
retval = 0;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
lu_ent_free(ent);
|
|
Packit Service |
3e5a5a |
CHECK_ERROR(error);
|
|
Packit Service |
3e5a5a |
if (started) {
|
|
Packit Service |
3e5a5a |
shutdown_libuser();
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
return retval;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
int
|
|
Packit Service |
3e5a5a |
pwdb_unlock_password(const char *username, int force)
|
|
Packit Service |
3e5a5a |
{
|
|
Packit Service |
3e5a5a |
int retval = 1, i;
|
|
Packit Service |
3e5a5a |
struct lu_ent *ent;
|
|
Packit Service |
3e5a5a |
struct lu_error *error = NULL;
|
|
Packit Service |
3e5a5a |
const char *current = NULL;
|
|
Packit Service |
3e5a5a |
gboolean started = FALSE;
|
|
Packit Service |
3e5a5a |
if (libuser == NULL) {
|
|
Packit Service |
3e5a5a |
startup_libuser("root");
|
|
Packit Service |
3e5a5a |
started = TRUE;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
ent = lu_ent_new();
|
|
Packit Service |
3e5a5a |
if (lu_user_lookup_name(libuser, username, ent, &error)) {
|
|
Packit Service |
3e5a5a |
current = lu_ent_get_first_value_strdup(ent, LU_SHADOWPASSWORD);
|
|
Packit Service |
3e5a5a |
if (current == NULL)
|
|
Packit Service |
3e5a5a |
lu_ent_get_first_value_strdup(ent, LU_USERPASSWORD);
|
|
Packit Service |
3e5a5a |
if (current && (force == 0)) {
|
|
Packit Service |
3e5a5a |
/* Search for a non-locking character. */
|
|
Packit Service |
3e5a5a |
for (i = 0; (current[i] == '!'); i++) {
|
|
Packit Service |
3e5a5a |
/*nothing */
|
|
Packit Service |
3e5a5a |
};
|
|
Packit Service |
3e5a5a |
/* If the first non-locking character is the end of the
|
|
Packit Service |
3e5a5a |
* string, */
|
|
Packit Service |
3e5a5a |
if (current[i] == '\0') {
|
|
Packit Service |
3e5a5a |
fprintf(stderr, "%s: %s\n", progname,
|
|
Packit Service |
3e5a5a |
_("Warning: unlocked password would be empty."));
|
|
Packit Service |
3e5a5a |
/* warn the admin, because this is probably a
|
|
Packit Service |
3e5a5a |
* bad idea. */
|
|
Packit Service |
3e5a5a |
retval = -2;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
if (retval != -2) {
|
|
Packit Service |
3e5a5a |
/* Go blind, or force it. */
|
|
Packit Service |
3e5a5a |
if (lu_user_unlock(libuser, ent, &error)) {
|
|
Packit Service |
3e5a5a |
retval = 0;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
lu_ent_free(ent);
|
|
Packit Service |
3e5a5a |
CHECK_ERROR(error);
|
|
Packit Service |
3e5a5a |
if (started) {
|
|
Packit Service |
3e5a5a |
shutdown_libuser();
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
return retval;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
/* Try to remove a user's password. Note that some of the underlying modules
|
|
Packit Service |
3e5a5a |
* libuser uses don't support this. */
|
|
Packit Service |
3e5a5a |
int
|
|
Packit Service |
3e5a5a |
pwdb_clear_password(const char *username)
|
|
Packit Service |
3e5a5a |
{
|
|
Packit Service |
3e5a5a |
int retval = 1;
|
|
Packit Service |
3e5a5a |
struct lu_ent *ent;
|
|
Packit Service |
3e5a5a |
struct lu_error *error = NULL;
|
|
Packit Service |
3e5a5a |
gboolean started = FALSE;
|
|
Packit Service |
3e5a5a |
if (libuser == NULL) {
|
|
Packit Service |
3e5a5a |
startup_libuser("root");
|
|
Packit Service |
3e5a5a |
started = TRUE;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
ent = lu_ent_new();
|
|
Packit Service |
3e5a5a |
if (lu_user_lookup_name(libuser, username, ent, &error)) {
|
|
Packit Service |
3e5a5a |
const char *current;
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
current = lu_ent_get_first_value_strdup(ent, LU_SHADOWPASSWORD);
|
|
Packit Service |
3e5a5a |
if (current == NULL)
|
|
Packit Service |
3e5a5a |
lu_ent_get_first_value_strdup(ent, LU_USERPASSWORD);
|
|
Packit Service |
3e5a5a |
if (current != NULL && *current == '!')
|
|
Packit Service |
3e5a5a |
/* Just note this, do not abort, do not change exit
|
|
Packit Service |
3e5a5a |
* code; if someone wants to use -d at all, let's not
|
|
Packit Service |
3e5a5a |
* break their scripts. */
|
|
Packit Service |
3e5a5a |
fprintf(stderr, "%s: %s\n", progname,
|
|
Packit Service |
3e5a5a |
_("Note: deleting a password also unlocks the "
|
|
Packit Service |
3e5a5a |
"password."));
|
|
Packit Service |
3e5a5a |
if (lu_user_removepass(libuser, ent, &error)) {
|
|
Packit Service |
3e5a5a |
retval = 0;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
lu_ent_free(ent);
|
|
Packit Service |
3e5a5a |
CHECK_ERROR(error);
|
|
Packit Service |
3e5a5a |
if (started) {
|
|
Packit Service |
3e5a5a |
shutdown_libuser();
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
return retval;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
static long long
|
|
Packit Service |
3e5a5a |
ent_value_int64(struct lu_ent *ent, const char *attribute)
|
|
Packit Service |
3e5a5a |
{
|
|
Packit Service |
3e5a5a |
GValueArray *values;
|
|
Packit Service |
3e5a5a |
GValue *value;
|
|
Packit Service |
3e5a5a |
value = NULL;
|
|
Packit Service |
3e5a5a |
values = lu_ent_get(ent, attribute);
|
|
Packit Service |
3e5a5a |
if (values) {
|
|
Packit Service |
3e5a5a |
value = g_value_array_get_nth(values, 0);
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
if (value) {
|
|
Packit Service |
3e5a5a |
if (G_VALUE_HOLDS_STRING(value)) {
|
|
Packit Service |
3e5a5a |
return strtoll(g_value_get_string(value), NULL, 10);
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
else if (G_VALUE_HOLDS_LONG(value)) {
|
|
Packit Service |
3e5a5a |
return g_value_get_long(value);
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
else if (G_VALUE_HOLDS_INT64(value)) {
|
|
Packit Service |
3e5a5a |
return (long long)g_value_get_int64(value);
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
return -1;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
int
|
|
Packit Service |
3e5a5a |
pwdb_display_status(const char *username)
|
|
Packit Service |
3e5a5a |
{
|
|
Packit Service |
3e5a5a |
int retval = 1;
|
|
Packit Service |
3e5a5a |
struct lu_ent *ent;
|
|
Packit Service |
3e5a5a |
struct lu_error *error = NULL;
|
|
Packit Service |
3e5a5a |
char *current;
|
|
Packit Service |
3e5a5a |
char *realname;
|
|
Packit Service |
3e5a5a |
const char *msg;
|
|
Packit Service |
3e5a5a |
int shadow = 1;
|
|
Packit Service |
3e5a5a |
time_t sp_lstchg = 0;
|
|
Packit Service |
3e5a5a |
long long sp_min = 0;
|
|
Packit Service |
3e5a5a |
long long sp_max = 0;
|
|
Packit Service |
3e5a5a |
long long sp_warn = 0;
|
|
Packit Service |
3e5a5a |
long long sp_inact= 0;
|
|
Packit Service |
3e5a5a |
char date[80];
|
|
Packit Service |
3e5a5a |
const char *status;
|
|
Packit Service |
3e5a5a |
struct tm tm;
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
startup_libuser(username);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
ent = lu_ent_new();
|
|
Packit Service |
3e5a5a |
if (lu_user_lookup_name(libuser, username, ent, &error)) {
|
|
Packit Service |
3e5a5a |
realname = lu_ent_get_first_value_strdup(ent, LU_USERNAME);
|
|
Packit Service |
3e5a5a |
if (realname == NULL) {
|
|
Packit Service |
3e5a5a |
fprintf(stderr, "%s: %s\n", progname,
|
|
Packit Service |
3e5a5a |
_("Corrupted passwd entry."));
|
|
Packit Service |
3e5a5a |
goto bail;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
current = lu_ent_get_first_value_strdup(ent, LU_SHADOWPASSWORD);
|
|
Packit Service |
3e5a5a |
if (current == NULL) {
|
|
Packit Service |
3e5a5a |
shadow = 0;
|
|
Packit Service |
3e5a5a |
current = lu_ent_get_first_value_strdup(ent, LU_USERPASSWORD);
|
|
Packit Service |
3e5a5a |
} else {
|
|
Packit Service |
3e5a5a |
sp_lstchg = (time_t) ent_value_int64(ent, LU_SHADOWLASTCHANGE);
|
|
Packit Service |
3e5a5a |
sp_min = ent_value_int64(ent, LU_SHADOWMIN);
|
|
Packit Service |
3e5a5a |
sp_max = ent_value_int64(ent, LU_SHADOWMAX);
|
|
Packit Service |
3e5a5a |
sp_warn = ent_value_int64(ent, LU_SHADOWWARNING);
|
|
Packit Service |
3e5a5a |
sp_inact = ent_value_int64(ent, LU_SHADOWINACTIVE);
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
if (current) {
|
|
Packit Service |
3e5a5a |
status = "PS";
|
|
Packit Service |
3e5a5a |
if (strlen(current) == 0) {
|
|
Packit Service |
3e5a5a |
msg = _("Empty password.");
|
|
Packit Service |
3e5a5a |
status = "NP";
|
|
Packit Service |
3e5a5a |
} else if (current[0] == '!') {
|
|
Packit Service |
3e5a5a |
msg = _("Password locked.");
|
|
Packit Service |
3e5a5a |
status = "LK";
|
|
Packit Service |
3e5a5a |
} else if (current[0] == '$') {
|
|
Packit Service |
3e5a5a |
if (strncmp(current, "$1$", 3) == 0) {
|
|
Packit Service |
3e5a5a |
msg = _("Password set, MD5 crypt.");
|
|
Packit Service |
3e5a5a |
} else if (strncmp(current, "$2a$", 4) ==
|
|
Packit Service |
3e5a5a |
0) {
|
|
Packit Service |
3e5a5a |
msg = _("Password set, blowfish crypt.");
|
|
Packit Service |
3e5a5a |
} else if (strncmp(current, "$5$", 3) ==
|
|
Packit Service |
3e5a5a |
0) {
|
|
Packit Service |
3e5a5a |
msg = _("Password set, SHA256 crypt.");
|
|
Packit Service |
3e5a5a |
} else if (strncmp(current, "$6$", 3) ==
|
|
Packit Service |
3e5a5a |
0) {
|
|
Packit Service |
3e5a5a |
msg = _("Password set, SHA512 crypt.");
|
|
Packit Service |
3e5a5a |
} else {
|
|
Packit Service |
3e5a5a |
msg = _("Password set, unknown crypt variant.");
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
} else if (strlen(current) < 11) {
|
|
Packit Service |
3e5a5a |
msg = _("Alternate authentication scheme in use.");
|
|
Packit Service |
3e5a5a |
if (current[0] == '*' || current[0] == 'x') {
|
|
Packit Service |
3e5a5a |
status = "LK";
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
} else {
|
|
Packit Service |
3e5a5a |
msg = _("Password set, DES crypt.");
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
if (shadow) {
|
|
Packit Service |
3e5a5a |
sp_lstchg = sp_lstchg * 24L * 3600L;
|
|
Packit Service |
3e5a5a |
localtime_r(&sp_lstchg, &tm;;
|
|
Packit Service |
3e5a5a |
strftime(date, sizeof(date), "%Y-%m-%d", &tm;;
|
|
Packit Service |
3e5a5a |
printf("%s %s %s %lld %lld %lld %lld (%s)\n", realname, status,
|
|
Packit Service |
3e5a5a |
date, sp_min, sp_max, sp_warn, sp_inact, msg);
|
|
Packit Service |
3e5a5a |
} else {
|
|
Packit Service |
3e5a5a |
printf("%s %s (%s)\n", realname, status, msg);
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
g_free(current);
|
|
Packit Service |
3e5a5a |
} else {
|
|
Packit Service |
3e5a5a |
printf(_("No password set.\n"));
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
g_free(realname);
|
|
Packit Service |
3e5a5a |
retval = 0;
|
|
Packit Service |
3e5a5a |
} else {
|
|
Packit Service |
3e5a5a |
printf(_("Unknown user.\n"));
|
|
Packit Service |
3e5a5a |
retval = 2;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
bail:
|
|
Packit Service |
3e5a5a |
CHECK_ERROR(error);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
shutdown_libuser();
|
|
Packit Service |
3e5a5a |
return retval;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
int
|
|
Packit Service |
3e5a5a |
pwdb_update_gecos(const char *username, const char *gecos)
|
|
Packit Service |
3e5a5a |
{
|
|
Packit Service |
3e5a5a |
int retval = 1;
|
|
Packit Service |
3e5a5a |
struct lu_ent *ent;
|
|
Packit Service |
3e5a5a |
struct lu_error *error = NULL;
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
startup_libuser(username);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
ent = lu_ent_new();
|
|
Packit Service |
3e5a5a |
if (lu_user_lookup_name(libuser, username, ent, &error)) {
|
|
Packit Service |
3e5a5a |
lu_ent_set_string(ent, LU_GECOS, gecos);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
if (lu_user_modify(libuser, ent, &error)) {
|
|
Packit Service |
3e5a5a |
retval = 0;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
CHECK_ERROR(error);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
shutdown_libuser();
|
|
Packit Service |
3e5a5a |
return retval;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
int
|
|
Packit Service |
3e5a5a |
pwdb_update_shell(const char *username, const char *shell)
|
|
Packit Service |
3e5a5a |
{
|
|
Packit Service |
3e5a5a |
int retval = 1;
|
|
Packit Service |
3e5a5a |
struct lu_ent *ent;
|
|
Packit Service |
3e5a5a |
struct lu_error *error = NULL;
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
startup_libuser(username);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
ent = lu_ent_new();
|
|
Packit Service |
3e5a5a |
if (lu_user_lookup_name(libuser, username, ent, &error)) {
|
|
Packit Service |
3e5a5a |
lu_ent_set_string(ent, LU_LOGINSHELL, shell);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
if (lu_user_modify(libuser, ent, &error)) {
|
|
Packit Service |
3e5a5a |
retval = 0;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
CHECK_ERROR(error);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
shutdown_libuser();
|
|
Packit Service |
3e5a5a |
return retval;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
int
|
|
Packit Service |
3e5a5a |
pwdb_update_aging(const char *username,
|
|
Packit Service |
3e5a5a |
long min, long max, long warn, long inact, long lastchg)
|
|
Packit Service |
3e5a5a |
{
|
|
Packit Service |
3e5a5a |
int retval = 1;
|
|
Packit Service |
3e5a5a |
struct lu_ent *ent;
|
|
Packit Service |
3e5a5a |
struct lu_error *error = NULL;
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
startup_libuser(username);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
ent = lu_ent_new();
|
|
Packit Service |
3e5a5a |
if (lu_user_lookup_name(libuser, username, ent, &error)) {
|
|
Packit Service |
3e5a5a |
if (!lu_ent_get(ent, LU_SHADOWMIN) &&
|
|
Packit Service |
3e5a5a |
!lu_ent_get(ent, LU_SHADOWMAX) &&
|
|
Packit Service |
3e5a5a |
!lu_ent_get(ent, LU_SHADOWWARNING) &&
|
|
Packit Service |
3e5a5a |
!lu_ent_get(ent, LU_SHADOWINACTIVE)) {
|
|
Packit Service |
3e5a5a |
fprintf(stderr, _("%s: user account has no support "
|
|
Packit Service |
3e5a5a |
"for password aging.\n"), progname);
|
|
Packit Service |
3e5a5a |
shutdown_libuser();
|
|
Packit Service |
3e5a5a |
return retval;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
if (min != -2)
|
|
Packit Service |
3e5a5a |
lu_ent_set_long(ent, LU_SHADOWMIN, min);
|
|
Packit Service |
3e5a5a |
if (max != -2)
|
|
Packit Service |
3e5a5a |
lu_ent_set_long(ent, LU_SHADOWMAX, max);
|
|
Packit Service |
3e5a5a |
if (warn != -2)
|
|
Packit Service |
3e5a5a |
lu_ent_set_long(ent, LU_SHADOWWARNING, warn);
|
|
Packit Service |
3e5a5a |
if (inact != -2)
|
|
Packit Service |
3e5a5a |
lu_ent_set_long(ent, LU_SHADOWINACTIVE, inact);
|
|
Packit Service |
3e5a5a |
if (lastchg != -2)
|
|
Packit Service |
3e5a5a |
lu_ent_set_long(ent, LU_SHADOWLASTCHANGE, lastchg);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
if (lu_user_modify(libuser, ent, &error)) {
|
|
Packit Service |
3e5a5a |
retval = 0;
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
}
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
CHECK_ERROR(error);
|
|
Packit Service |
3e5a5a |
|
|
Packit Service |
3e5a5a |
shutdown_libuser();
|
|
Packit Service |
3e5a5a |
return retval;
|
|
Packit Service |
3e5a5a |
}
|