xref: /csrg-svn/local/kerberosIV/kinit/kinit.c (revision 47054)
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