|
|
1.1 ! root 1: #include "parms.h" ! 2: #include "structs.h" ! 3: ! 4: #ifdef RCSIDENT ! 5: static char rcsid[] = "$Header: access.c,v 1.7 85/01/18 15:00:31 notes Rel $"; ! 6: #endif RCSIDENT ! 7: ! 8: /* ! 9: * access - process access list editing ! 10: * ! 11: * functions include: ! 12: * (1) display access lists ! 13: * (2) insert new entries ! 14: * (3) delete old entries ! 15: * (4) modify existing entries ! 16: * ! 17: * Original Coding: Ray Essick January 1982 ! 18: */ ! 19: #include <pwd.h> ! 20: #include <grp.h> /* /etc/passwd and /etc/group formats */ ! 21: ! 22: char *kmap[] = /* mapping for name types */ ! 23: { ! 24: "usr:", "grp:", "sys:" ! 25: }; ! 26: char *map[] = ! 27: { ! 28: /* ----- */ "Null", ! 29: /* ----r */ "Read Only", ! 30: /* ---w- */ "(02)", ! 31: /* ---wr */ "(03)", ! 32: /* --d-- */ "(04)", /* nonsense */ ! 33: /* --d-r */ "(05)", /* nonsense */ ! 34: /* --dw- */ "(06)", /* nonsense */ ! 35: /* --dwr */ "(07)", ! 36: /* -a--- */ "Answer Only", /* nonsense */ ! 37: /* -a--r */ "Read/Answer", ! 38: /* -a-w- */ "Write only", ! 39: /* -a-wr */ "Read/Write", ! 40: /* -ad-- */ "(014)", /* nonsense */ ! 41: /* -ad-r */ "(015)", /* nonsense */ ! 42: /* -adw- */ "(016)", /* nonsense */ ! 43: /* -adwr */ "Director/R/W" ! 44: }; ! 45: ! 46: struct perm_f entry; ! 47: static int length; /* max on screen */ ! 48: ! 49: accessedit (io) ! 50: struct io_f *io; /* notefile working with */ ! 51: { ! 52: struct passwd *getpwnam (); ! 53: struct group *getgrnam (); /* check validity of name/group */ ! 54: FILE * acs, *fopen (); /* stream I/O */ ! 55: char fn[WDLEN]; ! 56: struct auth_f me; /* for detecting suicidals */ ! 57: struct perm_f alist[NPERMS]; /* hold the access list */ ! 58: ! 59: int items, ! 60: base, ! 61: i, ! 62: which, ! 63: changed; ! 64: char c; ! 65: short ptype; ! 66: char zname[NAMESZ + 1]; /* hold new user */ ! 67: ! 68: ! 69: sprintf (fn, "%s/%s/%s", io -> basedir, io -> nf, ACCESS);/* file name */ ! 70: x ((acs = fopen (fn, "r")) == NULL, "access: no access file"); ! 71: x ((items = fread (alist, sizeof entry, NPERMS, acs)) == 0, "access: empty file"); ! 72: fclose (acs); /* and close the file */ ! 73: changed = 0; /* no changes made to the list yet */ ! 74: length = nrows - 6; /* max to show */ ! 75: base = 0; /* which part are we displaying */ ! 76: erase (); ! 77: plotit (alist, base, items); ! 78: while (1) ! 79: { ! 80: at (-1, 1); ! 81: printf ("Option: "); ! 82: c = gchar (); /* grab command */ ! 83: printf ("\b \b"); /* overwrite */ ! 84: switch (c) ! 85: { ! 86: case '?': ! 87: case 'h': ! 88: help (ACCHLP); /* print the help page */ ! 89: goto redraw; /* replot the screen */ ! 90: ! 91: case '!': /* fork a shell for him */ ! 92: gshell (); ! 93: goto redraw; ! 94: ! 95: #ifdef K_KEY ! 96: case 'K': /* same as Q */ ! 97: #endif K_KEY ! 98: case 'Q': ! 99: return 0; /* return to the caller */ ! 100: ! 101: case '\004': /* abort notefiles */ ! 102: return QUITFAST; ! 103: ! 104: #ifdef K_KEY ! 105: case 'k': /* same as q */ ! 106: #endif K_KEY ! 107: case 'q': /* update lists (if changed) and leave) */ ! 108: if (changed) ! 109: { ! 110: acssort (alist, items); /* order them */ ! 111: x ((acs = fopen (fn, "w")) == NULL, "access: reopen"); ! 112: x (fwrite (alist, sizeof entry, items, acs) != items, "access:update write"); ! 113: fclose (acs); /* and close the file */ ! 114: } ! 115: return 0; ! 116: ! 117: case '-': /* scroll display backwards */ ! 118: base -= length / 2 - 1; /* back a half sreen */ ! 119: if (base < 0) ! 120: base = 0; /* don't pass zero */ ! 121: goto redraw; ! 122: ! 123: case '+': /* scroll display forwards */ ! 124: base += length / 2 - 1; /* up half screen */ ! 125: if (base >= items - (length / 2)) /* try to keep full */ ! 126: { ! 127: base = items - (length - 3); /* don't over-run */ ! 128: /* ! 129: * Gotta subtract 3: one for OBOE and two for the "-more-" message ! 130: * that might be there. ! 131: */ ! 132: if (base < 0) ! 133: base = 0; /* careful */ ! 134: } ! 135: goto redraw; ! 136: ! 137: case 's': /* sort and replot the list */ ! 138: acssort (alist, items); /* do the sort */ ! 139: /* and fall through to ... */ ! 140: break; ! 141: ! 142: case 'r': /* replot the lists */ ! 143: case '\014': /* everyone else uses ^L, might as well */ ! 144: redraw: ! 145: erase (); ! 146: plotit (alist, base, items); ! 147: break; /* back to command sucker */ ! 148: ! 149: case 'i': /* enter a bunch of permissions */ ! 150: while (items < NPERMS) /* not if all full */ ! 151: { ! 152: reget: at (-4, 40); ! 153: printf ("Entry type: \b"); ! 154: if ((c = gchar ()) == '\n' || c == 'q' || c == 'k') ! 155: break; /* get out */ ! 156: switch (c) ! 157: { ! 158: case 'u': ! 159: ptype = PERMUSER; ! 160: break; ! 161: case 'g': ! 162: ptype = PERMGROUP; ! 163: break; ! 164: case 's': ! 165: ptype = PERMSYSTEM; ! 166: break; ! 167: default: ! 168: printf ("\07 (u,g,s, q,k,<cr>)"); ! 169: goto reget; ! 170: } ! 171: at (-3, 40); ! 172: printf ("Name: \b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); ! 173: if (gline (zname, NAMESZ) == 1) ! 174: continue; /* null name */ ! 175: if (ptype == PERMUSER && strcmp ("Other", zname) != 0) ! 176: { ! 177: if (getpwnam (zname) == NULL) ! 178: { ! 179: at (-2, 40); ! 180: printf ("--No such user--"); ! 181: continue; ! 182: } ! 183: } ! 184: if (ptype == PERMGROUP && strcmp ("Other", zname) != 0) ! 185: { ! 186: if (getgrnam (zname) == NULL) ! 187: { ! 188: at (-2, 40); ! 189: printf ("--No such group--"); ! 190: continue; ! 191: } ! 192: } ! 193: /* ! 194: * make sure that it isn't already there. ! 195: */ ! 196: ! 197: for (i = 0; i < items; i++) ! 198: if (alist[i].ptype == ptype && strcmp (alist[i].name, zname) == 0) ! 199: { ! 200: at (-2, 40); ! 201: printf ("%s entry exists", zname); ! 202: goto reget; ! 203: } ! 204: ! 205: alist[items].perms = DFLTPERMS; /* give him default */ ! 206: getmode (&alist[items].perms); ! 207: alist[items].ptype = ptype; ! 208: strmove (zname, alist[items].name); /* copy things over */ ! 209: items++; ! 210: changed = 1; /* and set flags */ ! 211: acssort (alist, items); ! 212: erase (); /* clean screen */ ! 213: plotit (alist, base, items); /* show new list */ ! 214: } ! 215: endpwent (); ! 216: endgrent (); /* close passwd and group files */ ! 217: break; ! 218: ! 219: ! 220: case 'd': /* delete some permissions */ ! 221: at (-1, 1); ! 222: printf ("Delete entry #: "); ! 223: if ((c = gchar ()) == '\n') ! 224: break; /* null */ ! 225: printf ("\b"); ! 226: which = getnum (c); /* grab number */ ! 227: if (which <= 0) ! 228: break; /* don't update */ ! 229: if (which > items || c < '0' || c > '9') ! 230: { ! 231: printf ("Bad entry"); ! 232: break; ! 233: } ! 234: which--; /* adjust to zero base */ ! 235: getname (&me, 0); /* grab my name */ ! 236: if ((alist[which].ptype = PERMUSER) && strcmp (me.aname, alist[which].name) == 0) ! 237: { ! 238: printf (" Can't Delete self"); ! 239: break; ! 240: } ! 241: items--; /* decrement count and */ ! 242: for (i = which; i < items; i++) /* tamp down list */ ! 243: { ! 244: alist[i].ptype = alist[i + 1].ptype; ! 245: strmove (alist[i + 1].name, alist[i].name); ! 246: alist[i].perms = alist[i + 1].perms; ! 247: } ! 248: changed = 1; /* mark it as changed */ ! 249: goto redraw; /* show updated screen */ ! 250: ! 251: case 'm': /* modify someones permission */ ! 252: at (-1, 1); /* grab which slot */ ! 253: printf ("Modify entry #: "); ! 254: if ((c = gchar ()) == '\n') ! 255: break; /* null entry */ ! 256: printf ("\b"); ! 257: which = getnum (c); ! 258: if (which <= 0) ! 259: break; ! 260: if (which > items || c < '0' || c > '9')/* check its validity */ ! 261: { ! 262: at (-2, 1); ! 263: printf ("Bad entry"); ! 264: break; ! 265: } ! 266: which--; /* adjust to zero base */ ! 267: getmode (&alist[which].perms); ! 268: changed = 1; /* set changed flag */ ! 269: goto redraw; /* repaint screen */ ! 270: ! 271: default: /* wrong key dummy */ ! 272: printf ("\07"); ! 273: break; ! 274: } ! 275: } ! 276: } ! 277: ! 278: /* ! 279: * Grab a set of permissions ! 280: */ ! 281: getmode (zmode) ! 282: short *zmode; ! 283: { /* grab a mode from the tty */ ! 284: char c; ! 285: short mode; /* resulting mode */ ! 286: ! 287: mode = *zmode; /* set to what passed in */ ! 288: ! 289: while (1) ! 290: { ! 291: at (-2, 40); ! 292: printf ("%*s", 25, " "); ! 293: at (-2, 40); ! 294: printf (" Mode: %s", map[mode]); ! 295: at (-1, 40); ! 296: printf ("Mods: "); ! 297: c = gchar (); ! 298: switch (c) ! 299: { ! 300: case 'a': /* toggle answer */ ! 301: if (mode & WRITOK) ! 302: break; /* write supersedese */ ! 303: if (mode & RESPOK) ! 304: mode &= NOT RESPOK; ! 305: else ! 306: mode |= RESPOK; ! 307: break; ! 308: ! 309: case 'r': /* toggle read */ ! 310: if (mode & DRCTOK) ! 311: break; /* director supersedes */ ! 312: if (mode & READOK) ! 313: mode &= NOT READOK; ! 314: else ! 315: mode |= READOK; ! 316: break; ! 317: ! 318: case 'w': /* toggle write */ ! 319: if (mode & DRCTOK) ! 320: break; /* director supersedes */ ! 321: if (mode & WRITOK) ! 322: mode &= NOT WRITOK; ! 323: else ! 324: mode |= WRITOK + RESPOK; ! 325: break; ! 326: ! 327: case 'd': /* toggle director */ ! 328: if (mode & DRCTOK) ! 329: mode &= NOT DRCTOK; ! 330: else ! 331: mode |= DRCTOK + READOK + WRITOK + RESPOK; ! 332: break; ! 333: ! 334: case 'n': /* set to null */ ! 335: mode = 0; ! 336: break; ! 337: ! 338: case '\n': /* acceptable to him */ ! 339: #ifdef K_KEY ! 340: case 'k': /* same as q */ ! 341: case 'K': ! 342: #endif K_KEY ! 343: case 'q': ! 344: case 'Q': ! 345: return (*zmode = mode); /* do both ways */ ! 346: ! 347: default: ! 348: printf ("\07 (d,r,w,a,n,q,k<cr>)"); ! 349: break; ! 350: } ! 351: } ! 352: } ! 353: plotit (alist, base, items) /* plot the list */ ! 354: struct perm_f alist[]; ! 355: int base; ! 356: int items; ! 357: { ! 358: register int atrow, ! 359: atcol, ! 360: i; ! 361: ! 362: atrow = 1; ! 363: atcol = 1; ! 364: if (base != 0) ! 365: { ! 366: at (atrow++, atcol); ! 367: printf (" -- More -- "); ! 368: } ! 369: for (i = base; i < items && atrow < length; i++) ! 370: { ! 371: at (atrow++, atcol); ! 372: printf ("%2d %s%-*s %s", i + 1, kmap[alist[i].ptype], NAMESZ, ! 373: alist[i].name, map[alist[i].perms]); ! 374: } ! 375: if (i < items) /* tell him more */ ! 376: { ! 377: at (atrow++, atcol); ! 378: printf (" -- More -- "); ! 379: } ! 380: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.