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