146999Skarels /*
246999Skarels * $Source: /usr/src/kerberosIV/kinit/RCS/kinit.c,v $
346999Skarels * $Author: kfall $
446999Skarels *
546999Skarels * Copyright 1987, 1988 by the Massachusetts Institute of Technology.
646999Skarels *
746999Skarels * For copying and distribution information, please see the file
846999Skarels * <mit-copyright.h>.
946999Skarels *
1046999Skarels * Routine to initialize user to Kerberos. Prompts optionally for
1146999Skarels * user, instance and realm. Authenticates user and gets a ticket
1246999Skarels * for the Kerberos ticket-granting service for future use.
1346999Skarels *
1446999Skarels * Options are:
1546999Skarels *
1646999Skarels * -i[instance]
1746999Skarels * -r[realm]
1846999Skarels * -v[erbose]
1946999Skarels * -l[ifetime]
2046999Skarels */
2146999Skarels
2246999Skarels #ifndef lint
2346999Skarels static char rcsid_kinit_c[] =
2446999Skarels "$Header: /usr/src/kerberosIV/kinit/RCS/kinit.c,v 4.15 90/06/25 21:01:06 kfall Exp $";
2546999Skarels #endif lint
2646999Skarels
2746999Skarels #include <sys/types.h>
2846999Skarels #include <sys/param.h>
2946999Skarels #include <mit-copyright.h>
3046999Skarels #include <string.h>
3146999Skarels #include <stdio.h>
3246999Skarels #include <des.h>
3346999Skarels #include <krb.h>
3446999Skarels #include <pwd.h>
3546999Skarels #include <paths.h>
3646999Skarels
3746999Skarels #define LEN MAXHOSTNAMELEN
3846999Skarels #define LIFE DEFAULT_TKT_LIFE /* in 5-minute units */
3946999Skarels #define INITIAL_TICKET "krbtgt"
4046999Skarels
4146999Skarels char *progname;
4246999Skarels
4346999Skarels char aname[ANAME_SZ];
4446999Skarels char inst[INST_SZ];
4546999Skarels char realm[REALM_SZ];
4646999Skarels
47*47054Skarels #define gets(buf) _gets(buf, sizeof(buf)) /* hack */
48*47054Skarels
49*47054Skarels char *
_gets(p,n)50*47054Skarels _gets(p, n)
51*47054Skarels char *p;
52*47054Skarels int n;
53*47054Skarels {
54*47054Skarels char *rv, *fgets();
55*47054Skarels
56*47054Skarels if ((rv = fgets(p, n, stdin)) == NULL)
57*47054Skarels return (rv);
58*47054Skarels if (p = index(p, '\n'))
59*47054Skarels *p = '\0';
60*47054Skarels return (rv);
61*47054Skarels }
62*47054Skarels
main(argc,argv)6346999Skarels main(argc, argv)
6446999Skarels char *argv[];
6546999Skarels {
6646999Skarels char buf[LEN];
6746999Skarels char *username = NULL;
6846999Skarels int iflag, rflag, vflag, lflag, lifetime, k_errno;
6946999Skarels register char *cp;
7046999Skarels register i;
7146999Skarels
7246999Skarels *inst = *realm = '\0';
7346999Skarels iflag = rflag = vflag = lflag = 0;
7446999Skarels lifetime = LIFE;
7546999Skarels progname = (cp = rindex(*argv, '/')) ? cp + 1 : *argv;
7646999Skarels
7746999Skarels while (--argc) {
7846999Skarels if ((*++argv)[0] != '-') {
7946999Skarels if (username)
8046999Skarels usage();
8146999Skarels username = *argv;
8246999Skarels continue;
8346999Skarels }
8446999Skarels for (i = 1; (*argv)[i] != '\0'; i++)
8546999Skarels switch ((*argv)[i]) {
8646999Skarels case 'i': /* Instance */
8746999Skarels ++iflag;
8846999Skarels continue;
8946999Skarels case 'r': /* Realm */
9046999Skarels ++rflag;
9146999Skarels continue;
9246999Skarels case 'v': /* Verbose */
9346999Skarels ++vflag;
9446999Skarels continue;
9546999Skarels case 'l':
9646999Skarels ++lflag;
9746999Skarels continue;
9846999Skarels default:
9946999Skarels usage();
10046999Skarels exit(1);
10146999Skarels }
10246999Skarels }
10346999Skarels if (username && (k_errno = kname_parse(aname, inst, realm, username)) !=
10446999Skarels KSUCCESS) {
10546999Skarels fprintf(stderr, "%s: %s\n", progname, krb_err_txt[k_errno]);
10646999Skarels iflag = rflag = 1;
10746999Skarels username = NULL;
10846999Skarels }
10946999Skarels if (k_gethostname(buf, LEN)) {
11046999Skarels fprintf(stderr, "%s: k_gethostname failed\n", progname);
11146999Skarels exit(1);
11246999Skarels }
11346999Skarels
11446999Skarels if (username) {
11546999Skarels printf("Kerberos Initialization for \"%s", aname);
11646999Skarels if (*inst)
11746999Skarels printf(".%s", inst);
11846999Skarels if (*realm)
11946999Skarels printf("@%s", realm);
12046999Skarels printf("\"\n");
12146999Skarels } else {
12246999Skarels if (iflag) {
12346999Skarels printf("Kerberos Initialization\n");
12446999Skarels printf("Kerberos name: ");
12546999Skarels gets(aname);
12646999Skarels } else {
127*47054Skarels int uid = getuid();
128*47054Skarels char *getenv();
129*47054Skarels struct passwd *pwd;
13046999Skarels
131*47054Skarels /* default to current user name unless running as root */
132*47054Skarels if (uid == 0 && (username = getenv("USER")) &&
133*47054Skarels strcmp(username, "root") != 0) {
134*47054Skarels strncpy(aname, username, sizeof(aname));
135*47054Skarels strncpy(inst, "root", sizeof(inst));
136*47054Skarels } else {
137*47054Skarels pwd = getpwuid(uid);
138*47054Skarels
139*47054Skarels if (pwd == (struct passwd *) NULL) {
140*47054Skarels fprintf(stderr, "Unknown name for your uid\n");
141*47054Skarels printf("Kerberos name: ");
142*47054Skarels gets(aname);
143*47054Skarels } else
144*47054Skarels strncpy(aname, pwd->pw_name, sizeof(aname));
145*47054Skarels }
14646999Skarels }
14746999Skarels
14846999Skarels if (!*aname)
14946999Skarels exit(0);
15046999Skarels if (!k_isname(aname)) {
15146999Skarels fprintf(stderr, "%s: bad Kerberos name format\n",
15246999Skarels progname);
15346999Skarels exit(1);
15446999Skarels }
15546999Skarels }
15646999Skarels /* optional instance */
15746999Skarels if (iflag) {
15846999Skarels printf("Kerberos instance: ");
15946999Skarels gets(inst);
16046999Skarels if (!k_isinst(inst)) {
16146999Skarels fprintf(stderr, "%s: bad Kerberos instance format\n",
16246999Skarels progname);
16346999Skarels exit(1);
16446999Skarels }
16546999Skarels }
16646999Skarels if (rflag) {
16746999Skarels printf("Kerberos realm: ");
16846999Skarels gets(realm);
16946999Skarels if (!k_isrealm(realm)) {
17046999Skarels fprintf(stderr, "%s: bad Kerberos realm format\n",
17146999Skarels progname);
17246999Skarels exit(1);
17346999Skarels }
17446999Skarels }
17546999Skarels if (lflag) {
17646999Skarels printf("Kerberos ticket lifetime (minutes): ");
17746999Skarels gets(buf);
17846999Skarels lifetime = atoi(buf);
17946999Skarels if (lifetime < 5)
18046999Skarels lifetime = 1;
18146999Skarels else
18246999Skarels lifetime /= 5;
18346999Skarels /* This should be changed if the maximum ticket lifetime */
18446999Skarels /* changes */
18546999Skarels if (lifetime > 255)
18646999Skarels lifetime = 255;
18746999Skarels }
18846999Skarels if (!*realm && krb_get_lrealm(realm, 1)) {
18946999Skarels fprintf(stderr, "%s: krb_get_lrealm failed\n", progname);
19046999Skarels exit(1);
19146999Skarels }
19246999Skarels
19346999Skarels k_errno = krb_get_pw_in_tkt(aname, inst, realm, INITIAL_TICKET,
19446999Skarels realm, lifetime, 0);
19546999Skarels
19646999Skarels if (vflag) {
19746999Skarels printf("Kerberos realm %s:\n", realm);
19846999Skarels printf("%s\n", krb_err_txt[k_errno]);
19946999Skarels } else if (k_errno) {
20046999Skarels fprintf(stderr, "%s: %s\n", progname, krb_err_txt[k_errno]);
20146999Skarels exit(1);
20246999Skarels }
203*47054Skarels exit(0);
20446999Skarels }
20546999Skarels
usage()20646999Skarels usage()
20746999Skarels {
20846999Skarels fprintf(stderr, "Usage: %s [-irvl] [name]\n", progname);
20946999Skarels exit(1);
21046999Skarels }
211