@@ -0,0 +1,52 @@
1+package validation
2+
3+import (
4+ "fmt"
5+
6+ "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
7+)
8+
9+func validateHeaders(headers []options.Header) []string {
10+ msgs := []string{}
11+ names := make(map[string]struct{})
12+
13+ for _, header := range headers {
14+ msgs = append(msgs, validateHeader(header, names)...)
15+ }
16+ return msgs
17+}
18+
19+func validateHeader(header options.Header, names map[string]struct{}) []string {
20+ msgs := []string{}
21+
22+ if header.Name == "" {
23+ msgs = append(msgs, "header has empty name: names are required for all headers")
24+ }
25+
26+ if _, ok := names[header.Name]; ok {
27+ msgs = append(msgs, fmt.Sprintf("multiple headers found with name %q: header names must be unique", header.Name))
28+ }
29+
30+ for _, value := range header.Values {
31+ msgs = append(msgs, validateHeaderValue(header.Name, value)...)
32+ }
33+ return msgs
34+}
35+
36+func validateHeaderValue(name string, value options.HeaderValue) []string {
37+ switch {
38+ case value.SecretSource != nil && value.ClaimSource == nil:
39+ return prefixValues("invalid header value: ", validateSecretSource(*value.SecretSource))
40+ case value.SecretSource == nil && value.ClaimSource != nil:
41+ return validateHeaderValueClaimSource(*value.ClaimSource)
42+ default:
43+ return []string{fmt.Sprintf("header %q value has multiple entries: only one entry per value is allowed", name)}
44+ }
45+}
46+
47+func validateHeaderValueClaimSource(claim options.ClaimSource) []string {
48+ if claim.BasicAuthPassword != nil {
49+ return prefixValues("invalid basicAuthPassword: ", validateSecretSource(*claim.BasicAuthPassword))
50+ }
51+ return []string{}
52+}