Skip to content

Commit 5ba8bf7

Browse files
committed
Fix certificate selector parsing
Fix string-based certificate selector parsing Add unit tests for certificate selector parsing
1 parent 223cb3b commit 5ba8bf7

7 files changed

+110
-21
lines changed

cmd/credentials.go

+33-21
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ var (
3838
X509_ISSUER_KEY = "x509Issuer"
3939
X509_SERIAL_KEY = "x509Serial"
4040

41-
validCertSelectorKeys = map[string]struct{}{
42-
"x509Subject": {},
43-
"x509Issuer": {},
44-
"x509Serial": {},
41+
validCertSelectorKeys = []string{
42+
X509_SUBJECT_KEY,
43+
X509_ISSUER_KEY,
44+
X509_SERIAL_KEY,
4545
}
4646
)
4747

@@ -87,18 +87,24 @@ func getStringMap(s string) (map[string]string, error) {
8787
}
8888
key := strings.TrimSpace(strings.Join(keyTokens[1:], "="))
8989

90+
isValidKey := false
91+
for _, validKey := range validCertSelectorKeys {
92+
if validKey == key {
93+
isValidKey = true
94+
break
95+
}
96+
}
97+
if !isValidKey {
98+
return nil, errors.New("cert selector contained invalid key")
99+
}
100+
90101
valueTokens := strings.Split(tokens[1], "=")
91102
if valueTokens[0] != "Value" {
92103
return nil, errors.New("invalid cert selector map value")
93104
}
94105
value := strings.TrimSpace(strings.Join(valueTokens[1:], "="))
95106
m[key] = value
96107
}
97-
for key := range m {
98-
if _, ok := m[key]; !ok {
99-
return nil, errors.New("invalid cert selector map key")
100-
}
101-
}
102108

103109
return m, nil
104110
}
@@ -112,6 +118,16 @@ func getMapFromJsonEntries(jsonStr string) (map[string]string, error) {
112118
return nil, errors.New("unable to parse JSON map entries")
113119
}
114120
for _, mapEntry := range mapEntries {
121+
isValidKey := false
122+
for _, validKey := range validCertSelectorKeys {
123+
if validKey == mapEntry.Key {
124+
isValidKey = true
125+
break
126+
}
127+
}
128+
if !isValidKey {
129+
return nil, errors.New("cert selector contained invalid key")
130+
}
115131
m[mapEntry.Key] = mapEntry.Value
116132
}
117133
return m, nil
@@ -146,16 +162,9 @@ func PopulateCertIdentifierFromJsonStr(jsonStr string) (helper.CertIdentifier, e
146162

147163
// Populates a CertIdentifier object using a cert selector string
148164
func PopulateCertIdentifierFromCertSelectorStr(certSelectorStr string) (helper.CertIdentifier, error) {
149-
var certIdentifier helper.CertIdentifier
150-
151-
err := json.Unmarshal([]byte(certSelector), &certIdentifier)
152-
certSelectorMap, err := getStringMap(certSelector)
165+
certSelectorMap, err := getStringMap(certSelectorStr)
153166
if err != nil {
154-
certSelectorMap, err = getMapFromJsonEntries(certSelector)
155-
if err != nil {
156-
msg := "unable to parse cert selector"
157-
return helper.CertIdentifier{}, errors.New(msg)
158-
}
167+
return helper.CertIdentifier{}, err
159168
}
160169

161170
return createCertSelectorFromMap(certSelectorMap), nil
@@ -173,11 +182,14 @@ func PopulateCertIdentifier(certSelector string) (helper.CertIdentifier, error)
173182
return helper.CertIdentifier{}, errors.New("unable to read cert selector file")
174183
}
175184
certIdentifier, err = PopulateCertIdentifierFromJsonStr(string(certSelectorFile[:]))
185+
if err != nil {
186+
return helper.CertIdentifier{}, errors.New("unable to parse JSON cert selector")
187+
}
176188
} else {
177189
certIdentifier, err = PopulateCertIdentifierFromCertSelectorStr(certSelector)
178-
}
179-
if err != nil {
180-
return helper.CertIdentifier{}, errors.New("unable to read cert selector")
190+
if err != nil {
191+
return helper.CertIdentifier{}, errors.New("unable to parse cert selector string")
192+
}
181193
}
182194
}
183195

cmd/credentials_test.go

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package cmd
2+
3+
import (
4+
"os"
5+
"testing"
6+
)
7+
8+
func TestMain(m *testing.M) {
9+
code := m.Run()
10+
os.Exit(code)
11+
}
12+
13+
func TestValidSelectorParsing(t *testing.T) {
14+
fixtures := []string{
15+
"file://../tst/selectors/valid-all-attributes-selector.json",
16+
"file://../tst/selectors/valid-some-attributes-selector.json",
17+
"Key=x509Subject,Value=CN=Subject Key=x509Issuer,Value=CN=Issuer Key=x509Serial,Value=15D19632234BF759A32802C0DA88F9E8AFC8702D",
18+
"Key=x509Issuer,Value=CN=Issuer",
19+
}
20+
for _, fixture := range fixtures {
21+
_, err := PopulateCertIdentifier(fixture)
22+
if err != nil {
23+
t.Log("Unable to populate cert identifier from selector")
24+
t.Fail()
25+
}
26+
}
27+
}
28+
29+
func TestInvalidSelectorParsing(t *testing.T) {
30+
fixtures := []string{
31+
"file://../tst/selectors/invalid-selector.json",
32+
"file://../tst/selectors/invalid-selector-2.json",
33+
"file://../tst/selectors/invalid-selector-3.json",
34+
"laksdjadf",
35+
"Key=laksdjf,Valalsd",
36+
"Key=aljsdf,Value=aljsdfadsf",
37+
}
38+
for _, fixture := range fixtures {
39+
_, err := PopulateCertIdentifier(fixture)
40+
if err == nil {
41+
t.Log("Expected parsing failure, but received none")
42+
t.Fail()
43+
}
44+
}
45+
}

tst/selectors/invalid-selector-2.json

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"lajsdf": "lajsdlfjadf"
3+
}

tst/selectors/invalid-selector-3.json

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"Key": "x509Serial",
3+
"Value": "alskjdfa"
4+
}

tst/selectors/invalid-selector.json

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
asldjf;laj;laweijncaljda
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[
2+
{
3+
"Key": "x509Subject",
4+
"Value": "CN=Subject"
5+
},
6+
{
7+
"Key": "x509Issuer",
8+
"Value": "CN=Issuer"
9+
},
10+
{
11+
"Key": "x509Serial",
12+
"Value": "15D19632234BF759A32802C0DA88F9E8AFC8702D"
13+
}
14+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[
2+
{
3+
"Key": "x509Subject",
4+
"Value": "CN=Subject"
5+
},
6+
{
7+
"Key": "x509Serial",
8+
"Value": "15D19632234BF759A32802C0DA88F9E8AFC8702D"
9+
}
10+
]

0 commit comments

Comments
 (0)