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