Skip to content

Commit 17ad69b

Browse files
authored
fix: hack to fix the checking of remote_addrs (#952)
* fix: hack to fix the checking of `remote_addrs`
1 parent b4ad55d commit 17ad69b

File tree

2 files changed

+142
-0
lines changed

2 files changed

+142
-0
lines changed

api/internal/core/store/validate.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,15 @@ func checkUpstream(upstream *entity.UpstreamDef) error {
193193
return nil
194194
}
195195

196+
func checkRemoteAddr(remoteAddrs []string) error {
197+
for _, remoteAddr := range remoteAddrs {
198+
if remoteAddr == "" {
199+
return fmt.Errorf("schema validate failed: invalid field remote_addrs")
200+
}
201+
}
202+
return nil
203+
}
204+
196205
func checkConf(reqBody interface{}) error {
197206
switch bodyType := reqBody.(type) {
198207
case *entity.Route:
@@ -201,6 +210,10 @@ func checkConf(reqBody interface{}) error {
201210
if err := checkUpstream(route.Upstream); err != nil {
202211
return err
203212
}
213+
// todo: this is a temporary method, we'll drop it later
214+
if err := checkRemoteAddr(route.RemoteAddrs); err != nil {
215+
return err
216+
}
204217
case *entity.Service:
205218
service := reqBody.(*entity.Service)
206219
if err := checkUpstream(service.Upstream); err != nil {

api/internal/core/store/validate_test.go

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,5 +247,134 @@ func TestAPISIXJsonSchemaValidator_checkUpstream(t *testing.T) {
247247
err = validator.Validate(route5)
248248
assert.NotNil(t, err)
249249
assert.EqualError(t, err, "schema validate failed: (root): Does not match pattern '^((uri|server_name|server_addr|request_uri|remote_port|remote_addr|query_string|host|hostname)|arg_[0-9a-zA-z_-]+)$'")
250+
}
251+
252+
func TestAPISIXJsonSchemaValidator_Route_checkRemoteAddr(t *testing.T) {
253+
tests := []struct {
254+
caseDesc string
255+
giveContent string
256+
wantNewErr error
257+
wantValidateErr error
258+
}{
259+
{
260+
caseDesc: "correct remote_addr",
261+
giveContent: `{
262+
"id": "1",
263+
"uri": "/*",
264+
"upstream": {
265+
"nodes": [{
266+
"host": "127.0.0.1",
267+
"port": 8080,
268+
"weight": 1
269+
}],
270+
"type": "roundrobin"
271+
},
272+
"remote_addr": "127.0.0.1"
273+
}`,
274+
},
275+
{
276+
caseDesc: "correct remote_addr (CIDR)",
277+
giveContent: `{
278+
"id": "1",
279+
"uri": "/*",
280+
"upstream": {
281+
"nodes": [{
282+
"host": "127.0.0.1",
283+
"port": 8080,
284+
"weight": 1
285+
}],
286+
"type": "roundrobin"
287+
},
288+
"remote_addr": "192.168.1.0/24"
289+
}`,
290+
},
291+
{
292+
caseDesc: "invalid remote_addr",
293+
giveContent: `{
294+
"id": "1",
295+
"uri": "/*",
296+
"upstream": {
297+
"nodes": [{
298+
"host": "127.0.0.1",
299+
"port": 8080,
300+
"weight": 1
301+
}],
302+
"type": "roundrobin"
303+
},
304+
"remote_addr": "127.0.0."
305+
}`,
306+
wantValidateErr: fmt.Errorf("schema validate failed: remote_addr: Must validate at least one schema (anyOf)\nremote_addr: Does not match pattern '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'"),
307+
},
308+
{
309+
caseDesc: "correct remote_addrs",
310+
giveContent: `{
311+
"id": "1",
312+
"uri": "/*",
313+
"upstream": {
314+
"nodes": [{
315+
"host": "127.0.0.1",
316+
"port": 8080,
317+
"weight": 1
318+
}],
319+
"type": "roundrobin"
320+
},
321+
"remote_addrs": ["127.0.0.1", "192.0.0.0/8", "::1", "fe80::1/64"]
322+
}`,
323+
},
324+
{
325+
caseDesc: "invalid remote_addrs",
326+
giveContent: `{
327+
"id": "1",
328+
"uri": "/*",
329+
"upstream": {
330+
"nodes": [{
331+
"host": "127.0.0.1",
332+
"port": 8080,
333+
"weight": 1
334+
}],
335+
"type": "roundrobin"
336+
},
337+
"remote_addrs": ["127.0.0.", "192.0.0.0/128", "::1"]
338+
}`,
339+
wantValidateErr: fmt.Errorf("schema validate failed: remote_addrs.0: Must validate at least one schema (anyOf)\nremote_addrs.0: Does not match pattern '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'\nremote_addrs.1: Must validate at least one schema (anyOf)\nremote_addrs.1: Does not match pattern '^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'"),
340+
},
341+
{
342+
caseDesc: "invalid remote_addrs (an empty string item)",
343+
giveContent: `{
344+
"id": "1",
345+
"uri": "/*",
346+
"upstream": {
347+
"nodes": [{
348+
"host": "127.0.0.1",
349+
"port": 8080,
350+
"weight": 1
351+
}],
352+
"type": "roundrobin"
353+
},
354+
"remote_addrs": [""]
355+
}`,
356+
wantValidateErr: fmt.Errorf("schema validate failed: invalid field remote_addrs"),
357+
},
358+
}
359+
360+
// todo: add a test case for "remote_addr": ""
361+
362+
for _, tc := range tests {
363+
validator, err := NewAPISIXJsonSchemaValidator("main.route")
364+
if err != nil {
365+
assert.Equal(t, tc.wantNewErr, err, tc.caseDesc)
366+
continue
367+
}
368+
route := &entity.Route{}
369+
err = json.Unmarshal([]byte(tc.giveContent), route)
370+
assert.Nil(t, err, tc.caseDesc)
250371

372+
err = validator.Validate(route)
373+
if tc.wantValidateErr == nil {
374+
assert.Equal(t, nil, err, tc.caseDesc)
375+
continue
376+
}
377+
378+
assert.Equal(t, tc.wantValidateErr, err, tc.caseDesc)
379+
}
251380
}

0 commit comments

Comments
 (0)