freebsd-dev/crypto/kerberosIV/kuser/kinit.c
Mark Murray 03656ac1b0 Initial import of KTH eBones. This has been cleaned up to only include
the "core" Kerberos functionality. The rest of the userland will get their
own changes later.
1997-09-04 06:04:33 +00:00

159 lines
3.7 KiB
C

/*
* Copyright 1987, 1988 by the Massachusetts Institute of Technology.
*
* For copying and distribution information, please see the file
* <mit-copyright.h>.
*
* Routine to initialize user to Kerberos. Prompts optionally for
* user, instance and realm. Authenticates user and gets a ticket
* for the Kerberos ticket-granting service for future use.
*
* Options are:
*
* -i[instance]
* -r[realm]
* -v[erbose]
* -l[ifetime]
* -p
*/
#include "kuser_locl.h"
RCSID("$Id: kinit.c,v 1.15 1997/03/30 18:58:46 assar Exp $");
#define LIFE DEFAULT_TKT_LIFE /* lifetime of ticket in 5-minute units */
#define CHPASSLIFE 2
static void
get_input(char *s, int size, FILE *stream)
{
char *p;
if (fgets(s, size, stream) == NULL)
exit(1);
if ( (p = strchr(s, '\n')) != NULL)
*p = '\0';
}
static void
usage(void)
{
fprintf(stderr, "Usage: %s [-irvlp] [name]\n", __progname);
exit(1);
}
int
main(int argc, char **argv)
{
char aname[ANAME_SZ];
char inst[INST_SZ];
char realm[REALM_SZ];
char buf[MaxHostNameLen];
char name[MAX_K_NAME_SZ];
char *username = NULL;
int iflag, rflag, vflag, lflag, pflag, lifetime, k_errno;
int i;
set_progname (argv[0]);
*inst = *realm = '\0';
iflag = rflag = vflag = lflag = pflag = 0;
lifetime = LIFE;
set_progname(argv[0]);
while (--argc) {
if ((*++argv)[0] != '-') {
if (username)
usage();
username = *argv;
continue;
}
for (i = 1; (*argv)[i] != '\0'; i++)
switch ((*argv)[i]) {
case 'i': /* Instance */
++iflag;
continue;
case 'r': /* Realm */
++rflag;
continue;
case 'v': /* Verbose */
++vflag;
continue;
case 'l':
++lflag;
continue;
case 'p':
++pflag; /* chpass-tickets */
lifetime = CHPASSLIFE;
break;
default:
usage();
}
}
if (username &&
(k_errno = kname_parse(aname, inst, realm, username)) != KSUCCESS) {
warnx("%s", krb_get_err_text(k_errno));
iflag = rflag = 1;
username = NULL;
}
if (k_gethostname(buf, MaxHostNameLen))
err(1, "k_gethostname failed");
printf("%s (%s)\n", ORGANIZATION, buf);
if (username) {
printf("Kerberos Initialization for \"%s", aname);
if (*inst)
printf(".%s", inst);
if (*realm)
printf("@%s", realm);
printf("\"\n");
} else {
printf("Kerberos Initialization\n");
printf("Kerberos name: ");
get_input(name, sizeof(name), stdin);
if (!*name)
return 0;
if ((k_errno = kname_parse(aname, inst, realm, name)) != KSUCCESS )
errx(1, "%s", krb_get_err_text(k_errno));
}
/* optional instance */
if (iflag) {
printf("Kerberos instance: ");
get_input(inst, sizeof(inst), stdin);
if (!k_isinst(inst))
errx(1, "bad Kerberos instance format");
}
if (rflag) {
printf("Kerberos realm: ");
get_input(realm, sizeof(realm), stdin);
if (!k_isrealm(realm))
errx(1, "bad Kerberos realm format");
}
if (lflag) {
printf("Kerberos ticket lifetime (minutes): ");
get_input(buf, sizeof(buf), stdin);
lifetime = atoi(buf);
if (lifetime < 5)
lifetime = 1;
else
lifetime = krb_time_to_life(0, lifetime*60);
/* This should be changed if the maximum ticket lifetime */
/* changes */
if (lifetime > 255)
lifetime = 255;
}
if (!*realm && krb_get_lrealm(realm, 1))
errx(1, "krb_get_lrealm failed");
k_errno = krb_get_pw_in_tkt(aname, inst, realm,
pflag ? PWSERV_NAME :
KRB_TICKET_GRANTING_TICKET,
pflag ? KADM_SINST : realm,
lifetime, 0);
if (vflag) {
printf("Kerberos realm %s:\n", realm);
printf("%s\n", krb_get_err_text(k_errno));
} else if (k_errno)
errx(1, "%s", krb_get_err_text(k_errno));
exit(0);
}