|
|
1.1 root 1: /*
2: * Copyright (c) 1989 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)register.c 1.5 (Berkeley) 5/17/89";
20: #endif /* not lint */
21:
22: #include <sys/types.h>
23: #include <sys/time.h>
24: #include <sys/resource.h>
25: #include <sys/socket.h>
26: #include <stdio.h>
27: #include <netdb.h>
28: #include <netinet/in.h>
29: #include <kerberos/krb.h>
30: #include <sys/param.h>
31: #include <sys/file.h>
32: #include <sys/signal.h>
33: #include "register_proto.h"
34:
35: #define SERVICE "krbupdate"
36: #define PROTO "tcp"
37: #define KFILE "/.update.key%s"
38: #define KPASSWD "/usr/athena/kpasswd"
39:
40: char realm[REALM_SZ];
41: char krbhst[MAX_HSTNM];
42:
43: static char pname[ANAME_SZ];
44: static char iname[INST_SZ];
45: static char password[255];
46:
47: extern char *sys_errlist;
48: int die();
49:
50: main(argc, argv)
51: int argc;
52: char **argv;
53: {
54: struct servent *se;
55: struct hostent *host;
56: struct sockaddr_in sin, local;
57: int rval;
58: int sock, llen;
59: u_char code;
60: static struct rlimit rl = { 0, 0 };
61:
62: signal(SIGPIPE, die);
63:
64: if (setrlimit(RLIMIT_CORE, &rl) < 0) {
65: perror("rlimit");
66: exit(1);
67: }
68:
69: if ((se = getservbyname(SERVICE, PROTO)) == NULL) {
70: fprintf(stderr, "couldn't find entry for service %s\n",
71: SERVICE);
72: exit(1);
73: }
74: if ((rval = krb_get_lrealm(realm,1)) != KSUCCESS) {
75: fprintf(stderr, "couldn't get local Kerberos realm: %s\n",
76: krb_err_txt[rval]);
77: exit(1);
78: }
79:
80: if ((rval = krb_get_krbhst(krbhst, realm, 1)) != KSUCCESS) {
81: fprintf(stderr, "couldn't get Kerberos host: %s\n",
82: krb_err_txt[rval]);
83: exit(1);
84: }
85:
86: if ((host = gethostbyname(krbhst)) == NULL) {
87: fprintf(stderr, "couldn't get host entry for host %s\n",
88: krbhst);
89: exit(1);
90: }
91:
92: sin.sin_family = host->h_addrtype;
93: bcopy(host->h_addr, (char *) &sin.sin_addr, host->h_length);
94: sin.sin_port = se->s_port;
95:
96: if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
97: perror("socket");
98: exit(1);
99: }
100:
101: if (connect(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
102: perror("connect");
103: close(sock);
104: exit(1);
105: }
106:
107: llen = sizeof(local);
108: if (getsockname(sock, (struct sockaddr *) &local, &llen) < 0) {
109: perror("getsockname");
110: close(sock);
111: exit(1);
112: }
113:
114: setup_key(local);
115:
116: type_info();
117:
118: if (!get_user_info()) {
119: code = ABORT;
120: (void)des_write(sock, &code, 1);
121: cleanup();
122: exit(1);
123: }
124:
125: code = APPEND_DB;
126: if(des_write(sock, &code, 1) != 1) {
127: perror("write 1");
128: cleanup();
129: exit(1);
130: }
131:
132: if(des_write(sock, pname, ANAME_SZ) != ANAME_SZ) {
133: perror("write principal name");
134: cleanup();
135: exit(1);
136: }
137:
138: if(des_write(sock, iname, INST_SZ) != INST_SZ) {
139: perror("write instance name");
140: cleanup();
141: exit(1);
142: }
143:
144: if(des_write(sock, password, 255) != 255) {
145: perror("write password");
146: cleanup();
147: exit(1);
148: }
149:
150: /* get return message */
151:
152: {
153: int cc;
154: char msgbuf[BUFSIZ];
155:
156: cc = read(sock, msgbuf, BUFSIZ);
157: if (cc <= 0) {
158: fprintf(stderr, "protocol error during key verification\n");
159: cleanup();
160: exit(1);
161: }
162: if (strncmp(msgbuf, GOTKEY_MSG, 6) != 0) {
163: fprintf(stderr, "%s: %s", krbhst, msgbuf);
164: cleanup();
165: exit(1);
166: }
167:
168: cc = des_read(sock, msgbuf, BUFSIZ);
169: if(cc <= 0) {
170: fprintf(stderr, "protocol error during read\n");
171: cleanup();
172: exit(1);
173: } else {
174: printf("%s: %s", krbhst, msgbuf);
175: }
176: }
177:
178: cleanup();
179: close(sock);
180: }
181:
182: cleanup()
183: {
184: bzero(password, 255);
185: }
186:
187: #include <pwd.h>
188:
189: extern char *crypt();
190: extern char *getpass();
191:
192: int
193: get_user_info()
194: {
195: int uid = getuid();
196: int valid = 0, i;
197: struct passwd *pw;
198: char *pas, *namep;
199:
200: if((pw = getpwuid(uid)) == NULL) {
201: fprintf(stderr, "Who are you?\n");
202: return(0);
203: }
204: seteuid(uid);
205: strcpy(pname, pw->pw_name); /* principal name */
206: for(i = 1; i < 3; i++) {
207: pas = getpass("login password:");
208: namep = crypt(pas, pw->pw_passwd);
209: if(strcmp(namep, pw->pw_passwd)) {
210: fprintf(stderr, "Password incorrect\n");
211: continue;
212: } else {
213: valid = 1;
214: break;
215: }
216: }
217: if(!valid)
218: return(0);
219: pas = getpass("Kerberos password (may be the same):");
220: while(*pas == NULL) {
221: printf("<NULL> password not allowed\n");
222: pas = getpass("Kerberos password (may be the same):");
223: }
224: strcpy(password, pas); /* password */
225: pas = getpass("Retype Kerberos password:");
226: if(strcmp(password, pas)) {
227: fprintf(stderr, "Password mismatch -- aborted\n");
228: return(0);
229: }
230:
231: iname[0] = NULL; /* null instance name */
232: return(1);
233: }
234:
235: setup_key(local)
236: struct sockaddr_in local;
237: {
238: static struct keyfile_data kdata;
239: static Key_schedule schedule;
240: int fd;
241: char namebuf[MAXPATHLEN];
242: extern int errno;
243:
244: sprintf(namebuf, KFILE, inet_ntoa(local.sin_addr));
245: fd = open(namebuf, O_RDONLY);
246: if(fd < 0) {
247: fprintf(stderr, "couldn't open key file for local host %s\n",
248: inet_ntoa(local.sin_addr));
249: perror("open");
250: exit(1);
251: }
252:
253: if(read(fd, (char *)&kdata, sizeof(kdata)) != sizeof(kdata)) {
254: fprintf(stderr,"size error reading key file for local host %s\n",
255: inet_ntoa(local.sin_addr));
256: exit(1);
257: }
258: key_sched(kdata.kf_key, schedule);
259: des_set_key(kdata.kf_key, schedule);
260: }
261:
262: type_info()
263: {
264: printf("Kerberos user registration (realm %s)\n\n", realm);
265: printf("Please enter your login password followed by your new Kerberos password.\n");
266: printf("The Kerberos password you enter now will be used in the future\n");
267: printf("as your Kerberos password for all machines in the %s realm.\n", realm);
268: printf("You will only be allowed to perform this operation once, although you may run\n");
269: printf("the %s program from now on to change your Kerberos password.\n\n", KPASSWD);
270: }
271:
272: die()
273: {
274: fprintf(stderr, "\nServer no longer listeninga\n");
275: fflush(stderr);
276: cleanup();
277: exit(1);
278: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.