aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDavid M. Syzdek <david@syzdek.net>2022-03-17 21:34:17 -0800
committerDavid M. Syzdek <david@syzdek.net>2022-03-17 21:34:17 -0800
commit8c50435e9c8b35871b2837e74604b81527980407 (patch)
tree8fd0632a0dcebd4310ba1641fdd85a2b3d747cc4
parent907ec60bc997462804ed3256152f192ae10d8887 (diff)
downloadtinyrad-8c50435e9c8b35871b2837e74604b81527980407.tar.gz
tinyrad-8c50435e9c8b35871b2837e74604b81527980407.tar.bz2
tinyrad-8c50435e9c8b35871b2837e74604b81527980407.tar.xz
tinyrad-8c50435e9c8b35871b2837e74604b81527980407.zip
libtinyrad: updating URL parser to allow empty secret
-rw-r--r--lib/libtinyrad/lurl.c57
-rw-r--r--src/tinyrad-url.c10
-rw-r--r--tests/common-url.c42
3 files changed, 59 insertions, 50 deletions
diff --git a/lib/libtinyrad/lurl.c b/lib/libtinyrad/lurl.c
index e0c79b5..139762a 100644
--- a/lib/libtinyrad/lurl.c
+++ b/lib/libtinyrad/lurl.c
@@ -120,7 +120,7 @@ tinyrad_urldesc2str(
120 TinyRadDebug(TRAD_DEBUG_ARGS, " == %s(trudp)", __func__); 120 TinyRadDebug(TRAD_DEBUG_ARGS, " == %s(trudp)", __func__);
121 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_host: %s", trudp->trud_host); 121 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_host: %s", trudp->trud_host);
122 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_port: %i", trudp->trud_port); 122 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_port: %i", trudp->trud_port);
123 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_secret: %s", trudp->trud_secret); 123 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_secret: %s", (((trudp->trud_secret)) ? trudp->trud_secret : "n/a"));
124 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_opts: 0x%04x", trudp->trud_opts); 124 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_opts: 0x%04x", trudp->trud_opts);
125 125
126 memset(buff, 0, sizeof(buff)); 126 memset(buff, 0, sizeof(buff));
@@ -162,7 +162,7 @@ tinyrad_urldesc2str(
162 162
163 // add URL secret 163 // add URL secret
164 strncat(buff, "/", (sizeof(buff)-strlen(buff)-1)); 164 strncat(buff, "/", (sizeof(buff)-strlen(buff)-1));
165 if ( (trudp->trud_opts & TRAD_SCHEME) != TRAD_RADSEC) 165 if ( ((trudp->trud_opts & TRAD_SCHEME) != TRAD_RADSEC) && ((trudp->trud_secret)) )
166 { 166 {
167 len = strlen(buff); 167 len = strlen(buff);
168 strncat(buff, trudp->trud_secret, (sizeof(buff)-strlen(buff)-1)); 168 strncat(buff, trudp->trud_secret, (sizeof(buff)-strlen(buff)-1));
@@ -473,10 +473,10 @@ tinyrad_urldesc_parse_url(
473 return(TRAD_EURL); 473 return(TRAD_EURL);
474 if (!(trud_host[0])) 474 if (!(trud_host[0]))
475 return(TRAD_EURL); 475 return(TRAD_EURL);
476 if (!(trud_secret)) 476
477 return(TRAD_EURL); 477 if ((trud_secret))
478 if (!(trud_secret[0])) 478 if (!(trud_secret[0]))
479 return(TRAD_EURL); 479 trud_secret = NULL;
480 480
481 if (!(trudpp)) 481 if (!(trudpp))
482 return(TRAD_SUCCESS); 482 return(TRAD_SUCCESS);
@@ -492,31 +492,34 @@ tinyrad_urldesc_parse_url(
492 return(TRAD_ENOMEM); 492 return(TRAD_ENOMEM);
493 }; 493 };
494 494
495 if ((trudp->trud_secret = tinyrad_strdup(trud_secret)) == NULL) 495 if ((trud_secret))
496 { 496 {
497 tinyrad_urldesc_free(trudp); 497 if ((trudp->trud_secret = tinyrad_strdup(trud_secret)) == NULL)
498 return(TRAD_ENOMEM);
499 };
500 for(pos = 0; ((trudp->trud_secret[pos])); pos++)
501 {
502 switch(trudp->trud_secret[pos])
503 { 498 {
504 case '+': 499 tinyrad_urldesc_free(trudp);
505 trudp->trud_secret[pos] = ' '; 500 return(TRAD_ENOMEM);
506 break; 501 };
502 for(pos = 0; ((trudp->trud_secret[pos])); pos++)
503 {
504 switch(trudp->trud_secret[pos])
505 {
506 case '+':
507 trudp->trud_secret[pos] = ' ';
508 break;
507 509
508 case '%': 510 case '%':
509 hex[0] = trudp->trud_secret[pos+1]; 511 hex[0] = trudp->trud_secret[pos+1];
510 hex[1] = trudp->trud_secret[pos+2]; 512 hex[1] = trudp->trud_secret[pos+2];
511 hex[2] = '\0'; 513 hex[2] = '\0';
512 trudp->trud_secret[pos] = (char)strtol(hex, NULL, 16); 514 trudp->trud_secret[pos] = (char)strtol(hex, NULL, 16);
513 for(x = pos+1; ((trudp->trud_secret[x+2])); x++) 515 for(x = pos+1; ((trudp->trud_secret[x+2])); x++)
516 trudp->trud_secret[x] = trudp->trud_secret[x+2];
514 trudp->trud_secret[x] = trudp->trud_secret[x+2]; 517 trudp->trud_secret[x] = trudp->trud_secret[x+2];
515 trudp->trud_secret[x] = trudp->trud_secret[x+2]; 518 break;
516 break;
517 519
518 default: 520 default:
519 break; 521 break;
522 };
520 }; 523 };
521 }; 524 };
522 525
@@ -552,7 +555,7 @@ tinyrad_urldesc_resolve(
552 TinyRadDebug(TRAD_DEBUG_ARGS, " == %s(trudp)", __func__); 555 TinyRadDebug(TRAD_DEBUG_ARGS, " == %s(trudp)", __func__);
553 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_host: %s", trudp->trud_host); 556 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_host: %s", trudp->trud_host);
554 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_port: %i", trudp->trud_port); 557 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_port: %i", trudp->trud_port);
555 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_secret: %s", trudp->trud_secret); 558 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_secret: %s", (((trudp->trud_secret)) ? trudp->trud_secret : "n/a"));
556 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_opts: 0x%04x", trudp->trud_opts); 559 TinyRadDebug(TRAD_DEBUG_ARGS, " => trudp->trud_opts: 0x%04x", trudp->trud_opts);
557 560
558 // clear existing sockaddrs 561 // clear existing sockaddrs
diff --git a/src/tinyrad-url.c b/src/tinyrad-url.c
index 91b4bf0..00d432a 100644
--- a/src/tinyrad-url.c
+++ b/src/tinyrad-url.c
@@ -259,7 +259,7 @@ int my_print_urldesc( TinyRadURLDesc * trudp)
259 printf(" scheme: %s\n", scheme); 259 printf(" scheme: %s\n", scheme);
260 printf(" host: %s\n", trudp->trud_host); 260 printf(" host: %s\n", trudp->trud_host);
261 printf(" port: %i\n", trudp->trud_port); 261 printf(" port: %i\n", trudp->trud_port);
262 printf(" secret: %s\n", trudp->trud_secret); 262 printf(" secret: %s\n", (((trudp->trud_secret)) ? trudp->trud_secret : "n/a"));
263 printf(" protocol: %s\n", ((trudp->trud_opts & TRAD_TCP)) ? "tcp" : "udp"); 263 printf(" protocol: %s\n", ((trudp->trud_opts & TRAD_TCP)) ? "tcp" : "udp");
264 if ( ((trudp->trud_sockaddrs)) && ((trudp->trud_sockaddrs[0])) ) 264 if ( ((trudp->trud_sockaddrs)) && ((trudp->trud_sockaddrs[0])) )
265 { 265 {
@@ -299,10 +299,10 @@ void my_usage(void)
299 printf(" -r, --resolve resolve URLs\n"); 299 printf(" -r, --resolve resolve URLs\n");
300 printf("\n"); 300 printf("\n");
301 printf("URL Syntax:\n"); 301 printf("URL Syntax:\n");
302 printf(" radius://hostport/secret[?proto] use RFC2865 (udp/port 1812)\n"); 302 printf(" radius://hostport/[secret][?proto] use RFC2865 (udp/port 1812)\n");
303 printf(" radius-acct://hostport/secret[?proto] use RFC2866 (udp/port 1813)\n"); 303 printf(" radius-acct://hostport/[secret][?proto] use RFC2866 (udp/port 1813)\n");
304 printf(" radsec://hostport/[?proto] use RFC6614/RFC7360 (tcp/port 2083)\n"); 304 printf(" radsec://hostport/[?proto] use RFC6614/RFC7360 (tcp/port 2083)\n");
305 printf(" radius-dynauth://hostport/secret[?proto] use RFC5176 (udp/port 3799)\n"); 305 printf(" radius-dynauth://hostport/[secret][?proto] use RFC5176 (udp/port 3799)\n");
306 printf("\n"); 306 printf("\n");
307 printf(" where:\n"); 307 printf(" where:\n");
308 printf(" 'hostport' is a host name with an optional ':portnumber'\n"); 308 printf(" 'hostport' is a host name with an optional ':portnumber'\n");
diff --git a/tests/common-url.c b/tests/common-url.c
index 310775a..1f9d62f 100644
--- a/tests/common-url.c
+++ b/tests/common-url.c
@@ -71,48 +71,30 @@ const char * test_urldesc_strs_bad[] =
71 "radius:///drowssap", 71 "radius:///drowssap",
72 "radius:/www.foo.org/drowssap", 72 "radius:/www.foo.org/drowssap",
73 "radius:///www.foo.org/drowssap", 73 "radius:///www.foo.org/drowssap",
74 "radius://www.foo.org",
75 "radius://www.foo.org/",
76 "radius://www.foo.org/?", 74 "radius://www.foo.org/?",
77 "radius://www.foo.org/?udp",
78 "radius://www.foo.org/?tcp",
79 "radius://www.foo.org/drowssap?", 75 "radius://www.foo.org/drowssap?",
80 "radius://www.foo.org/drowssap?u", 76 "radius://www.foo.org/drowssap?u",
81 "radius://www.foo.org:", 77 "radius://www.foo.org:",
82 "radius://www.foo.org:1111",
83 "radius://www.foo.org:1111/",
84 "radius://www.foo.org:1111/drowssap?", 78 "radius://www.foo.org:1111/drowssap?",
85 "radius://www.foo.org:1111/drowssap?u", 79 "radius://www.foo.org:1111/drowssap?u",
86 80
87 "radius-acct:///drowssap", 81 "radius-acct:///drowssap",
88 "radius-acct:/www.foo.org/drowssap", 82 "radius-acct:/www.foo.org/drowssap",
89 "radius-acct:///www.foo.org/drowssap", 83 "radius-acct:///www.foo.org/drowssap",
90 "radius-acct://www.foo.org",
91 "radius-acct://www.foo.org/",
92 "radius-acct://www.foo.org/?", 84 "radius-acct://www.foo.org/?",
93 "radius-acct://www.foo.org/?udp",
94 "radius-acct://www.foo.org/?tcp",
95 "radius-acct://www.foo.org/drowssap?", 85 "radius-acct://www.foo.org/drowssap?",
96 "radius-acct://www.foo.org/drowssap?u", 86 "radius-acct://www.foo.org/drowssap?u",
97 "radius-acct://www.foo.org:", 87 "radius-acct://www.foo.org:",
98 "radius-acct://www.foo.org:1111",
99 "radius-acct://www.foo.org:1111/",
100 "radius-acct://www.foo.org:1111/drowssap?", 88 "radius-acct://www.foo.org:1111/drowssap?",
101 "radius-acct://www.foo.org:1111/drowssap?u", 89 "radius-acct://www.foo.org:1111/drowssap?u",
102 90
103 "radius-dynauth:///drowssap", 91 "radius-dynauth:///drowssap",
104 "radius-dynauth:/www.foo.org/drowssap", 92 "radius-dynauth:/www.foo.org/drowssap",
105 "radius-dynauth:///www.foo.org/drowssap", 93 "radius-dynauth:///www.foo.org/drowssap",
106 "radius-dynauth://www.foo.org",
107 "radius-dynauth://www.foo.org/",
108 "radius-dynauth://www.foo.org/?", 94 "radius-dynauth://www.foo.org/?",
109 "radius-dynauth://www.foo.org/?udp",
110 "radius-dynauth://www.foo.org/?tcp",
111 "radius-dynauth://www.foo.org/drowssap?", 95 "radius-dynauth://www.foo.org/drowssap?",
112 "radius-dynauth://www.foo.org/drowssap?u", 96 "radius-dynauth://www.foo.org/drowssap?u",
113 "radius-dynauth://www.foo.org:", 97 "radius-dynauth://www.foo.org:",
114 "radius-dynauth://www.foo.org:1111",
115 "radius-dynauth://www.foo.org:1111/",
116 "radius-dynauth://www.foo.org:1111/drowssap?", 98 "radius-dynauth://www.foo.org:1111/drowssap?",
117 "radius-dynauth://www.foo.org:1111/drowssap?u", 99 "radius-dynauth://www.foo.org:1111/drowssap?u",
118 100
@@ -136,6 +118,8 @@ const char * test_urldesc_strs_bad[] =
136#pragma mark test_urldesc_strs_desc2str[] 118#pragma mark test_urldesc_strs_desc2str[]
137const char * test_urldesc_strs_desc2str[] = 119const char * test_urldesc_strs_desc2str[] =
138{ 120{
121 "radius://www.foo.org/",
122 "radius://www.foo.org/?tcp",
139 "radius://www.foo.org/drowssap", 123 "radius://www.foo.org/drowssap",
140 "radius://www.foo.org/drow+ssap", 124 "radius://www.foo.org/drow+ssap",
141 "radius://www.foo.org/drow+ssap+", 125 "radius://www.foo.org/drow+ssap+",
@@ -144,6 +128,7 @@ const char * test_urldesc_strs_desc2str[] =
144 "radius://www.foo.org/drow+ssap?tcp", 128 "radius://www.foo.org/drow+ssap?tcp",
145 "radius://www.foo.org/drow+ssap+?tcp", 129 "radius://www.foo.org/drow+ssap+?tcp",
146 "radius://www.foo.org/drow+ss%2aap+%2a?tcp", 130 "radius://www.foo.org/drow+ss%2aap+%2a?tcp",
131 "radius://www.foo.org:1111/",
147 "radius://www.foo.org:1111/drowssap", 132 "radius://www.foo.org:1111/drowssap",
148 "radius://www.foo.org:1111/drow+ssap", 133 "radius://www.foo.org:1111/drow+ssap",
149 "radius://www.foo.org:1111/drow+ssap+", 134 "radius://www.foo.org:1111/drow+ssap+",
@@ -175,8 +160,11 @@ const char * test_urldesc_strs_desc2str[] =
175 "radius://[::1]/drow+ss%2aap+%2a radius://www.foo.org/drow+ss%2aap+%2a", 160 "radius://[::1]/drow+ss%2aap+%2a radius://www.foo.org/drow+ss%2aap+%2a",
176 "radius://[::1]/drowssap?tcp radius://www.foo.org/drowssap?tcp", 161 "radius://[::1]/drowssap?tcp radius://www.foo.org/drowssap?tcp",
177 162
163 "radius-acct://www.foo.org/",
164 "radius-acct://www.foo.org/?tcp",
178 "radius-acct://www.foo.org/drowssap", 165 "radius-acct://www.foo.org/drowssap",
179 "radius-acct://www.foo.org/drowssap?tcp", 166 "radius-acct://www.foo.org/drowssap?tcp",
167 "radius-acct://www.foo.org:1111/",
180 "radius-acct://www.foo.org:1111/drowssap", 168 "radius-acct://www.foo.org:1111/drowssap",
181 "radius-acct://www.foo.org:1111/drowssap?tcp", 169 "radius-acct://www.foo.org:1111/drowssap?tcp",
182 "radius-acct://[::1]/drowssap", 170 "radius-acct://[::1]/drowssap",
@@ -184,8 +172,11 @@ const char * test_urldesc_strs_desc2str[] =
184 "radius-acct://[::1]:1111/drowssap", 172 "radius-acct://[::1]:1111/drowssap",
185 "radius-acct://[::1]:1111/drowssap?tcp", 173 "radius-acct://[::1]:1111/drowssap?tcp",
186 174
175 "radius-dynauth://www.foo.org/",
176 "radius-dynauth://www.foo.org/?tcp",
187 "radius-dynauth://www.foo.org/drowssap", 177 "radius-dynauth://www.foo.org/drowssap",
188 "radius-dynauth://www.foo.org/drowssap?tcp", 178 "radius-dynauth://www.foo.org/drowssap?tcp",
179 "radius-dynauth://www.foo.org:1111/",
189 "radius-dynauth://www.foo.org:1111/drowssap", 180 "radius-dynauth://www.foo.org:1111/drowssap",
190 "radius-dynauth://www.foo.org:1111/drowssap?tcp", 181 "radius-dynauth://www.foo.org:1111/drowssap?tcp",
191 "radius-dynauth://[::1]/drowssap", 182 "radius-dynauth://[::1]/drowssap",
@@ -208,11 +199,17 @@ const char * test_urldesc_strs_desc2str[] =
208#pragma mark test_urldesc_strs_good[] 199#pragma mark test_urldesc_strs_good[]
209const char * test_urldesc_strs_good[] = 200const char * test_urldesc_strs_good[] =
210{ 201{
202 "radius://www.foo.org",
203 "radius://www.foo.org/?udp",
211 "radius://www.foo.org/drowssap", 204 "radius://www.foo.org/drowssap",
212 "radius://www.foo.org/drowssap?tcp", 205 "radius://www.foo.org/drowssap?tcp",
213 "radius://www.foo.org/drowssap?udp", 206 "radius://www.foo.org/drowssap?udp",
207 "radius://www.foo.org:1111",
208 "radius://www.foo.org:1111/?udp",
214 "radius://www.foo.org:1111/drowssap", 209 "radius://www.foo.org:1111/drowssap",
215 "radius://www.foo.org:1111/drowssap?tcp", 210 "radius://www.foo.org:1111/drowssap?tcp",
211 "radius://[::1]",
212 "radius://[::1]/?udp",
216 "radius://[::1]/drowssap", 213 "radius://[::1]/drowssap",
217 "radius://[::1]/drowssap?tcp", 214 "radius://[::1]/drowssap?tcp",
218 "radius://[::1]/drowssap?udp", 215 "radius://[::1]/drowssap?udp",
@@ -220,12 +217,18 @@ const char * test_urldesc_strs_good[] =
220 "radius://[::1]:1111/drowssap?tcp", 217 "radius://[::1]:1111/drowssap?tcp",
221 "radius://[::1]:1111/drowssap?udp", 218 "radius://[::1]:1111/drowssap?udp",
222 219
220 "radius-acct://www.foo.org",
221 "radius-acct://www.foo.org/?udp",
223 "radius-acct://www.foo.org/drowssap", 222 "radius-acct://www.foo.org/drowssap",
224 "radius-acct://www.foo.org/drowssap?tcp", 223 "radius-acct://www.foo.org/drowssap?tcp",
225 "radius-acct://www.foo.org/drowssap?udp", 224 "radius-acct://www.foo.org/drowssap?udp",
225 "radius-acct://www.foo.org:1111",
226 "radius-acct://www.foo.org:1111/?udp",
226 "radius-acct://www.foo.org:1111/drowssap", 227 "radius-acct://www.foo.org:1111/drowssap",
227 "radius-acct://www.foo.org:1111/drowssap?tcp", 228 "radius-acct://www.foo.org:1111/drowssap?tcp",
228 "radius-acct://www.foo.org:1111/drowssap?udp", 229 "radius-acct://www.foo.org:1111/drowssap?udp",
230 "radius-acct://[::1]",
231 "radius-acct://[::1]/?udp",
229 "radius-acct://[::1]/drowssap", 232 "radius-acct://[::1]/drowssap",
230 "radius-acct://[::1]/drowssap?tcp", 233 "radius-acct://[::1]/drowssap?tcp",
231 "radius-acct://[::1]/drowssap?udp", 234 "radius-acct://[::1]/drowssap?udp",
@@ -233,9 +236,12 @@ const char * test_urldesc_strs_good[] =
233 "radius-acct://[::1]:1111/drowssap?tcp", 236 "radius-acct://[::1]:1111/drowssap?tcp",
234 "radius-acct://[::1]:1111/drowssap?udp", 237 "radius-acct://[::1]:1111/drowssap?udp",
235 238
239 "radius-dynauth://www.foo.org",
240 "radius-dynauth://www.foo.org/?udp",
236 "radius-dynauth://www.foo.org/drowssap", 241 "radius-dynauth://www.foo.org/drowssap",
237 "radius-dynauth://www.foo.org/drowssap?tcp", 242 "radius-dynauth://www.foo.org/drowssap?tcp",
238 "radius-dynauth://www.foo.org/drowssap?udp", 243 "radius-dynauth://www.foo.org/drowssap?udp",
244 "radius-dynauth://www.foo.org:1111",
239 "radius-dynauth://www.foo.org:1111/drowssap", 245 "radius-dynauth://www.foo.org:1111/drowssap",
240 "radius-dynauth://www.foo.org:1111/drowssap?tcp", 246 "radius-dynauth://www.foo.org:1111/drowssap?tcp",
241 "radius-dynauth://www.foo.org:1111/drowssap?udp", 247 "radius-dynauth://www.foo.org:1111/drowssap?udp",