diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 60c4684b2..0807ddecd 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -33,10 +33,10 @@ updates: directory: "pkg/config/templates" schedule: interval: "daily" + commit-message: + prefix: "fix(docker): " groups: docker-minor: - exclude-patterns: - - supabase/logflare update-types: - minor - patch diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index 1e57b0afd..5cf15ef53 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -27,7 +27,7 @@ jobs: if: ${{ steps.meta.outputs.update-type == 'version-update:semver-patch' || (!startsWith(steps.meta.outputs.previous-version, '0.') && steps.meta.outputs.update-type == 'version-update:semver-minor') }} run: gh pr review --approve "${{ github.event.pull_request.html_url }}" env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GH_PAT }} # Finally, this sets the PR to allow auto-merging for patch and minor # updates if all checks pass @@ -35,4 +35,4 @@ jobs: if: ${{ steps.meta.outputs.update-type == 'version-update:semver-patch' || (!startsWith(steps.meta.outputs.previous-version, '0.') && steps.meta.outputs.update-type == 'version-update:semver-minor') }} run: gh pr merge --auto --squash "${{ github.event.pull_request.html_url }}" env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GH_PAT }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index e518cf1e5..7b69e3f7e 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -60,7 +60,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} @@ -88,6 +88,6 @@ jobs: exit 1 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/mirror-image.yml b/.github/workflows/mirror-image.yml index 9423799ce..d55881de5 100644 --- a/.github/workflows/mirror-image.yml +++ b/.github/workflows/mirror-image.yml @@ -29,7 +29,7 @@ jobs: TAG=${{ inputs.image }} echo "image=${TAG##*/}" >> $GITHUB_OUTPUT - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v5.0.0 + uses: aws-actions/configure-aws-credentials@v5.1.0 with: role-to-assume: ${{ secrets.PROD_AWS_ROLE }} aws-region: us-east-1 diff --git a/api/overlay.yaml b/api/overlay.yaml index b028333bd..9418cccd2 100644 --- a/api/overlay.yaml +++ b/api/overlay.yaml @@ -32,6 +32,9 @@ actions: - target: $.components.schemas.*.properties.connectionString description: Removes deprecated field that conflicts with naming convention remove: true +- target: $.components.schemas.*.properties.region_selection.discriminator + description: Replaces discriminated union with concrete type + remove: true - target: $.components.schemas.*.properties.private_jwk.discriminator description: Replaces discriminated union with concrete type remove: true diff --git a/cmd/login.go b/cmd/login.go index ca9aea666..d1d4086fd 100644 --- a/cmd/login.go +++ b/cmd/login.go @@ -6,6 +6,7 @@ import ( "github.com/go-errors/errors" "github.com/spf13/afero" "github.com/spf13/cobra" + "github.com/spf13/viper" "github.com/supabase/cli/internal/login" "github.com/supabase/cli/internal/utils" "golang.org/x/term" @@ -38,6 +39,13 @@ var ( } return login.Run(cmd.Context(), os.Stdout, params) }, + PostRunE: func(cmd *cobra.Command, args []string) error { + if prof := viper.GetString("PROFILE"); viper.IsSet("PROFILE") { + // Failure to save should block subsequent commands on CI + return utils.WriteFile(utils.ProfilePath, []byte(prof), afero.NewOsFs()) + } + return nil + }, } ) diff --git a/cmd/projects.go b/cmd/projects.go index 1a60b6170..fcf539af2 100644 --- a/cmd/projects.go +++ b/cmd/projects.go @@ -14,6 +14,7 @@ import ( "github.com/supabase/cli/internal/utils" "github.com/supabase/cli/internal/utils/flags" "github.com/supabase/cli/pkg/api" + "github.com/supabase/cli/pkg/cast" "golang.org/x/term" ) @@ -78,7 +79,7 @@ var ( Name: projectName, OrganizationId: orgId, DbPass: dbPassword, - Region: api.V1CreateProjectBodyRegion(region.Value), + Region: cast.Ptr(api.V1CreateProjectBodyRegion(region.Value)), } if cmd.Flags().Changed("size") { body.DesiredInstanceSize = (*api.V1CreateProjectBodyDesiredInstanceSize)(&size.Value) diff --git a/cmd/root.go b/cmd/root.go index db1cfabbc..8329cd86c 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -120,6 +120,7 @@ var ( if viper.GetBool("DEBUG") { http.DefaultTransport = debug.NewTransport() fmt.Fprintln(os.Stderr, cmd.Root().Short) + fmt.Fprintf(os.Stderr, "Using profile: %s (%s)\n", utils.CurrentProfile.Name, utils.CurrentProfile.ProjectHost) } cmd.SetContext(ctx) // Setup sentry last to ignore errors from parsing cli flags diff --git a/go.mod b/go.mod index b1aae5c68..25ad32be3 100644 --- a/go.mod +++ b/go.mod @@ -13,14 +13,15 @@ require ( github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 github.com/containerd/errdefs v1.0.0 github.com/containers/common v0.64.2 - github.com/docker/cli v28.4.0+incompatible - github.com/docker/docker v28.4.0+incompatible + github.com/docker/cli v28.5.1+incompatible + github.com/docker/docker v28.5.1+incompatible github.com/docker/go-connections v0.6.0 github.com/fsnotify/fsnotify v1.9.0 github.com/getsentry/sentry-go v0.35.3 github.com/go-errors/errors v1.5.1 - github.com/go-git/go-git/v5 v5.16.2 - github.com/go-playground/validator/v10 v10.27.0 + github.com/go-git/go-git/v5 v5.16.3 + github.com/go-playground/validator/v10 v10.28.0 + github.com/go-viper/mapstructure/v2 v2.4.0 github.com/go-xmlfmt/xmlfmt v1.1.3 github.com/golang-jwt/jwt/v5 v5.3.0 github.com/google/go-github/v62 v62.0.0 @@ -47,11 +48,11 @@ require ( github.com/withfig/autocomplete-tools/packages/cobra v1.2.0 github.com/zalando/go-keyring v0.2.6 go.opentelemetry.io/otel v1.38.0 - golang.org/x/mod v0.28.0 - golang.org/x/net v0.44.0 - golang.org/x/oauth2 v0.31.0 - golang.org/x/term v0.35.0 - google.golang.org/grpc v1.75.1 + golang.org/x/mod v0.29.0 + golang.org/x/net v0.46.0 + golang.org/x/oauth2 v0.32.0 + golang.org/x/term v0.36.0 + google.golang.org/grpc v1.76.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -134,7 +135,7 @@ require ( github.com/firefart/nonamedreturns v1.0.6 // indirect github.com/fvbommel/sortorder v1.1.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gabriel-vasile/mimetype v1.4.10 // indirect github.com/getkin/kin-openapi v0.131.0 // indirect github.com/ghostiam/protogetter v0.3.15 // indirect github.com/go-critic/go-critic v0.13.0 // indirect @@ -153,7 +154,6 @@ require ( github.com/go-toolsmith/astp v1.1.0 // indirect github.com/go-toolsmith/strparse v1.1.0 // indirect github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gofrs/flock v0.12.1 // indirect @@ -337,16 +337,16 @@ require ( go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.42.0 // indirect + golang.org/x/crypto v0.43.0 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/sync v0.17.0 // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/text v0.29.0 // indirect - golang.org/x/tools v0.36.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/tools v0.37.0 // indirect golang.org/x/tools/go/expect v0.1.1-deprecated // indirect golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 718c44908..ca58a3d3c 100644 --- a/go.sum +++ b/go.sum @@ -237,13 +237,13 @@ github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZ github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk= github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= -github.com/docker/cli v28.4.0+incompatible h1:RBcf3Kjw2pMtwui5V0DIMdyeab8glEw5QY0UUU4C9kY= -github.com/docker/cli v28.4.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v28.5.1+incompatible h1:ESutzBALAD6qyCLqbQSEf1a/U8Ybms5agw59yGVc+yY= +github.com/docker/cli v28.5.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v28.4.0+incompatible h1:KVC7bz5zJY/4AZe/78BIvCnPsLaC9T/zh72xnlrTTOk= -github.com/docker/docker v28.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v28.5.1+incompatible h1:Bm8DchhSD2J6PsFzxC35TZo4TLGR2PdW/E69rU45NhM= +github.com/docker/docker v28.5.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= @@ -296,8 +296,8 @@ github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQ github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= -github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0= +github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/getkin/kin-openapi v0.131.0 h1:NO2UeHnFKRYhZ8wg6Nyh5Cq7dHk4suQQr72a4pMrDxE= github.com/getkin/kin-openapi v0.131.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= github.com/getsentry/sentry-go v0.35.3 h1:u5IJaEqZyPdWqe/hKlBKBBnMTSxB/HenCqF3QLabeds= @@ -316,8 +316,8 @@ github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UN github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM= -github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= +github.com/go-git/go-git/v5 v5.16.3 h1:Z8BtvxZ09bYm/yYNgPKCzgWtaRqDTgIKRgIRHBfU6Z8= +github.com/go-git/go-git/v5 v5.16.3/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -342,8 +342,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= -github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/go-playground/validator/v10 v10.28.0 h1:Q7ibns33JjyW48gHkuFT91qX48KG0ktULL6FgHdG688= +github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3fFYbyDOpwMn5KXd+m2hUU= github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -1121,8 +1121,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1168,8 +1168,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1217,16 +1217,16 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= -golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1310,8 +1310,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1322,8 +1322,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1338,8 +1338,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1407,8 +1407,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= @@ -1472,10 +1472,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b h1:ULiyYQ0FdsJhwwZUwbaXpZF5yUE3h+RA+gxvBu37ucc= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:zPKJod4w6F1+nRGDI9ubnXYhU9NSWoFAijkHkUXeTK8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1489,8 +1489,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= -google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/internal/db/reset/reset.go b/internal/db/reset/reset.go index fd5b7e711..40aee23f5 100644 --- a/internal/db/reset/reset.go +++ b/internal/db/reset/reset.go @@ -142,7 +142,7 @@ func resetDatabase15(ctx context.Context, version string, fsys afero.Fs, options } func initDatabase(ctx context.Context, options ...func(*pgx.ConnConfig)) error { - conn, err := utils.ConnectLocalPostgres(ctx, pgconn.Config{User: "supabase_admin"}, options...) + conn, err := utils.ConnectLocalPostgres(ctx, pgconn.Config{User: utils.SUPERUSER_ROLE}, options...) if err != nil { return err } @@ -152,7 +152,7 @@ func initDatabase(ctx context.Context, options ...func(*pgx.ConnConfig)) error { // Recreate postgres database by connecting to template1 func recreateDatabase(ctx context.Context, options ...func(*pgx.ConnConfig)) error { - conn, err := utils.ConnectLocalPostgres(ctx, pgconn.Config{User: "supabase_admin", Database: "template1"}, options...) + conn, err := utils.ConnectLocalPostgres(ctx, pgconn.Config{User: utils.SUPERUSER_ROLE, Database: "template1"}, options...) if err != nil { return err } diff --git a/internal/db/start/start.go b/internal/db/start/start.go index 7febc9294..a70e39f1d 100644 --- a/internal/db/start/start.go +++ b/internal/db/start/start.go @@ -160,6 +160,7 @@ EOF ` + utils.Config.Db.RootKey.Value + ` EOF ` + utils.Config.Db.Settings.ToPostgresConfig() + ` +cron.launch_active_jobs = off EOF`} if !filepath.IsAbs(fromBackup) { fromBackup = filepath.Join(utils.CurrentDirAbs, fromBackup) @@ -180,15 +181,12 @@ EOF`} if _, err := utils.DockerStart(ctx, config, hostConfig, networkingConfig, utils.DbId); err != nil { return err } - if err := WaitForHealthyService(ctx, HealthTimeout, utils.DbId); err != nil { + // Ignore health check because restoring a large backup may take longer than 2 minutes + if err := WaitForHealthyService(ctx, HealthTimeout, utils.DbId); err != nil && len(fromBackup) == 0 { return err } // Initialize if we are on PG14 and there's no existing db volume - if len(fromBackup) > 0 { - if err := initSchema15(ctx, utils.DbId); err != nil { - return err - } - } else if utils.NoBackupVolume { + if utils.NoBackupVolume && len(fromBackup) == 0 { if err := SetupLocalDatabase(ctx, "", fsys, w, options...); err != nil { return err } @@ -272,18 +270,19 @@ func InitSchema14(ctx context.Context, conn *pgx.Conn) error { return file.ExecBatch(ctx, conn) } -func initRealtimeJob(host string) utils.DockerJob { +func initRealtimeJob(host, jwks string) utils.DockerJob { return utils.DockerJob{ Image: utils.Config.Realtime.Image, Env: []string{ "PORT=4000", "DB_HOST=" + host, "DB_PORT=5432", - "DB_USER=supabase_admin", + "DB_USER=" + utils.SUPERUSER_ROLE, "DB_PASSWORD=" + utils.Config.Db.Password, "DB_NAME=postgres", "DB_AFTER_CONNECT_QUERY=SET search_path TO _realtime", "DB_ENC_KEY=" + utils.Config.Realtime.EncryptionKey, + fmt.Sprintf("API_JWT_JWKS=%s", jwks), "API_JWT_SECRET=" + utils.Config.Auth.JwtSecret.Value, "METRICS_JWT_SECRET=" + utils.Config.Auth.JwtSecret.Value, "APP_NAME=realtime", @@ -341,7 +340,11 @@ func initSchema15(ctx context.Context, host string) error { // Apply service migrations var initJobs []utils.DockerJob if utils.Config.Realtime.Enabled { - initJobs = append(initJobs, initRealtimeJob(host)) + jwks, err := utils.Config.Auth.ResolveJWKS(context.Background()) + if err != nil { + return err + } + initJobs = append(initJobs, initRealtimeJob(host, jwks)) } if utils.Config.Storage.Enabled { initJobs = append(initJobs, initStorageJob(host)) diff --git a/internal/db/start/templates/restore.sh b/internal/db/start/templates/restore.sh index d13d608a1..3a1729ad9 100755 --- a/internal/db/start/templates/restore.sh +++ b/internal/db/start/templates/restore.sh @@ -27,6 +27,7 @@ cat "/etc/backup.sql" \ echo "$0: restoring schema" cat "/etc/backup.sql" \ +| sed -E 's/^\\(un)?restrict .*$/-- &/' \ | sed -E 's/^CREATE VIEW /CREATE OR REPLACE VIEW /' \ | sed -E 's/^CREATE FUNCTION /CREATE OR REPLACE FUNCTION /' \ | sed -E 's/^CREATE TRIGGER /CREATE OR REPLACE TRIGGER /' \ diff --git a/internal/functions/deploy/bundle.go b/internal/functions/deploy/bundle.go index f476bd31c..13b9a6360 100644 --- a/internal/functions/deploy/bundle.go +++ b/internal/functions/deploy/bundle.go @@ -130,6 +130,9 @@ func GetBindMounts(cwd, hostFuncDir, hostOutputDir, hostEntrypointPath, hostImpo // Remove any duplicate mount points for _, mod := range modules { hostPath := strings.Split(mod, ":")[0] + if volName := filepath.VolumeName(mod); len(volName) > 0 { + hostPath = volName + strings.Split(strings.TrimPrefix(mod, volName), ":")[0] + } if !strings.HasPrefix(hostPath, hostFuncDir) && (len(hostOutputDir) == 0 || !strings.HasPrefix(hostPath, hostOutputDir)) { binds = append(binds, mod) diff --git a/internal/link/link_test.go b/internal/link/link_test.go index 21de43389..686f12d46 100644 --- a/internal/link/link_test.go +++ b/internal/link/link_test.go @@ -21,7 +21,6 @@ import ( "github.com/supabase/cli/pkg/api" "github.com/supabase/cli/pkg/migration" "github.com/supabase/cli/pkg/pgtest" - "github.com/supabase/cli/pkg/pgxv5" "github.com/zalando/go-keyring" ) @@ -48,7 +47,7 @@ func TestLinkCommand(t *testing.T) { // Setup mock postgres conn := pgtest.NewConn() defer conn.Close(t) - conn.Query(pgxv5.SET_SESSION_ROLE). + conn.Query(utils.SET_SESSION_ROLE). Reply("SET ROLE"). Query(GET_LATEST_STORAGE_MIGRATION). Reply("SELECT 1", []interface{}{"custom-metadata"}) @@ -198,7 +197,7 @@ func TestLinkCommand(t *testing.T) { // Setup mock postgres conn := pgtest.NewConn() defer conn.Close(t) - conn.Query(pgxv5.SET_SESSION_ROLE). + conn.Query(utils.SET_SESSION_ROLE). Reply("SET ROLE"). Query(GET_LATEST_STORAGE_MIGRATION). Reply("SELECT 1", []interface{}{"custom-metadata"}) diff --git a/internal/projects/create/create.go b/internal/projects/create/create.go index 0463aa610..6be3fc8ab 100644 --- a/internal/projects/create/create.go +++ b/internal/projects/create/create.go @@ -74,11 +74,13 @@ func promptMissingParams(ctx context.Context, body *api.V1CreateProjectBody) err } fmt.Fprintln(os.Stderr, printKeyValue("Selected org-id", body.OrganizationId)) } - if len(body.Region) == 0 { - if body.Region, err = promptProjectRegion(ctx); err != nil { + if body.Region == nil || len(*body.Region) == 0 { + region, err := promptProjectRegion(ctx) + if err != nil { return err } - fmt.Fprintln(os.Stderr, printKeyValue("Selected region", string(body.Region))) + body.Region = ®ion + fmt.Fprintln(os.Stderr, printKeyValue("Selected region", string(region))) } if len(body.DbPass) == 0 { body.DbPass = flags.PromptPassword(os.Stdin) diff --git a/internal/projects/create/create_test.go b/internal/projects/create/create_test.go index c67c7a35e..5e5363ded 100644 --- a/internal/projects/create/create_test.go +++ b/internal/projects/create/create_test.go @@ -11,6 +11,7 @@ import ( "github.com/supabase/cli/internal/testing/apitest" "github.com/supabase/cli/internal/utils" "github.com/supabase/cli/pkg/api" + "github.com/supabase/cli/pkg/cast" ) func TestProjectCreateCommand(t *testing.T) { @@ -18,7 +19,7 @@ func TestProjectCreateCommand(t *testing.T) { Name: "Test Project", OrganizationId: "combined-fuchsia-lion", DbPass: "redacted", - Region: api.V1CreateProjectBodyRegionUsWest1, + Region: cast.Ptr(api.V1CreateProjectBodyRegionUsWest1), } t.Run("creates a new project", func(t *testing.T) { @@ -38,7 +39,7 @@ func TestProjectCreateCommand(t *testing.T) { Id: apitest.RandomProjectRef(), OrganizationId: params.OrganizationId, Name: params.Name, - Region: string(params.Region), + Region: string(*params.Region), CreatedAt: "2022-04-25T02:14:55.906498Z", }) // Run test diff --git a/internal/start/start.go b/internal/start/start.go index f0fa76e75..1176eaa56 100644 --- a/internal/start/start.go +++ b/internal/start/start.go @@ -87,6 +87,7 @@ type kongConfig struct { ApiHost string ApiPort uint16 BearerToken string + QueryToken string } var ( @@ -145,7 +146,7 @@ func run(ctx context.Context, fsys afero.Fs, excludedContainers []string, dbConf excluded[name] = true } - jwks, err := utils.Config.Auth.ResolveJWKS(ctx, fsys) + jwks, err := utils.Config.Auth.ResolveJWKS(ctx) if err != nil { return err } @@ -170,7 +171,7 @@ func run(ctx context.Context, fsys afero.Fs, excludedContainers []string, dbConf "DB_HOSTNAME=" + dbConfig.Host, fmt.Sprintf("DB_PORT=%d", dbConfig.Port), "DB_SCHEMA=_analytics", - "DB_USERNAME=supabase_admin", + "DB_USERNAME=" + utils.SUPERUSER_ROLE, "DB_PASSWORD=" + dbConfig.Password, "LOGFLARE_MIN_CLUSTER_SIZE=1", "LOGFLARE_SINGLE_TENANT=true", @@ -362,6 +363,13 @@ EOF utils.Config.Auth.PublishableKey.Value, utils.Config.Auth.AnonKey.Value, ), + QueryToken: fmt.Sprintf( + `$((function() return (query_params.apikey == '%s' and '%s') or (query_params.apikey == '%s' and '%s') or query_params.apikey end)())`, + utils.Config.Auth.SecretKey.Value, + utils.Config.Auth.ServiceRoleKey.Value, + utils.Config.Auth.PublishableKey.Value, + utils.Config.Auth.AnonKey.Value, + ), }); err != nil { return errors.Errorf("failed to exec template: %w", err) } @@ -685,6 +693,7 @@ EOF fmt.Sprintf("GOTRUE_EXTERNAL_%s_CLIENT_ID=%s", strings.ToUpper(name), config.ClientId), fmt.Sprintf("GOTRUE_EXTERNAL_%s_SECRET=%s", strings.ToUpper(name), config.Secret.Value), fmt.Sprintf("GOTRUE_EXTERNAL_%s_SKIP_NONCE_CHECK=%t", strings.ToUpper(name), config.SkipNonceCheck), + fmt.Sprintf("GOTRUE_EXTERNAL_%s_EMAIL_OPTIONAL=%t", strings.ToUpper(name), config.EmailOptional), ) redirectUri := config.RedirectUri @@ -790,7 +799,7 @@ EOF "PORT=4000", "DB_HOST=" + dbConfig.Host, fmt.Sprintf("DB_PORT=%d", dbConfig.Port), - "DB_USER=supabase_admin", + "DB_USER=" + utils.SUPERUSER_ROLE, "DB_PASSWORD=" + dbConfig.Password, "DB_NAME=" + dbConfig.Database, "DB_AFTER_CONNECT_QUERY=SET search_path TO _realtime", diff --git a/internal/start/templates/kong.yml b/internal/start/templates/kong.yml index d722139af..b1f4a64b6 100644 --- a/internal/start/templates/kong.yml +++ b/internal/start/templates/kong.yml @@ -1,5 +1,6 @@ _format_version: "1.1" services: + # Tenant project endpoints - name: auth-v1-open _comment: "GoTrue: /auth/v1/verify* -> http://auth:9999/verify*" url: http://{{ .GotrueId }}:9999/verify @@ -10,11 +11,6 @@ services: - /auth/v1/verify plugins: - name: cors - - name: request-transformer - config: - replace: - headers: - - "Authorization: {{ .BearerToken }}" - name: auth-v1-open-callback _comment: "GoTrue: /auth/v1/callback* -> http://auth:9999/callback*" url: http://{{ .GotrueId }}:9999/callback @@ -25,11 +21,6 @@ services: - /auth/v1/callback plugins: - name: cors - - name: request-transformer - config: - replace: - headers: - - "Authorization: {{ .BearerToken }}" - name: auth-v1-open-authorize _comment: "GoTrue: /auth/v1/authorize* -> http://auth:9999/authorize*" url: http://{{ .GotrueId }}:9999/authorize @@ -40,11 +31,6 @@ services: - /auth/v1/authorize plugins: - name: cors - - name: request-transformer - config: - replace: - headers: - - "Authorization: {{ .BearerToken }}" - name: auth-v1 _comment: "GoTrue: /auth/v1/* -> http://auth:9999/*" url: http://{{ .GotrueId }}:9999/ @@ -55,11 +41,7 @@ services: - /auth/v1/ plugins: - name: cors - - name: request-transformer - config: - replace: - headers: - - "Authorization: {{ .BearerToken }}" + # TODO: validate apikey - name: rest-v1 _comment: "PostgREST: /rest/v1/* -> http://rest:3000/*" url: http://{{ .RestId }}:3000/ @@ -72,6 +54,9 @@ services: - name: cors - name: request-transformer config: + add: + headers: + - "Authorization: {{ .BearerToken }}" replace: headers: - "Authorization: {{ .BearerToken }}" @@ -85,11 +70,7 @@ services: - /rest-admin/v1/ plugins: - name: cors - - name: request-transformer - config: - replace: - headers: - - "Authorization: {{ .BearerToken }}" + # TODO: validate apikey - name: graphql-v1 _comment: "PostgREST: /graphql/v1 -> http://rest:3000/rpc/graphql" url: http://{{ .RestId }}:3000/rpc/graphql @@ -105,6 +86,7 @@ services: add: headers: - "Content-Profile: graphql_public" + - "Authorization: {{ .BearerToken }}" replace: headers: - "Authorization: {{ .BearerToken }}" @@ -122,9 +104,9 @@ services: - name: request-transformer config: replace: - headers: - - "Authorization: {{ .BearerToken }}" - - name: realtime-v1-longpoll + querystring: + - "apikey:{{ .QueryToken }}" + - name: realtime-v1-longpoll-not-working _comment: "Realtime: /realtime/v1/* -> ws://realtime:4000/socket/longpoll" url: http://{{ .RealtimeId }}:4000/socket protocol: http @@ -137,6 +119,9 @@ services: - name: cors - name: request-transformer config: + add: + headers: + - "Authorization: {{ .BearerToken }}" replace: headers: - "Authorization: {{ .BearerToken }}" @@ -153,6 +138,9 @@ services: - name: cors - name: request-transformer config: + add: + headers: + - "Authorization: {{ .BearerToken }}" replace: headers: - "Authorization: {{ .BearerToken }}" @@ -168,17 +156,12 @@ services: - name: cors - name: request-transformer config: + add: + headers: + - "Authorization: {{ .BearerToken }}" replace: headers: - "Authorization: {{ .BearerToken }}" - - name: pg-meta - _comment: "pg-meta: /pg/* -> http://pg-meta:8080/*" - url: http://{{ .PgmetaId }}:8080/ - routes: - - name: pg-meta-all - strip_path: true - paths: - - /pg/ - name: functions-v1 _comment: "Functions: /functions/v1/* -> http://edge-runtime:8081/*" url: http://{{ .EdgeRuntimeId }}:8081/ @@ -194,9 +177,33 @@ services: - name: cors - name: request-transformer config: + add: + headers: + - "Authorization: {{ .BearerToken }}" replace: headers: - "Authorization: {{ .BearerToken }}" + # Management API endpoints + - name: well-known-oauth + _comment: "GoTrue: /.well-known/oauth-authorization-server -> http://auth:9999/.well-known/oauth-authorization-server" + url: http://{{ .GotrueId }}:9999/.well-known/oauth-authorization-server + routes: + - name: well-known-oauth + strip_path: true + paths: + - /.well-known/oauth-authorization-server + plugins: + - name: cors + - name: pg-meta + _comment: "pg-meta: /pg/* -> http://pg-meta:8080/*" + url: http://{{ .PgmetaId }}:8080/ + routes: + - name: pg-meta-all + strip_path: true + paths: + - /pg/ + plugins: + - name: cors - name: analytics-v1 _comment: "Analytics: /analytics/v1/* -> http://logflare:4000/*" url: http://{{ .LogflareId }}:4000/ @@ -207,11 +214,6 @@ services: - /analytics/v1/ plugins: - name: cors - - name: request-transformer - config: - replace: - headers: - - "Authorization: {{ .BearerToken }}" - name: pooler-v2-ws _comment: "Pooler: /pooler/v2/* -> ws://pooler:4000/v2/*" url: http://{{ .PoolerId }}:4000/v2 @@ -223,11 +225,6 @@ services: - /pooler/v2/ plugins: - name: cors - - name: request-transformer - config: - replace: - headers: - - "Authorization: {{ .BearerToken }}" - name: mcp _comment: "MCP: /mcp -> http://studio:3000/api/mcp" url: http://{{ .StudioId }}:3000/api/mcp diff --git a/internal/start/templates/vector.yaml b/internal/start/templates/vector.yaml index 1b9e5f57c..1c7609984 100644 --- a/internal/start/templates/vector.yaml +++ b/internal/start/templates/vector.yaml @@ -117,6 +117,13 @@ transforms: .event_message = parsed.msg .metadata.level = parsed.level } + # Function logs are unstructured messages on stderr + functions_logs: + type: remap + inputs: + - router.functions + source: |- + .metadata.project_ref = del(.project) # Storage logs may contain json objects so we parse them for completeness storage_logs: type: remap @@ -207,7 +214,7 @@ sinks: logflare_functions: type: "http" inputs: - - router.functions + - functions_logs encoding: codec: "json" method: "post" diff --git a/internal/utils/connect.go b/internal/utils/connect.go index da58581fe..1527a020d 100644 --- a/internal/utils/connect.go +++ b/internal/utils/connect.go @@ -150,6 +150,12 @@ func ConnectByUrl(ctx context.Context, url string, options ...func(*pgx.ConnConf return pgxv5.Connect(ctx, url, options...) } +const ( + SUPERUSER_ROLE = "supabase_admin" + CLI_LOGIN_PREFIX = "cli_login_" + SET_SESSION_ROLE = "SET SESSION ROLE postgres" +) + func ConnectByConfigStream(ctx context.Context, config pgconn.Config, w io.Writer, options ...func(*pgx.ConnConfig)) (*pgx.Conn, error) { if IsLocalDatabase(config) { fmt.Fprintln(w, "Connecting to local database...") @@ -160,6 +166,13 @@ func ConnectByConfigStream(ctx context.Context, config pgconn.Config, w io.Write if DNSResolver.Value == DNS_OVER_HTTPS { cc.LookupFunc = FallbackLookupIP } + // Step down from platform provisioned login roles or privileged roles + if user := strings.Split(cc.User, ".")[0]; strings.EqualFold(user, SUPERUSER_ROLE) || + strings.HasPrefix(user, CLI_LOGIN_PREFIX) { + cc.AfterConnect = func(ctx context.Context, pgconn *pgconn.PgConn) error { + return pgconn.Exec(ctx, SET_SESSION_ROLE).Close() + } + } }) return ConnectByUrl(ctx, ToPostgresURL(config), opts...) } @@ -169,5 +182,5 @@ func ConnectByConfig(ctx context.Context, config pgconn.Config, options ...func( } func IsLocalDatabase(config pgconn.Config) bool { - return config.Host == Config.Hostname && config.Port == Config.Db.Port + return config.Host == Config.Hostname && (config.Port == Config.Db.Port || config.Port == Config.Db.ShadowPort) } diff --git a/internal/utils/misc.go b/internal/utils/misc.go index 80fb13b27..84d65eaeb 100644 --- a/internal/utils/misc.go +++ b/internal/utils/misc.go @@ -74,6 +74,7 @@ var ( PoolerVersionPath = filepath.Join(TempDir, "pooler-version") RealtimeVersionPath = filepath.Join(TempDir, "realtime-version") CliVersionPath = filepath.Join(TempDir, "cli-latest") + ProfilePath = filepath.Join(TempDir, "profile") CurrBranchPath = filepath.Join(SupabaseDirPath, ".branches", "_current_branch") SchemasDir = filepath.Join(SupabaseDirPath, "schemas") MigrationsDir = filepath.Join(SupabaseDirPath, "migrations") diff --git a/internal/utils/profile.go b/internal/utils/profile.go index 53da75858..06b607a0d 100644 --- a/internal/utils/profile.go +++ b/internal/utils/profile.go @@ -38,15 +38,20 @@ var allProfiles = []Profile{{ DashboardURL: "http://localhost:8082", DocsURL: "https://supabase.com/docs", ProjectHost: "supabase.red", +}, { + Name: "snap", + APIURL: "https://cloudapi.snap.com", + DashboardURL: "https://cloud.snap.com/dashboard", + DocsURL: "https://cloud.snap.com/docs", + ProjectHost: "snapcloud.dev", }} var CurrentProfile Profile func LoadProfile(ctx context.Context, fsys afero.Fs) error { - prof := viper.GetString("PROFILE") + prof := getProfileName(fsys) for _, p := range allProfiles { if strings.EqualFold(p.Name, prof) { - fmt.Fprintln(GetDebugLogger(), "Using project host:", p.ProjectHost) CurrentProfile = p return nil } @@ -68,3 +73,17 @@ func LoadProfile(ctx context.Context, fsys afero.Fs) error { } return nil } + +func getProfileName(fsys afero.Fs) string { + debuglogger := GetDebugLogger() + if prof := viper.GetString("PROFILE"); viper.IsSet("PROFILE") { + fmt.Fprintln(debuglogger, "Loading profile from flag:", prof) + return prof + } else if content, err := afero.ReadFile(fsys, ProfilePath); err == nil { + fmt.Fprintln(debuglogger, "Loading profile from file:", ProfilePath) + return string(content) + } else { + fmt.Fprintln(debuglogger, err) + return prof + } +} diff --git a/pkg/api/client.gen.go b/pkg/api/client.gen.go index e3513b91a..ac1f7d1c1 100644 --- a/pkg/api/client.gen.go +++ b/pkg/api/client.gen.go @@ -163,6 +163,9 @@ type ClientInterface interface { V1CreateAProject(ctx context.Context, body V1CreateAProjectJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // V1GetAvailableRegions request + V1GetAvailableRegions(ctx context.Context, params *V1GetAvailableRegionsParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // V1DeleteAProject request V1DeleteAProject(ctx context.Context, ref string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -933,6 +936,18 @@ func (c *Client) V1CreateAProject(ctx context.Context, body V1CreateAProjectJSON return c.Client.Do(req) } +func (c *Client) V1GetAvailableRegions(ctx context.Context, params *V1GetAvailableRegionsParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewV1GetAvailableRegionsRequest(c.Server, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) V1DeleteAProject(ctx context.Context, ref string, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewV1DeleteAProjectRequest(c.Server, ref) if err != nil { @@ -3869,6 +3884,67 @@ func NewV1CreateAProjectRequestWithBody(server string, contentType string, body return req, nil } +// NewV1GetAvailableRegionsRequest generates requests for V1GetAvailableRegions +func NewV1GetAvailableRegionsRequest(server string, params *V1GetAvailableRegionsParams) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/v1/projects/available-regions") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "organization_slug", runtime.ParamLocationQuery, params.OrganizationSlug); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + if params.Continent != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "continent", runtime.ParamLocationQuery, *params.Continent); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewV1DeleteAProjectRequest generates requests for V1DeleteAProject func NewV1DeleteAProjectRequest(server string, ref string) (*http.Request, error) { var err error @@ -9579,6 +9655,9 @@ type ClientWithResponsesInterface interface { V1CreateAProjectWithResponse(ctx context.Context, body V1CreateAProjectJSONRequestBody, reqEditors ...RequestEditorFn) (*V1CreateAProjectResponse, error) + // V1GetAvailableRegionsWithResponse request + V1GetAvailableRegionsWithResponse(ctx context.Context, params *V1GetAvailableRegionsParams, reqEditors ...RequestEditorFn) (*V1GetAvailableRegionsResponse, error) + // V1DeleteAProjectWithResponse request V1DeleteAProjectWithResponse(ctx context.Context, ref string, reqEditors ...RequestEditorFn) (*V1DeleteAProjectResponse, error) @@ -10438,6 +10517,28 @@ func (r V1CreateAProjectResponse) StatusCode() int { return 0 } +type V1GetAvailableRegionsResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *RegionsInfo +} + +// Status returns HTTPResponse.Status +func (r V1GetAvailableRegionsResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r V1GetAvailableRegionsResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type V1DeleteAProjectResponse struct { Body []byte HTTPResponse *http.Response @@ -13309,6 +13410,15 @@ func (c *ClientWithResponses) V1CreateAProjectWithResponse(ctx context.Context, return ParseV1CreateAProjectResponse(rsp) } +// V1GetAvailableRegionsWithResponse request returning *V1GetAvailableRegionsResponse +func (c *ClientWithResponses) V1GetAvailableRegionsWithResponse(ctx context.Context, params *V1GetAvailableRegionsParams, reqEditors ...RequestEditorFn) (*V1GetAvailableRegionsResponse, error) { + rsp, err := c.V1GetAvailableRegions(ctx, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseV1GetAvailableRegionsResponse(rsp) +} + // V1DeleteAProjectWithResponse request returning *V1DeleteAProjectResponse func (c *ClientWithResponses) V1DeleteAProjectWithResponse(ctx context.Context, ref string, reqEditors ...RequestEditorFn) (*V1DeleteAProjectResponse, error) { rsp, err := c.V1DeleteAProject(ctx, ref, reqEditors...) @@ -15164,6 +15274,32 @@ func ParseV1CreateAProjectResponse(rsp *http.Response) (*V1CreateAProjectRespons return response, nil } +// ParseV1GetAvailableRegionsResponse parses an HTTP response from a V1GetAvailableRegionsWithResponse call +func ParseV1GetAvailableRegionsResponse(rsp *http.Response) (*V1GetAvailableRegionsResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &V1GetAvailableRegionsResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest RegionsInfo + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + } + + return response, nil +} + // ParseV1DeleteAProjectResponse parses an HTTP response from a V1DeleteAProjectWithResponse call func ParseV1DeleteAProjectResponse(rsp *http.Response) (*V1DeleteAProjectResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) diff --git a/pkg/api/types.gen.go b/pkg/api/types.gen.go index 1fa2f30a6..2b7ee8870 100644 --- a/pkg/api/types.gen.go +++ b/pkg/api/types.gen.go @@ -657,12 +657,6 @@ const ( RefreshToken OAuthTokenBodyGrantType = "refresh_token" ) -// Defines values for OAuthTokenBodyResource. -const ( - OAuthTokenBodyResourceHttpsapiSupabaseGreenmcp OAuthTokenBodyResource = "https://api.supabase.green/mcp" - OAuthTokenBodyResourceHttpsmcpSupabaseGreenmcp OAuthTokenBodyResource = "https://mcp.supabase.green/mcp" -) - // Defines values for OAuthTokenResponseTokenType. const ( Bearer OAuthTokenResponseTokenType = "Bearer" @@ -703,11 +697,11 @@ const ( // Defines values for ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion. const ( - N13 ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion = "13" - N14 ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion = "14" - N15 ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion = "15" - N17 ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion = "17" - N17Oriole ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion = "17-oriole" + ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersionN13 ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion = "13" + ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersionN14 ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion = "14" + ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersionN15 ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion = "15" + ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersionN17 ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion = "17" + ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersionN17Oriole ProjectUpgradeEligibilityResponseTargetUpgradeVersionsPostgresVersion = "17-oriole" ) // Defines values for ProjectUpgradeEligibilityResponseTargetUpgradeVersionsReleaseChannel. @@ -720,6 +714,68 @@ const ( ProjectUpgradeEligibilityResponseTargetUpgradeVersionsReleaseChannelWithdrawn ProjectUpgradeEligibilityResponseTargetUpgradeVersionsReleaseChannel = "withdrawn" ) +// Defines values for RegionsInfoAllSmartGroupCode. +const ( + RegionsInfoAllSmartGroupCodeAmericas RegionsInfoAllSmartGroupCode = "americas" + RegionsInfoAllSmartGroupCodeApac RegionsInfoAllSmartGroupCode = "apac" + RegionsInfoAllSmartGroupCodeEmea RegionsInfoAllSmartGroupCode = "emea" +) + +// Defines values for RegionsInfoAllSmartGroupType. +const ( + RegionsInfoAllSmartGroupTypeSmartGroup RegionsInfoAllSmartGroupType = "smartGroup" +) + +// Defines values for RegionsInfoAllSpecificProvider. +const ( + RegionsInfoAllSpecificProviderAWS RegionsInfoAllSpecificProvider = "AWS" + RegionsInfoAllSpecificProviderAWSK8S RegionsInfoAllSpecificProvider = "AWS_K8S" + RegionsInfoAllSpecificProviderAWSNIMBUS RegionsInfoAllSpecificProvider = "AWS_NIMBUS" + RegionsInfoAllSpecificProviderFLY RegionsInfoAllSpecificProvider = "FLY" +) + +// Defines values for RegionsInfoAllSpecificStatus. +const ( + RegionsInfoAllSpecificStatusCapacity RegionsInfoAllSpecificStatus = "capacity" + RegionsInfoAllSpecificStatusOther RegionsInfoAllSpecificStatus = "other" +) + +// Defines values for RegionsInfoAllSpecificType. +const ( + RegionsInfoAllSpecificTypeSpecific RegionsInfoAllSpecificType = "specific" +) + +// Defines values for RegionsInfoRecommendationsSmartGroupCode. +const ( + RegionsInfoRecommendationsSmartGroupCodeAmericas RegionsInfoRecommendationsSmartGroupCode = "americas" + RegionsInfoRecommendationsSmartGroupCodeApac RegionsInfoRecommendationsSmartGroupCode = "apac" + RegionsInfoRecommendationsSmartGroupCodeEmea RegionsInfoRecommendationsSmartGroupCode = "emea" +) + +// Defines values for RegionsInfoRecommendationsSmartGroupType. +const ( + RegionsInfoRecommendationsSmartGroupTypeSmartGroup RegionsInfoRecommendationsSmartGroupType = "smartGroup" +) + +// Defines values for RegionsInfoRecommendationsSpecificProvider. +const ( + RegionsInfoRecommendationsSpecificProviderAWS RegionsInfoRecommendationsSpecificProvider = "AWS" + RegionsInfoRecommendationsSpecificProviderAWSK8S RegionsInfoRecommendationsSpecificProvider = "AWS_K8S" + RegionsInfoRecommendationsSpecificProviderAWSNIMBUS RegionsInfoRecommendationsSpecificProvider = "AWS_NIMBUS" + RegionsInfoRecommendationsSpecificProviderFLY RegionsInfoRecommendationsSpecificProvider = "FLY" +) + +// Defines values for RegionsInfoRecommendationsSpecificStatus. +const ( + RegionsInfoRecommendationsSpecificStatusCapacity RegionsInfoRecommendationsSpecificStatus = "capacity" + RegionsInfoRecommendationsSpecificStatusOther RegionsInfoRecommendationsSpecificStatus = "other" +) + +// Defines values for RegionsInfoRecommendationsSpecificType. +const ( + RegionsInfoRecommendationsSpecificTypeSpecific RegionsInfoRecommendationsSpecificType = "specific" +) + // Defines values for SetUpReadReplicaBodyReadReplicaRegion. const ( SetUpReadReplicaBodyReadReplicaRegionApEast1 SetUpReadReplicaBodyReadReplicaRegion = "ap-east-1" @@ -1027,6 +1083,13 @@ const ( V1CreateProjectBodyPlanPro V1CreateProjectBodyPlan = "pro" ) +// Defines values for V1CreateProjectBodyPostgresEngine. +const ( + V1CreateProjectBodyPostgresEngineN15 V1CreateProjectBodyPostgresEngine = "15" + V1CreateProjectBodyPostgresEngineN17 V1CreateProjectBodyPostgresEngine = "17" + V1CreateProjectBodyPostgresEngineN17Oriole V1CreateProjectBodyPostgresEngine = "17-oriole" +) + // Defines values for V1CreateProjectBodyRegion. const ( V1CreateProjectBodyRegionApEast1 V1CreateProjectBodyRegion = "ap-east-1" @@ -1049,14 +1112,63 @@ const ( V1CreateProjectBodyRegionUsWest2 V1CreateProjectBodyRegion = "us-west-2" ) +// Defines values for V1CreateProjectBodyRegionSelection0Code. +const ( + ApEast1 V1CreateProjectBodyRegionSelection0Code = "ap-east-1" + ApNortheast1 V1CreateProjectBodyRegionSelection0Code = "ap-northeast-1" + ApNortheast2 V1CreateProjectBodyRegionSelection0Code = "ap-northeast-2" + ApSouth1 V1CreateProjectBodyRegionSelection0Code = "ap-south-1" + ApSoutheast1 V1CreateProjectBodyRegionSelection0Code = "ap-southeast-1" + ApSoutheast2 V1CreateProjectBodyRegionSelection0Code = "ap-southeast-2" + CaCentral1 V1CreateProjectBodyRegionSelection0Code = "ca-central-1" + EuCentral1 V1CreateProjectBodyRegionSelection0Code = "eu-central-1" + EuCentral2 V1CreateProjectBodyRegionSelection0Code = "eu-central-2" + EuNorth1 V1CreateProjectBodyRegionSelection0Code = "eu-north-1" + EuWest1 V1CreateProjectBodyRegionSelection0Code = "eu-west-1" + EuWest2 V1CreateProjectBodyRegionSelection0Code = "eu-west-2" + EuWest3 V1CreateProjectBodyRegionSelection0Code = "eu-west-3" + SaEast1 V1CreateProjectBodyRegionSelection0Code = "sa-east-1" + UsEast1 V1CreateProjectBodyRegionSelection0Code = "us-east-1" + UsEast2 V1CreateProjectBodyRegionSelection0Code = "us-east-2" + UsWest1 V1CreateProjectBodyRegionSelection0Code = "us-west-1" + UsWest2 V1CreateProjectBodyRegionSelection0Code = "us-west-2" +) + +// Defines values for V1CreateProjectBodyRegionSelection0Type. +const ( + Specific V1CreateProjectBodyRegionSelection0Type = "specific" +) + +// Defines values for V1CreateProjectBodyRegionSelection1Code. +const ( + Americas V1CreateProjectBodyRegionSelection1Code = "americas" + Apac V1CreateProjectBodyRegionSelection1Code = "apac" + Emea V1CreateProjectBodyRegionSelection1Code = "emea" +) + +// Defines values for V1CreateProjectBodyRegionSelection1Type. +const ( + SmartGroup V1CreateProjectBodyRegionSelection1Type = "smartGroup" +) + +// Defines values for V1CreateProjectBodyReleaseChannel. +const ( + V1CreateProjectBodyReleaseChannelAlpha V1CreateProjectBodyReleaseChannel = "alpha" + V1CreateProjectBodyReleaseChannelBeta V1CreateProjectBodyReleaseChannel = "beta" + V1CreateProjectBodyReleaseChannelGa V1CreateProjectBodyReleaseChannel = "ga" + V1CreateProjectBodyReleaseChannelInternal V1CreateProjectBodyReleaseChannel = "internal" + V1CreateProjectBodyReleaseChannelPreview V1CreateProjectBodyReleaseChannel = "preview" + V1CreateProjectBodyReleaseChannelWithdrawn V1CreateProjectBodyReleaseChannel = "withdrawn" +) + // Defines values for V1OrganizationSlugResponseAllowedReleaseChannels. const ( - V1OrganizationSlugResponseAllowedReleaseChannelsAlpha V1OrganizationSlugResponseAllowedReleaseChannels = "alpha" - V1OrganizationSlugResponseAllowedReleaseChannelsBeta V1OrganizationSlugResponseAllowedReleaseChannels = "beta" - V1OrganizationSlugResponseAllowedReleaseChannelsGa V1OrganizationSlugResponseAllowedReleaseChannels = "ga" - V1OrganizationSlugResponseAllowedReleaseChannelsInternal V1OrganizationSlugResponseAllowedReleaseChannels = "internal" - V1OrganizationSlugResponseAllowedReleaseChannelsPreview V1OrganizationSlugResponseAllowedReleaseChannels = "preview" - V1OrganizationSlugResponseAllowedReleaseChannelsWithdrawn V1OrganizationSlugResponseAllowedReleaseChannels = "withdrawn" + Alpha V1OrganizationSlugResponseAllowedReleaseChannels = "alpha" + Beta V1OrganizationSlugResponseAllowedReleaseChannels = "beta" + Ga V1OrganizationSlugResponseAllowedReleaseChannels = "ga" + Internal V1OrganizationSlugResponseAllowedReleaseChannels = "internal" + Preview V1OrganizationSlugResponseAllowedReleaseChannels = "preview" + Withdrawn V1OrganizationSlugResponseAllowedReleaseChannels = "withdrawn" ) // Defines values for V1OrganizationSlugResponseOptInTags. @@ -1232,12 +1344,6 @@ const ( V1AuthorizeUserParamsCodeChallengeMethodSha256 V1AuthorizeUserParamsCodeChallengeMethod = "sha256" ) -// Defines values for V1AuthorizeUserParamsResource. -const ( - V1AuthorizeUserParamsResourceHttpsapiSupabaseGreenmcp V1AuthorizeUserParamsResource = "https://api.supabase.green/mcp" - V1AuthorizeUserParamsResourceHttpsmcpSupabaseGreenmcp V1AuthorizeUserParamsResource = "https://mcp.supabase.green/mcp" -) - // Defines values for V1OauthAuthorizeProjectClaimParamsResponseType. const ( V1OauthAuthorizeProjectClaimParamsResponseTypeCode V1OauthAuthorizeProjectClaimParamsResponseType = "code" @@ -1252,6 +1358,17 @@ const ( V1OauthAuthorizeProjectClaimParamsCodeChallengeMethodSha256 V1OauthAuthorizeProjectClaimParamsCodeChallengeMethod = "sha256" ) +// Defines values for V1GetAvailableRegionsParamsContinent. +const ( + AF V1GetAvailableRegionsParamsContinent = "AF" + AN V1GetAvailableRegionsParamsContinent = "AN" + AS V1GetAvailableRegionsParamsContinent = "AS" + EU V1GetAvailableRegionsParamsContinent = "EU" + NA V1GetAvailableRegionsParamsContinent = "NA" + OC V1GetAvailableRegionsParamsContinent = "OC" + SA V1GetAvailableRegionsParamsContinent = "SA" +) + // Defines values for V1GetSecurityAdvisorsParamsLintType. const ( Sql V1GetSecurityAdvisorsParamsLintType = "sql" @@ -1440,204 +1557,228 @@ type ApplyProjectAddonBody_AddonVariant struct { // AuthConfigResponse defines model for AuthConfigResponse. type AuthConfigResponse struct { - ApiMaxRequestDuration nullable.Nullable[int] `json:"api_max_request_duration"` - DbMaxPoolSize nullable.Nullable[int] `json:"db_max_pool_size"` - DisableSignup nullable.Nullable[bool] `json:"disable_signup"` - ExternalAnonymousUsersEnabled nullable.Nullable[bool] `json:"external_anonymous_users_enabled"` - ExternalAppleAdditionalClientIds nullable.Nullable[string] `json:"external_apple_additional_client_ids"` - ExternalAppleClientId nullable.Nullable[string] `json:"external_apple_client_id"` - ExternalAppleEmailOptional nullable.Nullable[bool] `json:"external_apple_email_optional"` - ExternalAppleEnabled nullable.Nullable[bool] `json:"external_apple_enabled"` - ExternalAppleSecret nullable.Nullable[string] `json:"external_apple_secret"` - ExternalAzureClientId nullable.Nullable[string] `json:"external_azure_client_id"` - ExternalAzureEmailOptional nullable.Nullable[bool] `json:"external_azure_email_optional"` - ExternalAzureEnabled nullable.Nullable[bool] `json:"external_azure_enabled"` - ExternalAzureSecret nullable.Nullable[string] `json:"external_azure_secret"` - ExternalAzureUrl nullable.Nullable[string] `json:"external_azure_url"` - ExternalBitbucketClientId nullable.Nullable[string] `json:"external_bitbucket_client_id"` - ExternalBitbucketEmailOptional nullable.Nullable[bool] `json:"external_bitbucket_email_optional"` - ExternalBitbucketEnabled nullable.Nullable[bool] `json:"external_bitbucket_enabled"` - ExternalBitbucketSecret nullable.Nullable[string] `json:"external_bitbucket_secret"` - ExternalDiscordClientId nullable.Nullable[string] `json:"external_discord_client_id"` - ExternalDiscordEmailOptional nullable.Nullable[bool] `json:"external_discord_email_optional"` - ExternalDiscordEnabled nullable.Nullable[bool] `json:"external_discord_enabled"` - ExternalDiscordSecret nullable.Nullable[string] `json:"external_discord_secret"` - ExternalEmailEnabled nullable.Nullable[bool] `json:"external_email_enabled"` - ExternalFacebookClientId nullable.Nullable[string] `json:"external_facebook_client_id"` - ExternalFacebookEmailOptional nullable.Nullable[bool] `json:"external_facebook_email_optional"` - ExternalFacebookEnabled nullable.Nullable[bool] `json:"external_facebook_enabled"` - ExternalFacebookSecret nullable.Nullable[string] `json:"external_facebook_secret"` - ExternalFigmaClientId nullable.Nullable[string] `json:"external_figma_client_id"` - ExternalFigmaEmailOptional nullable.Nullable[bool] `json:"external_figma_email_optional"` - ExternalFigmaEnabled nullable.Nullable[bool] `json:"external_figma_enabled"` - ExternalFigmaSecret nullable.Nullable[string] `json:"external_figma_secret"` - ExternalGithubClientId nullable.Nullable[string] `json:"external_github_client_id"` - ExternalGithubEmailOptional nullable.Nullable[bool] `json:"external_github_email_optional"` - ExternalGithubEnabled nullable.Nullable[bool] `json:"external_github_enabled"` - ExternalGithubSecret nullable.Nullable[string] `json:"external_github_secret"` - ExternalGitlabClientId nullable.Nullable[string] `json:"external_gitlab_client_id"` - ExternalGitlabEmailOptional nullable.Nullable[bool] `json:"external_gitlab_email_optional"` - ExternalGitlabEnabled nullable.Nullable[bool] `json:"external_gitlab_enabled"` - ExternalGitlabSecret nullable.Nullable[string] `json:"external_gitlab_secret"` - ExternalGitlabUrl nullable.Nullable[string] `json:"external_gitlab_url"` - ExternalGoogleAdditionalClientIds nullable.Nullable[string] `json:"external_google_additional_client_ids"` - ExternalGoogleClientId nullable.Nullable[string] `json:"external_google_client_id"` - ExternalGoogleEmailOptional nullable.Nullable[bool] `json:"external_google_email_optional"` - ExternalGoogleEnabled nullable.Nullable[bool] `json:"external_google_enabled"` - ExternalGoogleSecret nullable.Nullable[string] `json:"external_google_secret"` - ExternalGoogleSkipNonceCheck nullable.Nullable[bool] `json:"external_google_skip_nonce_check"` - ExternalKakaoClientId nullable.Nullable[string] `json:"external_kakao_client_id"` - ExternalKakaoEmailOptional nullable.Nullable[bool] `json:"external_kakao_email_optional"` - ExternalKakaoEnabled nullable.Nullable[bool] `json:"external_kakao_enabled"` - ExternalKakaoSecret nullable.Nullable[string] `json:"external_kakao_secret"` - ExternalKeycloakClientId nullable.Nullable[string] `json:"external_keycloak_client_id"` - ExternalKeycloakEmailOptional nullable.Nullable[bool] `json:"external_keycloak_email_optional"` - ExternalKeycloakEnabled nullable.Nullable[bool] `json:"external_keycloak_enabled"` - ExternalKeycloakSecret nullable.Nullable[string] `json:"external_keycloak_secret"` - ExternalKeycloakUrl nullable.Nullable[string] `json:"external_keycloak_url"` - ExternalLinkedinOidcClientId nullable.Nullable[string] `json:"external_linkedin_oidc_client_id"` - ExternalLinkedinOidcEmailOptional nullable.Nullable[bool] `json:"external_linkedin_oidc_email_optional"` - ExternalLinkedinOidcEnabled nullable.Nullable[bool] `json:"external_linkedin_oidc_enabled"` - ExternalLinkedinOidcSecret nullable.Nullable[string] `json:"external_linkedin_oidc_secret"` - ExternalNotionClientId nullable.Nullable[string] `json:"external_notion_client_id"` - ExternalNotionEmailOptional nullable.Nullable[bool] `json:"external_notion_email_optional"` - ExternalNotionEnabled nullable.Nullable[bool] `json:"external_notion_enabled"` - ExternalNotionSecret nullable.Nullable[string] `json:"external_notion_secret"` - ExternalPhoneEnabled nullable.Nullable[bool] `json:"external_phone_enabled"` - ExternalSlackClientId nullable.Nullable[string] `json:"external_slack_client_id"` - ExternalSlackEmailOptional nullable.Nullable[bool] `json:"external_slack_email_optional"` - ExternalSlackEnabled nullable.Nullable[bool] `json:"external_slack_enabled"` - ExternalSlackOidcClientId nullable.Nullable[string] `json:"external_slack_oidc_client_id"` - ExternalSlackOidcEmailOptional nullable.Nullable[bool] `json:"external_slack_oidc_email_optional"` - ExternalSlackOidcEnabled nullable.Nullable[bool] `json:"external_slack_oidc_enabled"` - ExternalSlackOidcSecret nullable.Nullable[string] `json:"external_slack_oidc_secret"` - ExternalSlackSecret nullable.Nullable[string] `json:"external_slack_secret"` - ExternalSpotifyClientId nullable.Nullable[string] `json:"external_spotify_client_id"` - ExternalSpotifyEmailOptional nullable.Nullable[bool] `json:"external_spotify_email_optional"` - ExternalSpotifyEnabled nullable.Nullable[bool] `json:"external_spotify_enabled"` - ExternalSpotifySecret nullable.Nullable[string] `json:"external_spotify_secret"` - ExternalTwitchClientId nullable.Nullable[string] `json:"external_twitch_client_id"` - ExternalTwitchEmailOptional nullable.Nullable[bool] `json:"external_twitch_email_optional"` - ExternalTwitchEnabled nullable.Nullable[bool] `json:"external_twitch_enabled"` - ExternalTwitchSecret nullable.Nullable[string] `json:"external_twitch_secret"` - ExternalTwitterClientId nullable.Nullable[string] `json:"external_twitter_client_id"` - ExternalTwitterEmailOptional nullable.Nullable[bool] `json:"external_twitter_email_optional"` - ExternalTwitterEnabled nullable.Nullable[bool] `json:"external_twitter_enabled"` - ExternalTwitterSecret nullable.Nullable[string] `json:"external_twitter_secret"` - ExternalWeb3EthereumEnabled nullable.Nullable[bool] `json:"external_web3_ethereum_enabled"` - ExternalWeb3SolanaEnabled nullable.Nullable[bool] `json:"external_web3_solana_enabled"` - ExternalWorkosClientId nullable.Nullable[string] `json:"external_workos_client_id"` - ExternalWorkosEnabled nullable.Nullable[bool] `json:"external_workos_enabled"` - ExternalWorkosSecret nullable.Nullable[string] `json:"external_workos_secret"` - ExternalWorkosUrl nullable.Nullable[string] `json:"external_workos_url"` - ExternalZoomClientId nullable.Nullable[string] `json:"external_zoom_client_id"` - ExternalZoomEmailOptional nullable.Nullable[bool] `json:"external_zoom_email_optional"` - ExternalZoomEnabled nullable.Nullable[bool] `json:"external_zoom_enabled"` - ExternalZoomSecret nullable.Nullable[string] `json:"external_zoom_secret"` - HookBeforeUserCreatedEnabled nullable.Nullable[bool] `json:"hook_before_user_created_enabled"` - HookBeforeUserCreatedSecrets nullable.Nullable[string] `json:"hook_before_user_created_secrets"` - HookBeforeUserCreatedUri nullable.Nullable[string] `json:"hook_before_user_created_uri"` - HookCustomAccessTokenEnabled nullable.Nullable[bool] `json:"hook_custom_access_token_enabled"` - HookCustomAccessTokenSecrets nullable.Nullable[string] `json:"hook_custom_access_token_secrets"` - HookCustomAccessTokenUri nullable.Nullable[string] `json:"hook_custom_access_token_uri"` - HookMfaVerificationAttemptEnabled nullable.Nullable[bool] `json:"hook_mfa_verification_attempt_enabled"` - HookMfaVerificationAttemptSecrets nullable.Nullable[string] `json:"hook_mfa_verification_attempt_secrets"` - HookMfaVerificationAttemptUri nullable.Nullable[string] `json:"hook_mfa_verification_attempt_uri"` - HookPasswordVerificationAttemptEnabled nullable.Nullable[bool] `json:"hook_password_verification_attempt_enabled"` - HookPasswordVerificationAttemptSecrets nullable.Nullable[string] `json:"hook_password_verification_attempt_secrets"` - HookPasswordVerificationAttemptUri nullable.Nullable[string] `json:"hook_password_verification_attempt_uri"` - HookSendEmailEnabled nullable.Nullable[bool] `json:"hook_send_email_enabled"` - HookSendEmailSecrets nullable.Nullable[string] `json:"hook_send_email_secrets"` - HookSendEmailUri nullable.Nullable[string] `json:"hook_send_email_uri"` - HookSendSmsEnabled nullable.Nullable[bool] `json:"hook_send_sms_enabled"` - HookSendSmsSecrets nullable.Nullable[string] `json:"hook_send_sms_secrets"` - HookSendSmsUri nullable.Nullable[string] `json:"hook_send_sms_uri"` - JwtExp nullable.Nullable[int] `json:"jwt_exp"` - MailerAllowUnverifiedEmailSignIns nullable.Nullable[bool] `json:"mailer_allow_unverified_email_sign_ins"` - MailerAutoconfirm nullable.Nullable[bool] `json:"mailer_autoconfirm"` - MailerOtpExp int `json:"mailer_otp_exp"` - MailerOtpLength nullable.Nullable[int] `json:"mailer_otp_length"` - MailerSecureEmailChangeEnabled nullable.Nullable[bool] `json:"mailer_secure_email_change_enabled"` - MailerSubjectsConfirmation nullable.Nullable[string] `json:"mailer_subjects_confirmation"` - MailerSubjectsEmailChange nullable.Nullable[string] `json:"mailer_subjects_email_change"` - MailerSubjectsInvite nullable.Nullable[string] `json:"mailer_subjects_invite"` - MailerSubjectsMagicLink nullable.Nullable[string] `json:"mailer_subjects_magic_link"` - MailerSubjectsReauthentication nullable.Nullable[string] `json:"mailer_subjects_reauthentication"` - MailerSubjectsRecovery nullable.Nullable[string] `json:"mailer_subjects_recovery"` - MailerTemplatesConfirmationContent nullable.Nullable[string] `json:"mailer_templates_confirmation_content"` - MailerTemplatesEmailChangeContent nullable.Nullable[string] `json:"mailer_templates_email_change_content"` - MailerTemplatesInviteContent nullable.Nullable[string] `json:"mailer_templates_invite_content"` - MailerTemplatesMagicLinkContent nullable.Nullable[string] `json:"mailer_templates_magic_link_content"` - MailerTemplatesReauthenticationContent nullable.Nullable[string] `json:"mailer_templates_reauthentication_content"` - MailerTemplatesRecoveryContent nullable.Nullable[string] `json:"mailer_templates_recovery_content"` - MfaMaxEnrolledFactors nullable.Nullable[int] `json:"mfa_max_enrolled_factors"` - MfaPhoneEnrollEnabled nullable.Nullable[bool] `json:"mfa_phone_enroll_enabled"` - MfaPhoneMaxFrequency nullable.Nullable[int] `json:"mfa_phone_max_frequency"` - MfaPhoneOtpLength int `json:"mfa_phone_otp_length"` - MfaPhoneTemplate nullable.Nullable[string] `json:"mfa_phone_template"` - MfaPhoneVerifyEnabled nullable.Nullable[bool] `json:"mfa_phone_verify_enabled"` - MfaTotpEnrollEnabled nullable.Nullable[bool] `json:"mfa_totp_enroll_enabled"` - MfaTotpVerifyEnabled nullable.Nullable[bool] `json:"mfa_totp_verify_enabled"` - MfaWebAuthnEnrollEnabled nullable.Nullable[bool] `json:"mfa_web_authn_enroll_enabled"` - MfaWebAuthnVerifyEnabled nullable.Nullable[bool] `json:"mfa_web_authn_verify_enabled"` - NimbusOauthClientId nullable.Nullable[string] `json:"nimbus_oauth_client_id"` - NimbusOauthClientSecret nullable.Nullable[string] `json:"nimbus_oauth_client_secret"` - NimbusOauthEmailOptional nullable.Nullable[bool] `json:"nimbus_oauth_email_optional"` - PasswordHibpEnabled nullable.Nullable[bool] `json:"password_hibp_enabled"` - PasswordMinLength nullable.Nullable[int] `json:"password_min_length"` - PasswordRequiredCharacters nullable.Nullable[AuthConfigResponsePasswordRequiredCharacters] `json:"password_required_characters"` - RateLimitAnonymousUsers nullable.Nullable[int] `json:"rate_limit_anonymous_users"` - RateLimitEmailSent nullable.Nullable[int] `json:"rate_limit_email_sent"` - RateLimitOtp nullable.Nullable[int] `json:"rate_limit_otp"` - RateLimitSmsSent nullable.Nullable[int] `json:"rate_limit_sms_sent"` - RateLimitTokenRefresh nullable.Nullable[int] `json:"rate_limit_token_refresh"` - RateLimitVerify nullable.Nullable[int] `json:"rate_limit_verify"` - RateLimitWeb3 nullable.Nullable[int] `json:"rate_limit_web3"` - RefreshTokenRotationEnabled nullable.Nullable[bool] `json:"refresh_token_rotation_enabled"` - SamlAllowEncryptedAssertions nullable.Nullable[bool] `json:"saml_allow_encrypted_assertions"` - SamlEnabled nullable.Nullable[bool] `json:"saml_enabled"` - SamlExternalUrl nullable.Nullable[string] `json:"saml_external_url"` - SecurityCaptchaEnabled nullable.Nullable[bool] `json:"security_captcha_enabled"` - SecurityCaptchaProvider nullable.Nullable[AuthConfigResponseSecurityCaptchaProvider] `json:"security_captcha_provider"` - SecurityCaptchaSecret nullable.Nullable[string] `json:"security_captcha_secret"` - SecurityManualLinkingEnabled nullable.Nullable[bool] `json:"security_manual_linking_enabled"` - SecurityRefreshTokenReuseInterval nullable.Nullable[int] `json:"security_refresh_token_reuse_interval"` - SecurityUpdatePasswordRequireReauthentication nullable.Nullable[bool] `json:"security_update_password_require_reauthentication"` - SessionsInactivityTimeout nullable.Nullable[int] `json:"sessions_inactivity_timeout"` - SessionsSinglePerUser nullable.Nullable[bool] `json:"sessions_single_per_user"` - SessionsTags nullable.Nullable[string] `json:"sessions_tags"` - SessionsTimebox nullable.Nullable[int] `json:"sessions_timebox"` - SiteUrl nullable.Nullable[string] `json:"site_url"` - SmsAutoconfirm nullable.Nullable[bool] `json:"sms_autoconfirm"` - SmsMaxFrequency nullable.Nullable[int] `json:"sms_max_frequency"` - SmsMessagebirdAccessKey nullable.Nullable[string] `json:"sms_messagebird_access_key"` - SmsMessagebirdOriginator nullable.Nullable[string] `json:"sms_messagebird_originator"` - SmsOtpExp nullable.Nullable[int] `json:"sms_otp_exp"` - SmsOtpLength int `json:"sms_otp_length"` - SmsProvider nullable.Nullable[AuthConfigResponseSmsProvider] `json:"sms_provider"` - SmsTemplate nullable.Nullable[string] `json:"sms_template"` - SmsTestOtp nullable.Nullable[string] `json:"sms_test_otp"` - SmsTestOtpValidUntil nullable.Nullable[time.Time] `json:"sms_test_otp_valid_until"` - SmsTextlocalApiKey nullable.Nullable[string] `json:"sms_textlocal_api_key"` - SmsTextlocalSender nullable.Nullable[string] `json:"sms_textlocal_sender"` - SmsTwilioAccountSid nullable.Nullable[string] `json:"sms_twilio_account_sid"` - SmsTwilioAuthToken nullable.Nullable[string] `json:"sms_twilio_auth_token"` - SmsTwilioContentSid nullable.Nullable[string] `json:"sms_twilio_content_sid"` - SmsTwilioMessageServiceSid nullable.Nullable[string] `json:"sms_twilio_message_service_sid"` - SmsTwilioVerifyAccountSid nullable.Nullable[string] `json:"sms_twilio_verify_account_sid"` - SmsTwilioVerifyAuthToken nullable.Nullable[string] `json:"sms_twilio_verify_auth_token"` - SmsTwilioVerifyMessageServiceSid nullable.Nullable[string] `json:"sms_twilio_verify_message_service_sid"` - SmsVonageApiKey nullable.Nullable[string] `json:"sms_vonage_api_key"` - SmsVonageApiSecret nullable.Nullable[string] `json:"sms_vonage_api_secret"` - SmsVonageFrom nullable.Nullable[string] `json:"sms_vonage_from"` - SmtpAdminEmail nullable.Nullable[openapi_types.Email] `json:"smtp_admin_email"` - SmtpHost nullable.Nullable[string] `json:"smtp_host"` - SmtpMaxFrequency nullable.Nullable[int] `json:"smtp_max_frequency"` - SmtpPass nullable.Nullable[string] `json:"smtp_pass"` - SmtpPort nullable.Nullable[string] `json:"smtp_port"` - SmtpSenderName nullable.Nullable[string] `json:"smtp_sender_name"` - SmtpUser nullable.Nullable[string] `json:"smtp_user"` - UriAllowList nullable.Nullable[string] `json:"uri_allow_list"` + ApiMaxRequestDuration nullable.Nullable[int] `json:"api_max_request_duration"` + DbMaxPoolSize nullable.Nullable[int] `json:"db_max_pool_size"` + DisableSignup nullable.Nullable[bool] `json:"disable_signup"` + ExternalAnonymousUsersEnabled nullable.Nullable[bool] `json:"external_anonymous_users_enabled"` + ExternalAppleAdditionalClientIds nullable.Nullable[string] `json:"external_apple_additional_client_ids"` + ExternalAppleClientId nullable.Nullable[string] `json:"external_apple_client_id"` + ExternalAppleEmailOptional nullable.Nullable[bool] `json:"external_apple_email_optional"` + ExternalAppleEnabled nullable.Nullable[bool] `json:"external_apple_enabled"` + ExternalAppleSecret nullable.Nullable[string] `json:"external_apple_secret"` + ExternalAzureClientId nullable.Nullable[string] `json:"external_azure_client_id"` + ExternalAzureEmailOptional nullable.Nullable[bool] `json:"external_azure_email_optional"` + ExternalAzureEnabled nullable.Nullable[bool] `json:"external_azure_enabled"` + ExternalAzureSecret nullable.Nullable[string] `json:"external_azure_secret"` + ExternalAzureUrl nullable.Nullable[string] `json:"external_azure_url"` + ExternalBitbucketClientId nullable.Nullable[string] `json:"external_bitbucket_client_id"` + ExternalBitbucketEmailOptional nullable.Nullable[bool] `json:"external_bitbucket_email_optional"` + ExternalBitbucketEnabled nullable.Nullable[bool] `json:"external_bitbucket_enabled"` + ExternalBitbucketSecret nullable.Nullable[string] `json:"external_bitbucket_secret"` + ExternalDiscordClientId nullable.Nullable[string] `json:"external_discord_client_id"` + ExternalDiscordEmailOptional nullable.Nullable[bool] `json:"external_discord_email_optional"` + ExternalDiscordEnabled nullable.Nullable[bool] `json:"external_discord_enabled"` + ExternalDiscordSecret nullable.Nullable[string] `json:"external_discord_secret"` + ExternalEmailEnabled nullable.Nullable[bool] `json:"external_email_enabled"` + ExternalFacebookClientId nullable.Nullable[string] `json:"external_facebook_client_id"` + ExternalFacebookEmailOptional nullable.Nullable[bool] `json:"external_facebook_email_optional"` + ExternalFacebookEnabled nullable.Nullable[bool] `json:"external_facebook_enabled"` + ExternalFacebookSecret nullable.Nullable[string] `json:"external_facebook_secret"` + ExternalFigmaClientId nullable.Nullable[string] `json:"external_figma_client_id"` + ExternalFigmaEmailOptional nullable.Nullable[bool] `json:"external_figma_email_optional"` + ExternalFigmaEnabled nullable.Nullable[bool] `json:"external_figma_enabled"` + ExternalFigmaSecret nullable.Nullable[string] `json:"external_figma_secret"` + ExternalGithubClientId nullable.Nullable[string] `json:"external_github_client_id"` + ExternalGithubEmailOptional nullable.Nullable[bool] `json:"external_github_email_optional"` + ExternalGithubEnabled nullable.Nullable[bool] `json:"external_github_enabled"` + ExternalGithubSecret nullable.Nullable[string] `json:"external_github_secret"` + ExternalGitlabClientId nullable.Nullable[string] `json:"external_gitlab_client_id"` + ExternalGitlabEmailOptional nullable.Nullable[bool] `json:"external_gitlab_email_optional"` + ExternalGitlabEnabled nullable.Nullable[bool] `json:"external_gitlab_enabled"` + ExternalGitlabSecret nullable.Nullable[string] `json:"external_gitlab_secret"` + ExternalGitlabUrl nullable.Nullable[string] `json:"external_gitlab_url"` + ExternalGoogleAdditionalClientIds nullable.Nullable[string] `json:"external_google_additional_client_ids"` + ExternalGoogleClientId nullable.Nullable[string] `json:"external_google_client_id"` + ExternalGoogleEmailOptional nullable.Nullable[bool] `json:"external_google_email_optional"` + ExternalGoogleEnabled nullable.Nullable[bool] `json:"external_google_enabled"` + ExternalGoogleSecret nullable.Nullable[string] `json:"external_google_secret"` + ExternalGoogleSkipNonceCheck nullable.Nullable[bool] `json:"external_google_skip_nonce_check"` + ExternalKakaoClientId nullable.Nullable[string] `json:"external_kakao_client_id"` + ExternalKakaoEmailOptional nullable.Nullable[bool] `json:"external_kakao_email_optional"` + ExternalKakaoEnabled nullable.Nullable[bool] `json:"external_kakao_enabled"` + ExternalKakaoSecret nullable.Nullable[string] `json:"external_kakao_secret"` + ExternalKeycloakClientId nullable.Nullable[string] `json:"external_keycloak_client_id"` + ExternalKeycloakEmailOptional nullable.Nullable[bool] `json:"external_keycloak_email_optional"` + ExternalKeycloakEnabled nullable.Nullable[bool] `json:"external_keycloak_enabled"` + ExternalKeycloakSecret nullable.Nullable[string] `json:"external_keycloak_secret"` + ExternalKeycloakUrl nullable.Nullable[string] `json:"external_keycloak_url"` + ExternalLinkedinOidcClientId nullable.Nullable[string] `json:"external_linkedin_oidc_client_id"` + ExternalLinkedinOidcEmailOptional nullable.Nullable[bool] `json:"external_linkedin_oidc_email_optional"` + ExternalLinkedinOidcEnabled nullable.Nullable[bool] `json:"external_linkedin_oidc_enabled"` + ExternalLinkedinOidcSecret nullable.Nullable[string] `json:"external_linkedin_oidc_secret"` + ExternalNotionClientId nullable.Nullable[string] `json:"external_notion_client_id"` + ExternalNotionEmailOptional nullable.Nullable[bool] `json:"external_notion_email_optional"` + ExternalNotionEnabled nullable.Nullable[bool] `json:"external_notion_enabled"` + ExternalNotionSecret nullable.Nullable[string] `json:"external_notion_secret"` + ExternalPhoneEnabled nullable.Nullable[bool] `json:"external_phone_enabled"` + ExternalSlackClientId nullable.Nullable[string] `json:"external_slack_client_id"` + ExternalSlackEmailOptional nullable.Nullable[bool] `json:"external_slack_email_optional"` + ExternalSlackEnabled nullable.Nullable[bool] `json:"external_slack_enabled"` + ExternalSlackOidcClientId nullable.Nullable[string] `json:"external_slack_oidc_client_id"` + ExternalSlackOidcEmailOptional nullable.Nullable[bool] `json:"external_slack_oidc_email_optional"` + ExternalSlackOidcEnabled nullable.Nullable[bool] `json:"external_slack_oidc_enabled"` + ExternalSlackOidcSecret nullable.Nullable[string] `json:"external_slack_oidc_secret"` + ExternalSlackSecret nullable.Nullable[string] `json:"external_slack_secret"` + ExternalSpotifyClientId nullable.Nullable[string] `json:"external_spotify_client_id"` + ExternalSpotifyEmailOptional nullable.Nullable[bool] `json:"external_spotify_email_optional"` + ExternalSpotifyEnabled nullable.Nullable[bool] `json:"external_spotify_enabled"` + ExternalSpotifySecret nullable.Nullable[string] `json:"external_spotify_secret"` + ExternalTwitchClientId nullable.Nullable[string] `json:"external_twitch_client_id"` + ExternalTwitchEmailOptional nullable.Nullable[bool] `json:"external_twitch_email_optional"` + ExternalTwitchEnabled nullable.Nullable[bool] `json:"external_twitch_enabled"` + ExternalTwitchSecret nullable.Nullable[string] `json:"external_twitch_secret"` + ExternalTwitterClientId nullable.Nullable[string] `json:"external_twitter_client_id"` + ExternalTwitterEmailOptional nullable.Nullable[bool] `json:"external_twitter_email_optional"` + ExternalTwitterEnabled nullable.Nullable[bool] `json:"external_twitter_enabled"` + ExternalTwitterSecret nullable.Nullable[string] `json:"external_twitter_secret"` + ExternalWeb3EthereumEnabled nullable.Nullable[bool] `json:"external_web3_ethereum_enabled"` + ExternalWeb3SolanaEnabled nullable.Nullable[bool] `json:"external_web3_solana_enabled"` + ExternalWorkosClientId nullable.Nullable[string] `json:"external_workos_client_id"` + ExternalWorkosEnabled nullable.Nullable[bool] `json:"external_workos_enabled"` + ExternalWorkosSecret nullable.Nullable[string] `json:"external_workos_secret"` + ExternalWorkosUrl nullable.Nullable[string] `json:"external_workos_url"` + ExternalZoomClientId nullable.Nullable[string] `json:"external_zoom_client_id"` + ExternalZoomEmailOptional nullable.Nullable[bool] `json:"external_zoom_email_optional"` + ExternalZoomEnabled nullable.Nullable[bool] `json:"external_zoom_enabled"` + ExternalZoomSecret nullable.Nullable[string] `json:"external_zoom_secret"` + HookAfterUserCreatedEnabled nullable.Nullable[bool] `json:"hook_after_user_created_enabled"` + HookAfterUserCreatedSecrets nullable.Nullable[string] `json:"hook_after_user_created_secrets"` + HookAfterUserCreatedUri nullable.Nullable[string] `json:"hook_after_user_created_uri"` + HookBeforeUserCreatedEnabled nullable.Nullable[bool] `json:"hook_before_user_created_enabled"` + HookBeforeUserCreatedSecrets nullable.Nullable[string] `json:"hook_before_user_created_secrets"` + HookBeforeUserCreatedUri nullable.Nullable[string] `json:"hook_before_user_created_uri"` + HookCustomAccessTokenEnabled nullable.Nullable[bool] `json:"hook_custom_access_token_enabled"` + HookCustomAccessTokenSecrets nullable.Nullable[string] `json:"hook_custom_access_token_secrets"` + HookCustomAccessTokenUri nullable.Nullable[string] `json:"hook_custom_access_token_uri"` + HookMfaVerificationAttemptEnabled nullable.Nullable[bool] `json:"hook_mfa_verification_attempt_enabled"` + HookMfaVerificationAttemptSecrets nullable.Nullable[string] `json:"hook_mfa_verification_attempt_secrets"` + HookMfaVerificationAttemptUri nullable.Nullable[string] `json:"hook_mfa_verification_attempt_uri"` + HookPasswordVerificationAttemptEnabled nullable.Nullable[bool] `json:"hook_password_verification_attempt_enabled"` + HookPasswordVerificationAttemptSecrets nullable.Nullable[string] `json:"hook_password_verification_attempt_secrets"` + HookPasswordVerificationAttemptUri nullable.Nullable[string] `json:"hook_password_verification_attempt_uri"` + HookSendEmailEnabled nullable.Nullable[bool] `json:"hook_send_email_enabled"` + HookSendEmailSecrets nullable.Nullable[string] `json:"hook_send_email_secrets"` + HookSendEmailUri nullable.Nullable[string] `json:"hook_send_email_uri"` + HookSendSmsEnabled nullable.Nullable[bool] `json:"hook_send_sms_enabled"` + HookSendSmsSecrets nullable.Nullable[string] `json:"hook_send_sms_secrets"` + HookSendSmsUri nullable.Nullable[string] `json:"hook_send_sms_uri"` + JwtExp nullable.Nullable[int] `json:"jwt_exp"` + MailerAllowUnverifiedEmailSignIns nullable.Nullable[bool] `json:"mailer_allow_unverified_email_sign_ins"` + MailerAutoconfirm nullable.Nullable[bool] `json:"mailer_autoconfirm"` + MailerNotificationsEmailChangedEnabled nullable.Nullable[bool] `json:"mailer_notifications_email_changed_enabled"` + MailerNotificationsIdentityLinkedEnabled nullable.Nullable[bool] `json:"mailer_notifications_identity_linked_enabled"` + MailerNotificationsIdentityUnlinkedEnabled nullable.Nullable[bool] `json:"mailer_notifications_identity_unlinked_enabled"` + MailerNotificationsMfaFactorEnrolledEnabled nullable.Nullable[bool] `json:"mailer_notifications_mfa_factor_enrolled_enabled"` + MailerNotificationsMfaFactorUnenrolledEnabled nullable.Nullable[bool] `json:"mailer_notifications_mfa_factor_unenrolled_enabled"` + MailerNotificationsPasswordChangedEnabled nullable.Nullable[bool] `json:"mailer_notifications_password_changed_enabled"` + MailerNotificationsPhoneChangedEnabled nullable.Nullable[bool] `json:"mailer_notifications_phone_changed_enabled"` + MailerOtpExp int `json:"mailer_otp_exp"` + MailerOtpLength nullable.Nullable[int] `json:"mailer_otp_length"` + MailerSecureEmailChangeEnabled nullable.Nullable[bool] `json:"mailer_secure_email_change_enabled"` + MailerSubjectsConfirmation nullable.Nullable[string] `json:"mailer_subjects_confirmation"` + MailerSubjectsEmailChange nullable.Nullable[string] `json:"mailer_subjects_email_change"` + MailerSubjectsEmailChangedNotification nullable.Nullable[string] `json:"mailer_subjects_email_changed_notification"` + MailerSubjectsIdentityLinkedNotification nullable.Nullable[string] `json:"mailer_subjects_identity_linked_notification"` + MailerSubjectsIdentityUnlinkedNotification nullable.Nullable[string] `json:"mailer_subjects_identity_unlinked_notification"` + MailerSubjectsInvite nullable.Nullable[string] `json:"mailer_subjects_invite"` + MailerSubjectsMagicLink nullable.Nullable[string] `json:"mailer_subjects_magic_link"` + MailerSubjectsMfaFactorEnrolledNotification nullable.Nullable[string] `json:"mailer_subjects_mfa_factor_enrolled_notification"` + MailerSubjectsMfaFactorUnenrolledNotification nullable.Nullable[string] `json:"mailer_subjects_mfa_factor_unenrolled_notification"` + MailerSubjectsPasswordChangedNotification nullable.Nullable[string] `json:"mailer_subjects_password_changed_notification"` + MailerSubjectsPhoneChangedNotification nullable.Nullable[string] `json:"mailer_subjects_phone_changed_notification"` + MailerSubjectsReauthentication nullable.Nullable[string] `json:"mailer_subjects_reauthentication"` + MailerSubjectsRecovery nullable.Nullable[string] `json:"mailer_subjects_recovery"` + MailerTemplatesConfirmationContent nullable.Nullable[string] `json:"mailer_templates_confirmation_content"` + MailerTemplatesEmailChangeContent nullable.Nullable[string] `json:"mailer_templates_email_change_content"` + MailerTemplatesEmailChangedNotificationContent nullable.Nullable[string] `json:"mailer_templates_email_changed_notification_content"` + MailerTemplatesIdentityLinkedNotificationContent nullable.Nullable[string] `json:"mailer_templates_identity_linked_notification_content"` + MailerTemplatesIdentityUnlinkedNotificationContent nullable.Nullable[string] `json:"mailer_templates_identity_unlinked_notification_content"` + MailerTemplatesInviteContent nullable.Nullable[string] `json:"mailer_templates_invite_content"` + MailerTemplatesMagicLinkContent nullable.Nullable[string] `json:"mailer_templates_magic_link_content"` + MailerTemplatesMfaFactorEnrolledNotificationContent nullable.Nullable[string] `json:"mailer_templates_mfa_factor_enrolled_notification_content"` + MailerTemplatesMfaFactorUnenrolledNotificationContent nullable.Nullable[string] `json:"mailer_templates_mfa_factor_unenrolled_notification_content"` + MailerTemplatesPasswordChangedNotificationContent nullable.Nullable[string] `json:"mailer_templates_password_changed_notification_content"` + MailerTemplatesPhoneChangedNotificationContent nullable.Nullable[string] `json:"mailer_templates_phone_changed_notification_content"` + MailerTemplatesReauthenticationContent nullable.Nullable[string] `json:"mailer_templates_reauthentication_content"` + MailerTemplatesRecoveryContent nullable.Nullable[string] `json:"mailer_templates_recovery_content"` + MfaMaxEnrolledFactors nullable.Nullable[int] `json:"mfa_max_enrolled_factors"` + MfaPhoneEnrollEnabled nullable.Nullable[bool] `json:"mfa_phone_enroll_enabled"` + MfaPhoneMaxFrequency nullable.Nullable[int] `json:"mfa_phone_max_frequency"` + MfaPhoneOtpLength int `json:"mfa_phone_otp_length"` + MfaPhoneTemplate nullable.Nullable[string] `json:"mfa_phone_template"` + MfaPhoneVerifyEnabled nullable.Nullable[bool] `json:"mfa_phone_verify_enabled"` + MfaTotpEnrollEnabled nullable.Nullable[bool] `json:"mfa_totp_enroll_enabled"` + MfaTotpVerifyEnabled nullable.Nullable[bool] `json:"mfa_totp_verify_enabled"` + MfaWebAuthnEnrollEnabled nullable.Nullable[bool] `json:"mfa_web_authn_enroll_enabled"` + MfaWebAuthnVerifyEnabled nullable.Nullable[bool] `json:"mfa_web_authn_verify_enabled"` + NimbusOauthClientId nullable.Nullable[string] `json:"nimbus_oauth_client_id"` + NimbusOauthClientSecret nullable.Nullable[string] `json:"nimbus_oauth_client_secret"` + NimbusOauthEmailOptional nullable.Nullable[bool] `json:"nimbus_oauth_email_optional"` + PasswordHibpEnabled nullable.Nullable[bool] `json:"password_hibp_enabled"` + PasswordMinLength nullable.Nullable[int] `json:"password_min_length"` + PasswordRequiredCharacters nullable.Nullable[AuthConfigResponsePasswordRequiredCharacters] `json:"password_required_characters"` + RateLimitAnonymousUsers nullable.Nullable[int] `json:"rate_limit_anonymous_users"` + RateLimitEmailSent nullable.Nullable[int] `json:"rate_limit_email_sent"` + RateLimitOtp nullable.Nullable[int] `json:"rate_limit_otp"` + RateLimitSmsSent nullable.Nullable[int] `json:"rate_limit_sms_sent"` + RateLimitTokenRefresh nullable.Nullable[int] `json:"rate_limit_token_refresh"` + RateLimitVerify nullable.Nullable[int] `json:"rate_limit_verify"` + RateLimitWeb3 nullable.Nullable[int] `json:"rate_limit_web3"` + RefreshTokenRotationEnabled nullable.Nullable[bool] `json:"refresh_token_rotation_enabled"` + SamlAllowEncryptedAssertions nullable.Nullable[bool] `json:"saml_allow_encrypted_assertions"` + SamlEnabled nullable.Nullable[bool] `json:"saml_enabled"` + SamlExternalUrl nullable.Nullable[string] `json:"saml_external_url"` + SecurityCaptchaEnabled nullable.Nullable[bool] `json:"security_captcha_enabled"` + SecurityCaptchaProvider nullable.Nullable[AuthConfigResponseSecurityCaptchaProvider] `json:"security_captcha_provider"` + SecurityCaptchaSecret nullable.Nullable[string] `json:"security_captcha_secret"` + SecurityManualLinkingEnabled nullable.Nullable[bool] `json:"security_manual_linking_enabled"` + SecurityRefreshTokenReuseInterval nullable.Nullable[int] `json:"security_refresh_token_reuse_interval"` + SecurityUpdatePasswordRequireReauthentication nullable.Nullable[bool] `json:"security_update_password_require_reauthentication"` + SessionsInactivityTimeout nullable.Nullable[int] `json:"sessions_inactivity_timeout"` + SessionsSinglePerUser nullable.Nullable[bool] `json:"sessions_single_per_user"` + SessionsTags nullable.Nullable[string] `json:"sessions_tags"` + SessionsTimebox nullable.Nullable[int] `json:"sessions_timebox"` + SiteUrl nullable.Nullable[string] `json:"site_url"` + SmsAutoconfirm nullable.Nullable[bool] `json:"sms_autoconfirm"` + SmsMaxFrequency nullable.Nullable[int] `json:"sms_max_frequency"` + SmsMessagebirdAccessKey nullable.Nullable[string] `json:"sms_messagebird_access_key"` + SmsMessagebirdOriginator nullable.Nullable[string] `json:"sms_messagebird_originator"` + SmsOtpExp nullable.Nullable[int] `json:"sms_otp_exp"` + SmsOtpLength int `json:"sms_otp_length"` + SmsProvider nullable.Nullable[AuthConfigResponseSmsProvider] `json:"sms_provider"` + SmsTemplate nullable.Nullable[string] `json:"sms_template"` + SmsTestOtp nullable.Nullable[string] `json:"sms_test_otp"` + SmsTestOtpValidUntil nullable.Nullable[time.Time] `json:"sms_test_otp_valid_until"` + SmsTextlocalApiKey nullable.Nullable[string] `json:"sms_textlocal_api_key"` + SmsTextlocalSender nullable.Nullable[string] `json:"sms_textlocal_sender"` + SmsTwilioAccountSid nullable.Nullable[string] `json:"sms_twilio_account_sid"` + SmsTwilioAuthToken nullable.Nullable[string] `json:"sms_twilio_auth_token"` + SmsTwilioContentSid nullable.Nullable[string] `json:"sms_twilio_content_sid"` + SmsTwilioMessageServiceSid nullable.Nullable[string] `json:"sms_twilio_message_service_sid"` + SmsTwilioVerifyAccountSid nullable.Nullable[string] `json:"sms_twilio_verify_account_sid"` + SmsTwilioVerifyAuthToken nullable.Nullable[string] `json:"sms_twilio_verify_auth_token"` + SmsTwilioVerifyMessageServiceSid nullable.Nullable[string] `json:"sms_twilio_verify_message_service_sid"` + SmsVonageApiKey nullable.Nullable[string] `json:"sms_vonage_api_key"` + SmsVonageApiSecret nullable.Nullable[string] `json:"sms_vonage_api_secret"` + SmsVonageFrom nullable.Nullable[string] `json:"sms_vonage_from"` + SmtpAdminEmail nullable.Nullable[openapi_types.Email] `json:"smtp_admin_email"` + SmtpHost nullable.Nullable[string] `json:"smtp_host"` + SmtpMaxFrequency nullable.Nullable[int] `json:"smtp_max_frequency"` + SmtpPass nullable.Nullable[string] `json:"smtp_pass"` + SmtpPort nullable.Nullable[string] `json:"smtp_port"` + SmtpSenderName nullable.Nullable[string] `json:"smtp_sender_name"` + SmtpUser nullable.Nullable[string] `json:"smtp_user"` + UriAllowList nullable.Nullable[string] `json:"uri_allow_list"` } // AuthConfigResponsePasswordRequiredCharacters defines model for AuthConfigResponse.PasswordRequiredCharacters. @@ -2545,15 +2686,13 @@ type OAuthTokenBody struct { RefreshToken *string `json:"refresh_token,omitempty"` // Resource Resource indicator for MCP (Model Context Protocol) clients - Resource *OAuthTokenBodyResource `json:"resource,omitempty"` + Resource *string `json:"resource,omitempty"` + Scope *string `json:"scope,omitempty"` } // OAuthTokenBodyGrantType defines model for OAuthTokenBody.GrantType. type OAuthTokenBodyGrantType string -// OAuthTokenBodyResource Resource indicator for MCP (Model Context Protocol) clients -type OAuthTokenBodyResource string - // OAuthTokenResponse defines model for OAuthTokenResponse. type OAuthTokenResponse struct { AccessToken string `json:"access_token"` @@ -2583,12 +2722,10 @@ type OrganizationProjectClaimResponse struct { Limit float32 `json:"limit"` Name string `json:"name"` } `json:"members_exceeding_free_project_limit"` - SourceSubscriptionPlan OrganizationProjectClaimResponsePreviewSourceSubscriptionPlan `json:"source_subscription_plan"` - TargetOrganizationEligible nullable.Nullable[bool] `json:"target_organization_eligible"` - TargetOrganizationHasFreeProjectSlots nullable.Nullable[bool] `json:"target_organization_has_free_project_slots"` - TargetSubscriptionPlan nullable.Nullable[OrganizationProjectClaimResponsePreviewTargetSubscriptionPlan] `json:"target_subscription_plan"` - Valid bool `json:"valid"` - Warnings []struct { + SourceSubscriptionPlan OrganizationProjectClaimResponsePreviewSourceSubscriptionPlan `json:"source_subscription_plan"` + TargetSubscriptionPlan nullable.Nullable[OrganizationProjectClaimResponsePreviewTargetSubscriptionPlan] `json:"target_subscription_plan"` + Valid bool `json:"valid"` + Warnings []struct { Key string `json:"key"` Message string `json:"message"` } `json:"warnings"` @@ -2704,6 +2841,68 @@ type ReadOnlyStatusResponse struct { OverrideEnabled bool `json:"override_enabled"` } +// RegionsInfo defines model for RegionsInfo. +type RegionsInfo struct { + All struct { + SmartGroup []struct { + Code RegionsInfoAllSmartGroupCode `json:"code"` + Name string `json:"name"` + Type RegionsInfoAllSmartGroupType `json:"type"` + } `json:"smartGroup"` + Specific []struct { + Code string `json:"code"` + Name string `json:"name"` + Provider RegionsInfoAllSpecificProvider `json:"provider"` + Status *RegionsInfoAllSpecificStatus `json:"status,omitempty"` + Type RegionsInfoAllSpecificType `json:"type"` + } `json:"specific"` + } `json:"all"` + Recommendations struct { + SmartGroup struct { + Code RegionsInfoRecommendationsSmartGroupCode `json:"code"` + Name string `json:"name"` + Type RegionsInfoRecommendationsSmartGroupType `json:"type"` + } `json:"smartGroup"` + Specific []struct { + Code string `json:"code"` + Name string `json:"name"` + Provider RegionsInfoRecommendationsSpecificProvider `json:"provider"` + Status *RegionsInfoRecommendationsSpecificStatus `json:"status,omitempty"` + Type RegionsInfoRecommendationsSpecificType `json:"type"` + } `json:"specific"` + } `json:"recommendations"` +} + +// RegionsInfoAllSmartGroupCode defines model for RegionsInfo.All.SmartGroup.Code. +type RegionsInfoAllSmartGroupCode string + +// RegionsInfoAllSmartGroupType defines model for RegionsInfo.All.SmartGroup.Type. +type RegionsInfoAllSmartGroupType string + +// RegionsInfoAllSpecificProvider defines model for RegionsInfo.All.Specific.Provider. +type RegionsInfoAllSpecificProvider string + +// RegionsInfoAllSpecificStatus defines model for RegionsInfo.All.Specific.Status. +type RegionsInfoAllSpecificStatus string + +// RegionsInfoAllSpecificType defines model for RegionsInfo.All.Specific.Type. +type RegionsInfoAllSpecificType string + +// RegionsInfoRecommendationsSmartGroupCode defines model for RegionsInfo.Recommendations.SmartGroup.Code. +type RegionsInfoRecommendationsSmartGroupCode string + +// RegionsInfoRecommendationsSmartGroupType defines model for RegionsInfo.Recommendations.SmartGroup.Type. +type RegionsInfoRecommendationsSmartGroupType string + +// RegionsInfoRecommendationsSpecificProvider defines model for RegionsInfo.Recommendations.Specific.Provider. +type RegionsInfoRecommendationsSpecificProvider string + +// RegionsInfoRecommendationsSpecificStatus defines model for RegionsInfo.Recommendations.Specific.Status. +type RegionsInfoRecommendationsSpecificStatus string + +// RegionsInfoRecommendationsSpecificType defines model for RegionsInfo.Recommendations.Specific.Type. +type RegionsInfoRecommendationsSpecificType string + // RemoveNetworkBanRequest defines model for RemoveNetworkBanRequest. type RemoveNetworkBanRequest struct { Identifier *string `json:"identifier,omitempty"` @@ -2937,202 +3136,226 @@ type UpdateApiKeyBody struct { // UpdateAuthConfigBody defines model for UpdateAuthConfigBody. type UpdateAuthConfigBody struct { - ApiMaxRequestDuration nullable.Nullable[int] `json:"api_max_request_duration,omitempty"` - DbMaxPoolSize nullable.Nullable[int] `json:"db_max_pool_size,omitempty"` - DisableSignup nullable.Nullable[bool] `json:"disable_signup,omitempty"` - ExternalAnonymousUsersEnabled nullable.Nullable[bool] `json:"external_anonymous_users_enabled,omitempty"` - ExternalAppleAdditionalClientIds nullable.Nullable[string] `json:"external_apple_additional_client_ids,omitempty"` - ExternalAppleClientId nullable.Nullable[string] `json:"external_apple_client_id,omitempty"` - ExternalAppleEmailOptional nullable.Nullable[bool] `json:"external_apple_email_optional,omitempty"` - ExternalAppleEnabled nullable.Nullable[bool] `json:"external_apple_enabled,omitempty"` - ExternalAppleSecret nullable.Nullable[string] `json:"external_apple_secret,omitempty"` - ExternalAzureClientId nullable.Nullable[string] `json:"external_azure_client_id,omitempty"` - ExternalAzureEmailOptional nullable.Nullable[bool] `json:"external_azure_email_optional,omitempty"` - ExternalAzureEnabled nullable.Nullable[bool] `json:"external_azure_enabled,omitempty"` - ExternalAzureSecret nullable.Nullable[string] `json:"external_azure_secret,omitempty"` - ExternalAzureUrl nullable.Nullable[string] `json:"external_azure_url,omitempty"` - ExternalBitbucketClientId nullable.Nullable[string] `json:"external_bitbucket_client_id,omitempty"` - ExternalBitbucketEmailOptional nullable.Nullable[bool] `json:"external_bitbucket_email_optional,omitempty"` - ExternalBitbucketEnabled nullable.Nullable[bool] `json:"external_bitbucket_enabled,omitempty"` - ExternalBitbucketSecret nullable.Nullable[string] `json:"external_bitbucket_secret,omitempty"` - ExternalDiscordClientId nullable.Nullable[string] `json:"external_discord_client_id,omitempty"` - ExternalDiscordEmailOptional nullable.Nullable[bool] `json:"external_discord_email_optional,omitempty"` - ExternalDiscordEnabled nullable.Nullable[bool] `json:"external_discord_enabled,omitempty"` - ExternalDiscordSecret nullable.Nullable[string] `json:"external_discord_secret,omitempty"` - ExternalEmailEnabled nullable.Nullable[bool] `json:"external_email_enabled,omitempty"` - ExternalFacebookClientId nullable.Nullable[string] `json:"external_facebook_client_id,omitempty"` - ExternalFacebookEmailOptional nullable.Nullable[bool] `json:"external_facebook_email_optional,omitempty"` - ExternalFacebookEnabled nullable.Nullable[bool] `json:"external_facebook_enabled,omitempty"` - ExternalFacebookSecret nullable.Nullable[string] `json:"external_facebook_secret,omitempty"` - ExternalFigmaClientId nullable.Nullable[string] `json:"external_figma_client_id,omitempty"` - ExternalFigmaEmailOptional nullable.Nullable[bool] `json:"external_figma_email_optional,omitempty"` - ExternalFigmaEnabled nullable.Nullable[bool] `json:"external_figma_enabled,omitempty"` - ExternalFigmaSecret nullable.Nullable[string] `json:"external_figma_secret,omitempty"` - ExternalGithubClientId nullable.Nullable[string] `json:"external_github_client_id,omitempty"` - ExternalGithubEmailOptional nullable.Nullable[bool] `json:"external_github_email_optional,omitempty"` - ExternalGithubEnabled nullable.Nullable[bool] `json:"external_github_enabled,omitempty"` - ExternalGithubSecret nullable.Nullable[string] `json:"external_github_secret,omitempty"` - ExternalGitlabClientId nullable.Nullable[string] `json:"external_gitlab_client_id,omitempty"` - ExternalGitlabEmailOptional nullable.Nullable[bool] `json:"external_gitlab_email_optional,omitempty"` - ExternalGitlabEnabled nullable.Nullable[bool] `json:"external_gitlab_enabled,omitempty"` - ExternalGitlabSecret nullable.Nullable[string] `json:"external_gitlab_secret,omitempty"` - ExternalGitlabUrl nullable.Nullable[string] `json:"external_gitlab_url,omitempty"` - ExternalGoogleAdditionalClientIds nullable.Nullable[string] `json:"external_google_additional_client_ids,omitempty"` - ExternalGoogleClientId nullable.Nullable[string] `json:"external_google_client_id,omitempty"` - ExternalGoogleEmailOptional nullable.Nullable[bool] `json:"external_google_email_optional,omitempty"` - ExternalGoogleEnabled nullable.Nullable[bool] `json:"external_google_enabled,omitempty"` - ExternalGoogleSecret nullable.Nullable[string] `json:"external_google_secret,omitempty"` - ExternalGoogleSkipNonceCheck nullable.Nullable[bool] `json:"external_google_skip_nonce_check,omitempty"` - ExternalKakaoClientId nullable.Nullable[string] `json:"external_kakao_client_id,omitempty"` - ExternalKakaoEmailOptional nullable.Nullable[bool] `json:"external_kakao_email_optional,omitempty"` - ExternalKakaoEnabled nullable.Nullable[bool] `json:"external_kakao_enabled,omitempty"` - ExternalKakaoSecret nullable.Nullable[string] `json:"external_kakao_secret,omitempty"` - ExternalKeycloakClientId nullable.Nullable[string] `json:"external_keycloak_client_id,omitempty"` - ExternalKeycloakEmailOptional nullable.Nullable[bool] `json:"external_keycloak_email_optional,omitempty"` - ExternalKeycloakEnabled nullable.Nullable[bool] `json:"external_keycloak_enabled,omitempty"` - ExternalKeycloakSecret nullable.Nullable[string] `json:"external_keycloak_secret,omitempty"` - ExternalKeycloakUrl nullable.Nullable[string] `json:"external_keycloak_url,omitempty"` - ExternalLinkedinOidcClientId nullable.Nullable[string] `json:"external_linkedin_oidc_client_id,omitempty"` - ExternalLinkedinOidcEmailOptional nullable.Nullable[bool] `json:"external_linkedin_oidc_email_optional,omitempty"` - ExternalLinkedinOidcEnabled nullable.Nullable[bool] `json:"external_linkedin_oidc_enabled,omitempty"` - ExternalLinkedinOidcSecret nullable.Nullable[string] `json:"external_linkedin_oidc_secret,omitempty"` - ExternalNotionClientId nullable.Nullable[string] `json:"external_notion_client_id,omitempty"` - ExternalNotionEmailOptional nullable.Nullable[bool] `json:"external_notion_email_optional,omitempty"` - ExternalNotionEnabled nullable.Nullable[bool] `json:"external_notion_enabled,omitempty"` - ExternalNotionSecret nullable.Nullable[string] `json:"external_notion_secret,omitempty"` - ExternalPhoneEnabled nullable.Nullable[bool] `json:"external_phone_enabled,omitempty"` - ExternalSlackClientId nullable.Nullable[string] `json:"external_slack_client_id,omitempty"` - ExternalSlackEmailOptional nullable.Nullable[bool] `json:"external_slack_email_optional,omitempty"` - ExternalSlackEnabled nullable.Nullable[bool] `json:"external_slack_enabled,omitempty"` - ExternalSlackOidcClientId nullable.Nullable[string] `json:"external_slack_oidc_client_id,omitempty"` - ExternalSlackOidcEmailOptional nullable.Nullable[bool] `json:"external_slack_oidc_email_optional,omitempty"` - ExternalSlackOidcEnabled nullable.Nullable[bool] `json:"external_slack_oidc_enabled,omitempty"` - ExternalSlackOidcSecret nullable.Nullable[string] `json:"external_slack_oidc_secret,omitempty"` - ExternalSlackSecret nullable.Nullable[string] `json:"external_slack_secret,omitempty"` - ExternalSpotifyClientId nullable.Nullable[string] `json:"external_spotify_client_id,omitempty"` - ExternalSpotifyEmailOptional nullable.Nullable[bool] `json:"external_spotify_email_optional,omitempty"` - ExternalSpotifyEnabled nullable.Nullable[bool] `json:"external_spotify_enabled,omitempty"` - ExternalSpotifySecret nullable.Nullable[string] `json:"external_spotify_secret,omitempty"` - ExternalTwitchClientId nullable.Nullable[string] `json:"external_twitch_client_id,omitempty"` - ExternalTwitchEmailOptional nullable.Nullable[bool] `json:"external_twitch_email_optional,omitempty"` - ExternalTwitchEnabled nullable.Nullable[bool] `json:"external_twitch_enabled,omitempty"` - ExternalTwitchSecret nullable.Nullable[string] `json:"external_twitch_secret,omitempty"` - ExternalTwitterClientId nullable.Nullable[string] `json:"external_twitter_client_id,omitempty"` - ExternalTwitterEmailOptional nullable.Nullable[bool] `json:"external_twitter_email_optional,omitempty"` - ExternalTwitterEnabled nullable.Nullable[bool] `json:"external_twitter_enabled,omitempty"` - ExternalTwitterSecret nullable.Nullable[string] `json:"external_twitter_secret,omitempty"` - ExternalWeb3EthereumEnabled nullable.Nullable[bool] `json:"external_web3_ethereum_enabled,omitempty"` - ExternalWeb3SolanaEnabled nullable.Nullable[bool] `json:"external_web3_solana_enabled,omitempty"` - ExternalWorkosClientId nullable.Nullable[string] `json:"external_workos_client_id,omitempty"` - ExternalWorkosEnabled nullable.Nullable[bool] `json:"external_workos_enabled,omitempty"` - ExternalWorkosSecret nullable.Nullable[string] `json:"external_workos_secret,omitempty"` - ExternalWorkosUrl nullable.Nullable[string] `json:"external_workos_url,omitempty"` - ExternalZoomClientId nullable.Nullable[string] `json:"external_zoom_client_id,omitempty"` - ExternalZoomEmailOptional nullable.Nullable[bool] `json:"external_zoom_email_optional,omitempty"` - ExternalZoomEnabled nullable.Nullable[bool] `json:"external_zoom_enabled,omitempty"` - ExternalZoomSecret nullable.Nullable[string] `json:"external_zoom_secret,omitempty"` - HookBeforeUserCreatedEnabled nullable.Nullable[bool] `json:"hook_before_user_created_enabled,omitempty"` - HookBeforeUserCreatedSecrets nullable.Nullable[string] `json:"hook_before_user_created_secrets,omitempty"` - HookBeforeUserCreatedUri nullable.Nullable[string] `json:"hook_before_user_created_uri,omitempty"` - HookCustomAccessTokenEnabled nullable.Nullable[bool] `json:"hook_custom_access_token_enabled,omitempty"` - HookCustomAccessTokenSecrets nullable.Nullable[string] `json:"hook_custom_access_token_secrets,omitempty"` - HookCustomAccessTokenUri nullable.Nullable[string] `json:"hook_custom_access_token_uri,omitempty"` - HookMfaVerificationAttemptEnabled nullable.Nullable[bool] `json:"hook_mfa_verification_attempt_enabled,omitempty"` - HookMfaVerificationAttemptSecrets nullable.Nullable[string] `json:"hook_mfa_verification_attempt_secrets,omitempty"` - HookMfaVerificationAttemptUri nullable.Nullable[string] `json:"hook_mfa_verification_attempt_uri,omitempty"` - HookPasswordVerificationAttemptEnabled nullable.Nullable[bool] `json:"hook_password_verification_attempt_enabled,omitempty"` - HookPasswordVerificationAttemptSecrets nullable.Nullable[string] `json:"hook_password_verification_attempt_secrets,omitempty"` - HookPasswordVerificationAttemptUri nullable.Nullable[string] `json:"hook_password_verification_attempt_uri,omitempty"` - HookSendEmailEnabled nullable.Nullable[bool] `json:"hook_send_email_enabled,omitempty"` - HookSendEmailSecrets nullable.Nullable[string] `json:"hook_send_email_secrets,omitempty"` - HookSendEmailUri nullable.Nullable[string] `json:"hook_send_email_uri,omitempty"` - HookSendSmsEnabled nullable.Nullable[bool] `json:"hook_send_sms_enabled,omitempty"` - HookSendSmsSecrets nullable.Nullable[string] `json:"hook_send_sms_secrets,omitempty"` - HookSendSmsUri nullable.Nullable[string] `json:"hook_send_sms_uri,omitempty"` - JwtExp nullable.Nullable[int] `json:"jwt_exp,omitempty"` - MailerAllowUnverifiedEmailSignIns nullable.Nullable[bool] `json:"mailer_allow_unverified_email_sign_ins,omitempty"` - MailerAutoconfirm nullable.Nullable[bool] `json:"mailer_autoconfirm,omitempty"` - MailerOtpExp *int `json:"mailer_otp_exp,omitempty"` - MailerOtpLength nullable.Nullable[int] `json:"mailer_otp_length,omitempty"` - MailerSecureEmailChangeEnabled nullable.Nullable[bool] `json:"mailer_secure_email_change_enabled,omitempty"` - MailerSubjectsConfirmation nullable.Nullable[string] `json:"mailer_subjects_confirmation,omitempty"` - MailerSubjectsEmailChange nullable.Nullable[string] `json:"mailer_subjects_email_change,omitempty"` - MailerSubjectsInvite nullable.Nullable[string] `json:"mailer_subjects_invite,omitempty"` - MailerSubjectsMagicLink nullable.Nullable[string] `json:"mailer_subjects_magic_link,omitempty"` - MailerSubjectsReauthentication nullable.Nullable[string] `json:"mailer_subjects_reauthentication,omitempty"` - MailerSubjectsRecovery nullable.Nullable[string] `json:"mailer_subjects_recovery,omitempty"` - MailerTemplatesConfirmationContent nullable.Nullable[string] `json:"mailer_templates_confirmation_content,omitempty"` - MailerTemplatesEmailChangeContent nullable.Nullable[string] `json:"mailer_templates_email_change_content,omitempty"` - MailerTemplatesInviteContent nullable.Nullable[string] `json:"mailer_templates_invite_content,omitempty"` - MailerTemplatesMagicLinkContent nullable.Nullable[string] `json:"mailer_templates_magic_link_content,omitempty"` - MailerTemplatesReauthenticationContent nullable.Nullable[string] `json:"mailer_templates_reauthentication_content,omitempty"` - MailerTemplatesRecoveryContent nullable.Nullable[string] `json:"mailer_templates_recovery_content,omitempty"` - MfaMaxEnrolledFactors nullable.Nullable[int] `json:"mfa_max_enrolled_factors,omitempty"` - MfaPhoneEnrollEnabled nullable.Nullable[bool] `json:"mfa_phone_enroll_enabled,omitempty"` - MfaPhoneMaxFrequency nullable.Nullable[int] `json:"mfa_phone_max_frequency,omitempty"` - MfaPhoneOtpLength nullable.Nullable[int] `json:"mfa_phone_otp_length,omitempty"` - MfaPhoneTemplate nullable.Nullable[string] `json:"mfa_phone_template,omitempty"` - MfaPhoneVerifyEnabled nullable.Nullable[bool] `json:"mfa_phone_verify_enabled,omitempty"` - MfaTotpEnrollEnabled nullable.Nullable[bool] `json:"mfa_totp_enroll_enabled,omitempty"` - MfaTotpVerifyEnabled nullable.Nullable[bool] `json:"mfa_totp_verify_enabled,omitempty"` - MfaWebAuthnEnrollEnabled nullable.Nullable[bool] `json:"mfa_web_authn_enroll_enabled,omitempty"` - MfaWebAuthnVerifyEnabled nullable.Nullable[bool] `json:"mfa_web_authn_verify_enabled,omitempty"` - NimbusOauthClientId nullable.Nullable[string] `json:"nimbus_oauth_client_id,omitempty"` - NimbusOauthClientSecret nullable.Nullable[string] `json:"nimbus_oauth_client_secret,omitempty"` - PasswordHibpEnabled nullable.Nullable[bool] `json:"password_hibp_enabled,omitempty"` - PasswordMinLength nullable.Nullable[int] `json:"password_min_length,omitempty"` - PasswordRequiredCharacters nullable.Nullable[UpdateAuthConfigBodyPasswordRequiredCharacters] `json:"password_required_characters,omitempty"` - RateLimitAnonymousUsers nullable.Nullable[int] `json:"rate_limit_anonymous_users,omitempty"` - RateLimitEmailSent nullable.Nullable[int] `json:"rate_limit_email_sent,omitempty"` - RateLimitOtp nullable.Nullable[int] `json:"rate_limit_otp,omitempty"` - RateLimitSmsSent nullable.Nullable[int] `json:"rate_limit_sms_sent,omitempty"` - RateLimitTokenRefresh nullable.Nullable[int] `json:"rate_limit_token_refresh,omitempty"` - RateLimitVerify nullable.Nullable[int] `json:"rate_limit_verify,omitempty"` - RateLimitWeb3 nullable.Nullable[int] `json:"rate_limit_web3,omitempty"` - RefreshTokenRotationEnabled nullable.Nullable[bool] `json:"refresh_token_rotation_enabled,omitempty"` - SamlEnabled nullable.Nullable[bool] `json:"saml_enabled,omitempty"` - SamlExternalUrl nullable.Nullable[string] `json:"saml_external_url,omitempty"` - SecurityCaptchaEnabled nullable.Nullable[bool] `json:"security_captcha_enabled,omitempty"` - SecurityCaptchaProvider nullable.Nullable[UpdateAuthConfigBodySecurityCaptchaProvider] `json:"security_captcha_provider,omitempty"` - SecurityCaptchaSecret nullable.Nullable[string] `json:"security_captcha_secret,omitempty"` - SecurityManualLinkingEnabled nullable.Nullable[bool] `json:"security_manual_linking_enabled,omitempty"` - SecurityRefreshTokenReuseInterval nullable.Nullable[int] `json:"security_refresh_token_reuse_interval,omitempty"` - SecurityUpdatePasswordRequireReauthentication nullable.Nullable[bool] `json:"security_update_password_require_reauthentication,omitempty"` - SessionsInactivityTimeout nullable.Nullable[int] `json:"sessions_inactivity_timeout,omitempty"` - SessionsSinglePerUser nullable.Nullable[bool] `json:"sessions_single_per_user,omitempty"` - SessionsTags nullable.Nullable[string] `json:"sessions_tags,omitempty"` - SessionsTimebox nullable.Nullable[int] `json:"sessions_timebox,omitempty"` - SiteUrl nullable.Nullable[string] `json:"site_url,omitempty"` - SmsAutoconfirm nullable.Nullable[bool] `json:"sms_autoconfirm,omitempty"` - SmsMaxFrequency nullable.Nullable[int] `json:"sms_max_frequency,omitempty"` - SmsMessagebirdAccessKey nullable.Nullable[string] `json:"sms_messagebird_access_key,omitempty"` - SmsMessagebirdOriginator nullable.Nullable[string] `json:"sms_messagebird_originator,omitempty"` - SmsOtpExp nullable.Nullable[int] `json:"sms_otp_exp,omitempty"` - SmsOtpLength *int `json:"sms_otp_length,omitempty"` - SmsProvider nullable.Nullable[UpdateAuthConfigBodySmsProvider] `json:"sms_provider,omitempty"` - SmsTemplate nullable.Nullable[string] `json:"sms_template,omitempty"` - SmsTestOtp nullable.Nullable[string] `json:"sms_test_otp,omitempty"` - SmsTestOtpValidUntil nullable.Nullable[time.Time] `json:"sms_test_otp_valid_until,omitempty"` - SmsTextlocalApiKey nullable.Nullable[string] `json:"sms_textlocal_api_key,omitempty"` - SmsTextlocalSender nullable.Nullable[string] `json:"sms_textlocal_sender,omitempty"` - SmsTwilioAccountSid nullable.Nullable[string] `json:"sms_twilio_account_sid,omitempty"` - SmsTwilioAuthToken nullable.Nullable[string] `json:"sms_twilio_auth_token,omitempty"` - SmsTwilioContentSid nullable.Nullable[string] `json:"sms_twilio_content_sid,omitempty"` - SmsTwilioMessageServiceSid nullable.Nullable[string] `json:"sms_twilio_message_service_sid,omitempty"` - SmsTwilioVerifyAccountSid nullable.Nullable[string] `json:"sms_twilio_verify_account_sid,omitempty"` - SmsTwilioVerifyAuthToken nullable.Nullable[string] `json:"sms_twilio_verify_auth_token,omitempty"` - SmsTwilioVerifyMessageServiceSid nullable.Nullable[string] `json:"sms_twilio_verify_message_service_sid,omitempty"` - SmsVonageApiKey nullable.Nullable[string] `json:"sms_vonage_api_key,omitempty"` - SmsVonageApiSecret nullable.Nullable[string] `json:"sms_vonage_api_secret,omitempty"` - SmsVonageFrom nullable.Nullable[string] `json:"sms_vonage_from,omitempty"` - SmtpAdminEmail nullable.Nullable[openapi_types.Email] `json:"smtp_admin_email,omitempty"` - SmtpHost nullable.Nullable[string] `json:"smtp_host,omitempty"` - SmtpMaxFrequency nullable.Nullable[int] `json:"smtp_max_frequency,omitempty"` - SmtpPass nullable.Nullable[string] `json:"smtp_pass,omitempty"` - SmtpPort nullable.Nullable[string] `json:"smtp_port,omitempty"` - SmtpSenderName nullable.Nullable[string] `json:"smtp_sender_name,omitempty"` - SmtpUser nullable.Nullable[string] `json:"smtp_user,omitempty"` - UriAllowList nullable.Nullable[string] `json:"uri_allow_list,omitempty"` + ApiMaxRequestDuration nullable.Nullable[int] `json:"api_max_request_duration,omitempty"` + DbMaxPoolSize nullable.Nullable[int] `json:"db_max_pool_size,omitempty"` + DisableSignup nullable.Nullable[bool] `json:"disable_signup,omitempty"` + ExternalAnonymousUsersEnabled nullable.Nullable[bool] `json:"external_anonymous_users_enabled,omitempty"` + ExternalAppleAdditionalClientIds nullable.Nullable[string] `json:"external_apple_additional_client_ids,omitempty"` + ExternalAppleClientId nullable.Nullable[string] `json:"external_apple_client_id,omitempty"` + ExternalAppleEmailOptional nullable.Nullable[bool] `json:"external_apple_email_optional,omitempty"` + ExternalAppleEnabled nullable.Nullable[bool] `json:"external_apple_enabled,omitempty"` + ExternalAppleSecret nullable.Nullable[string] `json:"external_apple_secret,omitempty"` + ExternalAzureClientId nullable.Nullable[string] `json:"external_azure_client_id,omitempty"` + ExternalAzureEmailOptional nullable.Nullable[bool] `json:"external_azure_email_optional,omitempty"` + ExternalAzureEnabled nullable.Nullable[bool] `json:"external_azure_enabled,omitempty"` + ExternalAzureSecret nullable.Nullable[string] `json:"external_azure_secret,omitempty"` + ExternalAzureUrl nullable.Nullable[string] `json:"external_azure_url,omitempty"` + ExternalBitbucketClientId nullable.Nullable[string] `json:"external_bitbucket_client_id,omitempty"` + ExternalBitbucketEmailOptional nullable.Nullable[bool] `json:"external_bitbucket_email_optional,omitempty"` + ExternalBitbucketEnabled nullable.Nullable[bool] `json:"external_bitbucket_enabled,omitempty"` + ExternalBitbucketSecret nullable.Nullable[string] `json:"external_bitbucket_secret,omitempty"` + ExternalDiscordClientId nullable.Nullable[string] `json:"external_discord_client_id,omitempty"` + ExternalDiscordEmailOptional nullable.Nullable[bool] `json:"external_discord_email_optional,omitempty"` + ExternalDiscordEnabled nullable.Nullable[bool] `json:"external_discord_enabled,omitempty"` + ExternalDiscordSecret nullable.Nullable[string] `json:"external_discord_secret,omitempty"` + ExternalEmailEnabled nullable.Nullable[bool] `json:"external_email_enabled,omitempty"` + ExternalFacebookClientId nullable.Nullable[string] `json:"external_facebook_client_id,omitempty"` + ExternalFacebookEmailOptional nullable.Nullable[bool] `json:"external_facebook_email_optional,omitempty"` + ExternalFacebookEnabled nullable.Nullable[bool] `json:"external_facebook_enabled,omitempty"` + ExternalFacebookSecret nullable.Nullable[string] `json:"external_facebook_secret,omitempty"` + ExternalFigmaClientId nullable.Nullable[string] `json:"external_figma_client_id,omitempty"` + ExternalFigmaEmailOptional nullable.Nullable[bool] `json:"external_figma_email_optional,omitempty"` + ExternalFigmaEnabled nullable.Nullable[bool] `json:"external_figma_enabled,omitempty"` + ExternalFigmaSecret nullable.Nullable[string] `json:"external_figma_secret,omitempty"` + ExternalGithubClientId nullable.Nullable[string] `json:"external_github_client_id,omitempty"` + ExternalGithubEmailOptional nullable.Nullable[bool] `json:"external_github_email_optional,omitempty"` + ExternalGithubEnabled nullable.Nullable[bool] `json:"external_github_enabled,omitempty"` + ExternalGithubSecret nullable.Nullable[string] `json:"external_github_secret,omitempty"` + ExternalGitlabClientId nullable.Nullable[string] `json:"external_gitlab_client_id,omitempty"` + ExternalGitlabEmailOptional nullable.Nullable[bool] `json:"external_gitlab_email_optional,omitempty"` + ExternalGitlabEnabled nullable.Nullable[bool] `json:"external_gitlab_enabled,omitempty"` + ExternalGitlabSecret nullable.Nullable[string] `json:"external_gitlab_secret,omitempty"` + ExternalGitlabUrl nullable.Nullable[string] `json:"external_gitlab_url,omitempty"` + ExternalGoogleAdditionalClientIds nullable.Nullable[string] `json:"external_google_additional_client_ids,omitempty"` + ExternalGoogleClientId nullable.Nullable[string] `json:"external_google_client_id,omitempty"` + ExternalGoogleEmailOptional nullable.Nullable[bool] `json:"external_google_email_optional,omitempty"` + ExternalGoogleEnabled nullable.Nullable[bool] `json:"external_google_enabled,omitempty"` + ExternalGoogleSecret nullable.Nullable[string] `json:"external_google_secret,omitempty"` + ExternalGoogleSkipNonceCheck nullable.Nullable[bool] `json:"external_google_skip_nonce_check,omitempty"` + ExternalKakaoClientId nullable.Nullable[string] `json:"external_kakao_client_id,omitempty"` + ExternalKakaoEmailOptional nullable.Nullable[bool] `json:"external_kakao_email_optional,omitempty"` + ExternalKakaoEnabled nullable.Nullable[bool] `json:"external_kakao_enabled,omitempty"` + ExternalKakaoSecret nullable.Nullable[string] `json:"external_kakao_secret,omitempty"` + ExternalKeycloakClientId nullable.Nullable[string] `json:"external_keycloak_client_id,omitempty"` + ExternalKeycloakEmailOptional nullable.Nullable[bool] `json:"external_keycloak_email_optional,omitempty"` + ExternalKeycloakEnabled nullable.Nullable[bool] `json:"external_keycloak_enabled,omitempty"` + ExternalKeycloakSecret nullable.Nullable[string] `json:"external_keycloak_secret,omitempty"` + ExternalKeycloakUrl nullable.Nullable[string] `json:"external_keycloak_url,omitempty"` + ExternalLinkedinOidcClientId nullable.Nullable[string] `json:"external_linkedin_oidc_client_id,omitempty"` + ExternalLinkedinOidcEmailOptional nullable.Nullable[bool] `json:"external_linkedin_oidc_email_optional,omitempty"` + ExternalLinkedinOidcEnabled nullable.Nullable[bool] `json:"external_linkedin_oidc_enabled,omitempty"` + ExternalLinkedinOidcSecret nullable.Nullable[string] `json:"external_linkedin_oidc_secret,omitempty"` + ExternalNotionClientId nullable.Nullable[string] `json:"external_notion_client_id,omitempty"` + ExternalNotionEmailOptional nullable.Nullable[bool] `json:"external_notion_email_optional,omitempty"` + ExternalNotionEnabled nullable.Nullable[bool] `json:"external_notion_enabled,omitempty"` + ExternalNotionSecret nullable.Nullable[string] `json:"external_notion_secret,omitempty"` + ExternalPhoneEnabled nullable.Nullable[bool] `json:"external_phone_enabled,omitempty"` + ExternalSlackClientId nullable.Nullable[string] `json:"external_slack_client_id,omitempty"` + ExternalSlackEmailOptional nullable.Nullable[bool] `json:"external_slack_email_optional,omitempty"` + ExternalSlackEnabled nullable.Nullable[bool] `json:"external_slack_enabled,omitempty"` + ExternalSlackOidcClientId nullable.Nullable[string] `json:"external_slack_oidc_client_id,omitempty"` + ExternalSlackOidcEmailOptional nullable.Nullable[bool] `json:"external_slack_oidc_email_optional,omitempty"` + ExternalSlackOidcEnabled nullable.Nullable[bool] `json:"external_slack_oidc_enabled,omitempty"` + ExternalSlackOidcSecret nullable.Nullable[string] `json:"external_slack_oidc_secret,omitempty"` + ExternalSlackSecret nullable.Nullable[string] `json:"external_slack_secret,omitempty"` + ExternalSpotifyClientId nullable.Nullable[string] `json:"external_spotify_client_id,omitempty"` + ExternalSpotifyEmailOptional nullable.Nullable[bool] `json:"external_spotify_email_optional,omitempty"` + ExternalSpotifyEnabled nullable.Nullable[bool] `json:"external_spotify_enabled,omitempty"` + ExternalSpotifySecret nullable.Nullable[string] `json:"external_spotify_secret,omitempty"` + ExternalTwitchClientId nullable.Nullable[string] `json:"external_twitch_client_id,omitempty"` + ExternalTwitchEmailOptional nullable.Nullable[bool] `json:"external_twitch_email_optional,omitempty"` + ExternalTwitchEnabled nullable.Nullable[bool] `json:"external_twitch_enabled,omitempty"` + ExternalTwitchSecret nullable.Nullable[string] `json:"external_twitch_secret,omitempty"` + ExternalTwitterClientId nullable.Nullable[string] `json:"external_twitter_client_id,omitempty"` + ExternalTwitterEmailOptional nullable.Nullable[bool] `json:"external_twitter_email_optional,omitempty"` + ExternalTwitterEnabled nullable.Nullable[bool] `json:"external_twitter_enabled,omitempty"` + ExternalTwitterSecret nullable.Nullable[string] `json:"external_twitter_secret,omitempty"` + ExternalWeb3EthereumEnabled nullable.Nullable[bool] `json:"external_web3_ethereum_enabled,omitempty"` + ExternalWeb3SolanaEnabled nullable.Nullable[bool] `json:"external_web3_solana_enabled,omitempty"` + ExternalWorkosClientId nullable.Nullable[string] `json:"external_workos_client_id,omitempty"` + ExternalWorkosEnabled nullable.Nullable[bool] `json:"external_workos_enabled,omitempty"` + ExternalWorkosSecret nullable.Nullable[string] `json:"external_workos_secret,omitempty"` + ExternalWorkosUrl nullable.Nullable[string] `json:"external_workos_url,omitempty"` + ExternalZoomClientId nullable.Nullable[string] `json:"external_zoom_client_id,omitempty"` + ExternalZoomEmailOptional nullable.Nullable[bool] `json:"external_zoom_email_optional,omitempty"` + ExternalZoomEnabled nullable.Nullable[bool] `json:"external_zoom_enabled,omitempty"` + ExternalZoomSecret nullable.Nullable[string] `json:"external_zoom_secret,omitempty"` + HookAfterUserCreatedEnabled nullable.Nullable[bool] `json:"hook_after_user_created_enabled,omitempty"` + HookAfterUserCreatedSecrets nullable.Nullable[string] `json:"hook_after_user_created_secrets,omitempty"` + HookAfterUserCreatedUri nullable.Nullable[string] `json:"hook_after_user_created_uri,omitempty"` + HookBeforeUserCreatedEnabled nullable.Nullable[bool] `json:"hook_before_user_created_enabled,omitempty"` + HookBeforeUserCreatedSecrets nullable.Nullable[string] `json:"hook_before_user_created_secrets,omitempty"` + HookBeforeUserCreatedUri nullable.Nullable[string] `json:"hook_before_user_created_uri,omitempty"` + HookCustomAccessTokenEnabled nullable.Nullable[bool] `json:"hook_custom_access_token_enabled,omitempty"` + HookCustomAccessTokenSecrets nullable.Nullable[string] `json:"hook_custom_access_token_secrets,omitempty"` + HookCustomAccessTokenUri nullable.Nullable[string] `json:"hook_custom_access_token_uri,omitempty"` + HookMfaVerificationAttemptEnabled nullable.Nullable[bool] `json:"hook_mfa_verification_attempt_enabled,omitempty"` + HookMfaVerificationAttemptSecrets nullable.Nullable[string] `json:"hook_mfa_verification_attempt_secrets,omitempty"` + HookMfaVerificationAttemptUri nullable.Nullable[string] `json:"hook_mfa_verification_attempt_uri,omitempty"` + HookPasswordVerificationAttemptEnabled nullable.Nullable[bool] `json:"hook_password_verification_attempt_enabled,omitempty"` + HookPasswordVerificationAttemptSecrets nullable.Nullable[string] `json:"hook_password_verification_attempt_secrets,omitempty"` + HookPasswordVerificationAttemptUri nullable.Nullable[string] `json:"hook_password_verification_attempt_uri,omitempty"` + HookSendEmailEnabled nullable.Nullable[bool] `json:"hook_send_email_enabled,omitempty"` + HookSendEmailSecrets nullable.Nullable[string] `json:"hook_send_email_secrets,omitempty"` + HookSendEmailUri nullable.Nullable[string] `json:"hook_send_email_uri,omitempty"` + HookSendSmsEnabled nullable.Nullable[bool] `json:"hook_send_sms_enabled,omitempty"` + HookSendSmsSecrets nullable.Nullable[string] `json:"hook_send_sms_secrets,omitempty"` + HookSendSmsUri nullable.Nullable[string] `json:"hook_send_sms_uri,omitempty"` + JwtExp nullable.Nullable[int] `json:"jwt_exp,omitempty"` + MailerAllowUnverifiedEmailSignIns nullable.Nullable[bool] `json:"mailer_allow_unverified_email_sign_ins,omitempty"` + MailerAutoconfirm nullable.Nullable[bool] `json:"mailer_autoconfirm,omitempty"` + MailerNotificationsEmailChangedEnabled nullable.Nullable[bool] `json:"mailer_notifications_email_changed_enabled,omitempty"` + MailerNotificationsIdentityLinkedEnabled nullable.Nullable[bool] `json:"mailer_notifications_identity_linked_enabled,omitempty"` + MailerNotificationsIdentityUnlinkedEnabled nullable.Nullable[bool] `json:"mailer_notifications_identity_unlinked_enabled,omitempty"` + MailerNotificationsMfaFactorEnrolledEnabled nullable.Nullable[bool] `json:"mailer_notifications_mfa_factor_enrolled_enabled,omitempty"` + MailerNotificationsMfaFactorUnenrolledEnabled nullable.Nullable[bool] `json:"mailer_notifications_mfa_factor_unenrolled_enabled,omitempty"` + MailerNotificationsPasswordChangedEnabled nullable.Nullable[bool] `json:"mailer_notifications_password_changed_enabled,omitempty"` + MailerNotificationsPhoneChangedEnabled nullable.Nullable[bool] `json:"mailer_notifications_phone_changed_enabled,omitempty"` + MailerOtpExp *int `json:"mailer_otp_exp,omitempty"` + MailerOtpLength nullable.Nullable[int] `json:"mailer_otp_length,omitempty"` + MailerSecureEmailChangeEnabled nullable.Nullable[bool] `json:"mailer_secure_email_change_enabled,omitempty"` + MailerSubjectsConfirmation nullable.Nullable[string] `json:"mailer_subjects_confirmation,omitempty"` + MailerSubjectsEmailChange nullable.Nullable[string] `json:"mailer_subjects_email_change,omitempty"` + MailerSubjectsEmailChangedNotification nullable.Nullable[string] `json:"mailer_subjects_email_changed_notification,omitempty"` + MailerSubjectsIdentityLinkedNotification nullable.Nullable[string] `json:"mailer_subjects_identity_linked_notification,omitempty"` + MailerSubjectsIdentityUnlinkedNotification nullable.Nullable[string] `json:"mailer_subjects_identity_unlinked_notification,omitempty"` + MailerSubjectsInvite nullable.Nullable[string] `json:"mailer_subjects_invite,omitempty"` + MailerSubjectsMagicLink nullable.Nullable[string] `json:"mailer_subjects_magic_link,omitempty"` + MailerSubjectsMfaFactorEnrolledNotification nullable.Nullable[string] `json:"mailer_subjects_mfa_factor_enrolled_notification,omitempty"` + MailerSubjectsMfaFactorUnenrolledNotification nullable.Nullable[string] `json:"mailer_subjects_mfa_factor_unenrolled_notification,omitempty"` + MailerSubjectsPasswordChangedNotification nullable.Nullable[string] `json:"mailer_subjects_password_changed_notification,omitempty"` + MailerSubjectsPhoneChangedNotification nullable.Nullable[string] `json:"mailer_subjects_phone_changed_notification,omitempty"` + MailerSubjectsReauthentication nullable.Nullable[string] `json:"mailer_subjects_reauthentication,omitempty"` + MailerSubjectsRecovery nullable.Nullable[string] `json:"mailer_subjects_recovery,omitempty"` + MailerTemplatesConfirmationContent nullable.Nullable[string] `json:"mailer_templates_confirmation_content,omitempty"` + MailerTemplatesEmailChangeContent nullable.Nullable[string] `json:"mailer_templates_email_change_content,omitempty"` + MailerTemplatesEmailChangedNotificationContent nullable.Nullable[string] `json:"mailer_templates_email_changed_notification_content,omitempty"` + MailerTemplatesIdentityLinkedNotificationContent nullable.Nullable[string] `json:"mailer_templates_identity_linked_notification_content,omitempty"` + MailerTemplatesIdentityUnlinkedNotificationContent nullable.Nullable[string] `json:"mailer_templates_identity_unlinked_notification_content,omitempty"` + MailerTemplatesInviteContent nullable.Nullable[string] `json:"mailer_templates_invite_content,omitempty"` + MailerTemplatesMagicLinkContent nullable.Nullable[string] `json:"mailer_templates_magic_link_content,omitempty"` + MailerTemplatesMfaFactorEnrolledNotificationContent nullable.Nullable[string] `json:"mailer_templates_mfa_factor_enrolled_notification_content,omitempty"` + MailerTemplatesMfaFactorUnenrolledNotificationContent nullable.Nullable[string] `json:"mailer_templates_mfa_factor_unenrolled_notification_content,omitempty"` + MailerTemplatesPasswordChangedNotificationContent nullable.Nullable[string] `json:"mailer_templates_password_changed_notification_content,omitempty"` + MailerTemplatesPhoneChangedNotificationContent nullable.Nullable[string] `json:"mailer_templates_phone_changed_notification_content,omitempty"` + MailerTemplatesReauthenticationContent nullable.Nullable[string] `json:"mailer_templates_reauthentication_content,omitempty"` + MailerTemplatesRecoveryContent nullable.Nullable[string] `json:"mailer_templates_recovery_content,omitempty"` + MfaMaxEnrolledFactors nullable.Nullable[int] `json:"mfa_max_enrolled_factors,omitempty"` + MfaPhoneEnrollEnabled nullable.Nullable[bool] `json:"mfa_phone_enroll_enabled,omitempty"` + MfaPhoneMaxFrequency nullable.Nullable[int] `json:"mfa_phone_max_frequency,omitempty"` + MfaPhoneOtpLength nullable.Nullable[int] `json:"mfa_phone_otp_length,omitempty"` + MfaPhoneTemplate nullable.Nullable[string] `json:"mfa_phone_template,omitempty"` + MfaPhoneVerifyEnabled nullable.Nullable[bool] `json:"mfa_phone_verify_enabled,omitempty"` + MfaTotpEnrollEnabled nullable.Nullable[bool] `json:"mfa_totp_enroll_enabled,omitempty"` + MfaTotpVerifyEnabled nullable.Nullable[bool] `json:"mfa_totp_verify_enabled,omitempty"` + MfaWebAuthnEnrollEnabled nullable.Nullable[bool] `json:"mfa_web_authn_enroll_enabled,omitempty"` + MfaWebAuthnVerifyEnabled nullable.Nullable[bool] `json:"mfa_web_authn_verify_enabled,omitempty"` + NimbusOauthClientId nullable.Nullable[string] `json:"nimbus_oauth_client_id,omitempty"` + NimbusOauthClientSecret nullable.Nullable[string] `json:"nimbus_oauth_client_secret,omitempty"` + PasswordHibpEnabled nullable.Nullable[bool] `json:"password_hibp_enabled,omitempty"` + PasswordMinLength nullable.Nullable[int] `json:"password_min_length,omitempty"` + PasswordRequiredCharacters nullable.Nullable[UpdateAuthConfigBodyPasswordRequiredCharacters] `json:"password_required_characters,omitempty"` + RateLimitAnonymousUsers nullable.Nullable[int] `json:"rate_limit_anonymous_users,omitempty"` + RateLimitEmailSent nullable.Nullable[int] `json:"rate_limit_email_sent,omitempty"` + RateLimitOtp nullable.Nullable[int] `json:"rate_limit_otp,omitempty"` + RateLimitSmsSent nullable.Nullable[int] `json:"rate_limit_sms_sent,omitempty"` + RateLimitTokenRefresh nullable.Nullable[int] `json:"rate_limit_token_refresh,omitempty"` + RateLimitVerify nullable.Nullable[int] `json:"rate_limit_verify,omitempty"` + RateLimitWeb3 nullable.Nullable[int] `json:"rate_limit_web3,omitempty"` + RefreshTokenRotationEnabled nullable.Nullable[bool] `json:"refresh_token_rotation_enabled,omitempty"` + SamlEnabled nullable.Nullable[bool] `json:"saml_enabled,omitempty"` + SamlExternalUrl nullable.Nullable[string] `json:"saml_external_url,omitempty"` + SecurityCaptchaEnabled nullable.Nullable[bool] `json:"security_captcha_enabled,omitempty"` + SecurityCaptchaProvider nullable.Nullable[UpdateAuthConfigBodySecurityCaptchaProvider] `json:"security_captcha_provider,omitempty"` + SecurityCaptchaSecret nullable.Nullable[string] `json:"security_captcha_secret,omitempty"` + SecurityManualLinkingEnabled nullable.Nullable[bool] `json:"security_manual_linking_enabled,omitempty"` + SecurityRefreshTokenReuseInterval nullable.Nullable[int] `json:"security_refresh_token_reuse_interval,omitempty"` + SecurityUpdatePasswordRequireReauthentication nullable.Nullable[bool] `json:"security_update_password_require_reauthentication,omitempty"` + SessionsInactivityTimeout nullable.Nullable[int] `json:"sessions_inactivity_timeout,omitempty"` + SessionsSinglePerUser nullable.Nullable[bool] `json:"sessions_single_per_user,omitempty"` + SessionsTags nullable.Nullable[string] `json:"sessions_tags,omitempty"` + SessionsTimebox nullable.Nullable[int] `json:"sessions_timebox,omitempty"` + SiteUrl nullable.Nullable[string] `json:"site_url,omitempty"` + SmsAutoconfirm nullable.Nullable[bool] `json:"sms_autoconfirm,omitempty"` + SmsMaxFrequency nullable.Nullable[int] `json:"sms_max_frequency,omitempty"` + SmsMessagebirdAccessKey nullable.Nullable[string] `json:"sms_messagebird_access_key,omitempty"` + SmsMessagebirdOriginator nullable.Nullable[string] `json:"sms_messagebird_originator,omitempty"` + SmsOtpExp nullable.Nullable[int] `json:"sms_otp_exp,omitempty"` + SmsOtpLength *int `json:"sms_otp_length,omitempty"` + SmsProvider nullable.Nullable[UpdateAuthConfigBodySmsProvider] `json:"sms_provider,omitempty"` + SmsTemplate nullable.Nullable[string] `json:"sms_template,omitempty"` + SmsTestOtp nullable.Nullable[string] `json:"sms_test_otp,omitempty"` + SmsTestOtpValidUntil nullable.Nullable[time.Time] `json:"sms_test_otp_valid_until,omitempty"` + SmsTextlocalApiKey nullable.Nullable[string] `json:"sms_textlocal_api_key,omitempty"` + SmsTextlocalSender nullable.Nullable[string] `json:"sms_textlocal_sender,omitempty"` + SmsTwilioAccountSid nullable.Nullable[string] `json:"sms_twilio_account_sid,omitempty"` + SmsTwilioAuthToken nullable.Nullable[string] `json:"sms_twilio_auth_token,omitempty"` + SmsTwilioContentSid nullable.Nullable[string] `json:"sms_twilio_content_sid,omitempty"` + SmsTwilioMessageServiceSid nullable.Nullable[string] `json:"sms_twilio_message_service_sid,omitempty"` + SmsTwilioVerifyAccountSid nullable.Nullable[string] `json:"sms_twilio_verify_account_sid,omitempty"` + SmsTwilioVerifyAuthToken nullable.Nullable[string] `json:"sms_twilio_verify_auth_token,omitempty"` + SmsTwilioVerifyMessageServiceSid nullable.Nullable[string] `json:"sms_twilio_verify_message_service_sid,omitempty"` + SmsVonageApiKey nullable.Nullable[string] `json:"sms_vonage_api_key,omitempty"` + SmsVonageApiSecret nullable.Nullable[string] `json:"sms_vonage_api_secret,omitempty"` + SmsVonageFrom nullable.Nullable[string] `json:"sms_vonage_from,omitempty"` + SmtpAdminEmail nullable.Nullable[openapi_types.Email] `json:"smtp_admin_email,omitempty"` + SmtpHost nullable.Nullable[string] `json:"smtp_host,omitempty"` + SmtpMaxFrequency nullable.Nullable[int] `json:"smtp_max_frequency,omitempty"` + SmtpPass nullable.Nullable[string] `json:"smtp_pass,omitempty"` + SmtpPort nullable.Nullable[string] `json:"smtp_port,omitempty"` + SmtpSenderName nullable.Nullable[string] `json:"smtp_sender_name,omitempty"` + SmtpUser nullable.Nullable[string] `json:"smtp_user,omitempty"` + UriAllowList nullable.Nullable[string] `json:"uri_allow_list,omitempty"` } // UpdateAuthConfigBodyPasswordRequiredCharacters defines model for UpdateAuthConfigBody.PasswordRequiredCharacters. @@ -3450,8 +3673,20 @@ type V1CreateProjectBody struct { // Deprecated: Plan *V1CreateProjectBodyPlan `json:"plan,omitempty"` - // Region Region you want your server to reside in - Region V1CreateProjectBodyRegion `json:"region"` + // PostgresEngine Postgres engine version. If not provided, the latest version will be used. + // Deprecated: + PostgresEngine *V1CreateProjectBodyPostgresEngine `json:"postgres_engine,omitempty"` + + // Region Region you want your server to reside in. Use region_selection instead. + // Deprecated: + Region *V1CreateProjectBodyRegion `json:"region,omitempty"` + + // RegionSelection Region selection. Only one of region or region_selection can be specified. + RegionSelection *V1CreateProjectBody_RegionSelection `json:"region_selection,omitempty"` + + // ReleaseChannel Release channel. If not provided, GA will be used. + // Deprecated: + ReleaseChannel *V1CreateProjectBodyReleaseChannel `json:"release_channel,omitempty"` // TemplateUrl Template URL used to create the project from the CLI. TemplateUrl *string `json:"template_url,omitempty"` @@ -3463,9 +3698,46 @@ type V1CreateProjectBodyDesiredInstanceSize string // V1CreateProjectBodyPlan Subscription Plan is now set on organization level and is ignored in this request type V1CreateProjectBodyPlan string -// V1CreateProjectBodyRegion Region you want your server to reside in +// V1CreateProjectBodyPostgresEngine Postgres engine version. If not provided, the latest version will be used. +type V1CreateProjectBodyPostgresEngine string + +// V1CreateProjectBodyRegion Region you want your server to reside in. Use region_selection instead. type V1CreateProjectBodyRegion string +// V1CreateProjectBodyRegionSelection0 defines model for . +type V1CreateProjectBodyRegionSelection0 struct { + // Code Specific region code. The codes supported are not a stable API, and should be retrieved from the /available-regions endpoint. + Code V1CreateProjectBodyRegionSelection0Code `json:"code"` + Type V1CreateProjectBodyRegionSelection0Type `json:"type"` +} + +// V1CreateProjectBodyRegionSelection0Code Specific region code. The codes supported are not a stable API, and should be retrieved from the /available-regions endpoint. +type V1CreateProjectBodyRegionSelection0Code string + +// V1CreateProjectBodyRegionSelection0Type defines model for V1CreateProjectBody.RegionSelection.0.Type. +type V1CreateProjectBodyRegionSelection0Type string + +// V1CreateProjectBodyRegionSelection1 defines model for . +type V1CreateProjectBodyRegionSelection1 struct { + // Code The Smart Region Group's code. The codes supported are not a stable API, and should be retrieved from the /available-regions endpoint. + Code V1CreateProjectBodyRegionSelection1Code `json:"code"` + Type V1CreateProjectBodyRegionSelection1Type `json:"type"` +} + +// V1CreateProjectBodyRegionSelection1Code The Smart Region Group's code. The codes supported are not a stable API, and should be retrieved from the /available-regions endpoint. +type V1CreateProjectBodyRegionSelection1Code string + +// V1CreateProjectBodyRegionSelection1Type defines model for V1CreateProjectBody.RegionSelection.1.Type. +type V1CreateProjectBodyRegionSelection1Type string + +// V1CreateProjectBody_RegionSelection Region selection. Only one of region or region_selection can be specified. +type V1CreateProjectBody_RegionSelection struct { + union json.RawMessage +} + +// V1CreateProjectBodyReleaseChannel Release channel. If not provided, GA will be used. +type V1CreateProjectBodyReleaseChannel string + // V1GetUsageApiCountResponse defines model for V1GetUsageApiCountResponse. type V1GetUsageApiCountResponse struct { Error *V1GetUsageApiCountResponse_Error `json:"error,omitempty"` @@ -3823,7 +4095,7 @@ type V1AuthorizeUserParams struct { OrganizationSlug *string `form:"organization_slug,omitempty" json:"organization_slug,omitempty"` // Resource Resource indicator for MCP (Model Context Protocol) clients - Resource *V1AuthorizeUserParamsResource `form:"resource,omitempty" json:"resource,omitempty"` + Resource *string `form:"resource,omitempty" json:"resource,omitempty"` } // V1AuthorizeUserParamsResponseType defines parameters for V1AuthorizeUser. @@ -3832,9 +4104,6 @@ type V1AuthorizeUserParamsResponseType string // V1AuthorizeUserParamsCodeChallengeMethod defines parameters for V1AuthorizeUser. type V1AuthorizeUserParamsCodeChallengeMethod string -// V1AuthorizeUserParamsResource defines parameters for V1AuthorizeUser. -type V1AuthorizeUserParamsResource string - // V1OauthAuthorizeProjectClaimParams defines parameters for V1OauthAuthorizeProjectClaim. type V1OauthAuthorizeProjectClaimParams struct { // ProjectRef Project ref @@ -3854,6 +4123,18 @@ type V1OauthAuthorizeProjectClaimParamsResponseType string // V1OauthAuthorizeProjectClaimParamsCodeChallengeMethod defines parameters for V1OauthAuthorizeProjectClaim. type V1OauthAuthorizeProjectClaimParamsCodeChallengeMethod string +// V1GetAvailableRegionsParams defines parameters for V1GetAvailableRegions. +type V1GetAvailableRegionsParams struct { + // OrganizationSlug Slug of your organization + OrganizationSlug string `form:"organization_slug" json:"organization_slug"` + + // Continent Continent code to determine regional recommendations + Continent *V1GetAvailableRegionsParamsContinent `form:"continent,omitempty" json:"continent,omitempty"` +} + +// V1GetAvailableRegionsParamsContinent defines parameters for V1GetAvailableRegions. +type V1GetAvailableRegionsParamsContinent string + // V1ListActionRunsParams defines parameters for V1ListActionRuns. type V1ListActionRunsParams struct { Offset *float32 `form:"offset,omitempty" json:"offset,omitempty"` @@ -5003,6 +5284,68 @@ func (t *ListProjectAddonsResponse_SelectedAddons_Variant_Id) UnmarshalJSON(b [] return err } +// AsV1CreateProjectBodyRegionSelection0 returns the union data inside the V1CreateProjectBody_RegionSelection as a V1CreateProjectBodyRegionSelection0 +func (t V1CreateProjectBody_RegionSelection) AsV1CreateProjectBodyRegionSelection0() (V1CreateProjectBodyRegionSelection0, error) { + var body V1CreateProjectBodyRegionSelection0 + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromV1CreateProjectBodyRegionSelection0 overwrites any union data inside the V1CreateProjectBody_RegionSelection as the provided V1CreateProjectBodyRegionSelection0 +func (t *V1CreateProjectBody_RegionSelection) FromV1CreateProjectBodyRegionSelection0(v V1CreateProjectBodyRegionSelection0) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeV1CreateProjectBodyRegionSelection0 performs a merge with any union data inside the V1CreateProjectBody_RegionSelection, using the provided V1CreateProjectBodyRegionSelection0 +func (t *V1CreateProjectBody_RegionSelection) MergeV1CreateProjectBodyRegionSelection0(v V1CreateProjectBodyRegionSelection0) error { + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +// AsV1CreateProjectBodyRegionSelection1 returns the union data inside the V1CreateProjectBody_RegionSelection as a V1CreateProjectBodyRegionSelection1 +func (t V1CreateProjectBody_RegionSelection) AsV1CreateProjectBodyRegionSelection1() (V1CreateProjectBodyRegionSelection1, error) { + var body V1CreateProjectBodyRegionSelection1 + err := json.Unmarshal(t.union, &body) + return body, err +} + +// FromV1CreateProjectBodyRegionSelection1 overwrites any union data inside the V1CreateProjectBody_RegionSelection as the provided V1CreateProjectBodyRegionSelection1 +func (t *V1CreateProjectBody_RegionSelection) FromV1CreateProjectBodyRegionSelection1(v V1CreateProjectBodyRegionSelection1) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +// MergeV1CreateProjectBodyRegionSelection1 performs a merge with any union data inside the V1CreateProjectBody_RegionSelection, using the provided V1CreateProjectBodyRegionSelection1 +func (t *V1CreateProjectBody_RegionSelection) MergeV1CreateProjectBodyRegionSelection1(v V1CreateProjectBodyRegionSelection1) error { + b, err := json.Marshal(v) + if err != nil { + return err + } + + merged, err := runtime.JSONMerge(t.union, b) + t.union = merged + return err +} + +func (t V1CreateProjectBody_RegionSelection) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *V1CreateProjectBody_RegionSelection) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + // AsV1GetUsageApiCountResponseError0 returns the union data inside the V1GetUsageApiCountResponse_Error as a V1GetUsageApiCountResponseError0 func (t V1GetUsageApiCountResponse_Error) AsV1GetUsageApiCountResponseError0() (V1GetUsageApiCountResponseError0, error) { var body V1GetUsageApiCountResponseError0 diff --git a/pkg/config/auth.go b/pkg/config/auth.go index 053c8296c..c8f017a5c 100644 --- a/pkg/config/auth.go +++ b/pkg/config/auth.go @@ -354,6 +354,7 @@ type ( Url string `toml:"url"` RedirectUri string `toml:"redirect_uri"` SkipNonceCheck bool `toml:"skip_nonce_check"` + EmailOptional bool `toml:"email_optional"` } solana struct { @@ -952,6 +953,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalAppleSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalAppleEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["azure"]; ok { @@ -961,6 +963,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { body.ExternalAzureSecret = nullable.NewNullableWithValue(p.Secret.Value) } body.ExternalAzureUrl = nullable.NewNullableWithValue(p.Url) + body.ExternalAzureEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["bitbucket"]; ok { @@ -969,6 +972,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalBitbucketSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalBitbucketEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["discord"]; ok { @@ -977,6 +981,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalDiscordSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalDiscordEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["facebook"]; ok { @@ -985,6 +990,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalFacebookSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalFacebookEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["figma"]; ok { @@ -993,6 +999,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalFigmaSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalFigmaEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["github"]; ok { @@ -1001,6 +1008,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalGithubSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalGithubEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["gitlab"]; ok { @@ -1010,6 +1018,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { body.ExternalGitlabSecret = nullable.NewNullableWithValue(p.Secret.Value) } body.ExternalGitlabUrl = nullable.NewNullableWithValue(p.Url) + body.ExternalGitlabEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["google"]; ok { @@ -1019,6 +1028,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { body.ExternalGoogleSecret = nullable.NewNullableWithValue(p.Secret.Value) } body.ExternalGoogleSkipNonceCheck = nullable.NewNullableWithValue(p.SkipNonceCheck) + body.ExternalGoogleEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["kakao"]; ok { @@ -1027,6 +1037,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalKakaoSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalKakaoEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["keycloak"]; ok { @@ -1036,6 +1047,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { body.ExternalKeycloakSecret = nullable.NewNullableWithValue(p.Secret.Value) } body.ExternalKeycloakUrl = nullable.NewNullableWithValue(p.Url) + body.ExternalKeycloakEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["linkedin_oidc"]; ok { @@ -1044,6 +1056,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalLinkedinOidcSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalLinkedinOidcEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["notion"]; ok { @@ -1052,6 +1065,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalNotionSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalNotionEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["slack_oidc"]; ok { @@ -1060,6 +1074,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalSlackOidcSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalSlackOidcEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["spotify"]; ok { @@ -1068,6 +1083,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalSpotifySecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalSpotifyEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["twitch"]; ok { @@ -1076,6 +1092,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalTwitchSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalTwitchEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["twitter"]; ok { @@ -1084,6 +1101,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalTwitterSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalTwitterEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } if p, ok := e["workos"]; ok { @@ -1101,6 +1119,7 @@ func (e external) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if len(p.Secret.SHA256) > 0 { body.ExternalZoomSecret = nullable.NewNullableWithValue(p.Secret.Value) } + body.ExternalZoomEmailOptional = nullable.NewNullableWithValue(p.EmailOptional) } } } @@ -1119,6 +1138,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalAppleSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalAppleEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalAppleEnabled, false) e["apple"] = p @@ -1131,6 +1151,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalAzureSecret, "") } p.Url = ValOrDefault(remoteConfig.ExternalAzureUrl, "") + p.EmailOptional = ValOrDefault(remoteConfig.ExternalAzureEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalAzureEnabled, false) e["azure"] = p @@ -1142,6 +1163,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalBitbucketSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalBitbucketEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalBitbucketEnabled, false) e["bitbucket"] = p @@ -1153,6 +1175,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalDiscordSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalDiscordEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalDiscordEnabled, false) e["discord"] = p @@ -1164,6 +1187,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalFacebookSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalFacebookEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalFacebookEnabled, false) e["facebook"] = p @@ -1175,6 +1199,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalFigmaSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalFigmaEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalFigmaEnabled, false) e["figma"] = p @@ -1186,6 +1211,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalGithubSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalGithubEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalGithubEnabled, false) e["github"] = p @@ -1198,6 +1224,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalGitlabSecret, "") } p.Url = ValOrDefault(remoteConfig.ExternalGitlabUrl, "") + p.EmailOptional = ValOrDefault(remoteConfig.ExternalGitlabEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalGitlabEnabled, false) e["gitlab"] = p @@ -1213,6 +1240,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalGoogleSecret, "") } p.SkipNonceCheck = ValOrDefault(remoteConfig.ExternalGoogleSkipNonceCheck, false) + p.EmailOptional = ValOrDefault(remoteConfig.ExternalGoogleEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalGoogleEnabled, false) e["google"] = p @@ -1224,6 +1252,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalKakaoSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalKakaoEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalKakaoEnabled, false) e["kakao"] = p @@ -1236,6 +1265,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalKeycloakSecret, "") } p.Url = ValOrDefault(remoteConfig.ExternalKeycloakUrl, "") + p.EmailOptional = ValOrDefault(remoteConfig.ExternalKeycloakEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalKeycloakEnabled, false) e["keycloak"] = p @@ -1247,6 +1277,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalLinkedinOidcSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalLinkedinOidcEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalLinkedinOidcEnabled, false) e["linkedin_oidc"] = p @@ -1258,6 +1289,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalNotionSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalNotionEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalNotionEnabled, false) e["notion"] = p @@ -1269,6 +1301,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalSlackOidcSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalSlackOidcEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalSlackOidcEnabled, false) e["slack_oidc"] = p @@ -1280,6 +1313,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalSpotifySecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalSpotifyEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalSpotifyEnabled, false) e["spotify"] = p @@ -1291,6 +1325,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalTwitchSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalTwitchEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalTwitchEnabled, false) e["twitch"] = p @@ -1302,6 +1337,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalTwitterSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalTwitterEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalTwitterEnabled, false) e["twitter"] = p @@ -1325,6 +1361,7 @@ func (e external) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { if len(p.Secret.SHA256) > 0 { p.Secret.SHA256 = ValOrDefault(remoteConfig.ExternalZoomSecret, "") } + p.EmailOptional = ValOrDefault(remoteConfig.ExternalZoomEmailOptional, false) } p.Enabled = ValOrDefault(remoteConfig.ExternalZoomEnabled, false) e["zoom"] = p diff --git a/pkg/config/config.go b/pkg/config/config.go index d21f1847c..ea49a76ca 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -28,7 +28,6 @@ import ( "github.com/go-errors/errors" "github.com/go-viper/mapstructure/v2" "github.com/joho/godotenv" - "github.com/spf13/afero" "github.com/spf13/viper" "github.com/supabase/cli/pkg/cast" "github.com/supabase/cli/pkg/fetcher" @@ -1428,7 +1427,7 @@ type ( // ResolveJWKS creates the JWKS from the JWT secret and Third-Party Auth // configs by resolving the JWKS via the OIDC discovery URL. // It always returns a JWKS string, except when there's an error fetching. -func (a *auth) ResolveJWKS(ctx context.Context, fsys afero.Fs) (string, error) { +func (a *auth) ResolveJWKS(ctx context.Context) (string, error) { var jwks remoteJWKS if issuerURL := a.ThirdParty.IssuerURL(); issuerURL != "" { diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index 1afea6435..f26370c15 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -1,19 +1,19 @@ # Exposed for updates by .github/dependabot.yml -FROM supabase/postgres:17.6.1.011 AS pg +FROM supabase/postgres:17.6.1.017 AS pg # Append to ServiceImages when adding new dependencies below FROM library/kong:2.8.1 AS kong FROM axllent/mailpit:v1.22.3 AS mailpit FROM postgrest/postgrest:v13.0.7 AS postgrest -FROM supabase/postgres-meta:v0.91.6 AS pgmeta -FROM supabase/studio:2025.10.01-sha-8460121 AS studio +FROM supabase/postgres-meta:v0.91.7 AS pgmeta +FROM supabase/studio:2025.10.09-sha-433e578 AS studio FROM darthsim/imgproxy:v3.8.0 AS imgproxy FROM supabase/edge-runtime:v1.69.12 AS edgeruntime FROM timberio/vector:0.28.1-alpine AS vector -FROM supabase/supavisor:2.7.0 AS supavisor +FROM supabase/supavisor:2.7.3 AS supavisor FROM supabase/gotrue:v2.180.0 AS gotrue -FROM supabase/realtime:v2.51.11 AS realtime -FROM supabase/storage-api:v1.28.0 AS storage -FROM supabase/logflare:1.22.4 AS logflare +FROM supabase/realtime:v2.53.2 AS realtime +FROM supabase/storage-api:v1.28.1 AS storage +FROM supabase/logflare:1.23.0 AS logflare # Append to JobImages when adding new dependencies below FROM supabase/pgadmin-schema-diff:cli-0.0.5 AS differ FROM supabase/migra:3.0.1663481299 AS migra diff --git a/pkg/config/templates/config.toml b/pkg/config/templates/config.toml index 5be2af89a..ebdb83103 100644 --- a/pkg/config/templates/config.toml +++ b/pkg/config/templates/config.toml @@ -275,6 +275,8 @@ redirect_uri = "" url = "" # If enabled, the nonce check will be skipped. Required for local sign in with Google auth. skip_nonce_check = false +# If enabled, it will allow the user to successfully authenticate when the provider does not return an email address. +email_optional = false # Allow Solana wallet holders to sign in to your project via the Sign in with Solana (SIWS, EIP-4361) standard. # You can configure "web3" rate limit in the [auth.rate_limit] section and set up [auth.captcha] if self-hosting. diff --git a/pkg/config/testdata/config.toml b/pkg/config/testdata/config.toml index 10d439399..cc3e7e907 100644 --- a/pkg/config/testdata/config.toml +++ b/pkg/config/testdata/config.toml @@ -285,6 +285,8 @@ secret = "env(AZURE_SECRET)" url = "https://login.microsoftonline.com/tenant" # If enabled, the nonce check will be skipped. Required for local sign in with Google auth. skip_nonce_check = true +# If enabled, it will allow the user to successfully authenticate when the provider does not return an email address. +email_optional = true # Allow Solana wallet holders to sign in to your project via the Sign in with Solana (SIWS, EIP-4361) standard. # You can configure "web3" rate limit in the [auth.rate_limit] section and set up [auth.captcha] if self-hosting. diff --git a/pkg/go.mod b/pkg/go.mod index 78d0b999c..b30ff9bfa 100644 --- a/pkg/go.mod +++ b/pkg/go.mod @@ -11,7 +11,6 @@ require ( github.com/go-errors/errors v1.5.1 github.com/go-viper/mapstructure/v2 v2.4.0 github.com/golang-jwt/jwt/v5 v5.3.0 - github.com/google/uuid v1.6.0 github.com/h2non/gock v1.2.0 github.com/jackc/pgconn v1.14.3 github.com/jackc/pgerrcode v0.0.0-20240316143900-6e2875d9b438 @@ -26,8 +25,8 @@ require ( github.com/spf13/viper v1.21.0 github.com/stretchr/testify v1.11.1 github.com/tidwall/jsonc v0.3.2 - golang.org/x/mod v0.28.0 - google.golang.org/grpc v1.75.1 + golang.org/x/mod v0.29.0 + google.golang.org/grpc v1.76.0 ) require ( @@ -36,6 +35,7 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect github.com/ethereum/go-ethereum v1.15.8 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgio v1.0.0 // indirect @@ -52,8 +52,8 @@ require ( github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.39.0 // indirect - golang.org/x/sys v0.33.0 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/sys v0.34.0 // indirect golang.org/x/text v0.28.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/pkg/go.sum b/pkg/go.sum index 58135e559..5b054d35c 100644 --- a/pkg/go.sum +++ b/pkg/go.sum @@ -217,15 +217,15 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -255,8 +255,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -290,8 +290,8 @@ golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= -google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/pkg/migration/list.go b/pkg/migration/list.go index afa024a1b..8972bb259 100644 --- a/pkg/migration/list.go +++ b/pkg/migration/list.go @@ -38,6 +38,9 @@ func ListLocalMigrations(migrationsDir string, fsys fs.FS, filter ...func(string var clean []string OUTER: for i, migration := range localMigrations { + if migration.IsDir() { + continue + } filename := migration.Name() if i == 0 && shouldSkip(filename) { fmt.Fprintf(os.Stderr, "Skipping migration %s... (replace \"init\" with a different file name to apply this migration)\n", filename) diff --git a/pkg/migration/queries/drop.sql b/pkg/migration/queries/drop.sql index 9ce1c8fbb..bbcf56edc 100644 --- a/pkg/migration/queries/drop.sql +++ b/pkg/migration/queries/drop.sql @@ -13,6 +13,7 @@ begin -- If an extension uses a schema it doesn't create, dropping the schema will cascade to also -- drop the extension. But if an extension creates its own schema, dropping the schema will -- throw an error. Hence, we drop schemas first while excluding those created by extensions. + raise notice 'dropping schema: %', rec.nspname; execute format('drop schema if exists %I cascade', rec.nspname); end loop; @@ -22,6 +23,7 @@ begin from pg_extension p where p.extname not in ('pg_graphql', 'pg_net', 'pg_stat_statements', 'pgcrypto', 'pgjwt', 'pgsodium', 'plpgsql', 'supabase_vault', 'uuid-ossp') loop + raise notice 'dropping extension: %', rec.extname; execute format('drop extension if exists %I cascade', rec.extname); end loop; @@ -32,6 +34,7 @@ begin where p.pronamespace::regnamespace::name = 'public' loop -- supports aggregate, function, and procedure + raise notice 'dropping function: %.%', rec.pronamespace::regnamespace::name, rec.proname; execute format('drop routine if exists %I.%I(%s) cascade', rec.pronamespace::regnamespace::name, rec.proname, pg_catalog.pg_get_function_identity_arguments(rec.oid)); end loop; @@ -43,6 +46,7 @@ begin c.relnamespace::regnamespace::name = 'public' and c.relkind = 'v' loop + raise notice 'dropping view: %.%', rec.relnamespace::regnamespace::name, rec.relname; execute format('drop view if exists %I.%I cascade', rec.relnamespace::regnamespace::name, rec.relname); end loop; @@ -54,6 +58,7 @@ begin c.relnamespace::regnamespace::name = 'public' and c.relkind = 'm' loop + raise notice 'dropping materialized view: %.%', rec.relnamespace::regnamespace::name, rec.relname; execute format('drop materialized view if exists %I.%I cascade', rec.relnamespace::regnamespace::name, rec.relname); end loop; @@ -67,6 +72,7 @@ begin order by c.relkind desc loop -- supports all table like relations, except views, complex types, and sequences + raise notice 'dropping table: %.%', rec.relnamespace::regnamespace::name, rec.relname; execute format('drop table if exists %I.%I cascade', rec.relnamespace::regnamespace::name, rec.relname); end loop; @@ -80,6 +86,7 @@ begin or c.relnamespace::regnamespace::name = 'supabase_migrations') and c.relkind = 'r' loop + raise notice 'truncating table: %.%', rec.relnamespace::regnamespace::name, rec.relname; execute format('truncate %I.%I cascade', rec.relnamespace::regnamespace::name, rec.relname); end loop; @@ -91,6 +98,7 @@ begin c.relnamespace::regnamespace::name = 'public' and c.relkind = 's' loop + raise notice 'dropping sequence: %.%', rec.relnamespace::regnamespace::name, rec.relname; execute format('drop sequence if exists %I.%I cascade', rec.relnamespace::regnamespace::name, rec.relname); end loop; @@ -102,6 +110,7 @@ begin t.typnamespace::regnamespace::name = 'public' and typtype != 'b' loop + raise notice 'dropping type: %.%', rec.typnamespace::regnamespace::name, rec.typname; execute format('drop type if exists %I.%I cascade', rec.typnamespace::regnamespace::name, rec.typname); end loop; @@ -110,6 +119,7 @@ begin select * from pg_policies p loop + raise notice 'dropping policy: %', rec.policyname; execute format('drop policy if exists %I on %I.%I cascade', rec.policyname, rec.schemaname, rec.tablename); end loop; @@ -120,6 +130,7 @@ begin where not p.pubname like any(array['supabase\_realtime%', 'realtime\_messages%']) loop + raise notice 'dropping publication: %', rec.pubname; execute format('drop publication if exists %I', rec.pubname); end loop; end $$; diff --git a/pkg/pgxv5/connect.go b/pkg/pgxv5/connect.go index 528742921..4ae754f24 100644 --- a/pkg/pgxv5/connect.go +++ b/pkg/pgxv5/connect.go @@ -11,11 +11,6 @@ import ( "github.com/jackc/pgx/v4" ) -const ( - CLI_LOGIN_PREFIX = "cli_login_" - SET_SESSION_ROLE = "SET SESSION ROLE postgres" -) - // Extends pgx.Connect with support for programmatically overriding parsed config func Connect(ctx context.Context, connString string, options ...func(*pgx.ConnConfig)) (*pgx.Conn, error) { // Parse connection url @@ -28,11 +23,6 @@ func Connect(ctx context.Context, connString string, options ...func(*pgx.ConnCo fmt.Fprintf(os.Stderr, "%s (%s): %s\n", n.Severity, n.Code, n.Message) } } - if strings.HasPrefix(config.User, CLI_LOGIN_PREFIX) { - config.AfterConnect = func(ctx context.Context, pgconn *pgconn.PgConn) error { - return pgconn.Exec(ctx, SET_SESSION_ROLE).Close() - } - } // Apply config overrides for _, op := range options { op(config)