xref: /original-bsd/old/athena/kinit/kinit.c (revision d75a44f9)
1 /*
2  * $Source: /mit/kerberos/src/kuser/RCS/kinit.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  * Routine to initialize user to Kerberos.  Prompts optionally for
11  * user, instance and realm.  Authenticates user and gets a ticket
12  * for the Kerberos ticket-granting service for future use.
13  *
14  * Options are:
15  *
16  *   -i[instance]
17  *   -r[realm]
18  *   -v[erbose]
19  *   -l[ifetime]
20  */
21 
22 #ifndef	lint
23 static char rcsid_kinit_c[] =
24 "$Header: kinit.c,v 4.11 89/01/23 09:34:49 jtkohl Exp $";
25 #endif	lint
26 
27 #include <kerberos/mit-copyright.h>
28 #include <stdio.h>
29 #include <pwd.h>
30 #include <kerberos/krb.h>
31 
32 #include <strings.h>
33 #include <sys/param.h>
34 
35 #define	LEN		MAXHOSTNAMELEN
36 #define	LIFE		96 	/* tick lifetime in 5-min units<8hrs> */
37 #define	MAX_LIFE	255	/* maximum life in 5-min units */
38 
39 char   *progname;
40 
41 main(argc, argv)
42     char   *argv[];
43 {
44     char    aname[ANAME_SZ];
45     char    inst[INST_SZ];
46     char    realm[REALM_SZ];
47     char    buf[LEN];
48     char   *username = NULL;
49     int     iflag, rflag, vflag, lflag, lifetime, k_errno;
50     register char *cp;
51     register i;
52     extern int krb_debug;
53     krb_debug = 1;
54 
55     *inst = *realm = '\0';
56     iflag = rflag = vflag = lflag = 0;
57     lifetime = LIFE;
58     progname = (cp = rindex(*argv, '/')) ? cp + 1 : *argv;
59 
60     while (--argc) {
61 	if ((*++argv)[0] != '-') {
62 	    if (username)
63 		usage();
64 	    username = *argv;
65 	    continue;
66 	}
67 	for (i = 1; (*argv)[i] != '\0'; i++)
68 	    switch ((*argv)[i]) {
69 	    case 'i':		/* Instance */
70 		++iflag;
71 		continue;
72 	    case 'r':		/* Realm */
73 		++rflag;
74 		continue;
75 	    case 'v':		/* Verbose */
76 		++vflag;
77 		continue;
78 	    case 'l':
79 		++lflag;
80 		continue;
81 	    default:
82 		usage();
83 		exit(1);
84 	    }
85     }
86     if (username &&
87 	(k_errno = kname_parse(aname, inst, realm, username))
88 	!= KSUCCESS) {
89 	fprintf(stderr, "%s: %s\n", progname, krb_err_txt[k_errno]);
90 	iflag = rflag = 1;
91 	username = NULL;
92     }
93     if (k_gethostname(buf, LEN)) {
94 	fprintf(stderr, "%s: k_gethostname failed\n", progname);
95 	exit(1);
96     }
97     printf("MIT Project Athena/UC Berkeley (%s)\n", buf);
98     if (username) {
99 	printf("Kerberos Initialization for \"%s", aname);
100 	if (*inst)
101 	    printf(".%s", inst);
102 	if (*realm)
103 	    printf("@%s", realm);
104 	printf("\"\n");
105     } else {
106 	printf("Kerberos Initialization\n");
107 	printf("Kerberos name: ");
108 	getstr(aname, ANAME_SZ);
109 	if (!*aname)
110 	    exit(0);
111 	if (!k_isname(aname)) {
112 	    fprintf(stderr, "%s: bad Kerberos name format\n",
113 		    progname);
114 	    exit(1);
115 	}
116     }
117     /* optional instance */
118     if (iflag) {
119 	printf("Kerberos instance: ");
120 	getstr(inst, INST_SZ);
121 	if (!k_isinst(inst)) {
122 	    fprintf(stderr, "%s: bad Kerberos instance format\n",
123 		    progname);
124 	    exit(1);
125 	}
126     }
127     if (rflag) {
128 	printf("Kerberos realm: ");
129 	getstr(realm, REALM_SZ);
130 	if (!k_isrealm(realm)) {
131 	    fprintf(stderr, "%s: bad Kerberos realm format\n",
132 		    progname);
133 	    exit(1);
134 	}
135     }
136     if (lflag) {
137 	 printf("Kerberos ticket lifetime (minutes): ");
138 	 getstr(buf, LEN);
139 	 lifetime = atoi(buf);
140 	 if (lifetime < 5)
141 	      lifetime = 1;
142 	 else
143 	      lifetime /= 5;
144 	 /* This should be changed if the maximum ticket lifetime */
145 	 /* changes */
146 	 if (lifetime > MAX_LIFE)
147 	      lifetime = MAX_LIFE;
148     }
149     if (!*realm && krb_get_lrealm(realm, 1)) {
150 	fprintf(stderr, "%s: krb_get_lrealm failed\n", progname);
151 	exit(1);
152     }
153     printf("Getting initial ticket for %s.%s@%s\n",
154 	aname, inst, realm);
155     k_errno = krb_get_pw_in_tkt(aname, inst, realm, "krbtgt", realm,
156 				lifetime, 0);
157     if (vflag) {
158 	printf("Kerberos realm %s:\n", realm);
159 	printf("%s\n", krb_err_txt[k_errno]);
160     } else if (k_errno) {
161 	fprintf(stderr, "%s: %s\n", progname, krb_err_txt[k_errno]);
162 	exit(1);
163     }
164 }
165 
166 usage()
167 {
168     fprintf(stderr, "Usage: %s [-irvl] [name]\n", progname);
169     exit(1);
170 }
171 
172 getstr(p, len)
173 	register char	*p;
174 	int		len;
175 {
176 	while(((*p++ = getchar()) != '\n') && --len)
177 		;
178 	*--p = '\0';
179 }
180