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