mirror of
https://github.com/gotenberg/gotenberg.git
synced 2026-08-16 04:12:16 +01:00
fix(chromium): accept case-insensitive values for the cookies' sameSite attribute - closes #1331
This commit is contained in:
@@ -24,6 +24,11 @@ import (
|
|||||||
"github.com/gotenberg/gotenberg/v8/pkg/modules/pdfengines"
|
"github.com/gotenberg/gotenberg/v8/pkg/modules/pdfengines"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var sameSiteRegexp = regexp2.MustCompile(
|
||||||
|
`("sameSite"\s*:\s*")(?i:(lax|strict|none))(")`,
|
||||||
|
regexp2.None,
|
||||||
|
)
|
||||||
|
|
||||||
// FormDataChromiumOptions creates [Options] from the form data. Fallback to
|
// FormDataChromiumOptions creates [Options] from the form data. Fallback to
|
||||||
// the default value if the considered key is not present.
|
// the default value if the considered key is not present.
|
||||||
func FormDataChromiumOptions(ctx *api.Context) (*api.FormData, Options) {
|
func FormDataChromiumOptions(ctx *api.Context) (*api.FormData, Options) {
|
||||||
@@ -84,7 +89,30 @@ func FormDataChromiumOptions(ctx *api.Context) (*api.FormData, Options) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
err := json.Unmarshal([]byte(value), &cookies)
|
// sameSite attribute from cookies must accept case-insensitive
|
||||||
|
// values.
|
||||||
|
// See https://github.com/gotenberg/gotenberg/issues/1331.
|
||||||
|
normalized, err := sameSiteRegexp.ReplaceFunc(value, func(m regexp2.Match) string {
|
||||||
|
groups := m.Groups()
|
||||||
|
provided := groups[2].String()
|
||||||
|
var canon string
|
||||||
|
switch strings.ToLower(provided) {
|
||||||
|
case "lax":
|
||||||
|
canon = "Lax"
|
||||||
|
case "strict":
|
||||||
|
canon = "Strict"
|
||||||
|
case "none":
|
||||||
|
canon = "None"
|
||||||
|
default:
|
||||||
|
canon = provided
|
||||||
|
}
|
||||||
|
return groups[1].String() + canon + groups[3].String()
|
||||||
|
}, -1, -1)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("normalize sameSite from cookies: %w")
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal([]byte(normalized), &cookies)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unmarshal cookies: %w", err)
|
return fmt.Errorf("unmarshal cookies: %w", err)
|
||||||
}
|
}
|
||||||
@@ -141,7 +169,7 @@ func FormDataChromiumOptions(ctx *api.Context) (*api.FormData, Options) {
|
|||||||
|
|
||||||
var scopeRegexp *regexp2.Regexp
|
var scopeRegexp *regexp2.Regexp
|
||||||
if len(scope) > 0 {
|
if len(scope) > 0 {
|
||||||
p, errCompile := regexp2.Compile(scope, 0)
|
p, errCompile := regexp2.Compile(scope, regexp2.None)
|
||||||
if errCompile != nil {
|
if errCompile != nil {
|
||||||
err = multierr.Append(err, fmt.Errorf("invalid scope regex pattern for header '%s': %w", k, errCompile))
|
err = multierr.Append(err, fmt.Errorf("invalid scope regex pattern for header '%s': %w", k, errCompile))
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -173,6 +173,22 @@ Feature: /forms/chromium/convert/url
|
|||||||
Then the server request cookie "cookie_1" should be "foo"
|
Then the server request cookie "cookie_1" should be "foo"
|
||||||
Then the server request cookie "cookie_2" should be ""
|
Then the server request cookie "cookie_2" should be ""
|
||||||
|
|
||||||
|
# See https://github.com/gotenberg/gotenberg/issues/1130.
|
||||||
|
Scenario: POST /forms/chromium/convert/url (case-insensitive sameSite)
|
||||||
|
Given I have a default Gotenberg container
|
||||||
|
Given I have a static server
|
||||||
|
When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/url" endpoint with the following form data and header(s):
|
||||||
|
| url | http://host.docker.internal:%d/html/testdata/page-1-html/index.html | field |
|
||||||
|
| cookies | [{"name":"cookie_1","value":"foo","domain":"host.docker.internal:%d"},{"name":"cookie_2","value":"bar","domain":"domain.com","sameSite":"lax"}] | field |
|
||||||
|
| Gotenberg-Output-Filename | foo | header |
|
||||||
|
Then the response status code should be 200
|
||||||
|
Then the response header "Content-Type" should be "application/pdf"
|
||||||
|
Then there should be 1 PDF(s) in the response
|
||||||
|
Then there should be the following file(s) in the response:
|
||||||
|
| foo.pdf |
|
||||||
|
Then the server request cookie "cookie_1" should be "foo"
|
||||||
|
Then the server request cookie "cookie_2" should be ""
|
||||||
|
|
||||||
Scenario: POST /forms/chromium/convert/url (Wait Delay)
|
Scenario: POST /forms/chromium/convert/url (Wait Delay)
|
||||||
Given I have a default Gotenberg container
|
Given I have a default Gotenberg container
|
||||||
Given I have a static server
|
Given I have a static server
|
||||||
|
|||||||
Reference in New Issue
Block a user