Skip to content

Commit 07f5db1

Browse files
authored
fix(waf): [124160075] update resource (#3382)
* add * add
1 parent 1d2d003 commit 07f5db1

19 files changed

+482
-70
lines changed

.changelog/3382.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
```release-note:enhancement
2+
resource/tencentcloud_waf_cc: support `cel_rule`, `logical_op`
3+
```
4+
5+
```release-note:enhancement
6+
resource/tencentcloud_waf_custom_white_rule: support `logical_op`
7+
```

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ require (
4646
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1107
4747
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033
4848
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148
49-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1164
49+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1170
5050
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1153
5151
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
5252
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1161
@@ -97,7 +97,7 @@ require (
9797
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tsf v1.0.674
9898
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.860
9999
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1154
100-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1163
100+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1170
101101
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792
102102
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199
103103
github.com/tencentyun/cos-go-sdk-v5 v0.7.64

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1163 h1:RZs
979979
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1163/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
980980
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1164 h1:qEzZCZf1sgvvrZ8ngws0gZlyW+sOdY0K9VXGm4AcvTE=
981981
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1164/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
982+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1170 h1:67TIDmxXDa73+7nFuyVVxtVswf83JPXiwBy1Xicv+xQ=
983+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1170/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
982984
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993 h1:WlPgXldQCxt7qi5Xrc6j6zTrsXWzN5BcOGs7Irq7fwQ=
983985
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993/go.mod h1:Z9U8zNtyuyKhjS0698wqsrG/kLx1TQ5CEixXBwVe7xY=
984986
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU=
@@ -1137,6 +1139,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1162 h1:gnmuUa
11371139
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1162/go.mod h1:bu3KAFeoJ1xDGQp72h9Le3FqbOcCcdomOUig3OqgcE4=
11381140
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1163 h1:dR/VWftnsFH/O18MaaM4DXDkBgFMIZYSWR4/6moy78A=
11391141
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1163/go.mod h1:RsiGONPLLzraDKCq1fs7bcm1OStioX7OWLXydoAmUf0=
1142+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1170 h1:kcQCWuI9zOkZgL5CK66HNAJmSWCSJxRrDxXT+j02CeE=
1143+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1170/go.mod h1:vTukVfThbBIc4lOf4eq/q51eEk78oZUJd2lAoJBOJwI=
11401144
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792 h1:NLgKNOIHWa38AmW7dyfI9Jlcp2Kr9VRD94f48pPNmxM=
11411145
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792/go.mod h1:Xz6vPV3gHlzPwtEcmWdWO1EUXJDgn2p7UMCXbJiVioQ=
11421146
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199 h1:hMBLtiJPnZ9GvA677cTB6ELBR6B68wCR2QY1sNoGQc4=

tencentcloud/services/waf/resource_tc_waf_bot_scene_ucb_rule.go

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package waf
22

33
import (
44
"context"
5+
"encoding/base64"
56
"fmt"
67
"log"
78
"strings"
@@ -437,12 +438,16 @@ func resourceTencentCloudWafBotSceneUCBRuleCreate(d *schema.ResourceData, meta i
437438
for _, item := range v.([]interface{}) {
438439
if ruleMap, ok := item.(map[string]interface{}); ok && ruleMap != nil {
439440
inOutputUCBRuleEntry := waf.InOutputUCBRuleEntry{}
441+
var base46Flag bool
440442
if v, ok := ruleMap["key"]; ok {
441443
inOutputUCBRuleEntry.Key = helper.String(v.(string))
442444
}
443445

444446
if v, ok := ruleMap["op"]; ok {
445447
inOutputUCBRuleEntry.Op = helper.String(v.(string))
448+
if v.(string) == "rematch" {
449+
base46Flag = true
450+
}
446451
}
447452

448453
if valueMap, ok := helper.InterfaceToMap(ruleMap, "value"); ok {
@@ -471,10 +476,20 @@ func resourceTencentCloudWafBotSceneUCBRuleCreate(d *schema.ResourceData, meta i
471476

472477
if v, ok := valueMap["multi_value"]; ok {
473478
multiValueSet := v.(*schema.Set).List()
474-
for i := range multiValueSet {
475-
if multiValueSet[i] != nil {
476-
multiValue := multiValueSet[i].(string)
477-
uCBEntryValue.MultiValue = append(uCBEntryValue.MultiValue, &multiValue)
479+
if base46Flag {
480+
for i := range multiValueSet {
481+
if multiValueSet[i] != nil {
482+
multiValue := multiValueSet[i].(string)
483+
bs64Str := helper.String(base64.URLEncoding.EncodeToString([]byte(multiValue)))
484+
uCBEntryValue.MultiValue = append(uCBEntryValue.MultiValue, bs64Str)
485+
}
486+
}
487+
} else {
488+
for i := range multiValueSet {
489+
if multiValueSet[i] != nil {
490+
multiValue := multiValueSet[i].(string)
491+
uCBEntryValue.MultiValue = append(uCBEntryValue.MultiValue, &multiValue)
492+
}
478493
}
479494
}
480495
}
@@ -767,12 +782,16 @@ func resourceTencentCloudWafBotSceneUCBRuleRead(d *schema.ResourceData, meta int
767782
tmpList := make([]map[string]interface{}, 0, len(respData.Rule))
768783
for _, item := range respData.Rule {
769784
dMap := make(map[string]interface{})
785+
var base46Flag bool
770786
if item.Key != nil {
771787
dMap["key"] = item.Key
772788
}
773789

774790
if item.Op != nil {
775791
dMap["op"] = item.Op
792+
if *item.Op == "rematch" {
793+
base46Flag = true
794+
}
776795
}
777796

778797
if item.Value != nil {
@@ -795,7 +814,21 @@ func resourceTencentCloudWafBotSceneUCBRuleRead(d *schema.ResourceData, meta int
795814
}
796815

797816
if item.Value.MultiValue != nil {
798-
valueMap["multi_value"] = item.Value.MultiValue
817+
if base46Flag {
818+
tmpMvList := make([]string, 0, len(item.Value.MultiValue))
819+
for _, item := range item.Value.MultiValue {
820+
decoded, e := base64.StdEncoding.DecodeString(*item)
821+
if e != nil {
822+
return fmt.Errorf("[%s] base64 decode error: %s", *item, e.Error())
823+
}
824+
825+
tmpMvList = append(tmpMvList, string(decoded))
826+
}
827+
828+
valueMap["multi_value"] = tmpMvList
829+
} else {
830+
valueMap["multi_value"] = item.Value.MultiValue
831+
}
799832
}
800833

801834
valueList = append(valueList, valueMap)
@@ -1028,12 +1061,16 @@ func resourceTencentCloudWafBotSceneUCBRuleUpdate(d *schema.ResourceData, meta i
10281061
for _, item := range v.([]interface{}) {
10291062
if ruleMap, ok := item.(map[string]interface{}); ok && ruleMap != nil {
10301063
inOutputUCBRuleEntry := waf.InOutputUCBRuleEntry{}
1064+
var base46Flag bool
10311065
if v, ok := ruleMap["key"]; ok {
10321066
inOutputUCBRuleEntry.Key = helper.String(v.(string))
10331067
}
10341068

10351069
if v, ok := ruleMap["op"]; ok {
10361070
inOutputUCBRuleEntry.Op = helper.String(v.(string))
1071+
if v.(string) == "rematch" {
1072+
base46Flag = true
1073+
}
10371074
}
10381075

10391076
if valueMap, ok := helper.InterfaceToMap(ruleMap, "value"); ok {
@@ -1062,10 +1099,20 @@ func resourceTencentCloudWafBotSceneUCBRuleUpdate(d *schema.ResourceData, meta i
10621099

10631100
if v, ok := valueMap["multi_value"]; ok {
10641101
multiValueSet := v.(*schema.Set).List()
1065-
for i := range multiValueSet {
1066-
if multiValueSet[i] != nil {
1067-
multiValue := multiValueSet[i].(string)
1068-
uCBEntryValue.MultiValue = append(uCBEntryValue.MultiValue, &multiValue)
1102+
if base46Flag {
1103+
for i := range multiValueSet {
1104+
if multiValueSet[i] != nil {
1105+
multiValue := multiValueSet[i].(string)
1106+
bs64Str := helper.String(base64.URLEncoding.EncodeToString([]byte(multiValue)))
1107+
uCBEntryValue.MultiValue = append(uCBEntryValue.MultiValue, bs64Str)
1108+
}
1109+
}
1110+
} else {
1111+
for i := range multiValueSet {
1112+
if multiValueSet[i] != nil {
1113+
multiValue := multiValueSet[i].(string)
1114+
uCBEntryValue.MultiValue = append(uCBEntryValue.MultiValue, &multiValue)
1115+
}
10691116
}
10701117
}
10711118
}

tencentcloud/services/waf/resource_tc_waf_bot_scene_ucb_rule.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ resource "tencentcloud_waf_bot_scene_ucb_rule" "example" {
2020
}
2121
}
2222
23+
rule {
24+
key = "url"
25+
op = "rematch"
26+
lang = "cn"
27+
value {
28+
multi_value = [
29+
"/prefix",
30+
"/startwith"
31+
]
32+
}
33+
}
34+
2335
action = "monitor"
2436
on_off = "on"
2537
rule_type = 0

tencentcloud/services/waf/resource_tc_waf_cc.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,17 @@ func ResourceTencentCloudWafCc() *schema.Resource {
120120
Computed: true,
121121
Description: "Frequency limiting method.",
122122
},
123+
"cel_rule": {
124+
Optional: true,
125+
Type: schema.TypeString,
126+
Description: "Cel expression.",
127+
},
128+
"logical_op": {
129+
Optional: true,
130+
Computed: true,
131+
Type: schema.TypeString,
132+
Description: "Logical operator of configuration mode, and/or.",
133+
},
123134
"rule_id": {
124135
Computed: true,
125136
Type: schema.TypeString,
@@ -218,6 +229,14 @@ func resourceTencentCloudWafCcCreate(d *schema.ResourceData, meta interface{}) e
218229
request.LimitMethod = helper.String(v.(string))
219230
}
220231

232+
if v, ok := d.GetOk("cel_rule"); ok {
233+
request.CelRule = helper.String(v.(string))
234+
}
235+
236+
if v, ok := d.GetOk("logical_op"); ok {
237+
request.LogicalOp = helper.String(v.(string))
238+
}
239+
221240
request.RuleId = helper.IntInt64(0)
222241
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
223242
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWafClient().UpsertCCRule(request)
@@ -337,6 +356,14 @@ func resourceTencentCloudWafCcRead(d *schema.ResourceData, meta interface{}) err
337356
_ = d.Set("limit_method", cc.LimitMethod)
338357
}
339358

359+
if cc.CelRule != nil {
360+
_ = d.Set("cel_rule", cc.CelRule)
361+
}
362+
363+
if cc.LogicalOp != nil {
364+
_ = d.Set("logical_op", cc.LogicalOp)
365+
}
366+
340367
if cc.RuleId != nil {
341368
ruleIdStr := strconv.FormatUint(*cc.RuleId, 10)
342369
_ = d.Set("rule_id", ruleIdStr)
@@ -439,6 +466,14 @@ func resourceTencentCloudWafCcUpdate(d *schema.ResourceData, meta interface{}) e
439466
request.LimitMethod = helper.String(v.(string))
440467
}
441468

469+
if v, ok := d.GetOk("cel_rule"); ok {
470+
request.CelRule = helper.String(v.(string))
471+
}
472+
473+
if v, ok := d.GetOk("logical_op"); ok {
474+
request.LogicalOp = helper.String(v.(string))
475+
}
476+
442477
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
443478
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseWafClient().UpsertCCRule(request)
444479
if e != nil {

tencentcloud/services/waf/resource_tc_waf_cc.md

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ Provides a resource to create a WAF cc
22

33
Example Usage
44

5+
If advance is 0(IP model)
6+
57
```hcl
68
resource "tencentcloud_waf_cc" "example" {
79
domain = "www.demo.com"
8-
name = "terraform"
10+
name = "tf-example"
911
status = 1
1012
advance = "0"
1113
limit = "60"
@@ -17,15 +19,82 @@ resource "tencentcloud_waf_cc" "example" {
1719
valid_time = 600
1820
edition = "sparta-waf"
1921
type = 1
22+
logical_op = "and"
2023
options_arr = jsonencode(
2124
[
25+
{
26+
"key" : "URL",
27+
"args" : [
28+
"=cHJlZml4"
29+
],
30+
"match" : "2",
31+
"encodeflag" : true
32+
},
2233
{
2334
"key" : "Method",
24-
"args" : ["=R0VU"],
35+
"args" : [
36+
"=POST" # if encodeflag is false, parameter value needs to be prefixed with an = sign.
37+
],
38+
"match" : "0",
39+
"encodeflag" : false
40+
},
41+
{
42+
"key" : "Post",
43+
"args" : [
44+
"S2V5=VmFsdWU"
45+
],
2546
"match" : "0",
2647
"encodeflag" : true
48+
},
49+
{
50+
"key" : "Referer",
51+
"args" : [
52+
"="
53+
],
54+
"match" : "12",
55+
"encodeflag" : true
56+
},
57+
{
58+
"key" : "Cookie",
59+
"args" : [
60+
"S2V5=VmFsdWU"
61+
],
62+
"match" : "3",
63+
"encodeflag" : true
64+
},
65+
{
66+
"key" : "IPLocation",
67+
"args" : [
68+
"=eyJMYW5nIjoiY24iLCJBcmVhcyI6W3siQ291bnRyeSI6IuWbveWkliJ9XX0"
69+
],
70+
"match" : "13",
71+
"encodeflag" : true
2772
}
2873
]
2974
)
3075
}
31-
```
76+
```
77+
78+
If advance is 1(SESSION model)
79+
80+
```hcl
81+
resource "tencentcloud_waf_cc" "example" {
82+
domain = "news.bots.icu"
83+
name = "tf-example"
84+
status = 1
85+
advance = "1"
86+
limit = "60"
87+
interval = "60"
88+
url = "/cc_demo"
89+
match_func = 0
90+
action_type = "22"
91+
priority = 50
92+
valid_time = 600
93+
edition = "sparta-waf"
94+
type = 1
95+
session_applied = [0]
96+
limit_method = "only_limit"
97+
logical_op = "or"
98+
cel_rule = "(has(request.url) && request.url.startsWith('/prefix')) && (has(request.method) && request.method == 'POST')"
99+
}
100+
```

0 commit comments

Comments
 (0)