|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include <tree.h> ! 3: # include <aux.h> ! 4: # include <catalog.h> ! 5: # include <symbol.h> ! 6: # include <sccs.h> ! 7: ! 8: SCCSID(@(#)pr_prot.c 8.3 2/8/85) ! 9: ! 10: /* ! 11: ** PR_PROT.C -- Print out a protection query ! 12: ** ! 13: ** Trace Flags: ! 14: ** 51 ! 15: */ ! 16: ! 17: ! 18: ! 19: ! 20: ! 21: ! 22: extern QTREE *gettree(); /* gets a tree from "tree" catalog [readtree.c] */ ! 23: ! 24: char *Days [] = ! 25: { ! 26: "sunday", ! 27: "monday", ! 28: "tuesday", ! 29: "wednesday", ! 30: "thursday", ! 31: "friday", ! 32: "saturday", ! 33: }; ! 34: ! 35: struct rngtab ! 36: { ! 37: char relid [MAXNAME]; ! 38: char rowner [2]; ! 39: char rused; ! 40: }; ! 41: ! 42: ! 43: ! 44: ! 45: /* ! 46: ** PR_PROT -- print out protection info on a relation ! 47: ** ! 48: ** Prints out a "define permit" statement for ! 49: ** each permission on a relation. ! 50: ** First calls pr_spec_permit() to print permissions ! 51: ** indicated in the relation.relstat bits. Lower level pr_?? ! 52: ** routines look for these bits, so in the calls to pr_permit ! 53: ** for tuples actually gotten from the "protect" catalog, ! 54: ** pr_prot sets the relstat bits, thereby suppressing their special ! 55: ** meaning (they are inverse bits: 0 means on). ! 56: ** ! 57: ** Parameters: ! 58: ** relid -- non-unique relation name used by user in DBU call ! 59: ** r -- ptr to relation tuple ! 60: ** ! 61: ** Returns: ! 62: ** 0 -- some permissions on rel ! 63: ** 1 -- no permissions on rel ! 64: ** ! 65: ** Side Effects: ! 66: ** reads trees from protection catalog ! 67: ** ! 68: ** Trace Flags: ! 69: ** 39, 0 ! 70: */ ! 71: ! 72: pr_prot(relid, r) ! 73: char *relid; ! 74: register struct relation *r; ! 75: { ! 76: extern DESC Prodes; ! 77: TID hitid, lotid; ! 78: struct protect key, tuple; ! 79: register int i; ! 80: int flag; /* indicates whether a special case occurred */ ! 81: ! 82: # ifdef xZTR1 ! 83: if (tTf(51, 0)) ! 84: printf("pr_prot: relation \"%s\" owner \"%s\"relstat 0%o\n", ! 85: r->relid, r->relowner, r->relstat); ! 86: # endif ! 87: ! 88: flag = 0; ! 89: if (r->relstat & S_PROTUPS || !(r->relstat & S_PROTALL) ! 90: || !(r->relstat & S_PROTRET)) ! 91: printf("Permissions on %s are:\n\n", relid); ! 92: /* print out special permissions, if any */ ! 93: flag += pr_spec_permit(r, S_PROTALL); ! 94: flag += pr_spec_permit(r, S_PROTRET); ! 95: ! 96: if (!(r->relstat & S_PROTUPS)) ! 97: if (flag) ! 98: return (0); ! 99: else ! 100: return (1); ! 101: opencatalog("protect", OR_READ); ! 102: ! 103: /* get protect catalog tuples for "r", "owner" */ ! 104: clearkeys(&Prodes); ! 105: setkey(&Prodes, &key, r->relid, PRORELID); ! 106: setkey(&Prodes, &key, r->relowner, PRORELOWN); ! 107: if (i = find(&Prodes, EXACTKEY, &lotid, &hitid, &key)) ! 108: syserr("pr_prot: find %d", i); ! 109: /* ready for pr_user call to getuser() */ ! 110: getuser(-1); ! 111: for ( ; ; ) ! 112: { ! 113: if (i = get(&Prodes, &lotid, &hitid, &tuple, TRUE)) ! 114: break; ! 115: /* print out protection info */ ! 116: if (kcompare(&Prodes, &tuple, &key) == 0) ! 117: /* permission from real protect tuple, concoct ! 118: * neutral relstat ! 119: */ ! 120: pr_permit(&tuple, r->relstat | S_PROTALL | S_PROTRET); ! 121: } ! 122: if (i != 1) ! 123: syserr("pr_prot: get %d", i); ! 124: ! 125: /* close user file opened by pr_user call to getuser */ ! 126: getuser(0); ! 127: } ! 128: /* ! 129: ** PR_SPEC_PERMIT -- Print out special permissions ! 130: ** Prints out permissios indicated by the relation.relstat field bits. ! 131: ** Concocts a protection tuple for the permission and assigns a ! 132: ** propermid-like number to it for printing. Passes to pr_permit() ! 133: ** the concocted tuple, together with a relstat where the appropriate ! 134: ** bit is 0, so that the special printing at the lower level pr_??? ! 135: ** routines takes place. ! 136: ** ! 137: ** Parameters: ! 138: ** r -- relation relation tuple for the permitted relation ! 139: ** relst_bit -- if this bit is 0 inthe relstat, prints the query ! 140: ** {S_PROTALL, S_PROTRET} ! 141: ** ! 142: ** Returns: ! 143: ** 1 -- if prints ! 144: ** 0 -- otherwise ! 145: */ ! 146: ! 147: ! 148: pr_spec_permit(r, relst_bit) ! 149: register struct relation *r; ! 150: int relst_bit; ! 151: { ! 152: register struct protect *p; ! 153: struct protect prot; ! 154: ! 155: if (r->relstat & relst_bit) ! 156: return (0); ! 157: p = &prot; ! 158: clrmem(p, sizeof *p); ! 159: p->protree = -1; ! 160: if (relst_bit == S_PROTALL) ! 161: p->propermid = 0; ! 162: else if (relst_bit == S_PROTRET) ! 163: p->propermid = 1; ! 164: else ! 165: syserr("pr_spec_permit(relst_bit == 0%o)", relst_bit); ! 166: ! 167: bmove(r->relid, p->prorelid, MAXNAME); ! 168: bmove(" ", p->prouser, 2); ! 169: pmove("", p->proterm, sizeof p->proterm, ' '); ! 170: pr_permit(p, (r->relstat | S_PROTRET | S_PROTALL) & ~relst_bit); ! 171: return (1); ! 172: } ! 173: /* ! 174: ** PR_PERMIT -- print out a DEFINE PERMIT query for a protection tuple ! 175: ** ! 176: ** Parameters: ! 177: ** p -- ptr to protection tuple ! 178: ** relstat -- relstat from relation ! 179: ** ! 180: ** Returns: ! 181: ** none ! 182: ** ! 183: ** Side Effects: ! 184: ** reads in a tree from the "tree" catalog ! 185: ** prints out a query ! 186: */ ! 187: ! 188: ! 189: pr_permit(p, relstat) ! 190: register struct protect *p; ! 191: int relstat; ! 192: { ! 193: register QTREE *t; ! 194: extern DESC Prodes; ! 195: DESC pdesc; ! 196: ! 197: /* ! 198: * if there is a qualification then ! 199: * clear range table, then read in protect tree, ! 200: * the print out range statements ! 201: * else create single entry range table. ! 202: */ ! 203: clrrange(); ! 204: if (p->protree >= 0) ! 205: { ! 206: t = gettree(p->prorelid, p->prorelown, mdPROT, p->protree, TRUE); ! 207: } ! 208: else ! 209: { ! 210: t = 0; ! 211: bmove(p->prorelid, pdesc.reldum.relid, MAXNAME); ! 212: bmove(p->prorelown, pdesc.reldum.relowner, 2); ! 213: declare(0, &pdesc); ! 214: p->proresvar = 0; ! 215: } ! 216: printf("Permission %d -\n\n", p->propermid); ! 217: pr_range(); ! 218: ! 219: # ifdef xZTR1 ! 220: if (tTf(51, 1)) ! 221: { ! 222: printf("pr_permit: prot="); ! 223: printup(&Prodes, p); ! 224: printf(", Qt.qt_resvar=%d\n", Qt.qt_resvar); ! 225: } ! 226: # endif ! 227: ! 228: /* print out query */ ! 229: printf("define permit "); ! 230: pr_ops(p->proopset, relstat); ! 231: printf("on "); ! 232: pr_rv(Qt.qt_resvar = p->proresvar); ! 233: putchar(' '); ! 234: pr_doms(p->prodomset, relstat); ! 235: printf("\n\t"); ! 236: pr_user(p->prouser); ! 237: pr_term(p->proterm); ! 238: if ((relstat & S_PROTRET) && (relstat & S_PROTALL)) ! 239: { ! 240: /* not special case */ ! 241: pr_time(p->protodbgn, p->protodend); ! 242: pr_day(p->prodowbgn, p->prodowend); ! 243: } ! 244: if (t && t->right->sym.type != QLEND) ! 245: { ! 246: printf("\nwhere "); ! 247: pr_qual(t->right); ! 248: } ! 249: printf("\n\n\n"); ! 250: ! 251: /* clear up the old range table */ ! 252: clrrange(); ! 253: } ! 254: /* ! 255: ** PR_OPS -- Prints the the operation list defined by a protection opset ! 256: ** ! 257: ** Eliminates the appropriate bits from a copy of the opset while printing ! 258: ** out the appropriate operation list. ! 259: ** ! 260: ** Parameters: ! 261: ** opset -- protection.opset for the relation ! 262: ** relstat ! 263: ** ! 264: ** Returns: ! 265: ** none ! 266: ** ! 267: ** Side Effects: ! 268: ** printing of permitted op list ! 269: */ ! 270: ! 271: pr_ops(opset, relstat) ! 272: int opset; ! 273: int relstat; ! 274: { ! 275: register int op, j; ! 276: ! 277: # ifdef xZTR1 ! 278: if (tTf(51, 2)) ! 279: printf("pr_ops(0%o)\n", opset); ! 280: # endif ! 281: ! 282: if (!(relstat & S_PROTALL) || opset == -1) ! 283: { ! 284: printf("all "); ! 285: return; ! 286: } ! 287: if (!(relstat & S_PROTRET)) ! 288: { ! 289: printf("retrieve "); ! 290: return; ! 291: } ! 292: ! 293: op = (opset & ~PRO_AGGR & ~PRO_TEST) & 077; ! 294: for ( ; ; ) ! 295: { ! 296: if (op & (j = PRO_RETR)) ! 297: printf("retrieve"); ! 298: else if (op & (j = PRO_REPL)) ! 299: printf("replace"); ! 300: else if (op & (j = PRO_DEL)) ! 301: printf("delete"); ! 302: else if (op & (j = PRO_APP)) ! 303: printf("append"); ! 304: op ^= j; ! 305: if (op) ! 306: printf(", "); ! 307: else ! 308: break; ! 309: } ! 310: putchar(' '); ! 311: } ! 312: /* ! 313: ** PR_DOMS -- Print domains in permit target list ! 314: ** ! 315: ** Parameters: ! 316: ** doms -- an 8 byte integer array; a bit map of the domains ! 317: ** if all 8 integers are -1, then "all" is printed fo ! 318: ** for the target list ! 319: ** relstat ! 320: ** ! 321: ** Returns: ! 322: ** none ! 323: ** ! 324: ** Side Effects: ! 325: ** prints out target list ! 326: */ ! 327: ! 328: pr_doms(doms, relstat) ! 329: short doms[BITMAP_SZ]; ! 330: int relstat; ! 331: { ! 332: register short *d; ! 333: register int flag, shift; ! 334: int word; ! 335: char *rel; ! 336: ! 337: word = shift = 0; ! 338: d = doms; ! 339: rel = Qt.qt_rangev[Qt.qt_resvar].rngvdesc->reldum.relid; ! 340: ! 341: # ifdef xZTR1 ! 342: if (tTf(51, 3)) ! 343: { ! 344: printf("pr_doms: rel=\"%s\" ", rel); ! 345: for (word = 0; word < BITMAP_SZ; ) ! 346: printf("0%o ", d [word++]); ! 347: word = 0; ! 348: putchar('\n'); ! 349: } ! 350: # endif ! 351: if (!(relstat & S_PROTALL) || !(relstat & S_PROTRET)) ! 352: return; ! 353: flag = 1; ! 354: for (word = 0; word < BITMAP_SZ; word++) ! 355: if (*d++ != -1) ! 356: { ! 357: flag = 0; ! 358: break; ! 359: } ! 360: ! 361: if (!flag) ! 362: { ! 363: putchar('('); ! 364: for (d = doms, word = 0; word < BITMAP_SZ; word++, d++) ! 365: { ! 366: for (shift = 0; shift < NUMSHIFTS; shift++, *d >>= 1) ! 367: { ! 368: if (*d & 01) ! 369: { ! 370: if (flag++) ! 371: printf(", "); ! 372: pr_attname(rel, word * NUMSHIFTS + shift); ! 373: } ! 374: } ! 375: } ! 376: putchar(')'); ! 377: } ! 378: } ! 379: /* ! 380: ** PR_USER -- prints out permitted user's name ! 381: ** ! 382: ** Parameters: ! 383: ** user -- 2 char array, user's usercode as in ! 384: ** users file ! 385: ** ! 386: ** Returns: ! 387: ** none ! 388: ** ! 389: ** Side Effects: ! 390: ** prints users name or "all" if user was " " ! 391: */ ! 392: ! 393: pr_user(user) ! 394: char user[2]; ! 395: { ! 396: register i; ! 397: char buf[MAXLINE]; ! 398: register char *c, *u; ! 399: ! 400: # ifdef xZTR1 ! 401: if (tTf(51, 4)) ! 402: printf("pr_user(\"%c%c\")\n", user[0], user[1]); ! 403: # endif ! 404: ! 405: c = buf; ! 406: u = user; ! 407: printf("to "); ! 408: if (bequal(u, " ", 2)) ! 409: printf("all "); ! 410: else ! 411: { ! 412: if (getuser(u, c)) ! 413: { ! 414: printf("%c%c ", u[0], u[1]); ! 415: return; ! 416: } ! 417: while (*c != ':' && *c != '\n') ! 418: putchar(*c++); ! 419: putchar(' '); ! 420: } ! 421: } ! 422: /* ! 423: ** PR_TIME -- Prints out clock time range access is allowed ! 424: ** ! 425: ** Parameters: ! 426: ** bgn, end -- begin end times in seconds (if all day, returns) ! 427: ** ! 428: ** Returns: ! 429: ** none ! 430: ** ! 431: ** Side Effects: ! 432: ** prints out time ! 433: */ ! 434: ! 435: pr_time(bgn, end) ! 436: int bgn, end; ! 437: { ! 438: char time [3]; ! 439: register char *t; ! 440: register int b, e; ! 441: ! 442: t = time; ! 443: b = bgn; ! 444: e = end; ! 445: # ifdef xZTR1 ! 446: if (tTf(51, 5)) ! 447: printf("pr_time(bgn=%d, end=%d)\n", b, e); ! 448: # endif ! 449: if (b == 0 && e == 24 * 60) ! 450: return; ! 451: printf("from %d:", b / 60); ! 452: itoa(b % 60, t); ! 453: if (!t [1]) ! 454: putchar('0'); ! 455: printf("%s to %d:", t, e / 60); ! 456: itoa(e % 60, t); ! 457: if (!t [1]) ! 458: putchar('0'); ! 459: printf("%s ", t); ! 460: } ! 461: /* ! 462: ** PR_DAY -- Prints day range permitted ! 463: ** ! 464: ** Parameters: ! 465: ** bgn, end -- bgn end days [0..6] (if all week returns) ! 466: ** ! 467: ** Returns: ! 468: ** none ! 469: ** ! 470: ** Side Effects: ! 471: ** prints days or nothing ! 472: */ ! 473: ! 474: pr_day(bgn, end) ! 475: int bgn, end; ! 476: { ! 477: # ifdef xZTR1 ! 478: if (tTf(51, 6)) ! 479: printf("pr_day(bgn=%d, end=%d)\n", bgn, end); ! 480: # endif ! 481: if (bgn == 0 && end >= 6) ! 482: return; ! 483: printf("on %s to %s ", Days [bgn], Days [end]); ! 484: } ! 485: /* ! 486: ** PR_TERM -- Print terminal from which access permitted ! 487: ** ! 488: ** Parameters: ! 489: ** term -- 1 char terminal id as in /etc/tty* (if ' ' the returns) ! 490: ** ! 491: ** Returns: ! 492: ** none ! 493: ** ! 494: ** Side Effects: ! 495: ** prints terminal or nothing ! 496: */ ! 497: ! 498: pr_term(term) ! 499: char term[8]; ! 500: { ! 501: # ifdef xZTR1 ! 502: if (tTf(51, 7)) ! 503: printf("pr_term(term='%.8s')\n", term); ! 504: # endif ! 505: ! 506: if (term[0] != ' ') ! 507: printf("at %8.8s ", term); ! 508: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.