diff --git a/packages/api/internal/api/api.gen.go b/packages/api/internal/api/api.gen.go index c6cb45cf6a..2e6b69b447 100644 --- a/packages/api/internal/api/api.gen.go +++ b/packages/api/internal/api/api.gen.go @@ -14033,208 +14033,210 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "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", - "w4xuXZJV5Tfr/VT8XQg8X27/XwAAAP//", + "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", + "AQAA//8=", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/packages/api/internal/middleware/cors.go b/packages/api/internal/middleware/cors.go new file mode 100644 index 0000000000..658c9ad1fa --- /dev/null +++ b/packages/api/internal/middleware/cors.go @@ -0,0 +1,61 @@ +package middleware + +import ( + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" + + "github.com/e2b-dev/infra/packages/auth/pkg/auth" +) + +// allowedRequestHeaders enumerates the request headers a browser may send +// cross-origin. +var allowedRequestHeaders = []string{ + // Default headers + "Origin", + "Content-Length", + "Content-Type", + "User-Agent", + // API Key header + "Authorization", + "X-API-Key", + auth.HeaderTeamID, + // Custom headers sent from SDK + "browser", + "lang", + "lang_version", + "machine", + "os", + "package_version", + "processor", + "publisher", + "release", + "sdk_runtime", + "system", +} + +// exposedResponseHeaders enumerates the response headers a browser hands to JS +// cross-origin. Only the CORS-safelisted headers are readable by default, so a +// custom response header the API sets is invisible to browser clients until it +// is listed here. +var exposedResponseHeaders = []string{ + // Pagination cursor of the list endpoints + "X-Next-Token", + // Running sandbox total, set by GET /v2/sandboxes + "X-Total-Running", + // Rate limiting + "RateLimit-Limit", + "RateLimit-Remaining", + "RateLimit-Reset", + "Retry-After", +} + +// CORS returns the gin CORS middleware for the api service. +func CORS() gin.HandlerFunc { + config := cors.DefaultConfig() + // Allow all origins + config.AllowAllOrigins = true + config.AllowHeaders = allowedRequestHeaders + config.ExposeHeaders = exposedResponseHeaders + + return cors.New(config) +} diff --git a/packages/api/internal/middleware/cors_test.go b/packages/api/internal/middleware/cors_test.go new file mode 100644 index 0000000000..e1b34f0025 --- /dev/null +++ b/packages/api/internal/middleware/cors_test.go @@ -0,0 +1,62 @@ +package middleware + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/e2b-dev/infra/packages/api/internal/api" +) + +// TestCORSExposesSpecResponseHeaders asserts that every response header the +// OpenAPI spec declares is also exposed via CORS. Browsers withhold custom +// response headers from JS unless they are listed, so drift here silently +// breaks browser SDKs (e.g. pagination stops after the first page). +func TestCORSExposesSpecResponseHeaders(t *testing.T) { + t.Parallel() + + swagger, err := api.GetSpec() + require.NoError(t, err) + + exposed := make(map[string]struct{}, len(exposedResponseHeaders)) + for _, header := range exposedResponseHeaders { + exposed[strings.ToLower(header)] = struct{}{} + } + + for path, item := range swagger.Paths.Map() { + for method, operation := range item.Operations() { + for status, response := range operation.Responses.Map() { + for header := range response.Value.Headers { + assert.Containsf(t, exposed, strings.ToLower(header), + "%s %s (%s) declares response header %q, add it to exposedResponseHeaders", + method, path, status, header) + } + } + } + } +} + +// TestCORSSetsExposeHeaders asserts the middleware actually emits the +// Access-Control-Expose-Headers response header on a cross-origin request. +func TestCORSSetsExposeHeaders(t *testing.T) { + t.Parallel() + + r := gin.New() + r.Use(CORS()) + r.GET("/", func(c *gin.Context) { c.Status(http.StatusOK) }) + + req := httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/", nil) + // Must differ from the request host, otherwise the middleware treats the + // request as same-origin and skips the CORS headers entirely. + req.Header.Set("Origin", "https://app.e2b.dev") + w := httptest.NewRecorder() + r.ServeHTTP(w, req) + + require.Equal(t, http.StatusOK, w.Code) + assert.Contains(t, w.Header().Get("Access-Control-Expose-Headers"), "X-Next-Token") +} diff --git a/packages/api/main.go b/packages/api/main.go index 1e334ef13e..dcef272af2 100644 --- a/packages/api/main.go +++ b/packages/api/main.go @@ -18,7 +18,6 @@ import ( "github.com/getkin/kin-openapi/openapi3" "github.com/getkin/kin-openapi/openapi3filter" - "github.com/gin-contrib/cors" limits "github.com/gin-contrib/size" "github.com/gin-gonic/gin" "github.com/google/uuid" @@ -157,33 +156,7 @@ func NewGinServer(ctx context.Context, config cfg.Config, tel *telemetry.Client, sharedmiddleware.RequestTimeout(requestTimeout), //nolint:contextcheck // Gin middleware sets context via c.Request.WithContext ) - corsConfig := cors.DefaultConfig() - // Allow all origins - corsConfig.AllowAllOrigins = true - corsConfig.AllowHeaders = []string{ - // Default headers - "Origin", - "Content-Length", - "Content-Type", - "User-Agent", - // API Key header - "Authorization", - "X-API-Key", - auth.HeaderTeamID, - // Custom headers sent from SDK - "browser", - "lang", - "lang_version", - "machine", - "os", - "package_version", - "processor", - "publisher", - "release", - "sdk_runtime", - "system", - } - r.Use(cors.New(corsConfig)) + r.Use(customMiddleware.CORS()) // Create a team API Key auth validator AuthenticationFunc := auth.CreateAuthenticationFunc( diff --git a/spec/openapi.yml b/spec/openapi.yml index 7ae8dd32da..4e7e06740d 100644 --- a/spec/openapi.yml +++ b/spec/openapi.yml @@ -123,6 +123,19 @@ components: schema: type: string + headers: + XNextToken: + description: Cursor to fetch the next page of results, if more exist + schema: + type: string + XTotalRunning: + description: > + Number of running sandboxes matching the filters, before pagination is applied. + Only present when running sandboxes were requested. + schema: + type: integer + format: int32 + responses: "400": description: Bad request @@ -2286,6 +2299,11 @@ paths: responses: "200": description: Successfully returned all running sandboxes + headers: + X-Next-Token: + $ref: "#/components/headers/XNextToken" + X-Total-Running: + $ref: "#/components/headers/XTotalRunning" content: application/json: schema: @@ -2837,6 +2855,9 @@ paths: responses: "200": description: Successfully returned snapshots + headers: + X-Next-Token: + $ref: "#/components/headers/XNextToken" content: application/json: schema: @@ -2908,9 +2929,7 @@ paths: description: Successfully returned all templates headers: X-Next-Token: - description: Cursor to fetch the next page of results, if more exist - schema: - type: string + $ref: "#/components/headers/XNextToken" content: application/json: schema: @@ -3075,6 +3094,9 @@ paths: responses: "200": description: Successfully returned the template with its builds + headers: + X-Next-Token: + $ref: "#/components/headers/XNextToken" content: application/json: schema: