|
|
1.1 ! root 1: #include "parms.h" ! 2: #include "structs.h" ! 3: ! 4: #ifdef RCSIDENT ! 5: static char rcsid[] = "$Header: perms.c,v 1.7.0.1 85/04/09 11:42:48 notes Rel $"; ! 6: #endif RCSIDENT ! 7: ! 8: /* ! 9: * getperms - opens and reads the permission file to ! 10: * determine the access rights for this user ! 11: * ! 12: * Uses a struture similar to PLATO's. A list is scanned ! 13: * until a match is found. The access rights at that point ! 14: * are then awarded to the user. In the event that no ! 15: * match is found, no access rights are granted. ! 16: * ! 17: * Original Coding: Ray Essick December 1981 ! 18: */ ! 19: #include <grp.h> ! 20: #include <sys/param.h> /* for groups */ ! 21: /* ! 22: * Make sure that the name NGROUPS is defined. ! 23: * pre-4.1a probably doesn't define either. ! 24: * 4.1a uses the NGRPS constant ! 25: * 4.2 uses the NGROUPS constant ! 26: * We make sure that NGROUPS is defined and use that in the ! 27: * generic portion of the routine. The emulation for V7, 4.1, 4.1a ! 28: * and such use the NGRPS or whatever is appropriate. ! 29: */ ! 30: #if defined(NGRPS) && ! defined(NGROUPS) ! 31: #define NGROUPS NGRPS /* name change! */ ! 32: #endif ! 33: #ifndef NGROUPS ! 34: #define NGROUPS 1 /* could be better */ ! 35: #endif NGROUPS ! 36: ! 37: static char *gnameptr[NGROUPS]; /* point to names */ ! 38: static int ngroups = 0; /* true if have gids */ ! 39: ! 40: getperms (io, sysflag, name) ! 41: struct io_f *io; ! 42: int sysflag; /* true for remote system */ ! 43: char *name; ! 44: { ! 45: ! 46: register int i; ! 47: FILE * acs, *fopen (); ! 48: struct group *gr, ! 49: *getgrgid (); ! 50: char fn[WDLEN]; ! 51: struct perm_f entry; ! 52: int hisperms; /* built up perms */ ! 53: int given; /* if assigned perms */ ! 54: ! 55: if (sysflag == 0 && globuid == Notesuid) /* "notes" omnipotent */ ! 56: { ! 57: io -> access = READOK + RESPOK + WRITOK + DRCTOK;/* all */ ! 58: /* ! 59: * should I just set it to -1 or something that turns on ! 60: * all the bits? or leave it with the defined bits only? ! 61: */ ! 62: return; ! 63: } ! 64: ! 65: if (sysflag == 0 && ngroups == 0) ! 66: { ! 67: register int i, ! 68: j; /* temp loop stuff */ ! 69: int gidset[NGROUPS]; /* hold gid list */ ! 70: ! 71: ngroups = NGROUPS; /* max allowed */ ! 72: /* ! 73: * NOTE that the getgroups system call doesn't behave as ! 74: * documented in the 4.2 manual. The manual says to call it ! 75: * ret=getgroups(&ngroups,&gidset) where ngroups is value-result. ! 76: * and ret is 0 on success. Actual implementation works as below. ! 77: */ ! 78: if ((ngroups = getgroups (ngroups, &gidset)) >= 0)/* worked */ ! 79: { ! 80: for (i = 0, j = 0; i < ngroups; i++) /* get names */ ! 81: { ! 82: if ((gr = getgrgid (gidset[i])) == NULL) ! 83: continue; /* bogus, skip it */ ! 84: gnameptr[j++] = strsave (gr -> gr_name);/* save it */ ! 85: } ! 86: ngroups = j; /* save count */ ! 87: } ! 88: } ! 89: io -> access = 0; /* default null */ ! 90: hisperms = 0; /* set up mask */ ! 91: given = 0; ! 92: ! 93: sprintf (fn, "%s/%s/%s", io -> basedir, io -> nf, ACCESS); ! 94: x ((acs = fopen (fn, "r")) == NULL, "getperms: no list"); ! 95: while (fread (&entry, sizeof entry, 1, acs) == 1) ! 96: { ! 97: if ((sysflag != 0) && (entry.ptype != PERMSYSTEM)) ! 98: continue; /* looking for systems */ ! 99: if ((sysflag == 0) && (entry.ptype == PERMSYSTEM)) ! 100: continue; /* users != systems */ ! 101: ! 102: if (strcmp (entry.name, "Other") == 0) ! 103: { ! 104: if (!given) /* he hasn't matched */ ! 105: hisperms = entry.perms; /* give him these */ ! 106: goto gotit; /* and exit ... */ ! 107: } ! 108: switch (entry.ptype) ! 109: { ! 110: case PERMUSER: ! 111: if (strcmp (name, entry.name) == 0) ! 112: { ! 113: hisperms = entry.perms; ! 114: goto gotit; ! 115: } ! 116: break; ! 117: ! 118: case PERMGROUP: /* a group entry */ ! 119: for (i = 0; i < ngroups; i++) /* check all */ ! 120: if (strcmp (entry.name, gnameptr[i]) == 0) ! 121: { ! 122: hisperms |= entry.perms; /* OR them in */ ! 123: given++; /* mark as such */ ! 124: break; ! 125: } ! 126: break; ! 127: ! 128: case PERMSYSTEM: ! 129: if (strcmp (name, entry.name) == 0) ! 130: { ! 131: hisperms = entry.perms; ! 132: given++; ! 133: goto gotit; ! 134: } ! 135: break; ! 136: ! 137: default: /* bad access list */ ! 138: x (1, "getperms: bad list"); ! 139: } ! 140: } ! 141: gotit: ! 142: fclose (acs); /* close the access file */ ! 143: io -> access = hisperms; /* what we built */ ! 144: ! 145: return; ! 146: } ! 147: ! 148: /* ! 149: * Some compatibility routines to let us use the fancy 4.2 Bsd ! 150: * getgroups() system call while running 4.1, 4.1a or V7 kernels. ! 151: * I've undoubtedly missed some kernels. ! 152: */ ! 153: ! 154: ! 155: /* ! 156: * getgroups ! 157: * ! 158: * Returns an integer and a set of groups. ! 159: * Emulates the 4.2 getgroups command under 4.1a Bsd ! 160: * ! 161: * Stolen mostly from the 4.1a command "groups". ! 162: * ! 163: * Ray Essick, January 1984 ! 164: * ! 165: */ ! 166: ! 167: #if defined (BSD41A) ! 168: ! 169: getgroups (ngroups, gidset) ! 170: int ngroups; ! 171: int *gidset; ! 172: { ! 173: register int i; ! 174: register int maxback; /* most to user */ ! 175: int grps[NGRPS / (sizeof (int) * 8)]; /* NGRPS=NGROUPS */ ! 176: ! 177: setgrp (0, grps); /* get groups */ ! 178: maxback = ngroups; /* save limit */ ! 179: ngroups = 0; /* start empty */ ! 180: for (i = 0; i < NGRPS && ngroups < maxback; i++) /* for each */ ! 181: if (grps[i / (sizeof (int) * 8)] & (1 << (i % (sizeof (int) * 8)))) ! 182: { ! 183: *gidset++ = i; /* save the group */ ! 184: ngroups++; /* and count */ ! 185: } ! 186: return (ngroups); ! 187: } ! 188: #endif defined (BSD41A) ! 189: ! 190: /* ! 191: * The V7 and 4.1 version of this system call. Also serves well ! 192: * for the 2.8 Bsd kernels and probably for the more recent BTL ! 193: * kernels. ! 194: * This could be extended to read from /etc/groups to actually give ! 195: * the user all groups he is permitted. ! 196: */ ! 197: ! 198: #if defined (V7) || defined (BSD41) || defined (BSD2x) || defined (USG) ! 199: getgroups (ngroups, gidset) /* simple V7 one */ ! 200: int ngroups; ! 201: int *gidset; ! 202: { ! 203: *gidset = getgid () & GIDMASK; ! 204: ngroups = 1; ! 205: return (1); ! 206: } ! 207: #endif defined (V7) || defined (BSD41) || defined (BSD2x) || defined(USG)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.