]> granicus.if.org Git - shadow/commitdiff
chkname.c, pwck.c, useradd.c, usermod.c, newusers.c: Allow names that do not conform...
authored <ed@s5h.net>
Fri, 23 Aug 2019 20:42:37 +0000 (21:42 +0100)
committerSerge Hallyn <shallyn@cisco.com>
Fri, 4 Oct 2019 23:40:41 +0000 (18:40 -0500)
Closes #121.

Changelog: squashed commits fixing tab style
Changelog: update 'return true' to match file's style (no parens).

libmisc/chkname.c
man/newusers.8.xml
man/pwck.8.xml
man/useradd.8.xml
man/usermod.8.xml
src/newusers.c
src/pwck.c
src/useradd.c
src/usermod.c

index 64f5580c84e8f1905d118aa767b2ea1be748c723..bdd1e72a2c4ca70638009042ffba0f4eb14b3ab7 100644 (file)
 #include "defines.h"
 #include "chkname.h"
 
+int allow_bad_names = false;
+
 static bool is_valid_name (const char *name)
 {
+       if (allow_bad_names) {
+               return true;
+       }
+
        /*
         * User/group names must match [a-z_][a-z0-9_-]*[$]
         */
+
        if (('\0' == *name) ||
            !((('a' <= *name) && ('z' >= *name)) || ('_' == *name))) {
                return false;
index ff6dc1c3a4b6073f5b72d8c7c884c10585deebbf..a1029a2717958e81fb55477f2368e608a94d3e5c 100644 (file)
     <para>
       The options which apply to the <command>newusers</command> command are:
     </para>
+    <variablelist remap='IP'>
+      <varlistentry>
+       <term>
+         <option>--badname</option>&nbsp;
+       </term>
+       <listitem>
+         <para>
+        Allow names that do not conform to standards.
+         </para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
     <variablelist remap='IP' condition="no_pam">
       <varlistentry>
        <term><option>-c</option>, <option>--crypt-method</option></term>
index 25952df575c7d3541943e335cca50edba99233cf..bc99605f60a0a5d6058655371eff7eee5707de59 100644 (file)
       The options which apply to the <command>pwck</command> command are:
     </para>
     <variablelist remap='IP'>
+      <varlistentry>
+       <term>
+         <option>--badname</option>&nbsp;
+       </term>
+       <listitem>
+         <para>
+        Allow names that do not conform to standards.
+         </para>
+       </listitem>
+      </varlistentry>
       <varlistentry>
        <term><option>-h</option>, <option>--help</option></term>
        <listitem>
index 59e53c1fe65fa9a6b48315b09dc39fe67ee7e94e..a16d730768cf4b5b845bf405035d1dc9e2ea7873 100644 (file)
     <para>The options which apply to the <command>useradd</command> command are:
     </para>
     <variablelist remap='IP'>
+      <varlistentry>
+       <term>
+         <option>--badname</option>&nbsp;
+       </term>
+       <listitem>
+         <para>
+        Allow names that do not conform to standards.
+         </para>
+       </listitem>
+      </varlistentry>
       <varlistentry>
        <term>
          <option>-b</option>, <option>--base-dir</option>&nbsp;<replaceable>BASE_DIR</replaceable>
index bb8312dbfa9732ec279b8eb727be2d22ece21397..81a99592734947991a6682c7bbc23595f56b76e7 100644 (file)
          </para>
        </listitem>
       </varlistentry>
+      <varlistentry>
+       <term>
+         <option>-b</option>, <option>--badnames</option>
+       </term>
+       <listitem>
+         <para>
+           Allow names that do not conform to standards.
+         </para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term>
+         <option>-b</option>, <option>--badnames</option>
+       </term>
+       <listitem>
+         <para>
+           Allow names that do not conform to standards.
+         </para>
+       </listitem>
+      </varlistentry>
       <varlistentry>
        <term>
          <option>-c</option>, <option>--comment</option>&nbsp;<replaceable>COMMENT</replaceable>
index 7c3bb1c2d65e1dcb5bd1a26178f7001d1a842e1f..bf63f4b56629585c2d070a971ba4bc1a21535bda 100644 (file)
@@ -117,6 +117,8 @@ static void check_perms (void);
 static void open_files (void);
 static void close_files (void);
 
+extern int allow_bad_names;
+
 /*
  * usage - display usage message and exit
  */
@@ -128,6 +130,7 @@ static void usage (int status)
                          "\n"
                          "Options:\n"),
                        Prog);
