|
|
1.1 root 1: /*
2: * $Source: /usr/src/kerberosIV/klist/RCS/klist.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: * Lists your current Kerberos tickets.
11: * Written by Bill Sommerfeld, MIT Project Athena.
12: */
13:
14: #ifndef lint
15: static char rcsid_klist_c[] =
16: "$Header: /usr/src/kerberosIV/klist/RCS/klist.c,v 4.16 90/06/25 21:01:52 kfall Exp $";
17: #endif lint
18:
19: #include <mit-copyright.h>
20: #include <stdio.h>
21: #include <strings.h>
22: #include <sys/file.h>
23: #include <des.h>
24: #include <krb.h>
25: #include <prot.h>
26:
27: char *tkt_string();
28: char *short_date();
29: char *whoami; /* What was I invoked as?? */
30: char *getenv();
31:
32: extern char *krb_err_txt[];
33:
34: /* ARGSUSED */
35: main(argc, argv)
36: int argc;
37: char **argv;
38: {
39: int long_form = 1;
40: int tgt_test = 0;
41: int do_srvtab = 0;
42: char *tkt_file = NULL;
43: char *cp;
44:
45: whoami = (cp = rindex(*argv, '/')) ? cp + 1 : *argv;
46:
47: while (*(++argv)) {
48: if (!strcmp(*argv, "-s")) {
49: long_form = 0;
50: continue;
51: }
52: if (!strcmp(*argv, "-t")) {
53: tgt_test = 1;
54: long_form = 0;
55: continue;
56: }
57: if (!strcmp(*argv, "-l")) { /* now default */
58: continue;
59: }
60: if (!strcmp(*argv, "-file")) {
61: if (*(++argv)) {
62: tkt_file = *argv;
63: continue;
64: } else
65: usage();
66: }
67: if (!strcmp(*argv, "-srvtab")) {
68: if (tkt_file == NULL) /* if no other file spec'ed,
69: set file to default srvtab */
70: tkt_file = KEYFILE;
71: do_srvtab = 1;
72: continue;
73: }
74: usage();
75: }
76:
77: if (do_srvtab)
78: display_srvtab(tkt_file);
79: else
80: display_tktfile(tkt_file, tgt_test, long_form);
81: exit(0);
82: }
83:
84:
85: display_tktfile(file, tgt_test, long_form)
86: char *file;
87: int tgt_test, long_form;
88: {
89: char pname[ANAME_SZ];
90: char pinst[INST_SZ];
91: char prealm[REALM_SZ];
92: char buf1[20], buf2[20];
93: int k_errno;
94: CREDENTIALS c;
95: int header = 1;
96:
97: if ((file == NULL) && ((file = getenv("KRBTKFILE")) == NULL))
98: file = TKT_FILE;
99:
100: if (long_form)
101: printf("Ticket file: %s\n", file);
102:
103: /*
104: * Since krb_get_tf_realm will return a ticket_file error,
105: * we will call tf_init and tf_close first to filter out
106: * things like no ticket file. Otherwise, the error that
107: * the user would see would be
108: * klist: can't find realm of ticket file: No ticket file (tf_util)
109: * instead of
110: * klist: No ticket file (tf_util)
111: */
112:
113: /* Open ticket file */
114: if (k_errno = tf_init(file, R_TKT_FIL)) {
115: if (!tgt_test)
116: fprintf(stderr, "%s: %s\n", whoami, krb_err_txt[k_errno]);
117: exit(1);
118: }
119: /* Close ticket file */
120: (void) tf_close();
121:
122: /*
123: * We must find the realm of the ticket file here before calling
124: * tf_init because since the realm of the ticket file is not
125: * really stored in the principal section of the file, the
126: * routine we use must itself call tf_init and tf_close.
127: */
128: if ((k_errno = krb_get_tf_realm(file, prealm)) != KSUCCESS) {
129: if (!tgt_test)
130: fprintf(stderr, "%s: can't find realm of ticket file: %s\n",
131: whoami, krb_err_txt[k_errno]);
132: exit(1);
133: }
134:
135: /* Open ticket file */
136: if (k_errno = tf_init(file, R_TKT_FIL)) {
137: if (!tgt_test)
138: fprintf(stderr, "%s: %s\n", whoami, krb_err_txt[k_errno]);
139: exit(1);
140: }
141: /* Get principal name and instance */
142: if ((k_errno = tf_get_pname(pname)) ||
143: (k_errno = tf_get_pinst(pinst))) {
144: if (!tgt_test)
145: fprintf(stderr, "%s: %s\n", whoami, krb_err_txt[k_errno]);
146: exit(1);
147: }
148:
149: /*
150: * You may think that this is the obvious place to get the
151: * realm of the ticket file, but it can't be done here as the
152: * routine to do this must open the ticket file. This is why
153: * it was done before tf_init.
154: */
155:
156: if (!tgt_test && long_form)
157: printf("Principal:\t%s%s%s%s%s\n\n", pname,
158: (pinst[0] ? "." : ""), pinst,
159: (prealm[0] ? "@" : ""), prealm);
160: while ((k_errno = tf_get_cred(&c)) == KSUCCESS) {
161: if (!tgt_test && long_form && header) {
162: printf("%-15s %-15s %s\n",
163: " Issued", " Expires", " Principal");
164: header = 0;
165: }
166: if (tgt_test) {
167: c.issue_date += ((unsigned char) c.lifetime) * 5 * 60;
168: if (!strcmp(c.service, TICKET_GRANTING_TICKET) &&
169: !strcmp(c.instance, prealm)) {
170: if (time(0) < c.issue_date)
171: exit(0); /* tgt hasn't expired */
172: else
173: exit(1); /* has expired */
174: }
175: continue; /* not a tgt */
176: }
177: if (long_form) {
178: (void) strcpy(buf1, short_date(&c.issue_date));
179: c.issue_date += ((unsigned char) c.lifetime) * 5 * 60;
180: (void) strcpy(buf2, short_date(&c.issue_date));
181: printf("%s %s ", buf1, buf2);
182: }
183: printf("%s%s%s%s%s\n",
184: c.service, (c.instance[0] ? "." : ""), c.instance,
185: (c.realm[0] ? "@" : ""), c.realm);
186: }
187: if (tgt_test)
188: exit(1); /* no tgt found */
189: if (header && long_form && k_errno == EOF) {
190: printf("No tickets in file.\n");
191: }
192: }
193:
194: char *
195: short_date(dp)
196: long *dp;
197: {
198: register char *cp;
199: extern char *ctime();
200: cp = ctime(dp) + 4;
201: cp[15] = '\0';
202: return (cp);
203: }
204:
205: usage()
206: {
207: fprintf(stderr,
208: "Usage: %s [ -s | -t ] [ -file filename ] [ -srvtab ]\n", whoami);
209: exit(1);
210: }
211:
212: display_srvtab(file)
213: char *file;
214: {
215: int stab;
216: char serv[SNAME_SZ];
217: char inst[INST_SZ];
218: char rlm[REALM_SZ];
219: unsigned char key[8];
220: unsigned char vno;
221: int count;
222:
223: printf("Server key file: %s\n", file);
224:
225: if ((stab = open(file, O_RDONLY, 0400)) < 0) {
226: perror(file);
227: exit(1);
228: }
229: printf("%-15s %-15s %-10s %s\n","Service","Instance","Realm",
230: "Key Version");
231: printf("------------------------------------------------------\n");
232:
233: /* argh. getst doesn't return error codes, it silently fails */
234: while (((count = ok_getst(stab, serv, SNAME_SZ)) > 0)
235: && ((count = ok_getst(stab, inst, INST_SZ)) > 0)
236: && ((count = ok_getst(stab, rlm, REALM_SZ)) > 0)) {
237: if (((count = read(stab,(char *) &vno,1)) != 1) ||
238: ((count = read(stab,(char *) key,8)) != 8)) {
239: if (count < 0)
240: perror("reading from key file");
241: else
242: fprintf(stderr, "key file truncated\n");
243: exit(1);
244: }
245: printf("%-15s %-15s %-15s %d\n",serv,inst,rlm,vno);
246: }
247: if (count < 0)
248: perror(file);
249: (void) close(stab);
250: }
251:
252: /* adapted from getst() in librkb */
253: /*
254: * ok_getst() takes a file descriptor, a string and a count. It reads
255: * from the file until either it has read "count" characters, or until
256: * it reads a null byte. When finished, what has been read exists in
257: * the given string "s". If "count" characters were actually read, the
258: * last is changed to a null, so the returned string is always null-
259: * terminated. ok_getst() returns the number of characters read, including
260: * the null terminator.
261: *
262: * If there is a read error, it returns -1 (like the read(2) system call)
263: */
264:
265: ok_getst(fd, s, n)
266: int fd;
267: register char *s;
268: {
269: register count = n;
270: int err;
271: while ((err = read(fd, s, 1)) > 0 && --count)
272: if (*s++ == '\0')
273: return (n - count);
274: if (err < 0)
275: return(-1);
276: *s = '\0';
277: return (n - count);
278: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.