2 * Copyright (c) 1996 by
3 * David Nugent <davidn@blaze.net.au>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, is permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice immediately at the beginning of the file, without modification,
11 * this list of conditions, and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. This work was done expressly for inclusion into FreeBSD. Other use
16 * is permitted provided this notation is included.
17 * 4. Absolutely no warranty of function or purpose is made by the authors.
18 * 5. Modifications may be freely made to this file providing the above
21 * Support allow/deny lists in login class capabilities
24 #include <sys/cdefs.h>
25 __FBSDID("$FreeBSD$");
27 #include <sys/types.h>
29 #include <sys/resource.h>
30 #include <sys/param.h>
33 #include <login_cap.h>
40 /* -- support functions -- */
44 * This function is intentionally public - reused by TAS.
45 * Returns TRUE (non-zero) if a string matches a pattern
46 * in a given array of patterns. 'flags' is passed directly
51 login_strinlist(const char **list
, char const *str
, int flags
)
55 if (str
!= NULL
&& *str
!= '\0') {
58 while (rc
== 0 && list
[i
] != NULL
)
59 rc
= fnmatch(list
[i
++], str
, flags
) == 0;
67 * Locate either or two strings in a given list
71 login_str2inlist(const char **ttlst
, const char *str1
, const char *str2
, int flags
)
75 if (login_strinlist(ttlst
, str1
, flags
))
77 else if (login_strinlist(ttlst
, str2
, flags
))
85 * This function is intentionally public - reused by TAS.
86 * Returns an allocated list of time periods given an array
87 * of time periods in ascii form.
91 login_timelist(login_cap_t
*lc
, char const *cap
, int *ltno
,
95 struct login_time
*lt
= NULL
;
98 if ((tl
= login_getcaplist(lc
, cap
, NULL
)) != NULL
) {
100 while (tl
[j
++] != NULL
)
104 else if ((lt
= realloc(*ltptr
, j
* sizeof(struct login_time
))) != NULL
) {
111 for (--j
; i
< j
; i
++)
112 lt
[i
] = parse_lt(tl
[i
]);
113 lt
[i
].lt_dow
= LTM_NONE
;
122 * This function is a variation of auth_ttyok(), but it checks two
123 * arbitrary capability lists not necessarily related to access.
124 * This hook is provided for the accounted/exclude accounting lists.
128 login_ttyok(login_cap_t
*lc
, const char *tty
, const char *allowcap
,
133 if (lc
!= NULL
&& tty
!= NULL
&& *tty
!= '\0') {
138 te
= getttynam(tty
); /* Need group name */
139 grp
= te
? te
->ty_group
: NULL
;
140 ttl
= login_getcaplist(lc
, allowcap
, NULL
);
142 if (ttl
!= NULL
&& !login_str2inlist(ttl
, tty
, grp
, 0))
143 rc
= 0; /* tty or ttygroup not in allow list */
146 ttl
= login_getcaplist(lc
, denycap
, NULL
);
147 if (ttl
!= NULL
&& login_str2inlist(ttl
, tty
, grp
, 0))
148 rc
= 0; /* tty or ttygroup in deny list */
158 * Determine whether or not login on a tty is accessible for
163 auth_ttyok(login_cap_t
*lc
, const char * tty
)
165 return login_ttyok(lc
, tty
, "ttys.allow", "ttys.deny");
171 * This function is a variation of auth_hostok(), but it checks two
172 * arbitrary capability lists not necessarily related to access.
173 * This hook is provided for the accounted/exclude accounting lists.
177 login_hostok(login_cap_t
*lc
, const char *host
, const char *ip
,
178 const char *allowcap
, const char *denycap
)
180 int rc
= 1; /* Default is ok */
183 ((host
!= NULL
&& *host
!= '\0') || (ip
!= NULL
&& *ip
!= '\0'))) {
186 hl
= login_getcaplist(lc
, allowcap
, NULL
);
187 if (hl
!= NULL
&& !login_str2inlist(hl
, host
, ip
, FNM_CASEFOLD
))
188 rc
= 0; /* host or IP not in allow list */
191 hl
= login_getcaplist(lc
, denycap
, NULL
);
192 if (hl
!= NULL
&& login_str2inlist(hl
, host
, ip
, FNM_CASEFOLD
))
193 rc
= 0; /* host or IP in deny list */
203 * Determine whether or not login from a host is ok
207 auth_hostok(login_cap_t
*lc
, const char *host
, const char *ip
)
209 return login_hostok(lc
, host
, ip
, "host.allow", "host.deny");
215 * Determine whether or not login is ok at a given time
219 auth_timeok(login_cap_t
*lc
, time_t t
)
221 int rc
= 1; /* Default is ok */
223 if (lc
!= NULL
&& t
!= (time_t)0 && t
!= (time_t)-1) {
226 static int ltimesno
= 0;
227 static struct login_time
*ltimes
= NULL
;
229 if ((tptr
= localtime(&t
)) != NULL
) {
230 struct login_time
*lt
;
232 lt
= login_timelist(lc
, "times.allow", <imesno
, <imes
);
233 if (lt
!= NULL
&& in_ltms(lt
, tptr
, NULL
) == -1)
234 rc
= 0; /* not in allowed times list */
237 lt
= login_timelist(lc
, "times.deny", <imesno
, <imes
);
238 if (lt
!= NULL
&& in_ltms(lt
, tptr
, NULL
) != -1)
239 rc
= 0; /* in deny times list */