+       (void) fputs (_("  -b, --badnames                allow bad names\n"), usageout);
 #ifndef USE_PAM
        (void) fprintf (usageout,
                        _("  -c, --crypt-method METHOD     the crypt method (one of %s)\n"),
@@ -580,6 +583,7 @@ static void process_flags (int argc, char **argv)
 {
        int c;
        static struct option long_options[] = {
+               {"badnames",     no_argument,       NULL, 'b'},
 #ifndef USE_PAM
                {"crypt-method", required_argument, NULL, 'c'},
 #endif                         /* !USE_PAM */
@@ -597,15 +601,18 @@ static void process_flags (int argc, char **argv)
        while ((c = getopt_long (argc, argv,
 #ifndef USE_PAM
 #ifdef USE_SHA_CRYPT
-                                "c:hrs:",
+                                "c:bhrs:",
 #else                          /* !USE_SHA_CRYPT */
-                                "c:hr",
+                                "c:bhr",
 #endif                         /* !USE_SHA_CRYPT */
 #else                          /* USE_PAM */
-                                "hr",
+                                "bhr",
 #endif
                                 long_options, NULL)) != -1) {
                switch (c) {
+               case 'b':
+                       allow_bad_names = true;
+                       break;
 #ifndef USE_PAM
                case 'c':
                        crypt_method = optarg;
index f022e473d77054a8424d44026404f48e0eb83323..c24524ce829033dde6fbd0977678c3e5829b00b6 100644 (file)
@@ -95,6 +95,8 @@ static void close_files (bool changed);
 static void check_pw_file (int *errors, bool *changed);
 static void check_spw_file (int *errors, bool *changed);
 
+extern int allow_bad_names;
+
 /*
  * fail_exit - do some cleanup and exit with the given error code
  */
@@ -148,6 +150,7 @@ static /*@noreturn@*/void usage (int status)
                                  "Options:\n"),
                                Prog);
        }
+       (void) fputs (_("  -b, --badnames                allow bad names\n"), usageout);
        (void) fputs (_("  -h, --help                    display this help message and exit\n"), usageout);
        (void) fputs (_("  -q, --quiet                   report errors only\n"), usageout);
        (void) fputs (_("  -r, --read-only               display errors and warnings\n"
@@ -172,6 +175,7 @@ static void process_flags (int argc, char **argv)
 {
        int c;
        static struct option long_options[] = {
+               {"badnames",  no_argument,       NULL, 'b'},
                {"help",      no_argument,       NULL, 'h'},
                {"quiet",     no_argument,       NULL, 'q'},
                {"read-only", no_argument,       NULL, 'r'},
@@ -183,9 +187,12 @@ static void process_flags (int argc, char **argv)
        /*
         * Parse the command line arguments
         */
-       while ((c = getopt_long (argc, argv, "ehqrR:s",
+       while ((c = getopt_long (argc, argv, "behqrR:s",
                                 long_options, NULL)) != -1) {
                switch (c) {
+               case 'b':
+                       allow_bad_names = true;
+                       break;
                case 'h':
                        usage (E_SUCCESS);
                        /*@notreached@*/break;
@@ -481,6 +488,7 @@ static void check_pw_file (int *errors, bool *changed)
                /*
                 * Check for invalid usernames.  --marekm
                 */
+
                if (!is_valid_user_name (pwd->pw_name)) {
                        printf (_("invalid user name '%s'\n"), pwd->pw_name);
                        *errors += 1;
index bdd7fe8c7305065dee77deb7c7ce0200c0da63fb..e89fe7e678fc0a261c53b70caf9226062a2b8679 100644 (file)
@@ -148,6 +148,8 @@ static char **user_groups;  /* NULL-terminated list */
 static long sys_ngroups;
 static bool do_grp_update = false;     /* group files need to be updated */
 
+extern int allow_bad_names;
+
 static bool
     bflg = false,              /* new default root of home directory */
     cflg = false,              /* comment (GECOS) field for new account */
@@ -821,6 +823,7 @@ static void usage (int status)
                          "\n"
                          "Options:\n"),
                        Prog, Prog, Prog);
+       (void) fputs (_("      --badnames                do not check for bad names\n"), usageout);
        (void) fputs (_("  -b, --base-dir BASE_DIR       base directory for the home directory of the\n"
                        "                                new account\n"), usageout);
 #ifdef WITH_BTRFS
@@ -1109,6 +1112,7 @@ static void process_flags (int argc, char **argv)
 #ifdef WITH_BTRFS
                        {"btrfs-subvolume-home", no_argument, NULL, 200},
 #endif
+                       {"badnames",       no_argument,       NULL, 201},
                        {"comment",        required_argument, NULL, 'c'},
                        {"home-dir",       required_argument, NULL, 'd'},
                        {"defaults",       no_argument,       NULL, 'D'},
@@ -1158,6 +1162,9 @@ static void process_flags (int argc, char **argv)
                        case 200:
                                subvolflg = true;
                                break;
+                       case 201:
+                               allow_bad_names = true;
+                               break;
                        case 'c':
                                if (!VALID (optarg)) {
                                        fprintf (stderr,
index 0ae50e3428b50206ab4d4870c95613cef753cb35..05b9871596803b9010dd3cb113785d59e53a3941 100644 (file)
@@ -206,6 +206,8 @@ static void update_faillog (void);
 static void move_mailbox (void);
 #endif
 
+extern int allow_bad_names;
+
 static void date_to_str (/*@unique@*//*@out@*/char *buf, size_t maxsize,
                          long int date)
 {
@@ -408,6 +410,7 @@ static /*@noreturn@*/void usage (int status)
                          "\n"
                          "Options:\n"),
                        Prog);
+       (void) fputs (_("  -b, --badnames                allow bad names\n"), usageout);
        (void) fputs (_("  -c, --comment COMMENT         new value of the GECOS field\n"), usageout);
        (void) fputs (_("  -d, --home HOME_DIR           new home directory for the user account\n"), usageout);
        (void) fputs (_("  -e, --expiredate EXPIRE_DATE  set account expiration date to EXPIRE_DATE\n"), usageout);
@@ -991,6 +994,7 @@ static void process_flags (int argc, char **argv)
                int c;
                static struct option long_options[] = {
                        {"append",       no_argument,       NULL, 'a'},
+                       {"badnames",     no_argument,       NULL, 'b'},
                        {"comment",      required_argument, NULL, 'c'},
                        {"home",         required_argument, NULL, 'd'},
                        {"expiredate",   required_argument, NULL, 'e'},
@@ -1020,7 +1024,7 @@ static void process_flags (int argc, char **argv)
                        {NULL, 0, NULL, '\0'}
                };
                while ((c = getopt_long (argc, argv,
-                                        "ac:d:e:f:g:G:hl:Lmop:R:s:u:UP:"
+                                        "abc:d:e:f:g:G:hl:Lmop:R:s:u:UP:"
 #ifdef ENABLE_SUBIDS
                                         "v:w:V:W:"
 #endif                         /* ENABLE_SUBIDS */
@@ -1032,6 +1036,9 @@ static void process_flags (int argc, char **argv)
                        case 'a':
                                aflg = true;
                                break;
+                       case 'b':
+                               allow_bad_names = true;
+                               break;
                        case 'c':
                                if (!VALID (optarg)) {
                                        fprintf (stderr,