|
|
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.