Blob Blame History Raw
diff -up shadow-4.1.0/libmisc/chkname.c.goodname shadow-4.1.0/libmisc/chkname.c
--- shadow-4.1.0/libmisc/chkname.c.goodname	2007-11-11 00:45:59.000000000 +0100
+++ shadow-4.1.0/libmisc/chkname.c	2007-12-12 13:57:20.000000000 +0100
@@ -18,16 +18,24 @@
 static int good_name (const char *name)
 {
 	/*
-	 * User/group names must match [a-z_][a-z0-9_-]*[$]
-	 */
-	if (!*name || !((*name >= 'a' && *name <= 'z') || *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 (!*name || !((*name >= 'a' && *name <= 'z')
+             || (*name >= 'A' && *name <= 'Z')
+             || (*name >= '0' && *name <= '9')
+             || *name == '_' || *name == '.'))
 		return 0;
 
 	while (*++name) {
-		if (!((*name >= 'a' && *name <= 'z') ||
-		      (*name >= '0' && *name <= '9') ||
-		      *name == '_' || *name == '-' ||
-		      (*name == '$' && *(name + 1) == '\0')))
+		if (!(  (*name >= 'a' && *name <= 'z')
+		     || (*name >= 'A' && *name <= 'Z')
+                     || (*name >= '0' && *name <= '9')
+                     || *name == '_' || *name == '.' || *name == '-'
+                     || (*name == '$' && *(name + 1) == '\0')))
 			return 0;
 	}
 
@@ -43,10 +51,9 @@ int check_user_name (const char *name)
 #endif
 
 	/*
-	 * User names are limited by whatever utmp can
-	 * handle (usually max 8 characters).
+	 * User names are limited by whatever utmp can handle.
 	 */
-	if (strlen (name) > sizeof (ut.ut_user))
+	if (strlen(name) + 1 > sizeof(ut.ut_user))
 		return 0;
 
 	return good_name (name);
@@ -54,11 +61,13 @@ int check_user_name (const char *name)
 
 int check_group_name (const char *name)
 {
-	/*
-	 * Arbitrary limit for group names - max 16
-	 * characters (same as on HP-UX 10).
-	 */
-	if (strlen (name) > 16)
+#if HAVE_UTMPX_H
+	struct utmpx ut;
+#else
+	struct utmp ut;
+#endif
+
+	if (strlen(name) + 1 > sizeof(ut.ut_user))
 		return 0;
 
 	return good_name (name);
diff -up shadow-4.1.0/man/groupadd.8.goodname shadow-4.1.0/man/groupadd.8
--- shadow-4.1.0/man/groupadd.8.goodname	2007-12-12 13:51:43.000000000 +0100
+++ shadow-4.1.0/man/groupadd.8	2007-12-12 14:00:29.000000000 +0100
@@ -126,9 +126,7 @@ Shadow password suite configuration\.
 .RE
 .SH "CAVEATS"
 .PP
-Groupnames must begin with a lower case letter or an underscore, and only lower case letters, underscores, dashes, and dollar signs may follow\. In regular expression terms: [a\-z_][a\-z0\-9_\-]*[$]
-.PP
-Groupnames may only be up to 16 characters long\.
+Groupnames may only be up to 32 characters long\.
 .PP
 You may not add a NIS or LDAP group\. This must be performed on the corresponding server\.
 .PP
diff -up shadow-4.1.0/man/useradd.8.goodname shadow-4.1.0/man/useradd.8
--- shadow-4.1.0/man/useradd.8.goodname	2007-12-12 13:51:43.000000000 +0100
+++ shadow-4.1.0/man/useradd.8	2007-12-12 14:01:36.000000000 +0100
@@ -242,8 +242,6 @@ You may not add a user to a NIS or LDAP 
 Similarly, if the username already exists in an external user database such as NIS or LDAP,
 \fBuseradd\fR
 will deny the user account creation request\.
-.PP
-Usernames must begin with a lower case letter or an underscore, and only lower case letters, underscores, dashes, and dollar signs may follow\. In regular expression terms: [a\-z_][a\-z0\-9_\-]*[$]
 .SH "CONFIGURATION"
 .PP
 The following configuration variables in