Commit | Line | Data |
---|---|---|
3cf9afd3 C |
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 | } |