
The groupadd from shadow does not allow upper case group names, the
same is true for the upstream shadow. But distributions like
Debian/Ubuntu/CentOS has their own way to cope with this problem,
this patch is picked up from CentOS release 7.0 to relax the usernames
restrictions to allow the upper case group names, and the relaxation is
POSIX compliant because POSIX indicate that usernames are composed of 
characters from the portable filename character set [A-Za-z0-9._-].

Upstream-Status: Pending

Signed-off-by: Shan Hai <shan.hai@windriver.com> 

diff -urpN a/libmisc/chkname.c b/libmisc/chkname.c
index 5089112..f40a0da 100644
--- a/libmisc/chkname.c
+++ b/libmisc/chkname.c
@@ -49,21 +49,28 @@
 static bool is_valid_name (const char *name)
 {
 	/*
-	 * User/group names must match [a-z_][a-z0-9_-]*[$]
-	 */
-	if (('\0' == *name) ||
-	    !((('a' <= *name) && ('z' >= *name)) || ('_' == *name))) {
+         * User/group names must match gnu e-regex:
+         *    [a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,30}[a-zA-Z0-9_.$-]?
+         *
+         * as a non-POSIX, extension, allow "$" as the last char for
+         * sake of Samba 3.x "add machine script"
+         */
+	if ( ('\0' == *name) ||
+             !((*name >= 'a' && *name <= 'z') ||
+               (*name >= 'A' && *name <= 'Z') ||
+               (*name >= '0' && *name <= '9') ||
+               (*name == '_') || (*name == '.') 
+	      )) {
 		return false;
 	}
 
 	while ('\0' != *++name) {
-		if (!(( ('a' <= *name) && ('z' >= *name) ) ||
-		      ( ('0' <= *name) && ('9' >= *name) ) ||
-		      ('_' == *name) ||
-		      ('-' == *name) ||
-		      ('.' == *name) ||
-		      ( ('$' == *name) && ('\0' == *(name + 1)) )
-		     )) {
+                if (!(  (*name >= 'a' && *name <= 'z') ||
+                        (*name >= 'A' && *name <= 'Z') ||
+                        (*name >= '0' && *name <= '9') ||
+                        (*name == '_') || (*name == '.') || (*name == '-') ||
+                        (*name == '$' && *(name + 1) == '\0') 
+                     )) {
 			return false;
 		}
 	}
diff -urpN a/man/groupadd.8.xml b/man/groupadd.8.xml
index 230fd0c..94f7807 100644
--- a/man/groupadd.8.xml
+++ b/man/groupadd.8.xml
@@ -222,12 +222,6 @@
    <refsect1 id='caveats'>
      <title>CAVEATS</title>
      <para>
-       Groupnames must start with a lower case letter or an underscore,
-       followed by lower case letters, digits, underscores, or dashes.
-       They can end with a dollar sign.
-       In regular expression terms: [a-z_][a-z0-9_-]*[$]?
-     </para>
-     <para>
        Groupnames may only be up to &GROUP_NAME_MAX_LENGTH; characters long.
      </para>
      <para>
diff -urpN a/man/useradd.8.xml b/man/useradd.8.xml
index 5dec989..fe623b9 100644
--- a/man/useradd.8.xml
+++ b/man/useradd.8.xml
@@ -336,7 +336,7 @@
 	</term>
 	<listitem>
 	  <para>
-	    Do no create the user's home directory, even if the system
+	    Do not create the user's home directory, even if the system
 	    wide setting from <filename>/etc/login.defs</filename>
 	    (<option>CREATE_HOME</option>) is set to
 	    <replaceable>yes</replaceable>.
@@ -607,12 +607,6 @@
     </para>
 
     <para>
-      Usernames must start with a lower case letter or an underscore,
-      followed by lower case letters, digits, underscores, or dashes.
-      They can end with a dollar sign.
-      In regular expression terms: [a-z_][a-z0-9_-]*[$]?
-    </para>
-    <para>
       Usernames may only be up to 32 characters long.
     </para>
   </refsect1>
