Home | History | Annotate | Download | only in cron
      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 (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
     22 /*	  All Rights Reserved  	*/
     23 
     24 /*
     25  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     26  * Use is subject to license terms.
     27  */
     28 
     29 #include <sys/types.h>
     30 #include <sys/stat.h>
     31 #include <stdio.h>
     32 #include <string.h>
     33 #include <ctype.h>
     34 #include <pwd.h>
     35 #include <auth_attr.h>
     36 #include <auth_list.h>
     37 
     38 #include "cron.h"
     39 
     40 struct stat globstat;
     41 #define	exists(file)	(stat(file, &globstat) == 0)
     42 #define	ROOT	"root"
     43 
     44 int per_errno;	/* status info from getuser */
     45 static int within(char *, char *);
     46 
     47 
     48 char *
     49 getuser(uid)
     50 uid_t uid;
     51 {
     52 	struct passwd *nptr;
     53 
     54 	if ((nptr = getpwuid(uid)) == NULL) {
     55 		per_errno = 1;
     56 		return (NULL);
     57 	}
     58 	if ((strcmp(nptr->pw_shell, SHELL) != 0) &&
     59 	    (strcmp(nptr->pw_shell, "") != 0)) {
     60 		per_errno = 2;
     61 		/*
     62 		 * return NULL if you want crontab and at to abort
     63 		 * when the users login shell is not /usr/bin/sh otherwise
     64 		 * return pw_name
     65 		 */
     66 		return (nptr->pw_name);
     67 	}
     68 	return (nptr->pw_name);
     69 }
     70 
     71 int
     72 allowed(user, allow, deny)
     73 char *user, *allow, *deny;
     74 {
     75 	if (exists(allow)) {
     76 		if (within(user, allow)) {
     77 			return (1);
     78 		} else {
     79 			return (0);
     80 		}
     81 	} else if (exists(deny)) {
     82 		if (within(user, deny)) {
     83 			return (0);
     84 		} else {
     85 			return (1);
     86 		}
     87 	} else if (chkauthattr(CRONUSER_AUTH, user)) {
     88 		return (1);
     89 	} else {
     90 		return (0);
     91 	}
     92 }
     93 
     94 static int
     95 within(username, filename)
     96 char *username, *filename;
     97 {
     98 	char line[UNAMESIZE];
     99 	FILE *cap;
    100 	int i;
    101 
    102 	if ((cap = fopen(filename, "r")) == NULL)
    103 		return (0);
    104 	while (fgets(line, UNAMESIZE, cap) != NULL) {
    105 		for (i = 0; line[i] != '\0'; i++) {
    106 			if (isspace(line[i])) {
    107 				line[i] = '\0';
    108 				break; }
    109 		}
    110 		if (strcmp(line, username) == 0) {
    111 			fclose(cap);
    112 			return (1);
    113 		}
    114 	}
    115 	fclose(cap);
    116 	return (0);
    117 }
    118 
    119 int
    120 cron_admin(const char *name)
    121 {
    122 	return (chkauthattr(CRONADMIN_AUTH, name));
    123 }
    124