1 /*
2 * $Source: /usr/src/kerberosIV/kinit/RCS/kinit.c,v $
3 * $Author: kfall $
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: /usr/src/kerberosIV/kinit/RCS/kinit.c,v 4.15 90/06/25 21:01:06 kfall Exp $";
25 #endif lint
26
27 #include <sys/types.h>
28 #include <sys/param.h>
29 #include <mit-copyright.h>
30 #include <string.h>
31 #include <stdio.h>
32 #include <des.h>
33 #include <krb.h>
34 #include <pwd.h>
35 #include <paths.h>
36
37 #define LEN MAXHOSTNAMELEN
38 #define LIFE DEFAULT_TKT_LIFE /* in 5-minute units */
39 #define INITIAL_TICKET "krbtgt"
40
41 char *progname;
42
43 char aname[ANAME_SZ];
44 char inst[INST_SZ];
45 char realm[REALM_SZ];
46
47 #define gets(buf) _gets(buf, sizeof(buf)) /* hack */
48
49 char *
_gets(p,n)50 _gets(p, n)
51 char *p;
52 int n;
53 {
54 char *rv, *fgets();
55
56 if ((rv = fgets(p, n, stdin)) == NULL)
57 return (rv);
58 if (p = index(p, '\n'))
59 *p = '\0';
60 return (rv);
61 }
62
main(argc,argv)63 main(argc, argv)
64 char *argv[];
65 {
66 char buf[LEN];
67 char *username = NULL;
68 int iflag, rflag, vflag, lflag, lifetime, k_errno;
69 register char *cp;
70 register i;
71
72 *inst = *realm = '\0';
73 iflag = rflag = vflag = lflag = 0;
74 lifetime = LIFE;
75 progname = (cp = rindex(*argv, '/')) ? cp + 1 : *argv;
76
77 while (--argc) {
78 if ((*++argv)[0] != '-') {
79 if (username)
80 usage();
81 username = *argv;
82 continue;
83 }
84 for (i = 1; (*argv)[i] != '\0'; i++)
85 switch ((*argv)[i]) {
86 case 'i': /* Instance */
87 ++iflag;
88 continue;
89 case 'r': /* Realm */
90 ++rflag;
91 continue;
92 case 'v': /* Verbose */
93 ++vflag;
94 continue;
95 case 'l':
96 ++lflag;
97 continue;
98 default:
99 usage();
100 exit(1);
101 }
102 }
103 if (username && (k_errno = kname_parse(aname, inst, realm, username)) !=
104 KSUCCESS) {
105 fprintf(stderr, "%s: %s\n", progname, krb_err_txt[k_errno]);
106 iflag = rflag = 1;
107 username = NULL;
108 }
109 if (k_gethostname(buf, LEN)) {
110 fprintf(stderr, "%s: k_gethostname failed\n", progname);
111 exit(1);
112 }
113
114 if (username) {
115 printf("Kerberos Initialization for \"%s", aname);
116 if (*inst)
117 printf(".%s", inst);
118 if (*realm)
119 printf("@%s", realm);
120 printf("\"\n");
121 } else {
122 if (iflag) {
123 printf("Kerberos Initialization\n");
124 printf("Kerberos name: ");
125 gets(aname);
126 } else {
127 int uid = getuid();
128 char *getenv();
129 struct passwd *pwd;
130
131 /* default to current user name unless running as root */
132 if (uid == 0 && (username = getenv("USER")) &&
133 strcmp(username, "root") != 0) {
134 strncpy(aname, username, sizeof(aname));
135 strncpy(inst, "root", sizeof(inst));
136 } else {
137 pwd = getpwuid(uid);
138
139 if (pwd == (struct passwd *) NULL) {
140 fprintf(stderr, "Unknown name for your uid\n");
141 printf("Kerberos name: ");
142 gets(aname);
143 } else
144 strncpy(aname, pwd->pw_name, sizeof(aname));
145 }
146 }
147
148 if (!*aname)
149 exit(0);
150 if (!k_isname(aname)) {
151 fprintf(stderr, "%s: bad Kerberos name format\n",
152 progname);
153 exit(1);
154 }
155 }
156 /* optional instance */
157 if (iflag) {
158 printf("Kerberos instance: ");
159 gets(inst);
160 if (!k_isinst(inst)) {
161 fprintf(stderr, "%s: bad Kerberos instance format\n",
162 progname);
163 exit(1);
164 }
165 }
166 if (rflag) {
167 printf("Kerberos realm: ");
168 gets(realm);
169 if (!k_isrealm(realm)) {
170 fprintf(stderr, "%s: bad Kerberos realm format\n",
171 progname);
172 exit(1);
173 }
174 }
175 if (lflag) {
176 printf("Kerberos ticket lifetime (minutes): ");
177 gets(buf);
178 lifetime = atoi(buf);
179 if (lifetime < 5)
180 lifetime = 1;
181 else
182 lifetime /= 5;
183 /* This should be changed if the maximum ticket lifetime */
184 /* changes */
185 if (lifetime > 255)
186 lifetime = 255;
187 }
188 if (!*realm && krb_get_lrealm(realm, 1)) {
189 fprintf(stderr, "%s: krb_get_lrealm failed\n", progname);
190 exit(1);
191 }
192
193 k_errno = krb_get_pw_in_tkt(aname, inst, realm, INITIAL_TICKET,
194 realm, lifetime, 0);
195
196 if (vflag) {
197 printf("Kerberos realm %s:\n", realm);
198 printf("%s\n", krb_err_txt[k_errno]);
199 } else if (k_errno) {
200 fprintf(stderr, "%s: %s\n", progname, krb_err_txt[k_errno]);
201 exit(1);
202 }
203 exit(0);
204 }
205
usage()206 usage()
207 {
208 fprintf(stderr, "Usage: %s [-irvl] [name]\n", progname);
209 exit(1);
210 }
211