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