xref: /illumos-gate/usr/src/cmd/oamuser/lib/vlogin.c (revision e4f7ccbe1e17940fdbde623116bcc8cd761d9ffc)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 2013 Gary Mills
24  *
25  * Copyright (c) 1997, by Sun Microsystems, Inc.
26  * All rights reserved.
27  */
28 
29 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
30 /*	  All Rights Reserved	*/
31 
32 /*LINTLIBRARY*/
33 
34 #include	<sys/types.h>
35 #include	<stdio.h>
36 #include	<ctype.h>
37 #include	<userdefs.h>
38 #include	<users.h>
39 #include	<deflt.h>
40 #include	<limits.h>
41 
42 /* Defaults file */
43 #define	DEFAULT_USERADD "/etc/default/useradd"
44 
45 /*
46  * validate string given as login name.
47  */
48 int
49 valid_login(char *login, struct passwd **pptr, int *warning)
50 {
51 	struct passwd *t_pptr;
52 	char *ptr = login;
53 	int bad1char, badc, clower, len;
54 	char c;
55 	char action;
56 
57 	len = 0; clower = 0; badc = 0; bad1char = 0;
58 	*warning = 0;
59 	if (!login || !*login)
60 		return (INVALID);
61 
62 	c = *ptr;
63 	if (!isalpha(c))
64 		bad1char++;
65 	for (; c != '\0'; ptr++, c = *ptr) {
66 		len++;
67 		if (!isprint(c) || (c == ':') || (c == '\n'))
68 			return (INVALID);
69 		if (!isalnum(c) && c != '_' && c != '-' && c != '.')
70 			badc++;
71 		if (islower(c))
72 			clower++;
73 	}
74 
75 	action = 'w';
76 	if (defopen(DEFAULT_USERADD) == 0) {
77 		char *defptr;
78 
79 		if ((defptr = defread("EXCEED_TRAD=")) != NULL) {
80 			char let = tolower(*defptr);
81 
82 			switch (let) {
83 			case 'w':	/* warning */
84 			case 'e':	/* error */
85 			case 's':	/* silent */
86 				action = let;
87 				break;
88 			}
89 		}
90 		(void) defopen((char *)NULL);
91 	}
92 
93 	if (len > LOGNAME_MAX)
94 		return (LONGNAME);
95 
96 	if (len > LOGNAME_MAX_TRAD) {
97 		if (action == 'w')
98 			*warning = *warning | WARN_NAME_TOO_LONG;
99 		else if (action == 'e')
100 			return (LONGNAME);
101 	}
102 
103 	if (clower == 0)
104 		*warning = *warning | WARN_NO_LOWERCHAR;
105 	if (badc != 0)
106 		*warning = *warning | WARN_BAD_LOGNAME_CHAR;
107 	if (bad1char != 0)
108 		*warning = *warning | WARN_BAD_LOGNAME_FIRST;
109 
110 	if ((t_pptr = getpwnam(login)) != NULL) {
111 		if (pptr) *pptr = t_pptr;
112 		return (NOTUNIQUE);
113 	}
114 	return (UNIQUE);
115 }
116