xref: /freebsd/usr.bin/at/perm.c (revision b89321a57ddc992e95585bf896d1871fae5b88c1)
1b89321a5SAndrey A. Chernov /*
2b89321a5SAndrey A. Chernov  *  perm.c - check user permission for at(1)
3b89321a5SAndrey A. Chernov  *  Copyright (C) 1994  Thomas Koenig
4b89321a5SAndrey A. Chernov  *
5b89321a5SAndrey A. Chernov  * Redistribution and use in source and binary forms, with or without
6b89321a5SAndrey A. Chernov  * modification, are permitted provided that the following conditions
7b89321a5SAndrey A. Chernov  * are met:
8b89321a5SAndrey A. Chernov  * 1. Redistributions of source code must retain the above copyright
9b89321a5SAndrey A. Chernov  *    notice, this list of conditions and the following disclaimer.
10b89321a5SAndrey A. Chernov  * 2. The name of the author(s) may not be used to endorse or promote
11b89321a5SAndrey A. Chernov  *    products derived from this software without specific prior written
12b89321a5SAndrey A. Chernov  *    permission.
13b89321a5SAndrey A. Chernov  *
14b89321a5SAndrey A. Chernov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15b89321a5SAndrey A. Chernov  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16b89321a5SAndrey A. Chernov  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17b89321a5SAndrey A. Chernov  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18b89321a5SAndrey A. Chernov  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19b89321a5SAndrey A. Chernov  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20b89321a5SAndrey A. Chernov  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21b89321a5SAndrey A. Chernov  * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22b89321a5SAndrey A. Chernov  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23b89321a5SAndrey A. Chernov  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24b89321a5SAndrey A. Chernov  */
25b89321a5SAndrey A. Chernov 
26b89321a5SAndrey A. Chernov /* System Headers */
27b89321a5SAndrey A. Chernov 
28b89321a5SAndrey A. Chernov #include <sys/types.h>
29b89321a5SAndrey A. Chernov #include <errno.h>
30b89321a5SAndrey A. Chernov #include <pwd.h>
31b89321a5SAndrey A. Chernov #include <stddef.h>
32b89321a5SAndrey A. Chernov #include <stdio.h>
33b89321a5SAndrey A. Chernov #include <stdlib.h>
34b89321a5SAndrey A. Chernov #include <string.h>
35b89321a5SAndrey A. Chernov #include <unistd.h>
36b89321a5SAndrey A. Chernov 
37b89321a5SAndrey A. Chernov /* Local headers */
38b89321a5SAndrey A. Chernov 
39b89321a5SAndrey A. Chernov #include "privs.h"
40b89321a5SAndrey A. Chernov #include "at.h"
41b89321a5SAndrey A. Chernov 
42b89321a5SAndrey A. Chernov /* Macros */
43b89321a5SAndrey A. Chernov 
44b89321a5SAndrey A. Chernov #define MAXUSERID 10
45b89321a5SAndrey A. Chernov 
46b89321a5SAndrey A. Chernov /* Structures and unions */
47b89321a5SAndrey A. Chernov 
48b89321a5SAndrey A. Chernov 
49b89321a5SAndrey A. Chernov /* File scope variables */
50b89321a5SAndrey A. Chernov 
51b89321a5SAndrey A. Chernov static char rcsid[] = "$Id: perm.c,v 1.1 1994/05/10 18:23:08 kernel Exp $";
52b89321a5SAndrey A. Chernov 
53b89321a5SAndrey A. Chernov /* Function declarations */
54b89321a5SAndrey A. Chernov 
55b89321a5SAndrey A. Chernov static int check_for_user(FILE *fp,const char *name);
56b89321a5SAndrey A. Chernov 
57b89321a5SAndrey A. Chernov /* Local functions */
58b89321a5SAndrey A. Chernov 
59b89321a5SAndrey A. Chernov static int check_for_user(FILE *fp,const char *name)
60b89321a5SAndrey A. Chernov {
61b89321a5SAndrey A. Chernov     char *buffer;
62b89321a5SAndrey A. Chernov     size_t len;
63b89321a5SAndrey A. Chernov     int found = 0;
64b89321a5SAndrey A. Chernov 
65b89321a5SAndrey A. Chernov     len = strlen(name);
66b89321a5SAndrey A. Chernov     buffer = mymalloc(len+2);
67b89321a5SAndrey A. Chernov 
68b89321a5SAndrey A. Chernov     while(fgets(buffer, len+2, fp) != NULL)
69b89321a5SAndrey A. Chernov     {
70b89321a5SAndrey A. Chernov 	if ((strncmp(name, buffer, len) == 0) &&
71b89321a5SAndrey A. Chernov 	    (buffer[len] == '\n'))
72b89321a5SAndrey A. Chernov 	{
73b89321a5SAndrey A. Chernov 	    found = 1;
74b89321a5SAndrey A. Chernov 	    break;
75b89321a5SAndrey A. Chernov 	}
76b89321a5SAndrey A. Chernov     }
77b89321a5SAndrey A. Chernov     fclose(fp);
78b89321a5SAndrey A. Chernov     free(buffer);
79b89321a5SAndrey A. Chernov     return found;
80b89321a5SAndrey A. Chernov }
81b89321a5SAndrey A. Chernov /* Global functions */
82b89321a5SAndrey A. Chernov int check_permission()
83b89321a5SAndrey A. Chernov {
84b89321a5SAndrey A. Chernov     FILE *fp;
85b89321a5SAndrey A. Chernov     uid_t uid = geteuid();
86b89321a5SAndrey A. Chernov     struct passwd *pentry;
87b89321a5SAndrey A. Chernov 
88b89321a5SAndrey A. Chernov     if (uid==0)
89b89321a5SAndrey A. Chernov 	return 1;
90b89321a5SAndrey A. Chernov 
91b89321a5SAndrey A. Chernov     if ((pentry = getpwuid(uid)) == NULL)
92b89321a5SAndrey A. Chernov     {
93b89321a5SAndrey A. Chernov 	perror("Cannot access user database");
94b89321a5SAndrey A. Chernov 	exit(EXIT_FAILURE);
95b89321a5SAndrey A. Chernov     }
96b89321a5SAndrey A. Chernov 
97b89321a5SAndrey A. Chernov     PRIV_START
98b89321a5SAndrey A. Chernov 
99b89321a5SAndrey A. Chernov     fp=fopen(PERM_PATH "at.allow","r");
100b89321a5SAndrey A. Chernov 
101b89321a5SAndrey A. Chernov     PRIV_END
102b89321a5SAndrey A. Chernov 
103b89321a5SAndrey A. Chernov     if (fp != NULL)
104b89321a5SAndrey A. Chernov     {
105b89321a5SAndrey A. Chernov 	return check_for_user(fp, pentry->pw_name);
106b89321a5SAndrey A. Chernov     }
107b89321a5SAndrey A. Chernov     else
108b89321a5SAndrey A. Chernov     {
109b89321a5SAndrey A. Chernov 
110b89321a5SAndrey A. Chernov 	PRIV_START
111b89321a5SAndrey A. Chernov 
112b89321a5SAndrey A. Chernov 	fp=fopen(PERM_PATH "at.deny", "r");
113b89321a5SAndrey A. Chernov 
114b89321a5SAndrey A. Chernov 	PRIV_END
115b89321a5SAndrey A. Chernov 
116b89321a5SAndrey A. Chernov 	if (fp != NULL)
117b89321a5SAndrey A. Chernov 	{
118b89321a5SAndrey A. Chernov 	    return !check_for_user(fp, pentry->pw_name);
119b89321a5SAndrey A. Chernov 	}
120b89321a5SAndrey A. Chernov 	perror("at.deny");
121b89321a5SAndrey A. Chernov     }
122b89321a5SAndrey A. Chernov     return 0;
123b89321a5SAndrey A. Chernov }
124