From: nekral-guest Date: Sat, 5 Jan 2008 14:17:43 +0000 (+0000) Subject: Add option --password to groupadd and groupmod (similar to useradd and usermod). X-Git-Tag: 4.1.1~137 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f8a95f7ca18f740108409eb975d4f083c4af2009;p=thirdparty%2Fshadow.git Add option --password to groupadd and groupmod (similar to useradd and usermod). --- diff --git a/ChangeLog b/ChangeLog index 3980d3e9a..7d0c03885 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-01-05 Nicolas François + + * NEWS, src/groupmod.c, src/groupadd.c: Add option --password to + groupadd and groupmod (similar to useradd and usermod). + 2008-01-05 Nicolas François * lib/prototypes.h: grent.c does not exist anymore. Remove the diff --git a/NEWS b/NEWS index c53e9e4f8..bd0750078 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,10 @@ shadow-4.1.0 -> shadow-4.1.1 UNRELEASED - chage * Fix bug which forbid to set the aging information of an account with a passwd entry, but no shadow entry. +- groupadd + * New option -p/--password to specify an encrypted password. +- groupmod + * New option -p/--password to specify an encrypted password. - grpck * Fix logging of changes to syslog when a group file is provided, without a gshadow file. diff --git a/src/groupadd.c b/src/groupadd.c index 2cdc59374..236d42f99 100644 --- a/src/groupadd.c +++ b/src/groupadd.c @@ -68,6 +68,7 @@ static int is_shadow_grp; */ static char *group_name; static gid_t group_id; +static char *group_passwd; static char *empty_list = NULL; static char *Prog; @@ -75,6 +76,7 @@ static char *Prog; static int oflg = 0; /* permit non-unique group ID to be specified with -g */ static int gflg = 0; /* ID value for the new group */ static int fflg = 0; /* if group already exists, do nothing and exit(0) */ +static int pflg = 0; /* new encrypted password */ #ifdef USE_PAM static pam_handle_t *pamh = NULL; @@ -127,7 +129,11 @@ static void new_grent (struct group *grent) { memzero (grent, sizeof *grent); grent->gr_name = group_name; - grent->gr_passwd = SHADOW_PASSWD_STRING; /* XXX warning: const */ + if (pflg) { + grent->gr_passwd = group_passwd; + } else { + grent->gr_passwd = SHADOW_PASSWD_STRING; /* XXX warning: const */ + } grent->gr_gid = group_id; grent->gr_mem = &empty_list; } @@ -143,7 +149,11 @@ static void new_sgent (struct sgrp *sgent) { memzero (sgent, sizeof *sgent); sgent->sg_name = group_name; - sgent->sg_passwd = "!"; /* XXX warning: const */ + if (pflg) { + sgent->sg_passwd = group_passwd; + } else { + sgent->sg_passwd = "!"; /* XXX warning: const */ + } sgent->sg_adm = &empty_list; sgent->sg_mem = &empty_list; } @@ -168,6 +178,9 @@ static void grp_update (void) new_grent (&grp); #ifdef SHADOWGRP new_sgent (&sgrp); + if (is_shadow_grp && pflg) { + grent->gr_passwd = SHADOW_PASSWD_STRING; /* XXX warning: const */ + } #endif /* SHADOWGRP */ /* @@ -393,6 +406,7 @@ static void process_flags (int argc, char **argv) {"help", no_argument, NULL, 'h'}, {"key", required_argument, NULL, 'K'}, {"non-unique", required_argument, NULL, 'o'}, + {"password", required_argument, NULL, 'p'}, {NULL, 0, NULL, '\0'} }; @@ -440,6 +454,10 @@ static void process_flags (int argc, char **argv) case 'o': oflg++; break; + case 'p': + pglf++; + group_passwd = optarg; + break; default: usage (); } diff --git a/src/groupmod.c b/src/groupmod.c index 1ec89594b..5899048a8 100644 --- a/src/groupmod.c +++ b/src/groupmod.c @@ -67,6 +67,7 @@ static int is_shadow_grp; #endif static char *group_name; static char *group_newname; +static char *group_passwd; static gid_t group_id; static gid_t group_newid; @@ -75,7 +76,8 @@ static char *Prog; static int oflg = 0, /* permit non-unique group ID to be specified with -g */ gflg = 0, /* new ID value for the group */ - nflg = 0; /* a new name has been specified for the group */ + nflg = 0, /* a new name has been specified for the group */ + pflg = 0; /* new encrypted password */ /* local function prototypes */ static void usage (void); @@ -105,6 +107,7 @@ static void usage (void) " -h, --help display this help message and exit\n" " -n, --new-name NEW_GROUP force use NEW_GROUP name by GROUP\n" " -o, --non-unique allow using duplicate (non-unique) GID by GROUP\n" + " -p, --password PASSWORD use encrypted password for the new password\n" "\n")); exit (E_USAGE); } @@ -122,6 +125,9 @@ static void new_grent (struct group *grent) if (gflg) grent->gr_gid = group_newid; + + if (pflg) + grent->gr_passwd = group_passwd; } #ifdef SHADOWGRP @@ -135,6 +141,9 @@ static void new_sgent (struct sgrp *sgent) { if (nflg) sgent->sg_name = xstrdup (group_newname); + + if (pflg) + sgent->sg_passwd = group_passwd; } #endif /* SHADOWGRP */ @@ -173,6 +182,8 @@ static void grp_update (void) if (is_shadow_grp && (osgrp = sgr_locate (group_name))) { sgrp = *osgrp; new_sgent (&sgrp); + if (pflg) + grp.gr_passwd = SHADOW_PASSWD_STRING; } #endif /* SHADOWGRP */ @@ -208,7 +219,7 @@ static void grp_update (void) /* * Write out the new shadow group entries as well. */ - if (!sgr_update (&sgrp)) { + if (is_shadow_grp && !sgr_update (&sgrp)) { fprintf (stderr, _("%s: error adding new group entry\n"), Prog); #ifdef WITH_AUDIT audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "adding group", @@ -216,7 +227,7 @@ static void grp_update (void) #endif exit (E_GRP_UPDATE); } - if (nflg && !sgr_remove (group_name)) { + if (is_shadow_grp && nflg && !sgr_remove (group_name)) { fprintf (stderr, _("%s: error removing group entry\n"), Prog); #ifdef WITH_AUDIT audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "deleting group", @@ -354,6 +365,7 @@ static void process_flags (int argc, char **argv) {"help", no_argument, NULL, 'h'}, {"new-name", required_argument, NULL, 'n'}, {"non-unique", no_argument, NULL, 'o'}, + {"password", required_argument, NULL, 'p'}, {NULL, 0, NULL, '\0'} }; while ((c = @@ -376,6 +388,10 @@ static void process_flags (int argc, char **argv) case 'o': oflg++; break; + case 'p': + group_passwd = optarg; + pflg++; + break; default: usage (); }