|
|
1.1 ! root 1: ! 2: /* ! 3: * Copyright (c) 1989 The Regents of the University of California. ! 4: * All rights reserved. ! 5: * ! 6: * Redistribution and use in source and binary forms are permitted ! 7: * provided that the above copyright notice and this paragraph are ! 8: * duplicated in all such forms and that any documentation, ! 9: * advertising materials, and other materials related to such ! 10: * distribution and use acknowledge that the software was developed ! 11: * by the University of California, Berkeley. The name of the ! 12: * University may not be used to endorse or promote products derived ! 13: * from this software without specific prior written permission. ! 14: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 15: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 16: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 17: */ ! 18: ! 19: #ifndef lint ! 20: static char sccsid[] = "@(#)kpasswd.c 1.2 (Berkeley) 5/17/89"; ! 21: #endif /* not lint */ ! 22: ! 23: /* ! 24: * kpasswd - client program to update Kerberos password ! 25: * ! 26: * K. Fall ! 27: * 12-Dec-88 ! 28: */ ! 29: ! 30: #include <stdio.h> ! 31: #include <sys/types.h> ! 32: #include <sys/time.h> ! 33: #include <sys/resource.h> ! 34: #include <sys/socket.h> ! 35: #include <sys/signal.h> ! 36: #include <netinet/in.h> ! 37: #include <netdb.h> ! 38: #include <kerberos/krb.h> ! 39: #include "kpasswd_proto.h" ! 40: ! 41: KTEXT_ST ticket; ! 42: long authopts = 0L; ! 43: Key_schedule random_schedule; ! 44: char realm[REALM_SZ], krbhst[MAX_HSTNM]; ! 45: static struct kpasswd_data proto_data; ! 46: static C_Block okey; ! 47: static Key_schedule osched; ! 48: static struct timeval timeout = { CLIENT_KRB_TIMEOUT, 0 }; ! 49: int sock; ! 50: char *getpass(); ! 51: int sock; ! 52: ! 53: int finish(); ! 54: ! 55: #define PROTO "tcp" ! 56: ! 57: main(argc, argv) ! 58: int argc; ! 59: char **argv; ! 60: { ! 61: struct servent *se; ! 62: struct hostent *host; ! 63: struct sockaddr_in sin; ! 64: int rval; ! 65: char password[255], *pass; ! 66: fd_set readfds; ! 67: ! 68: static struct rlimit rl = { 0, 0 }; ! 69: ! 70: signal(SIGHUP, SIG_IGN); ! 71: signal(SIGINT, SIG_IGN); ! 72: signal(SIGTSTP, SIG_IGN); ! 73: ! 74: if(setrlimit(RLIMIT_CORE, &rl) < 0) { ! 75: perror("setrlimit"); ! 76: exit(1); ! 77: } ! 78: ! 79: if((se = getservbyname(SERVICE, PROTO)) == NULL) { ! 80: fprintf(stderr, "couldn't find entry for service %s/%s\n", ! 81: SERVICE, PROTO); ! 82: exit(1); ! 83: } ! 84: if((rval = krb_get_lrealm(realm,1)) != KSUCCESS) { ! 85: fprintf(stderr, "couldn't get local Kerberos realm: %s\n", ! 86: krb_err_txt[rval]); ! 87: exit(1); ! 88: } ! 89: ! 90: if((rval = krb_get_krbhst(krbhst, realm, 1)) != KSUCCESS) { ! 91: fprintf(stderr, "couldn't get Kerberos host: %s\n", ! 92: krb_err_txt[rval]); ! 93: exit(1); ! 94: } ! 95: ! 96: if((host = gethostbyname(krbhst)) == NULL) { ! 97: fprintf(stderr, "couldn't get host entry for host %s\n", ! 98: krbhst); ! 99: exit(1); ! 100: } ! 101: ! 102: sin.sin_family = host->h_addrtype; ! 103: bcopy(host->h_addr, (char *) &sin.sin_addr, host->h_length); ! 104: sin.sin_port = se->s_port; ! 105: ! 106: if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { ! 107: perror("socket"); ! 108: exit(1); ! 109: } ! 110: ! 111: if(connect(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) { ! 112: perror("connect"); ! 113: close(sock); ! 114: exit(1); ! 115: } ! 116: ! 117: rval = krb_sendauth( ! 118: authopts, /* NOT mutual */ ! 119: sock, ! 120: &ticket, /* (filled in) */ ! 121: SERVICE, ! 122: krbhst, /* instance (krbhst) */ ! 123: realm, /* dest realm */ ! 124: (u_long) getpid(), /* checksum */ ! 125: NULL, /* msg data */ ! 126: NULL, /* credentials */ ! 127: NULL, /* schedule */ ! 128: NULL, /* local addr */ ! 129: NULL, /* foreign addr */ ! 130: "KPWDV0.1" ! 131: ); ! 132: ! 133: if(rval != KSUCCESS) { ! 134: fprintf(stderr, "Kerberos sendauth error: %s\n", ! 135: krb_err_txt[rval]); ! 136: exit(1); ! 137: } ! 138: ! 139: pass = getpass("Old Kerberos password:"); ! 140: string_to_key(pass, okey); ! 141: key_sched(okey, osched); ! 142: des_set_key(okey, osched); ! 143: ! 144: /* wait on the verification string */ ! 145: ! 146: FD_ZERO(&readfds); ! 147: FD_SET(sock, &readfds); ! 148: ! 149: rval = ! 150: select(sock + 1, &readfds, (fd_set *) 0, (fd_set *) 0, &timeout); ! 151: if((rval < 1) || !FD_ISSET(sock, &readfds)) { ! 152: if(rval == 0) { ! 153: fprintf(stderr, "Timed out\n"); ! 154: cleanup(); ! 155: exit(1); ! 156: } ! 157: fprintf(stderr, "select failed\n"); ! 158: cleanup(); ! 159: exit(1); ! 160: } ! 161: ! 162: /* read verification string */ ! 163: ! 164: if(des_read(sock, &proto_data, sizeof(proto_data)) != sizeof(proto_data)) { ! 165: fprintf(stderr, ! 166: "%s: couldn't read verification string (aborted)\n", ! 167: argv[0] ! 168: ); ! 169: ! 170: cleanup(); ! 171: exit(1); ! 172: } ! 173: ! 174: signal(SIGHUP, finish); ! 175: signal(SIGINT, finish); ! 176: ! 177: if(strcmp(SECURE_STRING, proto_data.secure_msg)) { ! 178: cleanup(); ! 179: fprintf(stderr, "Sorry.\n"); ! 180: exit(1); ! 181: } ! 182: key_sched(proto_data.random_key, random_schedule); ! 183: des_set_key(proto_data.random_key, random_schedule); ! 184: pass = getpass("New Kerberos password:"); ! 185: strcpy(password, pass); ! 186: pass = getpass("Retype new Kerberos password:"); ! 187: if(strcmp(password, pass)) { ! 188: fprintf(stderr, "Password mismatch (aborted)\n"); ! 189: cleanup(); ! 190: exit(1); ! 191: } ! 192: send_update(sock, password, SECURE_STRING); ! 193: ! 194: /* wait for ACK */ ! 195: ! 196: FD_ZERO(&readfds); ! 197: FD_SET(sock, &readfds); ! 198: ! 199: rval = ! 200: select(sock + 1, &readfds, (fd_set *) 0, (fd_set *) 0, &timeout); ! 201: if((rval < 1) || !FD_ISSET(sock, &readfds)) { ! 202: if(rval == 0) { ! 203: fprintf(stderr, "Timed out reading ACK\n"); ! 204: cleanup(); ! 205: exit(1); ! 206: } ! 207: fprintf(stderr, "select failed\n"); ! 208: cleanup(); ! 209: exit(1); ! 210: } ! 211: ! 212: recv_ack(sock); ! 213: cleanup(); ! 214: exit(0); ! 215: } ! 216: ! 217: send_update(dest, pwd, str) ! 218: int dest; ! 219: char *pwd, *str; ! 220: { ! 221: static struct update_data ud; ! 222: strncpy(ud.secure_msg, str, MSGSIZE); ! 223: strncpy(ud.pw, pwd, sizeof(ud.pw)); ! 224: if(des_write(dest, &ud, sizeof(ud)) != sizeof(ud)) { ! 225: fprintf(stderr, "couldn't write pw update (abort)\n"); ! 226: bzero(ud, sizeof(ud)); ! 227: cleanup(); ! 228: exit(1); ! 229: } ! 230: } ! 231: ! 232: recv_ack(remote) ! 233: int remote; ! 234: { ! 235: int cc; ! 236: char buf[BUFSIZ]; ! 237: cc = des_read(remote, buf, sizeof(buf)); ! 238: if(cc <= 0) { ! 239: fprintf(stderr, "error reading acknowledgement\n"); ! 240: cleanup(); ! 241: exit(1); ! 242: } ! 243: printf("%s", buf); ! 244: } ! 245: ! 246: cleanup() ! 247: { ! 248: bzero(&proto_data, sizeof(proto_data)); ! 249: bzero(okey, sizeof(okey)); ! 250: bzero(osched, sizeof(osched)); ! 251: bzero(random_schedule, sizeof(random_schedule)); ! 252: } ! 253: ! 254: finish() ! 255: { ! 256: close(sock); ! 257: exit(1); ! 258: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.