1 /* 2 * $Source: /mit/kerberos/src/kuser/RCS/kinit.c,v $ 3 * $Author: jtkohl $ 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: kinit.c,v 4.11 89/01/23 09:34:49 jtkohl Exp $"; 25 #endif lint 26 27 #include <kerberos/mit-copyright.h> 28 #include <stdio.h> 29 #include <pwd.h> 30 #include <kerberos/krb.h> 31 32 #include <strings.h> 33 #include <sys/param.h> 34 35 #define LEN MAXHOSTNAMELEN 36 #define LIFE 96 /* tick lifetime in 5-min units<8hrs> */ 37 #define MAX_LIFE 255 /* maximum life in 5-min units */ 38 39 char *progname; 40 41 main(argc, argv) 42 char *argv[]; 43 { 44 char aname[ANAME_SZ]; 45 char inst[INST_SZ]; 46 char realm[REALM_SZ]; 47 char buf[LEN]; 48 char *username = NULL; 49 int iflag, rflag, vflag, lflag, lifetime, k_errno; 50 register char *cp; 51 register i; 52 53 *inst = *realm = '\0'; 54 iflag = rflag = vflag = lflag = 0; 55 lifetime = LIFE; 56 progname = (cp = rindex(*argv, '/')) ? cp + 1 : *argv; 57 58 while (--argc) { 59 if ((*++argv)[0] != '-') { 60 if (username) 61 usage(); 62 username = *argv; 63 continue; 64 } 65 for (i = 1; (*argv)[i] != '\0'; i++) 66 switch ((*argv)[i]) { 67 case 'i': /* Instance */ 68 ++iflag; 69 continue; 70 case 'r': /* Realm */ 71 ++rflag; 72 continue; 73 case 'v': /* Verbose */ 74 ++vflag; 75 continue; 76 case 'l': 77 ++lflag; 78 continue; 79 default: 80 usage(); 81 exit(1); 82 } 83 } 84 if (username && 85 (k_errno = kname_parse(aname, inst, realm, username)) 86 != KSUCCESS) { 87 fprintf(stderr, "%s: %s\n", progname, krb_err_txt[k_errno]); 88 iflag = rflag = 1; 89 username = NULL; 90 } 91 if (k_gethostname(buf, LEN)) { 92 fprintf(stderr, "%s: k_gethostname failed\n", progname); 93 exit(1); 94 } 95 printf("MIT Project Athena/UC Berkeley (%s)\n", buf); 96 if (username) { 97 printf("Kerberos Initialization for \"%s", aname); 98 if (*inst) 99 printf(".%s", inst); 100 if (*realm) 101 printf("@%s", realm); 102 printf("\"\n"); 103 } else { 104 printf("Kerberos Initialization\n"); 105 printf("Kerberos name: "); 106 getstr(aname, ANAME_SZ); 107 if (!*aname) 108 exit(0); 109 if (!k_isname(aname)) { 110 fprintf(stderr, "%s: bad Kerberos name format\n", 111 progname); 112 exit(1); 113 } 114 } 115 /* optional instance */ 116 if (iflag) { 117 printf("Kerberos instance: "); 118 getstr(inst, INST_SZ); 119 if (!k_isinst(inst)) { 120 fprintf(stderr, "%s: bad Kerberos instance format\n", 121 progname); 122 exit(1); 123 } 124 } 125 if (rflag) { 126 printf("Kerberos realm: "); 127 getstr(realm, REALM_SZ); 128 if (!k_isrealm(realm)) { 129 fprintf(stderr, "%s: bad Kerberos realm format\n", 130 progname); 131 exit(1); 132 } 133 } 134 if (lflag) { 135 printf("Kerberos ticket lifetime (minutes): "); 136 getstr(buf, LEN); 137 lifetime = atoi(buf); 138 if (lifetime < 5) 139 lifetime = 1; 140 else 141 lifetime /= 5; 142 /* This should be changed if the maximum ticket lifetime */ 143 /* changes */ 144 if (lifetime > MAX_LIFE) 145 lifetime = MAX_LIFE; 146 } 147 if (!*realm && krb_get_lrealm(realm, 1)) { 148 fprintf(stderr, "%s: krb_get_lrealm failed\n", progname); 149 exit(1); 150 } 151 printf("Getting initial ticket for %s.%s@%s\n", 152 aname, inst, realm); 153 k_errno = krb_get_pw_in_tkt(aname, inst, realm, "krbtgt", realm, 154 lifetime, 0); 155 if (vflag) { 156 printf("Kerberos realm %s:\n", realm); 157 printf("%s\n", krb_err_txt[k_errno]); 158 } else if (k_errno) { 159 fprintf(stderr, "%s: %s\n", progname, krb_err_txt[k_errno]); 160 exit(1); 161 } 162 } 163 164 usage() 165 { 166 fprintf(stderr, "Usage: %s [-irvl] [name]\n", progname); 167 exit(1); 168 } 169 170 getstr(p, len) 171 register char *p; 172 int len; 173 { 174 while(((*p++ = getchar()) != '\n') && --len) 175 ; 176 *--p = '\0'; 177 } 178