From 71050102baa7d3be53effebc75ea9093e6930c35 Mon Sep 17 00:00:00 2001 From: Jakub Kracina Date: Fri, 26 Jun 2026 12:46:46 +0200 Subject: [PATCH 1/2] feat(api): gate access token issuance behind feature flag --- packages/api/internal/api/api.gen.go | 377 +++++++++--------- packages/api/internal/handlers/accesstoken.go | 7 + .../api/internal/handlers/accesstoken_test.go | 38 ++ packages/shared/pkg/featureflags/flags.go | 6 + spec/openapi.yml | 5 +- tests/integration/internal/api/generated.go | 8 + 6 files changed, 256 insertions(+), 185 deletions(-) create mode 100644 packages/api/internal/handlers/accesstoken_test.go diff --git a/packages/api/internal/api/api.gen.go b/packages/api/internal/api/api.gen.go index 56939a1399..675ff84bc6 100644 --- a/packages/api/internal/api/api.gen.go +++ b/packages/api/internal/api/api.gen.go @@ -6210,6 +6210,7 @@ type PostAccessTokensResponse struct { HTTPResponse *http.Response JSON201 *CreatedAccessToken JSON401 *N401 + JSON403 *N403 JSON500 *N500 } @@ -8797,6 +8798,13 @@ func ParsePostAccessTokensResponse(rsp *http.Response) (*PostAccessTokensRespons } response.JSON401 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: + var dest N403 + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON403 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: var dest N500 if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -13719,190 +13727,191 @@ 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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", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/packages/api/internal/handlers/accesstoken.go b/packages/api/internal/handlers/accesstoken.go index 05c2f36792..144bac2c12 100644 --- a/packages/api/internal/handlers/accesstoken.go +++ b/packages/api/internal/handlers/accesstoken.go @@ -11,6 +11,7 @@ import ( "github.com/e2b-dev/infra/packages/auth/pkg/auth" authqueries "github.com/e2b-dev/infra/packages/db/pkg/auth/queries" "github.com/e2b-dev/infra/packages/db/pkg/dberrors" + "github.com/e2b-dev/infra/packages/shared/pkg/featureflags" "github.com/e2b-dev/infra/packages/shared/pkg/ginutils" "github.com/e2b-dev/infra/packages/shared/pkg/keys" "github.com/e2b-dev/infra/packages/shared/pkg/telemetry" @@ -21,6 +22,12 @@ func (a *APIStore) PostAccessTokens(c *gin.Context) { userID := auth.MustGetUserID(c) + if a.featureFlags.BoolFlag(ctx, featureflags.DisableAccessTokenIssuanceFlag, featureflags.UserContext(userID.String())) { + a.sendAPIStoreError(c, http.StatusForbidden, "Creating new access tokens is disabled. E2B_ACCESS_TOKEN is deprecated; use an API key (E2B_API_KEY) instead. See https://e2b.dev/docs/migration/access-token-deprecation") + + return + } + body, err := ginutils.ParseBody[api.NewAccessToken](ctx, c) if err != nil { a.sendAPIStoreError(c, http.StatusBadRequest, fmt.Sprintf("Error when parsing request: %s", err)) diff --git a/packages/api/internal/handlers/accesstoken_test.go b/packages/api/internal/handlers/accesstoken_test.go new file mode 100644 index 0000000000..18908c3f05 --- /dev/null +++ b/packages/api/internal/handlers/accesstoken_test.go @@ -0,0 +1,38 @@ +package handlers + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/gin-gonic/gin" + "github.com/google/uuid" + "github.com/launchdarkly/go-server-sdk/v7/testhelpers/ldtestdata" + "github.com/stretchr/testify/require" + + sharedauth "github.com/e2b-dev/infra/packages/auth/pkg/auth" + "github.com/e2b-dev/infra/packages/shared/pkg/featureflags" +) + +func TestPostAccessTokensRejectsWhenIssuanceDisabled(t *testing.T) { + t.Parallel() + + td := ldtestdata.DataSource() + td.Update(td.Flag(featureflags.DisableAccessTokenIssuanceFlag.Key()).VariationForAll(true)) + ff, err := featureflags.NewClientWithDatasource(td) + require.NoError(t, err) + t.Cleanup(func() { _ = ff.Close(t.Context()) }) + + recorder := httptest.NewRecorder() + ginCtx, _ := gin.CreateTestContext(recorder) + ginCtx.Request = httptest.NewRequestWithContext(t.Context(), http.MethodPost, "/access-tokens", strings.NewReader(`{"name":"my token"}`)) + ginCtx.Request.Header.Set("Content-Type", "application/json") + sharedauth.SetUserIDForTest(t, ginCtx, uuid.New()) + + store := &APIStore{featureFlags: ff} + store.PostAccessTokens(ginCtx) + + require.Equal(t, http.StatusForbidden, recorder.Code) + require.Contains(t, recorder.Body.String(), "E2B_API_KEY") +} diff --git a/packages/shared/pkg/featureflags/flags.go b/packages/shared/pkg/featureflags/flags.go index 95b71e0eda..5018c32513 100644 --- a/packages/shared/pkg/featureflags/flags.go +++ b/packages/shared/pkg/featureflags/flags.go @@ -219,6 +219,12 @@ var ( // from the in-progress snapshot pull, so pinning the retry to it avoids // re-pulling the snapshot onto yet another node. ResumeOriginNodeRemapFlag = NewBoolFlag("resume-origin-node-remap", false) + + // DisableAccessTokenIssuanceFlag stops POST /access-tokens from issuing new + // E2B access tokens (sk_e2b_) once enabled. E2B_ACCESS_TOKEN is deprecated in + // favor of E2B_API_KEY; the CLI now authenticates via Hydra JWTs. Off by + // default so issuance keeps working until the deprecation cutover. + DisableAccessTokenIssuanceFlag = NewBoolFlag("disable-access-token-issuance", false) ) // envdTimeoutFallbackMs reads ENVD_TIMEOUT (Go duration string, e.g. "10s") diff --git a/spec/openapi.yml b/spec/openapi.yml index 1c7f610894..4e26eb4f90 100644 --- a/spec/openapi.yml +++ b/spec/openapi.yml @@ -3534,7 +3534,8 @@ paths: /access-tokens: post: summary: Create access token - description: Create a new access token + description: Create a new access token. Deprecated; use an API key (E2B_API_KEY) instead. + deprecated: true tags: [access-tokens] security: - AuthProviderBearerAuth: [] @@ -3553,6 +3554,8 @@ paths: $ref: "#/components/schemas/CreatedAccessToken" "401": $ref: "#/components/responses/401" + "403": + $ref: "#/components/responses/403" "500": $ref: "#/components/responses/500" diff --git a/tests/integration/internal/api/generated.go b/tests/integration/internal/api/generated.go index 6670a629ea..4033a6d305 100644 --- a/tests/integration/internal/api/generated.go +++ b/tests/integration/internal/api/generated.go @@ -6205,6 +6205,7 @@ type PostAccessTokensResponse struct { HTTPResponse *http.Response JSON201 *CreatedAccessToken JSON401 *N401 + JSON403 *N403 JSON500 *N500 } @@ -8792,6 +8793,13 @@ func ParsePostAccessTokensResponse(rsp *http.Response) (*PostAccessTokensRespons } response.JSON401 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: + var dest N403 + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON403 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: var dest N500 if err := json.Unmarshal(bodyBytes, &dest); err != nil { From 2920b77cf712d3600ecf1cb00b22d26f547d544c Mon Sep 17 00:00:00 2001 From: Jakub Kracina Date: Fri, 26 Jun 2026 20:58:58 +0200 Subject: [PATCH 2/2] Use 410 instead of 403 --- packages/api/internal/api/api.gen.go | 379 +++++++++--------- packages/api/internal/handlers/accesstoken.go | 2 +- .../api/internal/handlers/accesstoken_test.go | 2 +- spec/openapi.yml | 10 +- tests/integration/internal/api/generated.go | 11 +- 5 files changed, 208 insertions(+), 196 deletions(-) diff --git a/packages/api/internal/api/api.gen.go b/packages/api/internal/api/api.gen.go index 675ff84bc6..5c492c7293 100644 --- a/packages/api/internal/api/api.gen.go +++ b/packages/api/internal/api/api.gen.go @@ -1488,6 +1488,9 @@ type N404 = Error // N409 defines model for 409. type N409 = Error +// N410 defines model for 410. +type N410 = Error + // N500 defines model for 500. type N500 = Error @@ -6210,7 +6213,7 @@ type PostAccessTokensResponse struct { HTTPResponse *http.Response JSON201 *CreatedAccessToken JSON401 *N401 - JSON403 *N403 + JSON410 *N410 JSON500 *N500 } @@ -8798,12 +8801,12 @@ func ParsePostAccessTokensResponse(rsp *http.Response) (*PostAccessTokensRespons } response.JSON401 = &dest - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: - var dest N403 + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 410: + var dest N410 if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } - response.JSON403 = &dest + response.JSON410 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: var dest N500 @@ -13728,190 +13731,190 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ "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", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/packages/api/internal/handlers/accesstoken.go b/packages/api/internal/handlers/accesstoken.go index 144bac2c12..2777135d00 100644 --- a/packages/api/internal/handlers/accesstoken.go +++ b/packages/api/internal/handlers/accesstoken.go @@ -23,7 +23,7 @@ func (a *APIStore) PostAccessTokens(c *gin.Context) { userID := auth.MustGetUserID(c) if a.featureFlags.BoolFlag(ctx, featureflags.DisableAccessTokenIssuanceFlag, featureflags.UserContext(userID.String())) { - a.sendAPIStoreError(c, http.StatusForbidden, "Creating new access tokens is disabled. E2B_ACCESS_TOKEN is deprecated; use an API key (E2B_API_KEY) instead. See https://e2b.dev/docs/migration/access-token-deprecation") + a.sendAPIStoreError(c, http.StatusGone, "Creating new access tokens is disabled. E2B_ACCESS_TOKEN is deprecated; use an API key (E2B_API_KEY) instead. See https://e2b.dev/docs/migration/access-token-deprecation") return } diff --git a/packages/api/internal/handlers/accesstoken_test.go b/packages/api/internal/handlers/accesstoken_test.go index 18908c3f05..78676450ab 100644 --- a/packages/api/internal/handlers/accesstoken_test.go +++ b/packages/api/internal/handlers/accesstoken_test.go @@ -33,6 +33,6 @@ func TestPostAccessTokensRejectsWhenIssuanceDisabled(t *testing.T) { store := &APIStore{featureFlags: ff} store.PostAccessTokens(ginCtx) - require.Equal(t, http.StatusForbidden, recorder.Code) + require.Equal(t, http.StatusGone, recorder.Code) require.Contains(t, recorder.Body.String(), "E2B_API_KEY") } diff --git a/spec/openapi.yml b/spec/openapi.yml index 4e26eb4f90..e0e980041a 100644 --- a/spec/openapi.yml +++ b/spec/openapi.yml @@ -150,6 +150,12 @@ components: application/json: schema: $ref: "#/components/schemas/Error" + "410": + description: Gone + content: + application/json: + schema: + $ref: "#/components/schemas/Error" "500": description: Server error content: @@ -3554,8 +3560,8 @@ paths: $ref: "#/components/schemas/CreatedAccessToken" "401": $ref: "#/components/responses/401" - "403": - $ref: "#/components/responses/403" + "410": + $ref: "#/components/responses/410" "500": $ref: "#/components/responses/500" diff --git a/tests/integration/internal/api/generated.go b/tests/integration/internal/api/generated.go index 4033a6d305..41fcb108a7 100644 --- a/tests/integration/internal/api/generated.go +++ b/tests/integration/internal/api/generated.go @@ -1483,6 +1483,9 @@ type N404 = Error // N409 defines model for 409. type N409 = Error +// N410 defines model for 410. +type N410 = Error + // N500 defines model for 500. type N500 = Error @@ -6205,7 +6208,7 @@ type PostAccessTokensResponse struct { HTTPResponse *http.Response JSON201 *CreatedAccessToken JSON401 *N401 - JSON403 *N403 + JSON410 *N410 JSON500 *N500 } @@ -8793,12 +8796,12 @@ func ParsePostAccessTokensResponse(rsp *http.Response) (*PostAccessTokensRespons } response.JSON401 = &dest - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 403: - var dest N403 + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 410: + var dest N410 if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } - response.JSON403 = &dest + response.JSON410 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: var dest N500