Annotation of 43BSDReno/kerberosIV/register/register.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.