Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Jul 2015 09:48:04 +0000 (UTC)
From:      Baptiste Daroussin <bapt@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285156 - in head/usr.sbin/pw: . tests
Message-ID:  <201507050948.t659m41Y004411@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bapt
Date: Sun Jul  5 09:48:03 2015
New Revision: 285156
URL: https://svnweb.freebsd.org/changeset/base/285156

Log:
  Validate expiration dates
  
  Use strptime_l(3) to validate the dates provided in input

Modified:
  head/usr.sbin/pw/psdate.c
  head/usr.sbin/pw/tests/pw_useradd.sh

Modified: head/usr.sbin/pw/psdate.c
==============================================================================
--- head/usr.sbin/pw/psdate.c	Sun Jul  5 03:38:58 2015	(r285155)
+++ head/usr.sbin/pw/psdate.c	Sun Jul  5 09:48:03 2015	(r285156)
@@ -33,6 +33,8 @@ static const char rcsid[] =
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
+#include <xlocale.h>
+#include <err.h>
 
 #include "psdate.h"
 
@@ -95,16 +97,6 @@ weekday(char const ** str)
 	return aindex(days, str, 3);
 }
 
-static int
-month(char const ** str)
-{
-	static char const *months[] =
-	{"jan", "feb", "mar", "apr", "may", "jun", "jul",
-	"aug", "sep", "oct", "nov", "dec", NULL};
-
-	return aindex(months, str, 3);
-}
-
 static void
 parse_time(char const * str, int *hour, int *min, int *sec)
 {
@@ -122,34 +114,35 @@ parse_time(char const * str, int *hour, 
 static void
 parse_datesub(char const * str, int *day, int *mon, int *year)
 {
-	int             i;
-
-	static char const nchrs[] = "0123456789 \t,/-.";
+	struct tm	 tm;
+	locale_t	 l;
+	int		 i;
+	char		*ret;
+	const char	*valid_formats[] = {
+		"%d-%b-%y",
+		"%d-%b-%Y",
+		"%d-%m-%y",
+		"%d-%m-%Y",
+		NULL,
+	};
+
+	l = newlocale(LC_ALL_MASK, "C", NULL);
+
+	memset(&tm, 0, sizeof(tm));
+	for (i=0; valid_formats[i] != NULL; i++) {
+		ret = strptime_l(str, valid_formats[i], &tm, l);
+		if (ret && *ret == '\0') {
+			*day = tm.tm_mday;
+			*mon = tm.tm_mon;
+			*year = tm.tm_year;
+			freelocale(l);
+			return;
+		}
+	}
 
-	if ((i = month(&str)) != -1) {
-		*mon = i;
-		if ((i = a2i(&str)) != 0)
-			*day = i;
-	} else if ((i = a2i(&str)) != 0) {
-		*day = i;
-		while (*str && strchr(nchrs + 10, *str) != NULL)
-			++str;
-		if ((i = month(&str)) != -1)
-			*mon = i;
-		else if ((i = a2i(&str)) != 0)
-			*mon = i - 1;
-	} else
-		return;
+	freelocale(l);
 
-	while (*str && strchr(nchrs + 10, *str) != NULL)
-		++str;
-	if (isdigit((unsigned char)*str)) {
-		*year = atoi(str);
-		if (*year > 1900)
-			*year -= 1900;
-		else if (*year < 32)
-			*year += 100;
-	}
+	errx(EXIT_FAILURE, "Invalid date");
 }
 
 

Modified: head/usr.sbin/pw/tests/pw_useradd.sh
==============================================================================
--- head/usr.sbin/pw/tests/pw_useradd.sh	Sun Jul  5 03:38:58 2015	(r285155)
+++ head/usr.sbin/pw/tests/pw_useradd.sh	Sun Jul  5 09:48:03 2015	(r285156)
@@ -176,6 +176,31 @@ user_add_name_too_long_body() {
 		${PW} useradd name_very_vert_very_very_very_long
 }
 
+atf_test_case user_add_expiration
+user_add_expiration_body() {
+	populate_etc_skel
+
+	atf_check -s exit:0 \
+		${PW} useradd foo -e 20-03-2043
+	atf_check -o inline:"foo:*:1001:1001::0:2310422400:User &:/home/foo:/bin/sh\n" \
+		-s exit:0 grep "^foo" ${HOME}/master.passwd
+	atf_check -s exit:0 ${PW} userdel foo
+	atf_check -s exit:0 \
+		${PW} useradd foo -e 20-03-43
+	atf_check -o inline:"foo:*:1001:1001::0:2310422400:User &:/home/foo:/bin/sh\n" \
+		-s exit:0 grep "^foo" ${HOME}/master.passwd
+	atf_check -s exit:0 ${PW} userdel foo
+	atf_check -s exit:0 \
+		${PW} useradd foo -e 20-Mar-2043
+	atf_check -o inline:"foo:*:1001:1001::0:2310422400:User &:/home/foo:/bin/sh\n" \
+		-s exit:0 grep "^foo" ${HOME}/master.passwd
+	atf_check -s exit:0 ${PW} userdel foo
+	atf_check -e inline:"pw: Invalid date\n" -s exit:1 \
+		${PW} useradd foo -e 20-Foo-2043
+	atf_check -e inline:"pw: Invalid date\n" -s exit:1 \
+		${PW} useradd foo -e 20-13-2043
+}
+
 atf_init_test_cases() {
 	atf_add_test_case user_add
 	atf_add_test_case user_add_noupdate
@@ -193,4 +218,5 @@ atf_init_test_cases() {
 	atf_add_test_case user_add_password_expiration_date_month
 	atf_add_test_case user_add_password_expiration_date_relative
 	atf_add_test_case user_add_name_too_long
+	atf_add_test_case user_add_expiration
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507050948.t659m41Y004411>