perm.c revision 48386
1144518Sdavidxu/*
2144518Sdavidxu *  perm.c - check user permission for at(1)
3144518Sdavidxu *  Copyright (C) 1994  Thomas Koenig
4144518Sdavidxu *
5144518Sdavidxu * Redistribution and use in source and binary forms, with or without
6144518Sdavidxu * modification, are permitted provided that the following conditions
7144518Sdavidxu * are met:
8144518Sdavidxu * 1. Redistributions of source code must retain the above copyright
9144518Sdavidxu *    notice, this list of conditions and the following disclaimer.
10144518Sdavidxu * 2. The name of the author(s) may not be used to endorse or promote
11144518Sdavidxu *    products derived from this software without specific prior written
12144518Sdavidxu *    permission.
13144518Sdavidxu *
14144518Sdavidxu * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15144518Sdavidxu * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16144518Sdavidxu * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17144518Sdavidxu * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18144518Sdavidxu * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19144518Sdavidxu * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20144518Sdavidxu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21144518Sdavidxu * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22144518Sdavidxu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23144518Sdavidxu * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24144518Sdavidxu */
25144518Sdavidxu
26144518Sdavidxu/* System Headers */
27297706Skib
28297706Skib#include <sys/types.h>
29297706Skib#include <errno.h>
30144518Sdavidxu#include <pwd.h>
31144518Sdavidxu#include <stddef.h>
32144518Sdavidxu#include <stdio.h>
33177853Sdavidxu#include <stdlib.h>
34177853Sdavidxu#include <string.h>
35177853Sdavidxu#include <unistd.h>
36177853Sdavidxu
37177853Sdavidxu/* Local headers */
38177853Sdavidxu
39177853Sdavidxu#include "privs.h"
40177853Sdavidxu#include "at.h"
41177853Sdavidxu
42163334Sdavidxu/* Macros */
43163334Sdavidxu
44163334Sdavidxu#define MAXUSERID 10
45293858Svangyzen
46163334Sdavidxu/* Structures and unions */
47163334Sdavidxu
48163334Sdavidxu
49163334Sdavidxu/* File scope variables */
50212077Sdavidxu
51212077Sdavidxustatic const char rcsid[] = "$Id: perm.c,v 1.6 1998/12/06 07:42:09 archie Exp $";
52212077Sdavidxu
53293858Svangyzen/* Function declarations */
54293858Svangyzen
55212077Sdavidxustatic int check_for_user(FILE *fp,const char *name);
56212077Sdavidxu
57212077Sdavidxu/* Local functions */
58144518Sdavidxu
59179970Sdavidxustatic int check_for_user(FILE *fp,const char *name)
60161680Sdavidxu{
61179970Sdavidxu    char *buffer;
62179970Sdavidxu    size_t len;
63179970Sdavidxu    int found = 0;
64179970Sdavidxu
65179970Sdavidxu    len = strlen(name);
66179970Sdavidxu    buffer = mymalloc(len+2);
67179970Sdavidxu
68179970Sdavidxu    while(fgets(buffer, len+2, fp) != NULL)
69179970Sdavidxu    {
70179970Sdavidxu	if ((strncmp(name, buffer, len) == 0) &&
71179970Sdavidxu	    (buffer[len] == '\n'))
72179970Sdavidxu	{
73179970Sdavidxu	    found = 1;
74179970Sdavidxu	    break;
75179970Sdavidxu	}
76161680Sdavidxu    }
77161680Sdavidxu    fclose(fp);
78216641Sdavidxu    free(buffer);
79216641Sdavidxu    return found;
80161680Sdavidxu}
81216641Sdavidxu/* Global functions */
82216641Sdavidxuint check_permission()
83216641Sdavidxu{
84216641Sdavidxu    FILE *fp;
85216641Sdavidxu    uid_t uid = geteuid();
86216641Sdavidxu    struct passwd *pentry;
87216641Sdavidxu
88216641Sdavidxu    if (uid==0)
89216641Sdavidxu	return 1;
90216641Sdavidxu
91216641Sdavidxu    if ((pentry = getpwuid(uid)) == NULL)
92216641Sdavidxu    {
93216641Sdavidxu	perror("Cannot access user database");
94216641Sdavidxu	exit(EXIT_FAILURE);
95216641Sdavidxu    }
96216641Sdavidxu
97216641Sdavidxu    PRIV_START
98216641Sdavidxu
99216641Sdavidxu    fp=fopen(PERM_PATH "at.allow","r");
100216641Sdavidxu
101216641Sdavidxu    PRIV_END
102216641Sdavidxu
103216641Sdavidxu    if (fp != NULL)
104216641Sdavidxu    {
105216641Sdavidxu	return check_for_user(fp, pentry->pw_name);
106216641Sdavidxu    }
107216641Sdavidxu    else if (errno == ENOENT)
108216641Sdavidxu    {
109216641Sdavidxu
110216641Sdavidxu	PRIV_START
111216641Sdavidxu
112179970Sdavidxu	fp=fopen(PERM_PATH "at.deny", "r");
113232144Sdavidxu
114161680Sdavidxu	PRIV_END
115232144Sdavidxu
116232144Sdavidxu	if (fp != NULL)
117179970Sdavidxu	{
118179970Sdavidxu	    return !check_for_user(fp, pentry->pw_name);
119179970Sdavidxu	}
120232144Sdavidxu	else if (errno != ENOENT)
121232144Sdavidxu	    perror("at.deny");
122232144Sdavidxu    }
123232144Sdavidxu    else
124232144Sdavidxu	perror("at.allow");
125232144Sdavidxu    return 0;
126232144Sdavidxu}
127232144Sdavidxu