Allow CORS Access-Control-Allow-Origin: null
(#12402)
This commit is contained in:
parent
a5cd15d74a
commit
0a927b65af
2 changed files with 37 additions and 7 deletions
|
@ -40,12 +40,12 @@ var (
|
||||||
// that could cause the Response to contain some internal value/variable (like returning $pid, $upstream_addr, etc)
|
// that could cause the Response to contain some internal value/variable (like returning $pid, $upstream_addr, etc)
|
||||||
// Origin must contain a http/s Origin (including or not the port) or the value '*'
|
// Origin must contain a http/s Origin (including or not the port) or the value '*'
|
||||||
// This Regex is composed of the following:
|
// This Regex is composed of the following:
|
||||||
// * Sets a group that can be (https?://)?*?.something.com:port?
|
// * Sets a group that can be (https?://)?*?.something.com:port? OR null
|
||||||
// * Allows this to be repeated as much as possible, and separated by comma
|
// * Allows this to be repeated as much as possible, and separated by comma
|
||||||
// Otherwise it should be '*'
|
// Otherwise it should be '*'
|
||||||
corsOriginRegexValidator = regexp.MustCompile(`^(((([a-z]+://)?(\*\.)?[A-Za-z0-9\-.]*(:\d+)?,?)+)|\*)?$`)
|
corsOriginRegexValidator = regexp.MustCompile(`^((((([a-z]+://)?(\*\.)?[A-Za-z0-9\-.]*(:\d+)?,?)|null)+)|\*)?$`)
|
||||||
// corsOriginRegex defines the regex for validation inside Parse
|
// corsOriginRegex defines the regex for validation inside Parse
|
||||||
corsOriginRegex = regexp.MustCompile(`^([a-z]+://(\*\.)?[A-Za-z0-9\-.]*(:\d+)?|\*)?$`)
|
corsOriginRegex = regexp.MustCompile(`^([a-z]+://(\*\.)?[A-Za-z0-9\-.]*(:\d+)?|\*|null)?$`)
|
||||||
// Method must contain valid methods list (PUT, GET, POST, BLA)
|
// Method must contain valid methods list (PUT, GET, POST, BLA)
|
||||||
// May contain or not spaces between each verb
|
// May contain or not spaces between each verb
|
||||||
corsMethodsRegex = regexp.MustCompile(`^([A-Za-z]+,?\s?)+$`)
|
corsMethodsRegex = regexp.MustCompile(`^([A-Za-z]+,?\s?)+$`)
|
||||||
|
@ -78,7 +78,7 @@ var corsAnnotation = parser.Annotation{
|
||||||
Scope: parser.AnnotationScopeIngress,
|
Scope: parser.AnnotationScopeIngress,
|
||||||
Risk: parser.AnnotationRiskMedium,
|
Risk: parser.AnnotationRiskMedium,
|
||||||
Documentation: `This annotation controls what's the accepted Origin for CORS.
|
Documentation: `This annotation controls what's the accepted Origin for CORS.
|
||||||
This is a multi-valued field, separated by ','. It must follow this format: protocol://origin-site.com or protocol://origin-site.com:port
|
This is a multi-valued field, separated by ','. It must follow this format: protocol://origin-site.com, protocol://origin-site.com:port, null, or *.
|
||||||
It also supports single level wildcard subdomains and follows this format: https://*.foo.bar, http://*.bar.foo:8080 or myprotocol://*.abc.bar.foo:9000
|
It also supports single level wildcard subdomains and follows this format: https://*.foo.bar, http://*.bar.foo:8080 or myprotocol://*.abc.bar.foo:9000
|
||||||
Protocol can be any lowercase string, like http, https, or mycustomprotocol.`,
|
Protocol can be any lowercase string, like http, https, or mycustomprotocol.`,
|
||||||
},
|
},
|
||||||
|
|
|
@ -82,7 +82,7 @@ func TestIngressCorsConfigValid(t *testing.T) {
|
||||||
data[parser.GetAnnotationWithPrefix(corsAllowHeadersAnnotation)] = "DNT,X-CustomHeader, Keep-Alive,User-Agent"
|
data[parser.GetAnnotationWithPrefix(corsAllowHeadersAnnotation)] = "DNT,X-CustomHeader, Keep-Alive,User-Agent"
|
||||||
data[parser.GetAnnotationWithPrefix(corsAllowCredentialsAnnotation)] = "false"
|
data[parser.GetAnnotationWithPrefix(corsAllowCredentialsAnnotation)] = "false"
|
||||||
data[parser.GetAnnotationWithPrefix(corsAllowMethodsAnnotation)] = "GET, PATCH"
|
data[parser.GetAnnotationWithPrefix(corsAllowMethodsAnnotation)] = "GET, PATCH"
|
||||||
data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)] = "https://origin123.test.com:4443"
|
data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)] = "null, https://origin123.test.com:4443"
|
||||||
data[parser.GetAnnotationWithPrefix(corsExposeHeadersAnnotation)] = "*, X-CustomResponseHeader"
|
data[parser.GetAnnotationWithPrefix(corsExposeHeadersAnnotation)] = "*, X-CustomResponseHeader"
|
||||||
data[parser.GetAnnotationWithPrefix(corsMaxAgeAnnotation)] = "600"
|
data[parser.GetAnnotationWithPrefix(corsMaxAgeAnnotation)] = "600"
|
||||||
ing.SetAnnotations(data)
|
ing.SetAnnotations(data)
|
||||||
|
@ -113,7 +113,7 @@ func TestIngressCorsConfigValid(t *testing.T) {
|
||||||
t.Errorf("expected %v but returned %v", data[parser.GetAnnotationWithPrefix(corsAllowMethodsAnnotation)], nginxCors.CorsAllowMethods)
|
t.Errorf("expected %v but returned %v", data[parser.GetAnnotationWithPrefix(corsAllowMethodsAnnotation)], nginxCors.CorsAllowMethods)
|
||||||
}
|
}
|
||||||
|
|
||||||
if nginxCors.CorsAllowOrigin[0] != "https://origin123.test.com:4443" {
|
if !reflect.DeepEqual(nginxCors.CorsAllowOrigin, []string{"null", "https://origin123.test.com:4443"}) {
|
||||||
t.Errorf("expected %v but returned %v", data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)], nginxCors.CorsAllowOrigin)
|
t.Errorf("expected %v but returned %v", data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)], nginxCors.CorsAllowOrigin)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ func TestIngressCorsConfigInvalid(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIngresCorsConfigAllowOriginWithTrailingComma(t *testing.T) {
|
func TestIngressCorsConfigAllowOriginWithTrailingComma(t *testing.T) {
|
||||||
ing := buildIngress()
|
ing := buildIngress()
|
||||||
|
|
||||||
data := map[string]string{}
|
data := map[string]string{}
|
||||||
|
@ -206,6 +206,36 @@ func TestIngresCorsConfigAllowOriginWithTrailingComma(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIngressCorsConfigAllowOriginNull(t *testing.T) {
|
||||||
|
ing := buildIngress()
|
||||||
|
|
||||||
|
data := map[string]string{}
|
||||||
|
data[parser.GetAnnotationWithPrefix(corsEnableAnnotation)] = enableAnnotation
|
||||||
|
|
||||||
|
// Include a trailing comma and an empty value between the commas.
|
||||||
|
data[parser.GetAnnotationWithPrefix(corsAllowOriginAnnotation)] = "https://origin123.test.com:4443,null,https://origin321.test.com:4443"
|
||||||
|
ing.SetAnnotations(data)
|
||||||
|
|
||||||
|
corst, err := NewParser(&resolver.Mock{}).Parse(ing)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("error parsing annotations: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
nginxCors, ok := corst.(*Config)
|
||||||
|
if !ok {
|
||||||
|
t.Errorf("expected a Config type but returned %t", corst)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !nginxCors.CorsEnabled {
|
||||||
|
t.Errorf("expected %v but returned %v", data[parser.GetAnnotationWithPrefix(corsEnableAnnotation)], nginxCors.CorsEnabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedCorsAllowOrigins := []string{"https://origin123.test.com:4443", "null", "https://origin321.test.com:4443"}
|
||||||
|
if !reflect.DeepEqual(nginxCors.CorsAllowOrigin, expectedCorsAllowOrigins) {
|
||||||
|
t.Errorf("expected %v but returned %v", expectedCorsAllowOrigins, nginxCors.CorsAllowOrigin)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestIngressCorsConfigAllowOriginWithNonHttpProtocol(t *testing.T) {
|
func TestIngressCorsConfigAllowOriginWithNonHttpProtocol(t *testing.T) {
|
||||||
ing := buildIngress()
|
ing := buildIngress()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue