|
8 | 8 | package libddwaf |
9 | 9 |
|
10 | 10 | import ( |
| 11 | + "bytes" |
11 | 12 | "encoding/json" |
12 | 13 | "maps" |
13 | 14 | "net/http" |
14 | 15 | "os" |
15 | 16 | "testing" |
| 17 | + "time" |
16 | 18 |
|
17 | | - "github.com/DataDog/go-libddwaf/v4/internal/log" |
18 | 19 | "github.com/DataDog/go-libddwaf/v4/timer" |
| 20 | + "github.com/stretchr/testify/assert" |
19 | 21 | "github.com/stretchr/testify/require" |
20 | 22 | ) |
21 | 23 |
|
22 | 24 | func TestBuilder(t *testing.T) { |
23 | | - wafLib.SetLogCb(log.CallbackFunctionPointer(), log.LevelDebug) |
24 | | - |
25 | 25 | if supported, err := Usable(); !supported || err != nil { |
26 | 26 | t.Skipf("target is not supported by the WAF: %v", err) |
27 | 27 | } |
@@ -299,4 +299,89 @@ func TestBuilder(t *testing.T) { |
299 | 299 | require.NotNil(t, handle) |
300 | 300 | handle.Close() |
301 | 301 | }) |
| 302 | + |
| 303 | + t.Run("blank-string-encoding", func(t *testing.T) { |
| 304 | + var rulesJSON = `{ |
| 305 | + "version": "2.1", |
| 306 | + "metadata": { |
| 307 | + "rules_version": "1.2.6" |
| 308 | + }, |
| 309 | + "rules": [ |
| 310 | + { |
| 311 | + "id": "canary_rule4", |
| 312 | + "name": "Canary 4", |
| 313 | + "tags": { |
| 314 | + "type": "security_scanner", |
| 315 | + "category": "attack_attempt" |
| 316 | + }, |
| 317 | + "conditions": [ |
| 318 | + { |
| 319 | + "parameters": { |
| 320 | + "inputs": [ |
| 321 | + { |
| 322 | + "address": "server.request.headers.no_cookies", |
| 323 | + "key_path": [ |
| 324 | + "user-agent" |
| 325 | + ] |
| 326 | + } |
| 327 | + ], |
| 328 | + "regex": "^Canary\\/v4" |
| 329 | + }, |
| 330 | + "operator": "match_regex" |
| 331 | + } |
| 332 | + ], |
| 333 | + "on_match": [ |
| 334 | + "block4" |
| 335 | + ] |
| 336 | + } |
| 337 | + ], |
| 338 | + "actions": [ |
| 339 | + { |
| 340 | + "id": "block4", |
| 341 | + "type": "redirect_request", |
| 342 | + "parameters": { |
| 343 | + "status_code": 303, |
| 344 | + "location": "" |
| 345 | + } |
| 346 | + } |
| 347 | + ] |
| 348 | + } |
| 349 | + ` |
| 350 | + |
| 351 | + builder, err := NewBuilder("", "") |
| 352 | + require.NoError(t, err) |
| 353 | + |
| 354 | + dec := json.NewDecoder(bytes.NewReader([]byte(rulesJSON))) |
| 355 | + dec.UseNumber() |
| 356 | + |
| 357 | + var rules map[string]any |
| 358 | + require.NoError(t, dec.Decode(&rules)) |
| 359 | + |
| 360 | + diag, err := builder.AddOrUpdateConfig("/", rules) |
| 361 | + require.NoError(t, err) |
| 362 | + diag.EachFeature(func(name string, feat *Feature) { |
| 363 | + assert.Empty(t, feat.Error, "feature %s has top-level error", name) |
| 364 | + assert.Empty(t, feat.Errors, "feature %s has errors", name) |
| 365 | + assert.Empty(t, feat.Warnings, "feature %s has warnings", name) |
| 366 | + }) |
| 367 | + |
| 368 | + waf := builder.Build() |
| 369 | + require.NotNil(t, waf) |
| 370 | + defer waf.Close() |
| 371 | + |
| 372 | + ctx, err := waf.NewContext(time.Hour) |
| 373 | + require.NoError(t, err) |
| 374 | + defer ctx.Close() |
| 375 | + |
| 376 | + res, err := ctx.Run(RunAddressData{ |
| 377 | + Persistent: map[string]any{ |
| 378 | + "server.request.headers.no_cookies": map[string][]string{ |
| 379 | + "user-agent": {"Canary/v4 bazinga"}, |
| 380 | + }, |
| 381 | + }, |
| 382 | + }) |
| 383 | + require.NoError(t, err) |
| 384 | + assert.NotEmpty(t, res.Events) |
| 385 | + assert.NotEmpty(t, res.Actions) |
| 386 | + }) |
302 | 387 | } |
0 commit comments