home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / kerberosIV / kinit / kinit.c next >
Encoding:
C/C++ Source or Header  |  1991-03-07  |  4.4 KB  |  211 lines

  1. /*
  2.  * $Source: /usr/src/kerberosIV/kinit/RCS/kinit.c,v $
  3.  * $Author: kfall $ 
  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: /usr/src/kerberosIV/kinit/RCS/kinit.c,v 4.15 90/06/25 21:01:06 kfall Exp $";
  25. #endif    lint
  26.  
  27. #include <sys/types.h>
  28. #include <sys/param.h>
  29. #include <mit-copyright.h>
  30. #include <string.h>
  31. #include <stdio.h>
  32. #include <des.h>
  33. #include <krb.h>
  34. #include <pwd.h>
  35. #include <paths.h>
  36.  
  37. #define    LEN        MAXHOSTNAMELEN
  38. #define    LIFE        DEFAULT_TKT_LIFE /* in 5-minute units */
  39. #define    INITIAL_TICKET    "krbtgt"
  40.  
  41. char    *progname;
  42.  
  43. char    aname[ANAME_SZ];
  44. char    inst[INST_SZ];
  45. char    realm[REALM_SZ];
  46.  
  47. #define    gets(buf) _gets(buf, sizeof(buf))    /* hack */
  48.  
  49. char *
  50. _gets(p, n)
  51.     char *p;
  52.     int n;
  53. {
  54.     char *rv, *fgets();
  55.     
  56.     if ((rv = fgets(p, n, stdin)) == NULL)
  57.         return (rv);
  58.     if (p = index(p, '\n'))
  59.         *p = '\0';
  60.     return (rv);
  61. }
  62.  
  63. main(argc, argv)
  64.     char   *argv[];
  65. {
  66.     char    buf[LEN];
  67.     char   *username = NULL;
  68.     int     iflag, rflag, vflag, lflag, lifetime, k_errno;
  69.     register char *cp;
  70.     register i;
  71.  
  72.     *inst = *realm = '\0';
  73.     iflag = rflag = vflag = lflag = 0;
  74.     lifetime = LIFE;
  75.     progname = (cp = rindex(*argv, '/')) ? cp + 1 : *argv;
  76.  
  77.     while (--argc) {
  78.     if ((*++argv)[0] != '-') {
  79.         if (username)
  80.         usage();
  81.         username = *argv;
  82.         continue;
  83.     }
  84.     for (i = 1; (*argv)[i] != '\0'; i++)
  85.         switch ((*argv)[i]) {
  86.         case 'i':        /* Instance */
  87.         ++iflag;
  88.         continue;
  89.         case 'r':        /* Realm */
  90.         ++rflag;
  91.         continue;
  92.         case 'v':        /* Verbose */
  93.         ++vflag;
  94.         continue;
  95.         case 'l':
  96.         ++lflag;
  97.         continue;
  98.         default:
  99.         usage();
  100.         exit(1);
  101.         }
  102.     }
  103.     if (username && (k_errno = kname_parse(aname, inst, realm, username)) !=
  104.     KSUCCESS) {
  105.     fprintf(stderr, "%s: %s\n", progname, krb_err_txt[k_errno]);
  106.     iflag = rflag = 1;
  107.     username = NULL;
  108.     }
  109.     if (k_gethostname(buf, LEN)) {
  110.     fprintf(stderr, "%s: k_gethostname failed\n", progname);
  111.     exit(1);
  112.     }
  113.  
  114.     if (username) {
  115.     printf("Kerberos Initialization for \"%s", aname);
  116.     if (*inst)
  117.         printf(".%s", inst);
  118.     if (*realm)
  119.         printf("@%s", realm);
  120.     printf("\"\n");
  121.     } else {
  122.     if (iflag) {
  123.         printf("Kerberos Initialization\n");
  124.         printf("Kerberos name: ");
  125.         gets(aname);
  126.     } else {
  127.         int uid = getuid();
  128.         char *getenv();
  129.         struct passwd *pwd;
  130.  
  131.         /* default to current user name unless running as root */
  132.         if (uid == 0 && (username = getenv("USER")) &&
  133.             strcmp(username, "root") != 0) {
  134.             strncpy(aname, username, sizeof(aname));
  135.             strncpy(inst, "root", sizeof(inst));
  136.         } else {
  137.             pwd = getpwuid(uid);
  138.  
  139.             if (pwd == (struct passwd *) NULL) {
  140.                 fprintf(stderr, "Unknown name for your uid\n");
  141.                 printf("Kerberos name: ");
  142.                 gets(aname);
  143.             } else
  144.                 strncpy(aname, pwd->pw_name, sizeof(aname));
  145.         }
  146.     }
  147.         
  148.     if (!*aname)
  149.         exit(0);
  150.     if (!k_isname(aname)) {
  151.         fprintf(stderr, "%s: bad Kerberos name format\n",
  152.             progname);
  153.         exit(1);
  154.     }
  155.     }
  156.     /* optional instance */
  157.     if (iflag) {
  158.     printf("Kerberos instance: ");
  159.     gets(inst);
  160.     if (!k_isinst(inst)) {
  161.         fprintf(stderr, "%s: bad Kerberos instance format\n",
  162.             progname);
  163.         exit(1);
  164.     }
  165.     }
  166.     if (rflag) {
  167.     printf("Kerberos realm: ");
  168.     gets(realm);
  169.     if (!k_isrealm(realm)) {
  170.         fprintf(stderr, "%s: bad Kerberos realm format\n",
  171.             progname);
  172.         exit(1);
  173.     }
  174.     }
  175.     if (lflag) {
  176.      printf("Kerberos ticket lifetime (minutes): ");
  177.      gets(buf);
  178.      lifetime = atoi(buf);
  179.      if (lifetime < 5)
  180.           lifetime = 1;
  181.      else
  182.           lifetime /= 5;
  183.      /* This should be changed if the maximum ticket lifetime */
  184.      /* changes */
  185.      if (lifetime > 255)
  186.           lifetime = 255;
  187.     }
  188.     if (!*realm && krb_get_lrealm(realm, 1)) {
  189.     fprintf(stderr, "%s: krb_get_lrealm failed\n", progname);
  190.     exit(1);
  191.     }
  192.  
  193.     k_errno = krb_get_pw_in_tkt(aname, inst, realm, INITIAL_TICKET,
  194.         realm, lifetime, 0);
  195.  
  196.     if (vflag) {
  197.     printf("Kerberos realm %s:\n", realm);
  198.     printf("%s\n", krb_err_txt[k_errno]);
  199.     } else if (k_errno) {
  200.     fprintf(stderr, "%s: %s\n", progname, krb_err_txt[k_errno]);
  201.     exit(1);
  202.     }
  203.     exit(0);
  204. }
  205.  
  206. usage()
  207. {
  208.     fprintf(stderr, "Usage: %s [-irvl] [name]\n", progname);
  209.     exit(1);
  210. }
  211.