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