]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
Add option --password to groupadd and groupmod (similar to useradd and usermod).
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sat, 5 Jan 2008 14:17:43 +0000 (14:17 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sat, 5 Jan 2008 14:17:43 +0000 (14:17 +0000)
ChangeLog
NEWS
src/groupadd.c
src/groupmod.c

index 3980d3e9ac5c04afef5128e3f8578ea5df62c2ce..7d0c03885c30c5957b1053ee23bcd38d3dd77eed 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-05  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * 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  <nicolas.francois@centraliens.net>
 
        * lib/prototypes.h: grent.c does not exist anymore. Remove the
diff --git a/NEWS b/NEWS
index c53e9e4f8f22c8ae99c9dae007aa07ae95b0bc11..bd07500780fa4095502c6859f76d9cac95407469 100644 (file)
--- 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.
index 2cdc593746b6932555f3c15c390863a126d214b3..236d42f992e3f0ef5d74203f097a00df01670df2 100644 (file)
@@ -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 ();
                }
index 1ec89594b103d7996dd8e23446630d060c689288..5899048a81f1740c697c1ef414b0ae24a0981def 100644 (file)
@@ -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 ();
                        }