|
|
1.1 ! root 1: /* ! 2: * $Source: /usr/src/kerberosIV/krb/RCS/kuserok.c,v $ ! 3: * $Author: kfall $ ! 4: * ! 5: * Copyright 1987, 1988 by the Massachusetts Institute of Technology. ! 6: * ! 7: * For copying and distribution information, please see the file ! 8: * <mit-copyright.h>. ! 9: * ! 10: * kuserok: check if a kerberos principal has ! 11: * access to a local account ! 12: */ ! 13: ! 14: #ifndef lint ! 15: static char rcsid_kuserok_c[] = ! 16: "$Header: /usr/src/kerberosIV/krb/RCS/kuserok.c,v 4.7 90/06/23 03:11:11 kfall Exp $"; ! 17: #endif lint ! 18: ! 19: #include <mit-copyright.h> ! 20: ! 21: #include <sys/param.h> ! 22: #include <sys/socket.h> ! 23: #include <sys/stat.h> ! 24: #include <sys/file.h> ! 25: #include <des.h> ! 26: #include <krb.h> ! 27: #include <stdio.h> ! 28: #include <pwd.h> ! 29: #include <strings.h> ! 30: ! 31: #define OK 0 ! 32: #define NOTOK 1 ! 33: #define MAX_USERNAME 10 ! 34: ! 35: /* ! 36: * Given a Kerberos principal "kdata", and a local username "luser", ! 37: * determine whether user is authorized to login according to the ! 38: * authorization file ("~luser/.klogin" by default). Returns OK ! 39: * if authorized, NOTOK if not authorized. ! 40: * ! 41: * If there is no account for "luser" on the local machine, returns ! 42: * NOTOK. If there is no authorization file, and the given Kerberos ! 43: * name "kdata" translates to the same name as "luser" (using ! 44: * krb_kntoln()), returns OK. Otherwise, if the authorization file ! 45: * can't be accessed, returns NOTOK. Otherwise, the file is read for ! 46: * a matching principal name, instance, and realm. If one is found, ! 47: * returns OK, if none is found, returns NOTOK. ! 48: * ! 49: * The file entries are in the format: ! 50: * ! 51: * name.instance@realm ! 52: * ! 53: * one entry per line. ! 54: * ! 55: * The ATHENA_COMPAT code supports old-style Athena ~luser/.klogin ! 56: * file entries. See the file "kparse.c". ! 57: */ ! 58: ! 59: int ! 60: kuserok(kdata, luser) ! 61: AUTH_DAT *kdata; ! 62: char *luser; ! 63: { ! 64: struct stat sbuf; ! 65: struct passwd *pwd; ! 66: char pbuf[MAXPATHLEN]; ! 67: int isok = NOTOK, rc; ! 68: FILE *fp; ! 69: char kuser[MAX_USERNAME]; ! 70: char principal[ANAME_SZ], inst[INST_SZ], realm[REALM_SZ]; ! 71: char linebuf[BUFSIZ]; ! 72: char *newline; ! 73: int gobble; ! 74: ! 75: /* no account => no access */ ! 76: if ((pwd = getpwnam(luser)) == NULL) { ! 77: return(NOTOK); ! 78: } ! 79: (void) strcpy(pbuf, pwd->pw_dir); ! 80: (void) strcat(pbuf, "/.klogin"); ! 81: ! 82: if (access(pbuf, F_OK)) { /* not accessible */ ! 83: /* ! 84: * if he's trying to log in as himself, and there is no .klogin file, ! 85: * let him. To find out, call ! 86: * krb_kntoln to convert the triple in kdata to a name which we can ! 87: * string compare. ! 88: */ ! 89: if (!krb_kntoln(kdata, kuser) && (strcmp(kuser, luser) == 0)) { ! 90: return(OK); ! 91: } ! 92: } ! 93: /* open ~/.klogin */ ! 94: if ((fp = fopen(pbuf, "r")) == NULL) { ! 95: return(NOTOK); ! 96: } ! 97: /* ! 98: * security: if the user does not own his own .klogin file, ! 99: * do not grant access ! 100: */ ! 101: if (fstat(fileno(fp), &sbuf)) { ! 102: fclose(fp); ! 103: return(NOTOK); ! 104: } ! 105: if (sbuf.st_uid != pwd->pw_uid) { ! 106: fclose(fp); ! 107: return(NOTOK); ! 108: } ! 109: ! 110: /* check each line */ ! 111: while ((isok != OK) && (fgets(linebuf, BUFSIZ, fp) != NULL)) { ! 112: /* null-terminate the input string */ ! 113: linebuf[BUFSIZ-1] = '\0'; ! 114: newline = NULL; ! 115: /* nuke the newline if it exists */ ! 116: if (newline = index(linebuf, '\n')) ! 117: *newline = '\0'; ! 118: rc = kname_parse(principal, inst, realm, linebuf); ! 119: if (rc == KSUCCESS) { ! 120: isok = (strncmp(kdata->pname, principal, ANAME_SZ) || ! 121: strncmp(kdata->pinst, inst, INST_SZ) || ! 122: strncasecmp(kdata->prealm, realm, REALM_SZ)); ! 123: } ! 124: /* clean up the rest of the line if necessary */ ! 125: if (!newline) ! 126: while (((gobble = getc(fp)) != EOF) && gobble != '\n'); ! 127: } ! 128: fclose(fp); ! 129: return(isok); ! 130: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.