summaryrefslogtreecommitdiffstats
path: root/crypto/kerberosIV/kuser/kinit.c
blob: 64910b9108014ec9333d5b2ae9d65f1df1487e22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
 * 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);
}
OpenPOWER on IntegriCloud