Skip to content

Commit f9e50b3

Browse files
committed
feat: add variable name enums
1 parent 7220a8b commit f9e50b3

File tree

4 files changed

+517
-115
lines changed

4 files changed

+517
-115
lines changed

types/secrule.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package types
22

33
import (
4+
"fmt"
45
"slices"
56
)
67

@@ -34,9 +35,9 @@ func (d SecRule) GetTransformations() Transformations {
3435
}
3536

3637
func (s *SecRule) AddVariable(name string, excluded bool) error {
37-
variable, err := GetVariable(name)
38-
if err != nil {
39-
return err
38+
variable := stringToVariableName(name)
39+
if variable == UNKNOWN_VAR {
40+
return fmt.Errorf("Invalid variable name: %s", name)
4041
}
4142
if excluded {
4243
vars := []Variable{}

types/update_target.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package types
22

33
import (
4+
"fmt"
45
"strconv"
56
)
67

@@ -22,9 +23,9 @@ func NewUpdateTargetDirective() *UpdateTargetDirective {
2223
}
2324

2425
func (d *UpdateTargetDirective) AddVariable(name string, excluded bool) error {
25-
variable, err := GetVariable(name)
26-
if err != nil {
27-
return err
26+
variable := stringToVariableName(name)
27+
if variable == UNKNOWN_VAR {
28+
return fmt.Errorf("Invalid variable name: %s", name)
2829
}
2930
if excluded {
3031
vars := []Variable{}

types/variable_test.go

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
package types
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
"go.yaml.in/yaml/v4"
8+
)
9+
10+
var (
11+
varTests = []struct {
12+
variable VariableName
13+
yamlStr string
14+
}{
15+
{ARGS_COMBINED_SIZE, "ARGS_COMBINED_SIZE"},
16+
{AUTH_TYPE, "AUTH_TYPE"},
17+
{DURATION, "DURATION"},
18+
{FILES_COMBINED_SIZE, "FILES_COMBINED_SIZE"},
19+
{FILES_NAMES, "FILES_NAMES"},
20+
{FILES_SIZES, "FILES_SIZES"},
21+
{FILES_TMP_CONTENT, "FILES_TMP_CONTENT"},
22+
{FILES_TMPNAMES, "FILES_TMPNAMES"},
23+
{FULL_REQUEST, "FULL_REQUEST"},
24+
{FULL_REQUEST_LENGTH, "FULL_REQUEST_LENGTH"},
25+
{HIGHEST_SEVERITY, "HIGHEST_SEVERITY"},
26+
{INBOUND_DATA_ERROR, "INBOUND_DATA_ERROR"},
27+
{MATCHED_VAR, "MATCHED_VAR"},
28+
{MATCHED_VAR_NAME, "MATCHED_VAR_NAME"},
29+
{MODSEC_BUILD, "MODSEC_BUILD"},
30+
{MSC_PCRE_LIMITS_EXCEEDED, "MSC_PCRE_LIMITS_EXCEEDED"},
31+
{MULTIPART_CRLF_LF_LINES, "MULTIPART_CRLF_LF_LINES"},
32+
{MULTIPART_FILENAME, "MULTIPART_FILENAME"},
33+
{MULTIPART_NAME, "MULTIPART_NAME"},
34+
{MULTIPART_STRICT_ERROR, "MULTIPART_STRICT_ERROR"},
35+
{MULTIPART_UNMATCHED_BOUNDARY, "MULTIPART_UNMATCHED_BOUNDARY"},
36+
{OUTBOUND_DATA_ERROR, "OUTBOUND_DATA_ERROR"},
37+
{PATH_INFO, "PATH_INFO"},
38+
{PERF_ALL, "PERF_ALL"},
39+
{PERF_COMBINED, "PERF_COMBINED"},
40+
{PERF_GC, "PERF_GC"},
41+
{PERF_LOGGING, "PERF_LOGGING"},
42+
{PERF_PHASE1, "PERF_PHASE1"},
43+
{PERF_PHASE2, "PERF_PHASE2"},
44+
{PERF_PHASE3, "PERF_PHASE3"},
45+
{PERF_PHASE4, "PERF_PHASE4"},
46+
{PERF_PHASE5, "PERF_PHASE5"},
47+
{PERF_SREAD, "PERF_SREAD"},
48+
{PERF_SWRITE, "PERF_SWRITE"},
49+
{QUERY_STRING, "QUERY_STRING"},
50+
{REMOTE_ADDR, "REMOTE_ADDR"},
51+
{REMOTE_HOST, "REMOTE_HOST"},
52+
{REMOTE_PORT, "REMOTE_PORT"},
53+
{REMOTE_USER, "REMOTE_USER"},
54+
{REQBODY_ERROR, "REQBODY_ERROR"},
55+
{REQBODY_ERROR_MSG, "REQBODY_ERROR_MSG"},
56+
{REQBODY_PROCESSOR, "REQBODY_PROCESSOR"},
57+
{REQUEST_BASENAME, "REQUEST_BASENAME"},
58+
{REQUEST_BODY, "REQUEST_BODY"},
59+
{REQUEST_BODY_LENGTH, "REQUEST_BODY_LENGTH"},
60+
{REQUEST_FILENAME, "REQUEST_FILENAME"},
61+
{REQUEST_LINE, "REQUEST_LINE"},
62+
{REQUEST_METHOD, "REQUEST_METHOD"},
63+
{REQUEST_PROTOCOL, "REQUEST_PROTOCOL"},
64+
{REQUEST_URI, "REQUEST_URI"},
65+
{REQUEST_URI_RAW, "REQUEST_URI_RAW"},
66+
{RESPONSE_BODY, "RESPONSE_BODY"},
67+
{RESPONSE_CONTENT_LENGTH, "RESPONSE_CONTENT_LENGTH"},
68+
{RESPONSE_CONTENT_TYPE, "RESPONSE_CONTENT_TYPE"},
69+
{RESPONSE_PROTOCOL, "RESPONSE_PROTOCOL"},
70+
{RESPONSE_STATUS, "RESPONSE_STATUS"},
71+
{RESOURCE, "RESOURCE"},
72+
{SCRIPT_BASENAME, "SCRIPT_BASENAME"},
73+
{SCRIPT_FILENAME, "SCRIPT_FILENAME"},
74+
{SCRIPT_GID, "SCRIPT_GID"},
75+
{SCRIPT_GROUPNAME, "SCRIPT_GROUPNAME"},
76+
{SCRIPT_MODE, "SCRIPT_MODE"},
77+
{SCRIPT_UID, "SCRIPT_UID"},
78+
{SCRIPT_USERNAME, "SCRIPT_USERNAME"},
79+
{SDBM_DELETE_ERROR, "SDBM_DELETE_ERROR"},
80+
{SERVER_ADDR, "SERVER_ADDR"},
81+
{SERVER_NAME, "SERVER_NAME"},
82+
{SERVER_PORT, "SERVER_PORT"},
83+
{SESSIONID, "SESSIONID"},
84+
{STATUS_LINE, "STATUS_LINE"},
85+
{STREAM_INPUT_BODY, "STREAM_INPUT_BODY"},
86+
{STREAM_OUTPUT_BODY, "STREAM_OUTPUT_BODY"},
87+
{TIME, "TIME"},
88+
{TIME_DAY, "TIME_DAY"},
89+
{TIME_EPOCH, "TIME_EPOCH"},
90+
{TIME_HOUR, "TIME_HOUR"},
91+
{TIME_MIN, "TIME_MIN"},
92+
{TIME_MON, "TIME_MON"},
93+
{TIME_SEC, "TIME_SEC"},
94+
{TIME_WDAY, "TIME_WDAY"},
95+
{TIME_YEAR, "TIME_YEAR"},
96+
{UNIQUE_ID, "UNIQUE_ID"},
97+
{URLENCODED_ERROR, "URLENCODED_ERROR"},
98+
{USER, "USER"},
99+
{USERAGENT_IP, "USERAGENT_IP"},
100+
{USERID, "USERID"},
101+
{WEBAPPID, "WEBAPPID"},
102+
{WEBSERVER_ERROR_LOG, "WEBSERVER_ERROR_LOG"},
103+
{MSC_PCRE_ERROR, "MSC_PCRE_ERROR"},
104+
{MULTIPART_BOUNDARY_QUOTED, "MULTIPART_BOUNDARY_QUOTED"},
105+
{MULTIPART_BOUNDARY_WHITESPACE, "MULTIPART_BOUNDARY_WHITESPACE"},
106+
{MULTIPART_DATA_AFTER, "MULTIPART_DATA_AFTER"},
107+
{MULTIPART_DATA_BEFORE, "MULTIPART_DATA_BEFORE"},
108+
{MULTIPART_FILE_LIMIT_EXCEEDED, "MULTIPART_FILE_LIMIT_EXCEEDED"},
109+
{MULTIPART_HEADER_FOLDING, "MULTIPART_HEADER_FOLDING"},
110+
{MULTIPART_INVALID_HEADER_FOLDING, "MULTIPART_INVALID_HEADER_FOLDING"},
111+
{MULTIPART_INVALID_PART, "MULTIPART_INVALID_PART"},
112+
{MULTIPART_INVALID_QUOTING, "MULTIPART_INVALID_QUOTING"},
113+
{MULTIPART_LF_LINE, "MULTIPART_LF_LINE"},
114+
{MULTIPART_MISSING_SEMICOLON, "MULTIPART_MISSING_SEMICOLON"},
115+
{MULTIPART_SEMICOLON_MISSING, "MULTIPART_SEMICOLON_MISSING"},
116+
{REQBODY_PROCESSOR_ERROR, "REQBODY_PROCESSOR_ERROR"},
117+
{REQBODY_PROCESSOR_ERROR_MSG, "REQBODY_PROCESSOR_ERROR_MSG"},
118+
{STATUS, "STATUS"},
119+
}
120+
)
121+
122+
func TestVariableNameToString(t *testing.T) {
123+
for _, tt := range varTests {
124+
t.Run(tt.yamlStr, func(t *testing.T) {
125+
if tt.variable.String() != tt.yamlStr {
126+
t.Errorf("Expected %q, got %q", tt.yamlStr, tt.variable.String())
127+
}
128+
})
129+
}
130+
}
131+
132+
func TestStringToVariableName(t *testing.T) {
133+
for _, tt := range varTests {
134+
t.Run(tt.yamlStr, func(t *testing.T) {
135+
variable := stringToVariableName(tt.yamlStr)
136+
if variable != tt.variable {
137+
t.Errorf("Expected %q, got %q", tt.variable, variable)
138+
}
139+
})
140+
}
141+
}
142+
143+
func TestMarshalVariableName(t *testing.T) {
144+
for _, tt := range varTests {
145+
t.Run(tt.yamlStr, func(t *testing.T) {
146+
data, err := yaml.Marshal(tt.variable)
147+
if err != nil {
148+
t.Fatalf("Failed to marshal: %v", err)
149+
}
150+
if string(data) != tt.yamlStr+"\n" {
151+
t.Errorf("Expected %q, got %q", tt.yamlStr+"\n", data)
152+
}
153+
})
154+
}
155+
}
156+
157+
func TestUnknownVariableName(t *testing.T) {
158+
t.Run("marshal unknown", func(t *testing.T) {
159+
unknown := UNKNOWN_VAR
160+
_, err := unknown.MarshalYAML()
161+
assert.Error(t, err)
162+
assert.Equal(t, "Unknown variable name", err.Error())
163+
})
164+
}

0 commit comments

Comments
 (0)