Annotation of 43BSDReno/kerberosIV/krb/kname_parse.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * $Source: /usr/src/kerberosIV/krb/RCS/kname_parse.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: 
                     11: #ifndef lint
                     12: static char rcsid_kname_parse_c[] =
                     13: "$Header: /usr/src/kerberosIV/krb/RCS/kname_parse.c,v 4.5 90/06/25 20:56:35 kfall Exp $";
                     14: #endif /* lint */
                     15: 
                     16: #include <mit-copyright.h>
                     17: 
                     18: #include <stdio.h>
                     19: #include <des.h>
                     20: #include <krb.h>
                     21: #include <strings.h>
                     22: 
                     23: /* max size of full name */
                     24: #define FULL_SZ (ANAME_SZ + INST_SZ + REALM_SZ)
                     25: 
                     26: #define NAME    0              /* which field are we in? */
                     27: #define INST    1
                     28: #define REALM   2
                     29: 
                     30: extern char *krb_err_txt[];
                     31: 
                     32: /*
                     33:  * This file contains four routines for handling Kerberos names.
                     34:  *
                     35:  * kname_parse() breaks a Kerberos name into its name, instance,
                     36:  * and realm components.
                     37:  *
                     38:  * k_isname(), k_isinst(), and k_isrealm() check a given string to see if
                     39:  * it's a syntactically legitimate respective part of a Kerberos name,
                     40:  * returning 1 if it is, 0 if it isn't.
                     41:  *
                     42:  * Definition of "syntactically legitimate" names is according to
                     43:  * the Project Athena Technical Plan Section E.2.1, page 7 "Specifying
                     44:  * names", version dated 21 Dec 1987.
                     45:  * /
                     46: 
                     47: /*
                     48:  * kname_parse() takes a Kerberos name "fullname" of the form:
                     49:  *
                     50:  *             username[.instance][@realm]
                     51:  *
                     52:  * and returns the three components ("name", "instance", and "realm"
                     53:  * in the example above) in the given arguments "np", "ip", and "rp".
                     54:  *
                     55:  * If successful, it returns KSUCCESS.  If there was an error,
                     56:  * KNAME_FMT is returned.
                     57:  */
                     58: 
                     59: kname_parse(np, ip, rp, fullname)
                     60:     char *np, *ip, *rp, *fullname;
                     61: {
                     62:     static char buf[FULL_SZ];
                     63:     char *rnext, *wnext;       /* next char to read, write */
                     64:     register char c;
                     65:     int backslash;
                     66:     int field;
                     67: 
                     68:     backslash = 0;
                     69:     rnext = buf;
                     70:     wnext = np;
                     71:     field = NAME;
                     72: 
                     73:     if (strlen(fullname) > FULL_SZ)
                     74:         return KNAME_FMT;
                     75:     (void) strcpy(buf, fullname);
                     76: 
                     77:     while (c = *rnext++) {
                     78:         if (backslash) {
                     79:             *wnext++ = c;
                     80:             backslash = 0;
                     81:             continue;
                     82:         }
                     83:         switch (c) {
                     84:         case '\\':
                     85:             backslash++;
                     86:             break;
                     87:         case '.':
                     88:             switch (field) {
                     89:             case NAME:
                     90:                 if (wnext == np)
                     91:                     return KNAME_FMT;
                     92:                 *wnext = '\0';
                     93:                 field = INST;
                     94:                 wnext = ip;
                     95:                 break;
                     96:             case INST:
                     97:                 return KNAME_FMT;
                     98:                 /* break; */
                     99:             case REALM:
                    100:                 *wnext++ = c;
                    101:                 break;
                    102:             default:
                    103:                 fprintf(stderr, "unknown field value\n");
                    104:                 exit(1);
                    105:             }
                    106:             break;
                    107:         case '@':
                    108:             switch (field) {
                    109:             case NAME:
                    110:                 if (wnext == np)
                    111:                     return KNAME_FMT;
                    112:                 *ip = '\0';
                    113:                 /* fall through */
                    114:             case INST:
                    115:                 *wnext = '\0';
                    116:                 field = REALM;
                    117:                 wnext = rp;
                    118:                 break;
                    119:             case REALM:
                    120:                 return KNAME_FMT;
                    121:             default:
                    122:                 fprintf(stderr, "unknown field value\n");
                    123:                 exit(1);
                    124:             }
                    125:             break;
                    126:         default:
                    127:             *wnext++ = c;
                    128:         }
                    129:     }
                    130:     *wnext = '\0';
                    131:     if ((strlen(np) > ANAME_SZ - 1) ||
                    132:         (strlen(ip) > INST_SZ  - 1) ||
                    133:         (strlen(rp) > REALM_SZ - 1))
                    134:         return KNAME_FMT;
                    135:     return KSUCCESS;
                    136: }
                    137: 
                    138: /*
                    139:  * k_isname() returns 1 if the given name is a syntactically legitimate
                    140:  * Kerberos name; returns 0 if it's not.
                    141:  */
                    142: 
                    143: k_isname(s)
                    144:     char *s;
                    145: {
                    146:     register char c;
                    147:     int backslash = 0;
                    148: 
                    149:     if (!*s)
                    150:         return 0;
                    151:     if (strlen(s) > ANAME_SZ - 1)
                    152:         return 0;
                    153:     while(c = *s++) {
                    154:         if (backslash) {
                    155:             backslash = 0;
                    156:             continue;
                    157:         }
                    158:         switch(c) {
                    159:         case '\\':
                    160:             backslash = 1;
                    161:             break;
                    162:         case '.':
                    163:             return 0;
                    164:             /* break; */
                    165:         case '@':
                    166:             return 0;
                    167:             /* break; */
                    168:         }
                    169:     }
                    170:     return 1;
                    171: }
                    172: 
                    173: 
                    174: /*
                    175:  * k_isinst() returns 1 if the given name is a syntactically legitimate
                    176:  * Kerberos instance; returns 0 if it's not.
                    177:  */
                    178: 
                    179: k_isinst(s)
                    180:     char *s;
                    181: {
                    182:     register char c;
                    183:     int backslash = 0;
                    184: 
                    185:     if (strlen(s) > INST_SZ - 1)
                    186:         return 0;
                    187:     while(c = *s++) {
                    188:         if (backslash) {
                    189:             backslash = 0;
                    190:             continue;
                    191:         }
                    192:         switch(c) {
                    193:         case '\\':
                    194:             backslash = 1;
                    195:             break;
                    196:         case '.':
                    197:             return 0;
                    198:             /* break; */
                    199:         case '@':
                    200:             return 0;
                    201:             /* break; */
                    202:         }
                    203:     }
                    204:     return 1;
                    205: }
                    206: 
                    207: /*
                    208:  * k_isrealm() returns 1 if the given name is a syntactically legitimate
                    209:  * Kerberos realm; returns 0 if it's not.
                    210:  */
                    211: 
                    212: k_isrealm(s)
                    213:     char *s;
                    214: {
                    215:     register char c;
                    216:     int backslash = 0;
                    217: 
                    218:     if (!*s)
                    219:         return 0;
                    220:     if (strlen(s) > REALM_SZ - 1)
                    221:         return 0;
                    222:     while(c = *s++) {
                    223:         if (backslash) {
                    224:             backslash = 0;
                    225:             continue;
                    226:         }
                    227:         switch(c) {
                    228:         case '\\':
                    229:             backslash = 1;
                    230:             break;
                    231:         case '@':
                    232:             return 0;
                    233:             /* break; */
                    234:         }
                    235:     }
                    236:     return 1;
                    237: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.