From 4ef520d3d1109b374e96ea9d39fc091d5aee260f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 04:22:03 +0000 Subject: [PATCH 01/24] fix(docker): bump supabase/postgres from 17.6.1.029 to 17.6.1.032 in /pkg/config/templates (#4378) fix(docker): bump supabase/postgres in /pkg/config/templates Bumps supabase/postgres from 17.6.1.029 to 17.6.1.032. --- updated-dependencies: - dependency-name: supabase/postgres dependency-version: 17.6.1.032 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index 45abad217..700c1a876 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -1,5 +1,5 @@ # Exposed for updates by .github/dependabot.yml -FROM supabase/postgres:17.6.1.029 AS pg +FROM supabase/postgres:17.6.1.032 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 ac91981af5d863cb189fa2d626f1516219349aa5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 04:28:10 +0000 Subject: [PATCH 02/24] fix(docker): bump the docker-minor group in /pkg/config/templates with 3 updates (#4377) fix(docker): bump the docker-minor group Bumps the docker-minor group in /pkg/config/templates with 3 updates: supabase/supavisor, supabase/realtime and supabase/storage-api. Updates `supabase/supavisor` from 2.7.3 to 2.7.4 Updates `supabase/realtime` from v2.57.3 to v2.57.6 Updates `supabase/storage-api` from v1.28.2 to v1.28.3 --- updated-dependencies: - dependency-name: supabase/supavisor dependency-version: 2.7.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docker-minor - dependency-name: supabase/realtime dependency-version: v2.57.6 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/storage-api dependency-version: v1.28.3 dependency-type: direct:production dependency-group: docker-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index 700c1a876..12da9d99a 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -9,10 +9,10 @@ FROM supabase/studio:2025.10.27-sha-85b84e0 AS studio FROM darthsim/imgproxy:v3.8.0 AS imgproxy FROM supabase/edge-runtime:v1.69.15 AS edgeruntime FROM timberio/vector:0.28.1-alpine AS vector -FROM supabase/supavisor:2.7.3 AS supavisor +FROM supabase/supavisor:2.7.4 AS supavisor FROM supabase/gotrue:v2.180.0 AS gotrue -FROM supabase/realtime:v2.57.3 AS realtime -FROM supabase/storage-api:v1.28.2 AS storage +FROM supabase/realtime:v2.57.6 AS realtime +FROM supabase/storage-api:v1.28.3 AS storage FROM supabase/logflare:1.23.2 AS logflare # Append to JobImages when adding new dependencies below FROM supabase/pgadmin-schema-diff:cli-0.0.5 AS differ From a87b8c8c3569af09ff5dc5f8f8b80e3dda096068 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 14:55:03 +0800 Subject: [PATCH 03/24] chore(deps): bump github.com/getsentry/sentry-go from 0.36.1 to 0.36.2 in the go-minor group across 1 directory (#4379) chore(deps): bump github.com/getsentry/sentry-go Bumps the go-minor group with 1 update in the / directory: [github.com/getsentry/sentry-go](https://github.com/getsentry/sentry-go). Updates `github.com/getsentry/sentry-go` from 0.36.1 to 0.36.2 - [Release notes](https://github.com/getsentry/sentry-go/releases) - [Changelog](https://github.com/getsentry/sentry-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-go/compare/v0.36.1...v0.36.2) --- updated-dependencies: - dependency-name: github.com/getsentry/sentry-go dependency-version: 0.36.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0d7d1fb63..4efda4f17 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( 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.36.1 + github.com/getsentry/sentry-go v0.36.2 github.com/go-errors/errors v1.5.1 github.com/go-git/go-git/v5 v5.16.3 github.com/go-playground/validator/v10 v10.28.0 diff --git a/go.sum b/go.sum index 2809edcbf..aff76a2df 100644 --- a/go.sum +++ b/go.sum @@ -300,8 +300,8 @@ github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIp 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.36.1 h1:kMJt0WWsxWATUxkvFgVBZdIeHSk/Oiv5P0jZ9e5m/Lw= -github.com/getsentry/sentry-go v0.36.1/go.mod h1:p5Im24mJBeruET8Q4bbcMfCQ+F+Iadc4L48tB1apo2c= +github.com/getsentry/sentry-go v0.36.2 h1:uhuxRPTrUy0dnSzTd0LrYXlBYygLkKY0hhlG5LXarzM= +github.com/getsentry/sentry-go v0.36.2/go.mod h1:p5Im24mJBeruET8Q4bbcMfCQ+F+Iadc4L48tB1apo2c= github.com/ghostiam/protogetter v0.3.15 h1:1KF5sXel0HE48zh1/vn0Loiw25A9ApyseLzQuif1mLY= github.com/ghostiam/protogetter v0.3.15/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= From 891a5df913832f4a99ee24ca1ac515d068b8f80b Mon Sep 17 00:00:00 2001 From: Han Qiao Date: Wed, 29 Oct 2025 15:17:32 +0800 Subject: [PATCH 04/24] feat: add ssl certs for snap (#4380) --- internal/gen/types/templates/prod-ca-2025.crt | 23 +++++++++++++++++++ internal/gen/types/types.go | 5 +++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 internal/gen/types/templates/prod-ca-2025.crt diff --git a/internal/gen/types/templates/prod-ca-2025.crt b/internal/gen/types/templates/prod-ca-2025.crt new file mode 100644 index 000000000..da35f1f84 --- /dev/null +++ b/internal/gen/types/templates/prod-ca-2025.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDxzCCAq+gAwIBAgIUeX+gpfmsRW9asFkRvjyXjHxbfgcwDQYJKoZIhvcNAQEL +BQAwazELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB0RlbHdhcmUxEzARBgNVBAcMCk5l +dyBDYXN0bGUxFTATBgNVBAoMDFN1cGFiYXNlIEluYzEeMBwGA1UEAwwVU3VwYWJh +c2UgUm9vdCAyMDIxIENBMB4XDTI1MDkwMzA4MDEyNVoXDTM1MDkwMTA4MDEyNVow +azELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB0RlbHdhcmUxEzARBgNVBAcMCk5ldyBD +YXN0bGUxFTATBgNVBAoMDFN1cGFiYXNlIEluYzEeMBwGA1UEAwwVU3VwYWJhc2Ug +Um9vdCAyMDIxIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5Ve7 +i9UAmc7luUilELPtqzEk8nGHxg7nY0aCStr625M7+K4OPO6RUllTsHh47k1jWyzm +LXLlyYwCsYCjQp+3vn06H+F/HRUxBt6CK2B7bNng230exTunk0xFvfkX6YgHR7B3 +1B7L25Rq3PhuRFPV4hnGYRam2XBZC4UNPqoAgrhV0HOYzXXAVoTr2yaBTMnB331Z +RwOmINh7eqTCk/JRZbb6vfZOhZRAVAe9AoRLoG8aKwmeoLGwlu0UuFx6z3E+6bmA +fSNa8Lx02GEoCdPLw9IRKUFq/SgBpQUKm44H1fDwTjH2CMM0N4p0mL/6wXnNeHvt +C40MmKZ0RcVmHE5wBwIDAQABo2MwYTAdBgNVHQ4EFgQUjvEE541toZcwtXQlZlcB +YOBRTnowHwYDVR0jBBgwFoAUjvEE541toZcwtXQlZlcBYOBRTnowDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggEBACD5IcGP +XKvS9qg0CgEQPFqYavt5c7P+0xxFgiZe+xoG8fUw58yNeK2APtgGPRpxEOGfAlNx +z9HDt4gcyHEE00B3qAVDm49pqNxioFWzNqU2LGfM/HL1QmN6urR7hCOkVCJddvOc +FhFX4nZDuRfaBboDvS5HlK3Pzxddp9hvrJi2bemr8HLqYc3HzmVckgPGSLML6t+h +4LRCXSlQsDgQ1LZ4KHsl4cq7K51N6FOXQBLB5q4lMKhs0VUhCT8Pdsj12+84laCV +c22q6p2mdT9SaernCSRnWazXWisgpjv3H7Ex4S1DCYjJIwn3PUToGFv1r8YRN2/S +O19yVSxxCIf64Sg= +-----END CERTIFICATE----- diff --git a/internal/gen/types/types.go b/internal/gen/types/types.go index aa22c04fa..8d616c733 100644 --- a/internal/gen/types/types.go +++ b/internal/gen/types/types.go @@ -114,6 +114,8 @@ var ( caStaging string //go:embed templates/prod-ca-2021.crt caProd string + //go:embed templates/prod-ca-2025.crt + caSnap string ) func GetRootCA(ctx context.Context, dbURL string, options ...func(*pgx.ConnConfig)) (string, error) { @@ -121,7 +123,8 @@ func GetRootCA(ctx context.Context, dbURL string, options ...func(*pgx.ConnConfi if require, err := isRequireSSL(ctx, dbURL, options...); !require { return "", err } - return caStaging + caProd, nil + // Merge all certs to support --db-url flag + return caStaging + caProd + caSnap, nil } func isRequireSSL(ctx context.Context, dbUrl string, options ...func(*pgx.ConnConfig)) (bool, error) { From 73568176ff444e260b04ae0a843a6642421f9318 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Oct 2025 04:22:25 +0000 Subject: [PATCH 05/24] fix(docker): bump the docker-minor group in /pkg/config/templates with 3 updates (#4384) fix(docker): bump the docker-minor group Bumps the docker-minor group in /pkg/config/templates with 3 updates: supabase/realtime, supabase/storage-api and supabase/logflare. Updates `supabase/realtime` from v2.57.6 to v2.58.0 Updates `supabase/storage-api` from v1.28.3 to v1.28.4 Updates `supabase/logflare` from 1.23.2 to 1.23.3 --- updated-dependencies: - dependency-name: supabase/realtime dependency-version: v2.58.0 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/storage-api dependency-version: v1.28.4 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/logflare dependency-version: 1.23.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docker-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index 12da9d99a..e4ba0823a 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -11,9 +11,9 @@ FROM supabase/edge-runtime:v1.69.15 AS edgeruntime FROM timberio/vector:0.28.1-alpine AS vector FROM supabase/supavisor:2.7.4 AS supavisor FROM supabase/gotrue:v2.180.0 AS gotrue -FROM supabase/realtime:v2.57.6 AS realtime -FROM supabase/storage-api:v1.28.3 AS storage -FROM supabase/logflare:1.23.2 AS logflare +FROM supabase/realtime:v2.58.0 AS realtime +FROM supabase/storage-api:v1.28.4 AS storage +FROM supabase/logflare:1.23.3 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 From 55f2d68bf4980b7bdb8d171a9dfadbe6136cad58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Oct 2025 04:27:38 +0000 Subject: [PATCH 06/24] fix(docker): bump supabase/postgres from 17.6.1.032 to 17.6.1.034 in /pkg/config/templates (#4385) fix(docker): bump supabase/postgres in /pkg/config/templates Bumps supabase/postgres from 17.6.1.032 to 17.6.1.034. --- updated-dependencies: - dependency-name: supabase/postgres dependency-version: 17.6.1.034 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index e4ba0823a..a1e5ee5d1 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -1,5 +1,5 @@ # Exposed for updates by .github/dependabot.yml -FROM supabase/postgres:17.6.1.032 AS pg +FROM supabase/postgres:17.6.1.034 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 11bd66df45888c11fee80355ea91d06b7c78da8b Mon Sep 17 00:00:00 2001 From: Han Qiao Date: Thu, 30 Oct 2025 15:37:52 +0800 Subject: [PATCH 07/24] fix: enable snapchat provider automatically for selected profile (#4382) --- internal/utils/flags/config_path.go | 11 +++++++++++ internal/utils/profile.go | 4 +++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/internal/utils/flags/config_path.go b/internal/utils/flags/config_path.go index bec77a432..4df1bff74 100644 --- a/internal/utils/flags/config_path.go +++ b/internal/utils/flags/config_path.go @@ -1,6 +1,8 @@ package flags import ( + "strings" + "github.com/spf13/afero" "github.com/supabase/cli/internal/utils" ) @@ -11,5 +13,14 @@ func LoadConfig(fsys afero.Fs) error { return err } utils.UpdateDockerIds() + // Apply profile specific overrides + if strings.EqualFold(utils.CurrentProfile.Name, "snap") { + ext := utils.Config.Auth.External["snapchat"] + ext.Enabled = true + ext.ClientId = utils.CurrentProfile.AuthClientID + // Any dummy value should work for local dev + ext.Secret.Value = utils.CurrentProfile.AuthClientID + utils.Config.Auth.External["snapchat"] = ext + } return nil } diff --git a/internal/utils/profile.go b/internal/utils/profile.go index eef9e5a0d..fcb089e3f 100644 --- a/internal/utils/profile.go +++ b/internal/utils/profile.go @@ -15,9 +15,10 @@ type Profile struct { Name string `mapstructure:"name" validate:"required"` APIURL string `mapstructure:"api_url" validate:"required,http_url"` DashboardURL string `mapstructure:"dashboard_url" validate:"required,http_url"` + DocsURL string `mapstructure:"docs_url" validate:"omitempty,http_url"` ProjectHost string `mapstructure:"project_host" validate:"required,hostname_rfc1123"` PoolerHost string `mapstructure:"pooler_host" validate:"omitempty,hostname_rfc1123"` - DocsURL string `mapstructure:"docs_url" validate:"omitempty,http_url"` + AuthClientID string `mapstructure:"client_id" validate:"omitempty,uuid4"` StudioImage string `mapstructure:"studio_image"` } @@ -48,6 +49,7 @@ var allProfiles = []Profile{{ DocsURL: "https://cloud.snap.com/docs", ProjectHost: "snapcloud.dev", PoolerHost: "snapcloud.co", + AuthClientID: "f7573b20-df47-48f1-b606-e8db4ec16252", }} var CurrentProfile Profile From 4be2ac3a5ada69e661eb99f4a24f8fec2769ae94 Mon Sep 17 00:00:00 2001 From: Han Qiao Date: Thu, 30 Oct 2025 21:54:01 +0800 Subject: [PATCH 08/24] fix: reset config url when skipping pooler (#4387) --- internal/link/link.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/link/link.go b/internal/link/link.go index 5c66f93c6..98e3b4814 100644 --- a/internal/link/link.go +++ b/internal/link/link.go @@ -69,6 +69,7 @@ func LinkServices(ctx context.Context, projectRef, serviceKey string, skipPooler func() error { return linkStorage(ctx, projectRef) }, func() error { if skipPooler { + utils.Config.Db.Pooler.ConnectionString = "" return fsys.RemoveAll(utils.PoolerUrlPath) } return linkPooler(ctx, projectRef, fsys) From 0f0ea117fb0cbb3ce38b636e436a2706b029cfb7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Oct 2025 17:25:59 +0000 Subject: [PATCH 09/24] chore(deps): bump tar from 7.5.1 to 7.5.2 (#4389) Bumps [tar](https://github.com/isaacs/node-tar) from 7.5.1 to 7.5.2. - [Release notes](https://github.com/isaacs/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/isaacs/node-tar/compare/v7.5.1...v7.5.2) --- updated-dependencies: - dependency-name: tar dependency-version: 7.5.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1bae6b518..27f3470fd 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "bin-links": "^6.0.0", "https-proxy-agent": "^7.0.2", "node-fetch": "^3.3.2", - "tar": "7.5.1" + "tar": "7.5.2" }, "release": { "branches": [ From 01f6d1cb2b5e5165ba587f11e10cc9a9d640a1b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 15:34:41 +0800 Subject: [PATCH 10/24] fix(docker): bump the docker-minor group in /pkg/config/templates with 2 updates (#4390) fix(docker): bump the docker-minor group Bumps the docker-minor group in /pkg/config/templates with 2 updates: supabase/edge-runtime and supabase/realtime. Updates `supabase/edge-runtime` from v1.69.15 to v1.69.17 Updates `supabase/realtime` from v2.58.0 to v2.58.1 --- updated-dependencies: - dependency-name: supabase/edge-runtime dependency-version: v1.69.17 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/realtime dependency-version: v2.58.1 dependency-type: direct:production dependency-group: docker-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index a1e5ee5d1..fb9ea6aaa 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -7,11 +7,11 @@ FROM postgrest/postgrest:v13.0.7 AS postgrest FROM supabase/postgres-meta:v0.93.1 AS pgmeta FROM supabase/studio:2025.10.27-sha-85b84e0 AS studio FROM darthsim/imgproxy:v3.8.0 AS imgproxy -FROM supabase/edge-runtime:v1.69.15 AS edgeruntime +FROM supabase/edge-runtime:v1.69.17 AS edgeruntime FROM timberio/vector:0.28.1-alpine AS vector FROM supabase/supavisor:2.7.4 AS supavisor FROM supabase/gotrue:v2.180.0 AS gotrue -FROM supabase/realtime:v2.58.0 AS realtime +FROM supabase/realtime:v2.58.1 AS realtime FROM supabase/storage-api:v1.28.4 AS storage FROM supabase/logflare:1.23.3 AS logflare # Append to JobImages when adding new dependencies below From cda3afed946381157f78bf75b95ca945afa01ab5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 04:31:00 +0000 Subject: [PATCH 11/24] fix(docker): bump supabase/postgres from 17.6.1.034 to 17.6.1.036 in /pkg/config/templates (#4398) fix(docker): bump supabase/postgres in /pkg/config/templates Bumps supabase/postgres from 17.6.1.034 to 17.6.1.036. --- updated-dependencies: - dependency-name: supabase/postgres dependency-version: 17.6.1.036 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index fb9ea6aaa..20b839a9d 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -1,5 +1,5 @@ # Exposed for updates by .github/dependabot.yml -FROM supabase/postgres:17.6.1.034 AS pg +FROM supabase/postgres:17.6.1.036 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 f711ee2922e4fdf02f754a77c62536dcf6585633 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 04:47:22 +0000 Subject: [PATCH 12/24] fix(docker): bump the docker-minor group in /pkg/config/templates with 4 updates (#4397) fix(docker): bump the docker-minor group Bumps the docker-minor group in /pkg/config/templates with 4 updates: supabase/studio, supabase/edge-runtime, supabase/realtime and supabase/storage-api. Updates `supabase/studio` from 2025.10.27-sha-85b84e0 to 2025.11.03-sha-ddedae5 Updates `supabase/edge-runtime` from v1.69.17 to v1.69.18 Updates `supabase/realtime` from v2.58.1 to v2.59.1 Updates `supabase/storage-api` from v1.28.4 to v1.28.5 --- updated-dependencies: - dependency-name: supabase/studio dependency-version: 2025.11.03-sha-ddedae5 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: docker-minor - dependency-name: supabase/edge-runtime dependency-version: v1.69.18 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/realtime dependency-version: v2.59.1 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/storage-api dependency-version: v1.28.5 dependency-type: direct:production dependency-group: docker-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index 20b839a9d..c283b5a15 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -5,14 +5,14 @@ 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.93.1 AS pgmeta -FROM supabase/studio:2025.10.27-sha-85b84e0 AS studio +FROM supabase/studio:2025.11.03-sha-ddedae5 AS studio FROM darthsim/imgproxy:v3.8.0 AS imgproxy -FROM supabase/edge-runtime:v1.69.17 AS edgeruntime +FROM supabase/edge-runtime:v1.69.18 AS edgeruntime FROM timberio/vector:0.28.1-alpine AS vector FROM supabase/supavisor:2.7.4 AS supavisor FROM supabase/gotrue:v2.180.0 AS gotrue -FROM supabase/realtime:v2.58.1 AS realtime -FROM supabase/storage-api:v1.28.4 AS storage +FROM supabase/realtime:v2.59.1 AS realtime +FROM supabase/storage-api:v1.28.5 AS storage FROM supabase/logflare:1.23.3 AS logflare # Append to JobImages when adding new dependencies below FROM supabase/pgadmin-schema-diff:cli-0.0.5 AS differ From df557dc33967cf40e1e0af8a74e7a7b7c76120aa Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:57:15 +0100 Subject: [PATCH 13/24] chore: sync API types from infrastructure (#4392) Co-authored-by: avallete <8771783+avallete@users.noreply.github.com> --- pkg/api/types.gen.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pkg/api/types.gen.go b/pkg/api/types.gen.go index d55f973ee..50afda4ed 100644 --- a/pkg/api/types.gen.go +++ b/pkg/api/types.gen.go @@ -1366,6 +1366,7 @@ const ( // Defines values for V1RestorePointResponseStatus. const ( AVAILABLE V1RestorePointResponseStatus = "AVAILABLE" + FAILED V1RestorePointResponseStatus = "FAILED" PENDING V1RestorePointResponseStatus = "PENDING" REMOVED V1RestorePointResponseStatus = "REMOVED" ) @@ -2333,6 +2334,9 @@ type DeleteRolesResponse struct { // DeleteRolesResponseMessage defines model for DeleteRolesResponse.Message. type DeleteRolesResponseMessage string +// DeleteSecretsBody defines model for DeleteSecretsBody. +type DeleteSecretsBody = []string + // DeployFunctionResponse defines model for DeployFunctionResponse. type DeployFunctionResponse struct { CreatedAt *int64 `json:"created_at,omitempty"` @@ -3219,7 +3223,8 @@ type StorageConfigResponse struct { IcebergCatalog bool `json:"iceberg_catalog"` ListV2 bool `json:"list_v2"` } `json:"capabilities"` - External struct { + DatabasePoolMode string `json:"databasePoolMode"` + External struct { UpstreamTarget StorageConfigResponseExternalUpstreamTarget `json:"upstreamTarget"` } `json:"external"` Features struct { @@ -3233,7 +3238,8 @@ type StorageConfigResponse struct { Enabled bool `json:"enabled"` } `json:"s3Protocol"` } `json:"features"` - FileSizeLimit int64 `json:"fileSizeLimit"` + FileSizeLimit int64 `json:"fileSizeLimit"` + MigrationVersion string `json:"migrationVersion"` } // StorageConfigResponseExternalUpstreamTarget defines model for StorageConfigResponse.External.UpstreamTarget. @@ -4488,9 +4494,6 @@ type V1GetServicesHealthParams struct { // V1GetServicesHealthParamsServices defines parameters for V1GetServicesHealth. type V1GetServicesHealthParamsServices string -// V1BulkDeleteSecretsJSONBody defines parameters for V1BulkDeleteSecrets. -type V1BulkDeleteSecretsJSONBody = []string - // V1GenerateTypescriptTypesParams defines parameters for V1GenerateTypescriptTypes. type V1GenerateTypescriptTypesParams struct { IncludedSchemas *string `form:"included_schemas,omitempty" json:"included_schemas,omitempty"` @@ -4647,7 +4650,7 @@ type V1RemoveAReadReplicaJSONRequestBody = RemoveReadReplicaBody type V1SetupAReadReplicaJSONRequestBody = SetUpReadReplicaBody // V1BulkDeleteSecretsJSONRequestBody defines body for V1BulkDeleteSecrets for application/json ContentType. -type V1BulkDeleteSecretsJSONRequestBody = V1BulkDeleteSecretsJSONBody +type V1BulkDeleteSecretsJSONRequestBody = DeleteSecretsBody // V1BulkCreateSecretsJSONRequestBody defines body for V1BulkCreateSecrets for application/json ContentType. type V1BulkCreateSecretsJSONRequestBody = CreateSecretBody From 677365d4af3b9835fba1a638f37d65f77a12132e Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Tue, 4 Nov 2025 04:58:51 +0100 Subject: [PATCH 14/24] chore: sync API types from infrastructure (#4401) Co-authored-by: avallete <8771783+avallete@users.noreply.github.com> --- pkg/api/types.gen.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/api/types.gen.go b/pkg/api/types.gen.go index 50afda4ed..818f2822d 100644 --- a/pkg/api/types.gen.go +++ b/pkg/api/types.gen.go @@ -4365,6 +4365,7 @@ type V1GetProjectFunctionCombinedStatsParamsInterval string // V1GetProjectLogsParams defines parameters for V1GetProjectLogs. type V1GetProjectLogsParams struct { + // Sql Custom SQL query to execute on the logs. See [querying logs](/docs/guides/telemetry/logs?queryGroups=product&product=postgres&queryGroups=source&source=edge_logs#querying-with-the-logs-explorer) for more details. Sql *string `form:"sql,omitempty" json:"sql,omitempty"` IsoTimestampStart *time.Time `form:"iso_timestamp_start,omitempty" json:"iso_timestamp_start,omitempty"` IsoTimestampEnd *time.Time `form:"iso_timestamp_end,omitempty" json:"iso_timestamp_end,omitempty"` From 8b1d18234ae797039b4465aef1c3dbdfeb0c8c2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 04:19:43 +0000 Subject: [PATCH 15/24] fix(docker): bump supabase/postgres from 17.6.1.036 to 17.6.1.038 in /pkg/config/templates (#4404) fix(docker): bump supabase/postgres in /pkg/config/templates Bumps supabase/postgres from 17.6.1.036 to 17.6.1.038. --- updated-dependencies: - dependency-name: supabase/postgres dependency-version: 17.6.1.038 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index c283b5a15..7609b5bed 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -1,5 +1,5 @@ # Exposed for updates by .github/dependabot.yml -FROM supabase/postgres:17.6.1.036 AS pg +FROM supabase/postgres:17.6.1.038 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 3491a2f48aa6cf55b756167e524958a11820871b Mon Sep 17 00:00:00 2001 From: Han Qiao Date: Tue, 4 Nov 2025 18:05:44 +0800 Subject: [PATCH 16/24] fix: drop schema specifier when enabling pgmq (#4391) --- pkg/migration/scripts/dump_schema.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/migration/scripts/dump_schema.sh b/pkg/migration/scripts/dump_schema.sh index d7fa91f7f..0b7c8fb90 100755 --- a/pkg/migration/scripts/dump_schema.sh +++ b/pkg/migration/scripts/dump_schema.sh @@ -48,6 +48,7 @@ pg_dump \ | sed -E "s/^REVOKE (.+) ON (.+) \"(${EXCLUDED_SCHEMAS:-})\"/-- &/" \ | sed -E 's/^(CREATE EXTENSION IF NOT EXISTS "pg_tle").+/\1;/' \ | sed -E 's/^(CREATE EXTENSION IF NOT EXISTS "pgsodium").+/\1;/' \ +| sed -E 's/^(CREATE EXTENSION IF NOT EXISTS "pgmq").+/\1;/' \ | sed -E 's/^COMMENT ON EXTENSION (.+)/-- &/' \ | sed -E 's/^CREATE POLICY "cron_job_/-- &/' \ | sed -E 's/^ALTER TABLE "cron"/-- &/' \ From 8f3bf1cde284bf594f7e59349bc0a1817ad46400 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 18:06:10 +0800 Subject: [PATCH 17/24] fix(docker): bump the docker-minor group in /pkg/config/templates with 2 updates (#4403) fix(docker): bump the docker-minor group Bumps the docker-minor group in /pkg/config/templates with 2 updates: supabase/edge-runtime and supabase/realtime. Updates `supabase/edge-runtime` from v1.69.18 to v1.69.20 Updates `supabase/realtime` from v2.59.1 to v2.60.0 --- updated-dependencies: - dependency-name: supabase/edge-runtime dependency-version: v1.69.20 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/realtime dependency-version: v2.60.0 dependency-type: direct:production dependency-group: docker-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index 7609b5bed..effee1dc7 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -7,11 +7,11 @@ FROM postgrest/postgrest:v13.0.7 AS postgrest FROM supabase/postgres-meta:v0.93.1 AS pgmeta FROM supabase/studio:2025.11.03-sha-ddedae5 AS studio FROM darthsim/imgproxy:v3.8.0 AS imgproxy -FROM supabase/edge-runtime:v1.69.18 AS edgeruntime +FROM supabase/edge-runtime:v1.69.20 AS edgeruntime FROM timberio/vector:0.28.1-alpine AS vector FROM supabase/supavisor:2.7.4 AS supavisor FROM supabase/gotrue:v2.180.0 AS gotrue -FROM supabase/realtime:v2.59.1 AS realtime +FROM supabase/realtime:v2.60.0 AS realtime FROM supabase/storage-api:v1.28.5 AS storage FROM supabase/logflare:1.23.3 AS logflare # Append to JobImages when adding new dependencies below From 2f211d73352694a1d6548a58d13f662c40711936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cemal=20K=C4=B1l=C4=B1=C3=A7?= Date: Wed, 5 Nov 2025 11:52:11 +0300 Subject: [PATCH 18/24] feat: add configurable JWT issuer for local auth development (#4388) * feat: add configurable JWT issuer for local auth development * fix: set jwt_issuer default during config loading * chore: build verify url from jwt issuer * chore: build redirect uri from issuer url --------- Co-authored-by: Qiao Han --- internal/start/start.go | 12 ++++++------ pkg/config/auth.go | 1 + pkg/config/config.go | 4 ++++ pkg/config/templates/config.toml | 2 ++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/internal/start/start.go b/internal/start/start.go index 22b8fa694..2fadf7e0a 100644 --- a/internal/start/start.go +++ b/internal/start/start.go @@ -482,7 +482,7 @@ EOF "GOTRUE_JWT_DEFAULT_GROUP_NAME=authenticated", fmt.Sprintf("GOTRUE_JWT_EXP=%v", utils.Config.Auth.JwtExpiry), "GOTRUE_JWT_SECRET=" + utils.Config.Auth.JwtSecret.Value, - "GOTRUE_JWT_ISSUER=" + utils.GetApiUrl("/auth/v1"), + "GOTRUE_JWT_ISSUER=" + utils.Config.Auth.JwtIssuer, fmt.Sprintf("GOTRUE_EXTERNAL_EMAIL_ENABLED=%v", utils.Config.Auth.Email.EnableSignup), fmt.Sprintf("GOTRUE_MAILER_SECURE_EMAIL_CHANGE_ENABLED=%v", utils.Config.Auth.Email.DoubleConfirmChanges), @@ -494,10 +494,10 @@ EOF fmt.Sprintf("GOTRUE_SMTP_MAX_FREQUENCY=%v", utils.Config.Auth.Email.MaxFrequency), - "GOTRUE_MAILER_URLPATHS_INVITE=" + utils.GetApiUrl("/auth/v1/verify"), - "GOTRUE_MAILER_URLPATHS_CONFIRMATION=" + utils.GetApiUrl("/auth/v1/verify"), - "GOTRUE_MAILER_URLPATHS_RECOVERY=" + utils.GetApiUrl("/auth/v1/verify"), - "GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE=" + utils.GetApiUrl("/auth/v1/verify"), + fmt.Sprintf("GOTRUE_MAILER_URLPATHS_INVITE=%s/verify", utils.Config.Auth.JwtIssuer), + fmt.Sprintf("GOTRUE_MAILER_URLPATHS_CONFIRMATION=%s/verify", utils.Config.Auth.JwtIssuer), + fmt.Sprintf("GOTRUE_MAILER_URLPATHS_RECOVERY=%s/verify", utils.Config.Auth.JwtIssuer), + fmt.Sprintf("GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE=%s/verify", utils.Config.Auth.JwtIssuer), "GOTRUE_RATE_LIMIT_EMAIL_SENT=360000", fmt.Sprintf("GOTRUE_EXTERNAL_PHONE_ENABLED=%v", utils.Config.Auth.Sms.EnableSignup), @@ -699,7 +699,7 @@ EOF redirectUri := config.RedirectUri if redirectUri == "" { - redirectUri = utils.GetApiUrl("/auth/v1/callback") + redirectUri = utils.Config.Auth.JwtIssuer + "/callback" } env = append(env, fmt.Sprintf("GOTRUE_EXTERNAL_%s_REDIRECT_URI=%s", strings.ToUpper(name), redirectUri)) diff --git a/pkg/config/auth.go b/pkg/config/auth.go index 82fc0eef7..44edb4f50 100644 --- a/pkg/config/auth.go +++ b/pkg/config/auth.go @@ -152,6 +152,7 @@ type ( SiteUrl string `toml:"site_url"` AdditionalRedirectUrls []string `toml:"additional_redirect_urls"` JwtExpiry uint `toml:"jwt_expiry"` + JwtIssuer string `toml:"jwt_issuer"` EnableRefreshTokenRotation bool `toml:"enable_refresh_token_rotation"` RefreshTokenReuseInterval uint `toml:"refresh_token_reuse_interval"` EnableManualLinking bool `toml:"enable_manual_linking"` diff --git a/pkg/config/config.go b/pkg/config/config.go index 531bc3dea..e3ca3fc29 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -583,6 +583,10 @@ func (c *config) Load(path string, fsys fs.FS, overrides ...ConfigEditor) error } c.Api.ExternalUrl = apiUrl.String() } + // Set default JWT issuer if not configured + if len(c.Auth.JwtIssuer) == 0 { + c.Auth.JwtIssuer = c.Api.ExternalUrl + "/auth/v1" + } // Update image versions switch c.Db.MajorVersion { case 13: diff --git a/pkg/config/templates/config.toml b/pkg/config/templates/config.toml index ebdb83103..47d44d3c7 100644 --- a/pkg/config/templates/config.toml +++ b/pkg/config/templates/config.toml @@ -125,6 +125,8 @@ site_url = "http://127.0.0.1:3000" additional_redirect_urls = ["https://127.0.0.1:3000"] # How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 (1 week). jwt_expiry = 3600 +# JWT issuer URL. If not set, defaults to the local API URL (http://127.0.0.1:/auth/v1). +# jwt_issuer = "" # Path to JWT signing key. DO NOT commit your signing keys file to git. # signing_keys_path = "./signing_keys.json" # If disabled, the refresh token will never expire. From 47917e0f65d64d3ad11a7ac8a1c23909446e647d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Nov 2025 19:35:54 +0800 Subject: [PATCH 19/24] fix(docker): bump the docker-minor group in /pkg/config/templates with 4 updates (#4408) * fix(docker): bump the docker-minor group Bumps the docker-minor group in /pkg/config/templates with 4 updates: supabase/edge-runtime, supabase/gotrue, supabase/realtime and supabase/logflare. Updates `supabase/edge-runtime` from v1.69.20 to v1.69.21 Updates `supabase/gotrue` from v2.180.0 to v2.181.0 Updates `supabase/realtime` from v2.60.0 to v2.61.0 Updates `supabase/logflare` from 1.23.3 to 1.24.0 --- updated-dependencies: - dependency-name: supabase/edge-runtime dependency-version: v1.69.21 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/gotrue dependency-version: v2.181.0 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/realtime dependency-version: v2.61.0 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/logflare dependency-version: 1.24.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: docker-minor ... Signed-off-by: dependabot[bot] * Update logflare image version in Dockerfile --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Han Qiao --- pkg/config/templates/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index effee1dc7..5cc685303 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -7,13 +7,13 @@ FROM postgrest/postgrest:v13.0.7 AS postgrest FROM supabase/postgres-meta:v0.93.1 AS pgmeta FROM supabase/studio:2025.11.03-sha-ddedae5 AS studio FROM darthsim/imgproxy:v3.8.0 AS imgproxy -FROM supabase/edge-runtime:v1.69.20 AS edgeruntime +FROM supabase/edge-runtime:v1.69.21 AS edgeruntime FROM timberio/vector:0.28.1-alpine AS vector FROM supabase/supavisor:2.7.4 AS supavisor -FROM supabase/gotrue:v2.180.0 AS gotrue -FROM supabase/realtime:v2.60.0 AS realtime +FROM supabase/gotrue:v2.181.0 AS gotrue +FROM supabase/realtime:v2.61.0 AS realtime FROM supabase/storage-api:v1.28.5 AS storage -FROM supabase/logflare:1.23.3 AS logflare +FROM supabase/logflare:1.22.6 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 From 4054f205d853430847b280139c50bdd7089cb551 Mon Sep 17 00:00:00 2001 From: issuedat <165281975+issuedat@users.noreply.github.com> Date: Wed, 5 Nov 2025 06:43:03 -0500 Subject: [PATCH 20/24] feat(auth): add support for managing auth notification templates (#4400) * feat(auth): add support for managing auth notification templates * chore: use `notification_template` as entity type * chore: shorten config name and update unit test * chore: update example config file * chore: update unit test * chore: ignore content of disabled notification --------- Co-authored-by: Qiao Han --- pkg/config/auth.go | 495 +++++++++++++----- pkg/config/auth_test.go | 163 ++++++ pkg/config/config.go | 31 +- pkg/config/templates/config.toml | 6 + .../local_disabled_remote_enabled.diff | 35 +- .../local_enabled_remote_disabled.diff | 39 +- pkg/config/testdata/config.toml | 6 + 7 files changed, 629 insertions(+), 146 deletions(-) diff --git a/pkg/config/auth.go b/pkg/config/auth.go index 44edb4f50..56288b882 100644 --- a/pkg/config/auth.go +++ b/pkg/config/auth.go @@ -242,6 +242,7 @@ type ( EnableConfirmations bool `toml:"enable_confirmations"` SecurePasswordChange bool `toml:"secure_password_change"` Template map[string]emailTemplate `toml:"template"` + Notification map[string]notification `toml:"notification"` Smtp *smtp `toml:"smtp"` MaxFrequency time.Duration `toml:"max_frequency"` OtpLength uint `toml:"otp_length"` @@ -265,6 +266,11 @@ type ( ContentPath string `toml:"content_path"` } + notification struct { + Enabled bool `toml:"enabled"` + emailTemplate + } + sms struct { EnableSignup bool `toml:"enable_signup"` EnableConfirmations bool `toml:"enable_confirmations"` @@ -644,167 +650,374 @@ func (e email) toAuthConfigBody(body *v1API.UpdateAuthConfigBody) { if e.Smtp != nil { e.Smtp.toAuthConfigBody(body) } - if len(e.Template) == 0 { - return - } - var tmpl *emailTemplate - tmpl = cast.Ptr(e.Template["invite"]) - if tmpl.Subject != nil { - body.MailerSubjectsInvite = nullable.NewNullableWithValue(*tmpl.Subject) - } - if tmpl.Content != nil { - body.MailerTemplatesInviteContent = nullable.NewNullableWithValue(*tmpl.Content) - } - tmpl = cast.Ptr(e.Template["confirmation"]) - if tmpl.Subject != nil { - body.MailerSubjectsConfirmation = nullable.NewNullableWithValue(*tmpl.Subject) - } - if tmpl.Content != nil { - body.MailerTemplatesConfirmationContent = nullable.NewNullableWithValue(*tmpl.Content) - } - tmpl = cast.Ptr(e.Template["recovery"]) - if tmpl.Subject != nil { - body.MailerSubjectsRecovery = nullable.NewNullableWithValue(*tmpl.Subject) - } - if tmpl.Content != nil { - body.MailerTemplatesRecoveryContent = nullable.NewNullableWithValue(*tmpl.Content) - } - tmpl = cast.Ptr(e.Template["magic_link"]) - if tmpl.Subject != nil { - body.MailerSubjectsMagicLink = nullable.NewNullableWithValue(*tmpl.Subject) - } - if tmpl.Content != nil { - body.MailerTemplatesMagicLinkContent = nullable.NewNullableWithValue(*tmpl.Content) - } - tmpl = cast.Ptr(e.Template["email_change"]) - if tmpl.Subject != nil { - body.MailerSubjectsEmailChange = nullable.NewNullableWithValue(*tmpl.Subject) - } - if tmpl.Content != nil { - body.MailerTemplatesEmailChangeContent = nullable.NewNullableWithValue(*tmpl.Content) - } - tmpl = cast.Ptr(e.Template["reauthentication"]) - if tmpl.Subject != nil { - body.MailerSubjectsReauthentication = nullable.NewNullableWithValue(*tmpl.Subject) - } - if tmpl.Content != nil { - body.MailerTemplatesReauthenticationContent = nullable.NewNullableWithValue(*tmpl.Content) - } -} - -func (e *email) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { - e.EnableSignup = ValOrDefault(remoteConfig.ExternalEmailEnabled, false) - e.DoubleConfirmChanges = ValOrDefault(remoteConfig.MailerSecureEmailChangeEnabled, false) - e.EnableConfirmations = !ValOrDefault(remoteConfig.MailerAutoconfirm, false) - e.OtpLength = cast.IntToUint(ValOrDefault(remoteConfig.MailerOtpLength, 0)) - e.OtpExpiry = cast.IntToUint(remoteConfig.MailerOtpExp) - e.SecurePasswordChange = ValOrDefault(remoteConfig.SecurityUpdatePasswordRequireReauthentication, false) - e.MaxFrequency = time.Duration(ValOrDefault(remoteConfig.SmtpMaxFrequency, 0)) * time.Second - e.Smtp.fromAuthConfig(remoteConfig) - if len(e.Template) == 0 { - return - } - if t, ok := e.Template["invite"]; ok { - if t.Subject != nil { - if value, err := remoteConfig.MailerSubjectsInvite.Get(); err == nil { - t.Subject = &value - } else { - t.Subject = nil - } + if len(e.Template) > 0 { + var tmpl *emailTemplate + tmpl = cast.Ptr(e.Template["invite"]) + if tmpl.Subject != nil { + body.MailerSubjectsInvite = nullable.NewNullableWithValue(*tmpl.Subject) } - if t.Content != nil { - if value, err := remoteConfig.MailerTemplatesInviteContent.Get(); err == nil { - t.Content = &value - } else { - t.Content = nil - } + if tmpl.Content != nil { + body.MailerTemplatesInviteContent = nullable.NewNullableWithValue(*tmpl.Content) } - e.Template["invite"] = t - } - if t, ok := e.Template["confirmation"]; ok { - if t.Subject != nil { - if value, err := remoteConfig.MailerSubjectsConfirmation.Get(); err == nil { - t.Subject = &value - } else { - t.Subject = nil - } + tmpl = cast.Ptr(e.Template["confirmation"]) + if tmpl.Subject != nil { + body.MailerSubjectsConfirmation = nullable.NewNullableWithValue(*tmpl.Subject) } - if t.Content != nil { - if value, err := remoteConfig.MailerTemplatesConfirmationContent.Get(); err == nil { - t.Content = &value - } else { - t.Content = nil - } + if tmpl.Content != nil { + body.MailerTemplatesConfirmationContent = nullable.NewNullableWithValue(*tmpl.Content) + } + tmpl = cast.Ptr(e.Template["recovery"]) + if tmpl.Subject != nil { + body.MailerSubjectsRecovery = nullable.NewNullableWithValue(*tmpl.Subject) + } + if tmpl.Content != nil { + body.MailerTemplatesRecoveryContent = nullable.NewNullableWithValue(*tmpl.Content) + } + tmpl = cast.Ptr(e.Template["magic_link"]) + if tmpl.Subject != nil { + body.MailerSubjectsMagicLink = nullable.NewNullableWithValue(*tmpl.Subject) + } + if tmpl.Content != nil { + body.MailerTemplatesMagicLinkContent = nullable.NewNullableWithValue(*tmpl.Content) + } + tmpl = cast.Ptr(e.Template["email_change"]) + if tmpl.Subject != nil { + body.MailerSubjectsEmailChange = nullable.NewNullableWithValue(*tmpl.Subject) + } + if tmpl.Content != nil { + body.MailerTemplatesEmailChangeContent = nullable.NewNullableWithValue(*tmpl.Content) + } + tmpl = cast.Ptr(e.Template["reauthentication"]) + if tmpl.Subject != nil { + body.MailerSubjectsReauthentication = nullable.NewNullableWithValue(*tmpl.Subject) + } + if tmpl.Content != nil { + body.MailerTemplatesReauthenticationContent = nullable.NewNullableWithValue(*tmpl.Content) } - e.Template["confirmation"] = t } - if t, ok := e.Template["recovery"]; ok { - if t.Subject != nil { - if value, err := remoteConfig.MailerSubjectsRecovery.Get(); err == nil { - t.Subject = &value - } else { - t.Subject = nil + // Notifications + if len(e.Notification) > 0 { + if n, ok := e.Notification["password_changed"]; ok { + body.MailerNotificationsPasswordChangedEnabled = nullable.NewNullableWithValue(n.Enabled) + if n.Subject != nil { + body.MailerSubjectsPasswordChangedNotification = nullable.NewNullableWithValue(*n.Subject) } - } - if t.Content != nil { - if value, err := remoteConfig.MailerTemplatesRecoveryContent.Get(); err == nil { - t.Content = &value - } else { - t.Content = nil + if n.Content != nil { + body.MailerTemplatesPasswordChangedNotificationContent = nullable.NewNullableWithValue(*n.Content) } } - e.Template["recovery"] = t - } - if t, ok := e.Template["magic_link"]; ok { - if t.Subject != nil { - if value, err := remoteConfig.MailerSubjectsMagicLink.Get(); err == nil { - t.Subject = &value - } else { - t.Subject = nil + if n, ok := e.Notification["email_changed"]; ok { + body.MailerNotificationsEmailChangedEnabled = nullable.NewNullableWithValue(n.Enabled) + if n.Subject != nil { + body.MailerSubjectsEmailChangedNotification = nullable.NewNullableWithValue(*n.Subject) + } + if n.Content != nil { + body.MailerTemplatesEmailChangedNotificationContent = nullable.NewNullableWithValue(*n.Content) } } - if t.Content != nil { - if value, err := remoteConfig.MailerTemplatesMagicLinkContent.Get(); err == nil { - t.Content = &value - } else { - t.Content = nil + if n, ok := e.Notification["phone_changed"]; ok { + body.MailerNotificationsPhoneChangedEnabled = nullable.NewNullableWithValue(n.Enabled) + if n.Subject != nil { + body.MailerSubjectsPhoneChangedNotification = nullable.NewNullableWithValue(*n.Subject) + } + if n.Content != nil { + body.MailerTemplatesPhoneChangedNotificationContent = nullable.NewNullableWithValue(*n.Content) } } - e.Template["magic_link"] = t - } - if t, ok := e.Template["email_change"]; ok { - if t.Subject != nil { - if value, err := remoteConfig.MailerSubjectsEmailChange.Get(); err == nil { - t.Subject = &value - } else { - t.Subject = nil + if n, ok := e.Notification["identity_linked"]; ok { + body.MailerNotificationsIdentityLinkedEnabled = nullable.NewNullableWithValue(n.Enabled) + if n.Subject != nil { + body.MailerSubjectsIdentityLinkedNotification = nullable.NewNullableWithValue(*n.Subject) + } + if n.Content != nil { + body.MailerTemplatesIdentityLinkedNotificationContent = nullable.NewNullableWithValue(*n.Content) } } - if t.Content != nil { - if value, err := remoteConfig.MailerTemplatesEmailChangeContent.Get(); err == nil { - t.Content = &value - } else { - t.Content = nil + if n, ok := e.Notification["identity_unlinked"]; ok { + body.MailerNotificationsIdentityUnlinkedEnabled = nullable.NewNullableWithValue(n.Enabled) + if n.Subject != nil { + body.MailerSubjectsIdentityUnlinkedNotification = nullable.NewNullableWithValue(*n.Subject) + } + if n.Content != nil { + body.MailerTemplatesIdentityUnlinkedNotificationContent = nullable.NewNullableWithValue(*n.Content) } } - e.Template["email_change"] = t - } - if t, ok := e.Template["reauthentication"]; ok { - if t.Subject != nil { - if value, err := remoteConfig.MailerSubjectsReauthentication.Get(); err == nil { - t.Subject = &value - } else { - t.Subject = nil + if n, ok := e.Notification["mfa_factor_enrolled"]; ok { + body.MailerNotificationsMfaFactorEnrolledEnabled = nullable.NewNullableWithValue(n.Enabled) + if n.Subject != nil { + body.MailerSubjectsMfaFactorEnrolledNotification = nullable.NewNullableWithValue(*n.Subject) + } + if n.Content != nil { + body.MailerTemplatesMfaFactorEnrolledNotificationContent = nullable.NewNullableWithValue(*n.Content) } } - if t.Content != nil { - if value, err := remoteConfig.MailerTemplatesReauthenticationContent.Get(); err == nil { - t.Content = &value - } else { - t.Content = nil + if n, ok := e.Notification["mfa_factor_unenrolled"]; ok { + body.MailerNotificationsMfaFactorUnenrolledEnabled = nullable.NewNullableWithValue(n.Enabled) + if n.Subject != nil { + body.MailerSubjectsMfaFactorUnenrolledNotification = nullable.NewNullableWithValue(*n.Subject) } + if n.Content != nil { + body.MailerTemplatesMfaFactorUnenrolledNotificationContent = nullable.NewNullableWithValue(*n.Content) + } + } + } +} + +func (e *email) fromAuthConfig(remoteConfig v1API.AuthConfigResponse) { + e.EnableSignup = ValOrDefault(remoteConfig.ExternalEmailEnabled, false) + e.DoubleConfirmChanges = ValOrDefault(remoteConfig.MailerSecureEmailChangeEnabled, false) + e.EnableConfirmations = !ValOrDefault(remoteConfig.MailerAutoconfirm, false) + e.OtpLength = cast.IntToUint(ValOrDefault(remoteConfig.MailerOtpLength, 0)) + e.OtpExpiry = cast.IntToUint(remoteConfig.MailerOtpExp) + e.SecurePasswordChange = ValOrDefault(remoteConfig.SecurityUpdatePasswordRequireReauthentication, false) + e.MaxFrequency = time.Duration(ValOrDefault(remoteConfig.SmtpMaxFrequency, 0)) * time.Second + e.Smtp.fromAuthConfig(remoteConfig) + if len(e.Template) > 0 { + if t, ok := e.Template["invite"]; ok { + if t.Subject != nil { + if value, err := remoteConfig.MailerSubjectsInvite.Get(); err == nil { + t.Subject = &value + } else { + t.Subject = nil + } + } + if t.Content != nil { + if value, err := remoteConfig.MailerTemplatesInviteContent.Get(); err == nil { + t.Content = &value + } else { + t.Content = nil + } + } + e.Template["invite"] = t + } + if t, ok := e.Template["confirmation"]; ok { + if t.Subject != nil { + if value, err := remoteConfig.MailerSubjectsConfirmation.Get(); err == nil { + t.Subject = &value + } else { + t.Subject = nil + } + } + if t.Content != nil { + if value, err := remoteConfig.MailerTemplatesConfirmationContent.Get(); err == nil { + t.Content = &value + } else { + t.Content = nil + } + } + e.Template["confirmation"] = t + } + if t, ok := e.Template["recovery"]; ok { + if t.Subject != nil { + if value, err := remoteConfig.MailerSubjectsRecovery.Get(); err == nil { + t.Subject = &value + } else { + t.Subject = nil + } + } + if t.Content != nil { + if value, err := remoteConfig.MailerTemplatesRecoveryContent.Get(); err == nil { + t.Content = &value + } else { + t.Content = nil + } + } + e.Template["recovery"] = t + } + if t, ok := e.Template["magic_link"]; ok { + if t.Subject != nil { + if value, err := remoteConfig.MailerSubjectsMagicLink.Get(); err == nil { + t.Subject = &value + } else { + t.Subject = nil + } + } + if t.Content != nil { + if value, err := remoteConfig.MailerTemplatesMagicLinkContent.Get(); err == nil { + t.Content = &value + } else { + t.Content = nil + } + } + e.Template["magic_link"] = t + } + if t, ok := e.Template["email_change"]; ok { + if t.Subject != nil { + if value, err := remoteConfig.MailerSubjectsEmailChange.Get(); err == nil { + t.Subject = &value + } else { + t.Subject = nil + } + } + if t.Content != nil { + if value, err := remoteConfig.MailerTemplatesEmailChangeContent.Get(); err == nil { + t.Content = &value + } else { + t.Content = nil + } + } + e.Template["email_change"] = t + } + if t, ok := e.Template["reauthentication"]; ok { + if t.Subject != nil { + if value, err := remoteConfig.MailerSubjectsReauthentication.Get(); err == nil { + t.Subject = &value + } else { + t.Subject = nil + } + } + if t.Content != nil { + if value, err := remoteConfig.MailerTemplatesReauthenticationContent.Get(); err == nil { + t.Content = &value + } else { + t.Content = nil + } + } + e.Template["reauthentication"] = t + } + } + // Notifications + if len(e.Notification) > 0 { + if n, ok := e.Notification["password_changed"]; ok { + if value, err := remoteConfig.MailerNotificationsPasswordChangedEnabled.Get(); err == nil { + n.Enabled = value + } + if n.Subject != nil { + if value, err := remoteConfig.MailerSubjectsPasswordChangedNotification.Get(); err == nil { + n.Subject = &value + } else { + n.Subject = nil + } + } + if n.Content != nil { + if value, err := remoteConfig.MailerTemplatesPasswordChangedNotificationContent.Get(); err == nil { + n.Content = &value + } else { + n.Content = nil + } + } + e.Notification["password_changed"] = n + } + if n, ok := e.Notification["email_changed"]; ok { + if value, err := remoteConfig.MailerNotificationsEmailChangedEnabled.Get(); err == nil { + n.Enabled = value + } + if n.Subject != nil { + if value, err := remoteConfig.MailerSubjectsEmailChangedNotification.Get(); err == nil { + n.Subject = &value + } else { + n.Subject = nil + } + } + if n.Content != nil { + if value, err := remoteConfig.MailerTemplatesEmailChangedNotificationContent.Get(); err == nil { + n.Content = &value + } else { + n.Content = nil + } + } + e.Notification["email_changed"] = n + } + if n, ok := e.Notification["phone_changed"]; ok { + if value, err := remoteConfig.MailerNotificationsPhoneChangedEnabled.Get(); err == nil { + n.Enabled = value + } + if n.Subject != nil { + if value, err := remoteConfig.MailerSubjectsPhoneChangedNotification.Get(); err == nil { + n.Subject = &value + } else { + n.Subject = nil + } + } + if n.Content != nil { + if value, err := remoteConfig.MailerTemplatesPhoneChangedNotificationContent.Get(); err == nil { + n.Content = &value + } else { + n.Content = nil + } + } + e.Notification["phone_changed"] = n + } + if n, ok := e.Notification["identity_linked"]; ok { + if value, err := remoteConfig.MailerNotificationsIdentityLinkedEnabled.Get(); err == nil { + n.Enabled = value + } + if n.Subject != nil { + if value, err := remoteConfig.MailerSubjectsIdentityLinkedNotification.Get(); err == nil { + n.Subject = &value + } else { + n.Subject = nil + } + } + if n.Content != nil { + if value, err := remoteConfig.MailerTemplatesIdentityLinkedNotificationContent.Get(); err == nil { + n.Content = &value + } else { + n.Content = nil + } + } + e.Notification["identity_linked"] = n + } + if n, ok := e.Notification["identity_unlinked"]; ok { + if value, err := remoteConfig.MailerNotificationsIdentityUnlinkedEnabled.Get(); err == nil { + n.Enabled = value + } + if n.Subject != nil { + if value, err := remoteConfig.MailerSubjectsIdentityUnlinkedNotification.Get(); err == nil { + n.Subject = &value + } else { + n.Subject = nil + } + } + if n.Content != nil { + if value, err := remoteConfig.MailerTemplatesIdentityUnlinkedNotificationContent.Get(); err == nil { + n.Content = &value + } else { + n.Content = nil + } + } + e.Notification["identity_unlinked"] = n + } + if n, ok := e.Notification["mfa_factor_enrolled"]; ok { + if value, err := remoteConfig.MailerNotificationsMfaFactorEnrolledEnabled.Get(); err == nil { + n.Enabled = value + } + if n.Subject != nil { + if value, err := remoteConfig.MailerSubjectsMfaFactorEnrolledNotification.Get(); err == nil { + n.Subject = &value + } else { + n.Subject = nil + } + } + if n.Content != nil { + if value, err := remoteConfig.MailerTemplatesMfaFactorEnrolledNotificationContent.Get(); err == nil { + n.Content = &value + } else { + n.Content = nil + } + } + e.Notification["mfa_factor_enrolled"] = n + } + if n, ok := e.Notification["mfa_factor_unenrolled"]; ok { + if value, err := remoteConfig.MailerNotificationsMfaFactorUnenrolledEnabled.Get(); err == nil { + n.Enabled = value + } + if n.Subject != nil { + if value, err := remoteConfig.MailerSubjectsMfaFactorUnenrolledNotification.Get(); err == nil { + n.Subject = &value + } else { + n.Subject = nil + } + } + if n.Content != nil { + if value, err := remoteConfig.MailerTemplatesMfaFactorUnenrolledNotificationContent.Get(); err == nil { + n.Content = &value + } else { + n.Content = nil + } + } + e.Notification["mfa_factor_unenrolled"] = n } - e.Template["reauthentication"] = t } } diff --git a/pkg/config/auth_test.go b/pkg/config/auth_test.go index 8ec52f0fa..0d04c7609 100644 --- a/pkg/config/auth_test.go +++ b/pkg/config/auth_test.go @@ -552,6 +552,57 @@ func TestEmailDiff(t *testing.T) { Content: cast.Ptr("reauthentication-content"), }, }, + Notification: map[string]notification{ + "password_changed": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("password-changed-subject"), + Content: cast.Ptr("password-changed-content"), + }, + }, + "email_changed": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("email-changed-subject"), + Content: cast.Ptr("email-changed-content"), + }, + }, + "phone_changed": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("phone-changed-subject"), + Content: cast.Ptr("phone-changed-content"), + }, + }, + "identity_linked": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("identity-linked-subject"), + Content: cast.Ptr("identity-linked-content"), + }, + }, + "identity_unlinked": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("identity-unlinked-subject"), + Content: cast.Ptr("identity-unlinked-content"), + }, + }, + "mfa_factor_enrolled": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("mfa-enrolled-subject"), + Content: cast.Ptr("mfa-enrolled-content"), + }, + }, + "mfa_factor_unenrolled": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("mfa-unenrolled-subject"), + Content: cast.Ptr("mfa-unenrolled-content"), + }, + }, + }, Smtp: &smtp{ Enabled: true, Host: "smtp.sendgrid.net", @@ -596,6 +647,28 @@ func TestEmailDiff(t *testing.T) { MailerTemplatesEmailChangeContent: nullable.NewNullableWithValue("email-change-content"), MailerSubjectsReauthentication: nullable.NewNullableWithValue("reauthentication-subject"), MailerTemplatesReauthenticationContent: nullable.NewNullableWithValue("reauthentication-content"), + // Notifications + MailerNotificationsPasswordChangedEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsPasswordChangedNotification: nullable.NewNullableWithValue("password-changed-subject"), + MailerTemplatesPasswordChangedNotificationContent: nullable.NewNullableWithValue("password-changed-content"), + MailerNotificationsEmailChangedEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsEmailChangedNotification: nullable.NewNullableWithValue("email-changed-subject"), + MailerTemplatesEmailChangedNotificationContent: nullable.NewNullableWithValue("email-changed-content"), + MailerNotificationsPhoneChangedEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsPhoneChangedNotification: nullable.NewNullableWithValue("phone-changed-subject"), + MailerTemplatesPhoneChangedNotificationContent: nullable.NewNullableWithValue("phone-changed-content"), + MailerNotificationsIdentityLinkedEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsIdentityLinkedNotification: nullable.NewNullableWithValue("identity-linked-subject"), + MailerTemplatesIdentityLinkedNotificationContent: nullable.NewNullableWithValue("identity-linked-content"), + MailerNotificationsIdentityUnlinkedEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsIdentityUnlinkedNotification: nullable.NewNullableWithValue("identity-unlinked-subject"), + MailerTemplatesIdentityUnlinkedNotificationContent: nullable.NewNullableWithValue("identity-unlinked-content"), + MailerNotificationsMfaFactorEnrolledEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsMfaFactorEnrolledNotification: nullable.NewNullableWithValue("mfa-enrolled-subject"), + MailerTemplatesMfaFactorEnrolledNotificationContent: nullable.NewNullableWithValue("mfa-enrolled-content"), + MailerNotificationsMfaFactorUnenrolledEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsMfaFactorUnenrolledNotification: nullable.NewNullableWithValue("mfa-unenrolled-subject"), + MailerTemplatesMfaFactorUnenrolledNotificationContent: nullable.NewNullableWithValue("mfa-unenrolled-content"), }) // Check error assert.NoError(t, err) @@ -633,6 +706,45 @@ func TestEmailDiff(t *testing.T) { Content: cast.Ptr(""), }, }, + Notification: map[string]notification{ + "password_changed": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("password-changed-subject"), + Content: cast.Ptr("password-changed-content"), + }, + }, + "email_changed": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("email-changed-subject"), + Content: cast.Ptr("email-changed-content"), + }, + }, + "phone_changed": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("phone-changed-subject"), + Content: cast.Ptr("phone-changed-content"), + }, + }, + "identity_linked": { + Enabled: true, + emailTemplate: emailTemplate{ + Subject: cast.Ptr("identity-linked-subject"), + Content: cast.Ptr("identity-linked-content"), + }, + }, + "identity_unlinked": { + Enabled: true, + }, + "mfa_factor_enrolled": { + Enabled: true, + }, + "mfa_factor_unenrolled": { + Enabled: true, + }, + }, Smtp: &smtp{ Enabled: true, Host: "smtp.sendgrid.net", @@ -663,6 +775,21 @@ func TestEmailDiff(t *testing.T) { MailerSubjectsRecovery: nullable.NewNullableWithValue("recovery-subject"), MailerSubjectsMagicLink: nullable.NewNullableWithValue("magic-link-subject"), MailerTemplatesEmailChangeContent: nullable.NewNullableWithValue("email-change-content"), + // Notifications + MailerNotificationsPasswordChangedEnabled: nullable.NewNullableWithValue(false), + MailerSubjectsPasswordChangedNotification: nullable.NewNullableWithValue("password-changed-subject"), + MailerTemplatesPasswordChangedNotificationContent: nullable.NewNullableWithValue("password-changed-content"), + MailerNotificationsEmailChangedEnabled: nullable.NewNullableWithValue(false), + MailerSubjectsEmailChangedNotification: nullable.NewNullableWithValue("email-changed-subject"), + MailerNotificationsPhoneChangedEnabled: nullable.NewNullableWithValue(false), + MailerTemplatesPhoneChangedNotificationContent: nullable.NewNullableWithValue("phone-changed-content"), + MailerNotificationsIdentityLinkedEnabled: nullable.NewNullableWithValue(false), + MailerNotificationsIdentityUnlinkedEnabled: nullable.NewNullableWithValue(false), + MailerSubjectsIdentityUnlinkedNotification: nullable.NewNullableWithValue("identity-unlinked-subject"), + MailerTemplatesIdentityUnlinkedNotificationContent: nullable.NewNullableWithValue("identity-unlinked-content"), + MailerNotificationsMfaFactorEnrolledEnabled: nullable.NewNullableWithValue(false), + MailerSubjectsMfaFactorEnrolledNotification: nullable.NewNullableWithValue("mfa-enrolled-subject"), + MailerNotificationsMfaFactorUnenrolledEnabled: nullable.NewNullableWithValue(false), }) // Check error assert.NoError(t, err) @@ -681,6 +808,15 @@ func TestEmailDiff(t *testing.T) { "email_change": {}, "reauthentication": {}, }, + Notification: map[string]notification{ + "password_changed": {}, + "email_changed": {}, + "phone_changed": {}, + "identity_linked": {}, + "identity_unlinked": {}, + "mfa_factor_enrolled": {}, + "mfa_factor_unenrolled": {}, + }, MaxFrequency: time.Minute, OtpLength: 8, OtpExpiry: 86400, @@ -713,6 +849,24 @@ func TestEmailDiff(t *testing.T) { MailerTemplatesEmailChangeContent: nullable.NewNullableWithValue("email-change-content"), MailerSubjectsReauthentication: nullable.NewNullableWithValue("reauthentication-subject"), MailerTemplatesReauthenticationContent: nullable.NewNullableWithValue("reauthentication-content"), + // Notifications + MailerNotificationsPasswordChangedEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsPasswordChangedNotification: nullable.NewNullableWithValue("password-changed-subject"), + MailerTemplatesPasswordChangedNotificationContent: nullable.NewNullableWithValue("password-changed-content"), + MailerNotificationsEmailChangedEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsEmailChangedNotification: nullable.NewNullableWithValue("email-changed-subject"), + MailerNotificationsPhoneChangedEnabled: nullable.NewNullableWithValue(true), + MailerTemplatesPhoneChangedNotificationContent: nullable.NewNullableWithValue("phone-changed-content"), + MailerNotificationsIdentityLinkedEnabled: nullable.NewNullableWithValue(true), + MailerNotificationsIdentityUnlinkedEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsIdentityUnlinkedNotification: nullable.NewNullableWithValue("identity-unlinked-subject"), + MailerTemplatesIdentityUnlinkedNotificationContent: nullable.NewNullableWithValue("identity-unlinked-content"), + MailerNotificationsMfaFactorEnrolledEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsMfaFactorEnrolledNotification: nullable.NewNullableWithValue("mfa-enrolled-subject"), + MailerTemplatesMfaFactorEnrolledNotificationContent: nullable.NewNullableWithValue("mfa-enrolled-content"), + MailerNotificationsMfaFactorUnenrolledEnabled: nullable.NewNullableWithValue(true), + MailerSubjectsMfaFactorUnenrolledNotification: nullable.NewNullableWithValue("mfa-unenrolled-subject"), + MailerTemplatesMfaFactorUnenrolledNotificationContent: nullable.NewNullableWithValue("mfa-unenrolled-content"), }) // Check error assert.NoError(t, err) @@ -731,6 +885,15 @@ func TestEmailDiff(t *testing.T) { "email_change": {}, "reauthentication": {}, }, + Notification: map[string]notification{ + "password_changed": {}, + "email_changed": {}, + "phone_changed": {}, + "identity_linked": {}, + "identity_unlinked": {}, + "mfa_factor_enrolled": {}, + "mfa_factor_unenrolled": {}, + }, Smtp: &smtp{ Enabled: false, Host: "smtp.sendgrid.net", diff --git a/pkg/config/config.go b/pkg/config/config.go index e3ca3fc29..0a6945d78 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -259,6 +259,7 @@ func (a *auth) Clone() auth { copy.Email.Smtp = &mailer } copy.Email.Template = maps.Clone(a.Email.Template) + copy.Email.Notification = maps.Clone(a.Email.Notification) if a.Hook.MFAVerificationAttempt != nil { hook := *a.Hook.MFAVerificationAttempt copy.Hook.MFAVerificationAttempt = &hook @@ -372,7 +373,8 @@ func NewConfig(editors ...ConfigEditor) config { Auth: auth{ Image: Images.Gotrue, Email: email{ - Template: map[string]emailTemplate{}, + Template: map[string]emailTemplate{}, + Notification: map[string]notification{}, }, Sms: sms{ TestOTP: map[string]string{}, @@ -673,6 +675,12 @@ func (c *baseConfig) resolve(builder pathBuilder, fsys fs.FS) error { } c.Auth.Email.Template[name] = tmpl } + for name, tmpl := range c.Auth.Email.Notification { + if len(tmpl.ContentPath) > 0 && !filepath.IsAbs(tmpl.ContentPath) { + tmpl.ContentPath = filepath.Join(builder.SupabaseDirPath, tmpl.ContentPath) + } + c.Auth.Email.Notification[name] = tmpl + } // Update fallback configs for name, bucket := range c.Storage.Buckets { if bucket.FileSizeLimit == 0 { @@ -1026,17 +1034,34 @@ func (e *email) validate(fsys fs.FS) (err error) { for name, tmpl := range e.Template { if len(tmpl.ContentPath) == 0 { if tmpl.Content != nil { - return errors.Errorf("Invalid config for auth.email.%s.content: please use content_path instead", name) + return errors.Errorf("Invalid config for auth.email.template.%s.content: please use content_path instead", name) } continue } if content, err := fs.ReadFile(fsys, tmpl.ContentPath); err != nil { - return errors.Errorf("Invalid config for auth.email.%s.content_path: %w", name, err) + return errors.Errorf("Invalid config for auth.email.template.%s.content_path: %w", name, err) } else { tmpl.Content = cast.Ptr(string(content)) } e.Template[name] = tmpl } + for name, tmpl := range e.Notification { + if !tmpl.Enabled { + continue + } + if len(tmpl.ContentPath) == 0 { + if tmpl.Content != nil { + return errors.Errorf("Invalid config for auth.email.notification.%s.content: please use content_path instead", name) + } + continue + } + if content, err := fs.ReadFile(fsys, tmpl.ContentPath); err != nil { + return errors.Errorf("Invalid config for auth.email.notification.%s.content_path: %w", name, err) + } else { + tmpl.Content = cast.Ptr(string(content)) + } + e.Notification[name] = tmpl + } if e.Smtp != nil && e.Smtp.Enabled { if len(e.Smtp.Host) == 0 { return errors.New("Missing required field in config: auth.email.smtp.host") diff --git a/pkg/config/templates/config.toml b/pkg/config/templates/config.toml index 47d44d3c7..134be6085 100644 --- a/pkg/config/templates/config.toml +++ b/pkg/config/templates/config.toml @@ -200,6 +200,12 @@ otp_expiry = 3600 # subject = "You have been invited" # content_path = "./supabase/templates/invite.html" +# Uncomment to customize notification email template +# [auth.email.notification.password_changed] +# enabled = true +# subject = "Your password has been changed" +# content_path = "./templates/password_changed_notification.html" + [auth.sms] # Allow/disallow new user signups via SMS to your project. enable_signup = false diff --git a/pkg/config/testdata/TestEmailDiff/local_disabled_remote_enabled.diff b/pkg/config/testdata/TestEmailDiff/local_disabled_remote_enabled.diff index 42105313b..430759247 100644 --- a/pkg/config/testdata/TestEmailDiff/local_disabled_remote_enabled.diff +++ b/pkg/config/testdata/TestEmailDiff/local_disabled_remote_enabled.diff @@ -1,7 +1,7 @@ diff remote[auth] local[auth] --- remote[auth] +++ local[auth] -@@ -44,13 +44,13 @@ +@@ -47,13 +47,13 @@ inactivity_timeout = "0s" [email] @@ -22,3 +22,36 @@ diff remote[auth] local[auth] [email.template] [email.template.confirmation] content_path = "" +@@ -69,25 +69,25 @@ + content_path = "" + [email.notification] + [email.notification.email_changed] +-enabled = true ++enabled = false + content_path = "" + [email.notification.identity_linked] +-enabled = true ++enabled = false + content_path = "" + [email.notification.identity_unlinked] +-enabled = true ++enabled = false + content_path = "" + [email.notification.mfa_factor_enrolled] +-enabled = true ++enabled = false + content_path = "" + [email.notification.mfa_factor_unenrolled] +-enabled = true ++enabled = false + content_path = "" + [email.notification.password_changed] +-enabled = true ++enabled = false + content_path = "" + [email.notification.phone_changed] +-enabled = true ++enabled = false + content_path = "" + + [sms] diff --git a/pkg/config/testdata/TestEmailDiff/local_enabled_remote_disabled.diff b/pkg/config/testdata/TestEmailDiff/local_enabled_remote_disabled.diff index 536c34712..388c75ed3 100644 --- a/pkg/config/testdata/TestEmailDiff/local_enabled_remote_disabled.diff +++ b/pkg/config/testdata/TestEmailDiff/local_enabled_remote_disabled.diff @@ -1,7 +1,7 @@ diff remote[auth] local[auth] --- remote[auth] +++ local[auth] -@@ -44,36 +44,44 @@ +@@ -47,62 +47,74 @@ inactivity_timeout = "0s" [email] @@ -41,6 +41,43 @@ diff remote[auth] local[auth] content_path = "" [email.template.recovery] +content = "recovery-content" + content_path = "" + [email.notification] + [email.notification.email_changed] +-enabled = false ++enabled = true + subject = "email-changed-subject" ++content = "email-changed-content" + content_path = "" + [email.notification.identity_linked] +-enabled = false ++enabled = true ++subject = "identity-linked-subject" ++content = "identity-linked-content" + content_path = "" + [email.notification.identity_unlinked] +-enabled = false ++enabled = true + content_path = "" + [email.notification.mfa_factor_enrolled] +-enabled = false ++enabled = true + content_path = "" + [email.notification.mfa_factor_unenrolled] +-enabled = false ++enabled = true + content_path = "" + [email.notification.password_changed] +-enabled = false ++enabled = true + subject = "password-changed-subject" + content = "password-changed-content" + content_path = "" + [email.notification.phone_changed] +-enabled = false ++enabled = true ++subject = "phone-changed-subject" + content = "phone-changed-content" content_path = "" [email.smtp] -enabled = false diff --git a/pkg/config/testdata/config.toml b/pkg/config/testdata/config.toml index cc3e7e907..1b68b6d73 100644 --- a/pkg/config/testdata/config.toml +++ b/pkg/config/testdata/config.toml @@ -207,6 +207,12 @@ sender_name = "Admin" subject = "You have been invited" content_path = "./supabase/templates/invite.html" +# Uncomment to customize notification email template +[auth.email.notification.password_changed] +enabled = true +subject = "Your password has been changed" +content_path = "./templates/password_changed_notification.html" + [auth.sms] # Allow/disallow new user signups via SMS to your project. enable_signup = true From 4aa2ff2534752d5b2aa4cf07cc12f1825b53514b Mon Sep 17 00:00:00 2001 From: Jean-Paul Argudo Date: Wed, 5 Nov 2025 14:28:00 +0100 Subject: [PATCH 21/24] Add auto-ANALYZE infos in "inspect db vacuum-stats" --- internal/inspect/vacuum_stats/vacuum_stats.go | 22 ++++++++++-------- .../inspect/vacuum_stats/vacuum_stats.sql | 23 +++++++++++++++++-- .../inspect/vacuum_stats/vacuum_stats_test.go | 3 +++ 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/internal/inspect/vacuum_stats/vacuum_stats.go b/internal/inspect/vacuum_stats/vacuum_stats.go index a848f2272..e3f3af2a8 100644 --- a/internal/inspect/vacuum_stats/vacuum_stats.go +++ b/internal/inspect/vacuum_stats/vacuum_stats.go @@ -19,13 +19,17 @@ import ( var VacuumStatsQuery string type Result struct { - Name string - Last_vacuum string - Last_autovacuum string - Rowcount string - Dead_rowcount string - Autovacuum_threshold string - Expect_autovacuum string + Name string + Last_vacuum string + Last_autovacuum string + Last_analyze string + Last_autoanalyze string + Rowcount string + Dead_rowcount string + Autovacuum_threshold string + Autoanalyze_threshold string + Expect_autovacuum string + Expect_autoanalyze string } func Run(ctx context.Context, config pgconn.Config, fsys afero.Fs, options ...func(*pgx.ConnConfig)) error { @@ -43,10 +47,10 @@ func Run(ctx context.Context, config pgconn.Config, fsys afero.Fs, options ...fu return err } - table := "|Table|Last Vacuum|Last Auto Vacuum|Row count|Dead row count|Expect autovacuum?\n|-|-|-|-|-|-|\n" + table := "|Table|Last Vacuum|Last Auto Vacuum|Last Analyze|Last Auto Analyze|Row count|Dead row count|Expect autovacuum?|Expect autoanalyze?|\n|-|-|-|-|-|-|-|-|-|\n" for _, r := range result { rowcount := strings.Replace(r.Rowcount, "-1", "No stats", 1) - table += fmt.Sprintf("|`%s`|%s|%s|`%s`|`%s`|`%s`|\n", r.Name, r.Last_vacuum, r.Last_autovacuum, rowcount, r.Dead_rowcount, r.Expect_autovacuum) + table += fmt.Sprintf("|`%s`|%s|%s|%s|%s|`%s`|`%s`|`%s`|`%s`|\n", r.Name, r.Last_vacuum, r.Last_autovacuum, r.Last_analyze, r.Last_autoanalyze, rowcount, r.Dead_rowcount, r.Expect_autovacuum, r.Expect_autoanalyze) } return utils.RenderTable(table) } diff --git a/internal/inspect/vacuum_stats/vacuum_stats.sql b/internal/inspect/vacuum_stats/vacuum_stats.sql index 534fa4e64..73d32857f 100644 --- a/internal/inspect/vacuum_stats/vacuum_stats.sql +++ b/internal/inspect/vacuum_stats/vacuum_stats.sql @@ -15,7 +15,17 @@ WITH table_opts AS ( WHEN relopts LIKE '%autovacuum_vacuum_scale_factor%' THEN substring(relopts, '.*autovacuum_vacuum_scale_factor=([0-9.]+).*')::real ELSE current_setting('autovacuum_vacuum_scale_factor')::real - END AS autovacuum_vacuum_scale_factor + END AS autovacuum_vacuum_scale_factor, + CASE + WHEN relopts LIKE '%autovacuum_analyze_threshold%' + THEN substring(relopts, '.*autovacuum_analyze_threshold=([0-9.]+).*')::integer + ELSE current_setting('autovacuum_analyze_threshold')::integer + END AS autovacuum_analyze_threshold, + CASE + WHEN relopts LIKE '%autovacuum_analyze_scale_factor%' + THEN substring(relopts, '.*autovacuum_analyze_scale_factor=([0-9.]+).*')::real + ELSE current_setting('autovacuum_analyze_scale_factor')::real + END AS autovacuum_analyze_scale_factor FROM table_opts ) @@ -23,6 +33,8 @@ SELECT FORMAT('%I.%I', vacuum_settings.nspname, vacuum_settings.relname) AS name, coalesce(to_char(psut.last_vacuum, 'YYYY-MM-DD HH24:MI'), '') AS last_vacuum, coalesce(to_char(psut.last_autovacuum, 'YYYY-MM-DD HH24:MI'), '') AS last_autovacuum, + coalesce(to_char(psut.last_analyze, 'YYYY-MM-DD HH24:MI'), '') AS last_analyze, + coalesce(to_char(psut.last_autoanalyze, 'YYYY-MM-DD HH24:MI'), '') AS last_autoanalyze, to_char(pg_class.reltuples, '9G999G999G999') AS rowcount, to_char(psut.n_dead_tup, '9G999G999G999') AS dead_rowcount, to_char(autovacuum_vacuum_threshold @@ -31,7 +43,14 @@ SELECT WHEN autovacuum_vacuum_threshold + (autovacuum_vacuum_scale_factor::numeric * pg_class.reltuples) < psut.n_dead_tup THEN 'yes' ELSE 'no' - END AS expect_autovacuum + END AS expect_autovacuum, + to_char(autovacuum_analyze_threshold + + (autovacuum_analyze_scale_factor::numeric * pg_class.reltuples), '9G999G999G999') AS autoanalyze_threshold, + CASE + WHEN autovacuum_analyze_threshold + (autovacuum_analyze_scale_factor::numeric * pg_class.reltuples) < psut.n_dead_tup + THEN 'yes' + ELSE 'no' + END AS expect_autoanalyze FROM pg_stat_user_tables psut INNER JOIN pg_class ON psut.relid = pg_class.oid INNER JOIN vacuum_settings ON pg_class.oid = vacuum_settings.oid diff --git a/internal/inspect/vacuum_stats/vacuum_stats_test.go b/internal/inspect/vacuum_stats/vacuum_stats_test.go index 7872567b3..222da3493 100644 --- a/internal/inspect/vacuum_stats/vacuum_stats_test.go +++ b/internal/inspect/vacuum_stats/vacuum_stats_test.go @@ -32,10 +32,13 @@ func TestVacuumCommand(t *testing.T) { Name: "test_schema.test_table", Last_vacuum: "2021-01-01 00:00:00", Last_autovacuum: "2021-01-01 00:00:00", + Last_analyze: "2021-01-01 00:00:00", + Last_autoanalyze: "2021-01-01 00:00:00", Rowcount: "1000", Dead_rowcount: "100", Autovacuum_threshold: "100", Expect_autovacuum: "yes", + Expect_autoanalyze: "yes", }) // Run test err := Run(context.Background(), dbConfig, fsys, conn.Intercept) From 66e3ccd17128549e105e96f530a311b2ba10f23e Mon Sep 17 00:00:00 2001 From: Jean-Paul Argudo Date: Wed, 5 Nov 2025 14:47:34 +0100 Subject: [PATCH 22/24] Update vacuum_stats.go Make it clear with go formatter error in the file. Sorry I forgot to do that prior the commit.. :/ --- internal/inspect/vacuum_stats/vacuum_stats.go | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/internal/inspect/vacuum_stats/vacuum_stats.go b/internal/inspect/vacuum_stats/vacuum_stats.go index e3f3af2a8..71ec21e45 100644 --- a/internal/inspect/vacuum_stats/vacuum_stats.go +++ b/internal/inspect/vacuum_stats/vacuum_stats.go @@ -19,17 +19,17 @@ import ( var VacuumStatsQuery string type Result struct { - Name string - Last_vacuum string - Last_autovacuum string - Last_analyze string - Last_autoanalyze string - Rowcount string - Dead_rowcount string - Autovacuum_threshold string - Autoanalyze_threshold string - Expect_autovacuum string - Expect_autoanalyze string + Name string + Last_vacuum string + Last_autovacuum string + Last_analyze string + Last_autoanalyze string + Rowcount string + Dead_rowcount string + Autovacuum_threshold string + Autoanalyze_threshold string + Expect_autovacuum string + Expect_autoanalyze string } func Run(ctx context.Context, config pgconn.Config, fsys afero.Fs, options ...func(*pgx.ConnConfig)) error { From 442c07cf103107c0a2976e0222665ba83904ad52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 04:23:40 +0000 Subject: [PATCH 23/24] fix(docker): bump the docker-minor group in /pkg/config/templates with 4 updates (#4410) fix(docker): bump the docker-minor group Bumps the docker-minor group in /pkg/config/templates with 4 updates: supabase/edge-runtime, supabase/gotrue, supabase/realtime and supabase/logflare. Updates `supabase/edge-runtime` from v1.69.21 to v1.69.23 Updates `supabase/gotrue` from v2.181.0 to v2.182.1 Updates `supabase/realtime` from v2.61.0 to v2.61.1 Updates `supabase/logflare` from 1.22.6 to 1.25.0 --- updated-dependencies: - dependency-name: supabase/edge-runtime dependency-version: v1.69.23 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/gotrue dependency-version: v2.182.1 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/realtime dependency-version: v2.61.1 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/logflare dependency-version: 1.25.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: docker-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index 5cc685303..c2857dad3 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -7,13 +7,13 @@ FROM postgrest/postgrest:v13.0.7 AS postgrest FROM supabase/postgres-meta:v0.93.1 AS pgmeta FROM supabase/studio:2025.11.03-sha-ddedae5 AS studio FROM darthsim/imgproxy:v3.8.0 AS imgproxy -FROM supabase/edge-runtime:v1.69.21 AS edgeruntime +FROM supabase/edge-runtime:v1.69.23 AS edgeruntime FROM timberio/vector:0.28.1-alpine AS vector FROM supabase/supavisor:2.7.4 AS supavisor -FROM supabase/gotrue:v2.181.0 AS gotrue -FROM supabase/realtime:v2.61.0 AS realtime +FROM supabase/gotrue:v2.182.1 AS gotrue +FROM supabase/realtime:v2.61.1 AS realtime FROM supabase/storage-api:v1.28.5 AS storage -FROM supabase/logflare:1.22.6 AS logflare +FROM supabase/logflare:1.25.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 From d736cfd4d72704d98f494a9acea0b8cb071d7151 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 04:33:37 +0000 Subject: [PATCH 24/24] chore(deps): bump the go-minor group across 1 directory with 2 updates (#4412) Bumps the go-minor group with 2 updates in the / directory: [github.com/docker/cli](https://github.com/docker/cli) and [github.com/docker/docker](https://github.com/docker/docker). Updates `github.com/docker/cli` from 28.5.1+incompatible to 28.5.2+incompatible - [Commits](https://github.com/docker/cli/compare/v28.5.1...v28.5.2) Updates `github.com/docker/docker` from 28.5.1+incompatible to 28.5.2+incompatible - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v28.5.1...v28.5.2) --- updated-dependencies: - dependency-name: github.com/docker/cli dependency-version: 28.5.2+incompatible dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-minor - dependency-name: github.com/docker/docker dependency-version: 28.5.2+incompatible dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 4efda4f17..72380e9a6 100644 --- a/go.mod +++ b/go.mod @@ -13,8 +13,8 @@ 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.5.1+incompatible - github.com/docker/docker v28.5.1+incompatible + github.com/docker/cli v28.5.2+incompatible + github.com/docker/docker v28.5.2+incompatible github.com/docker/go-connections v0.6.0 github.com/fsnotify/fsnotify v1.9.0 github.com/getsentry/sentry-go v0.36.2 diff --git a/go.sum b/go.sum index aff76a2df..adc3056a4 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.5.1+incompatible h1:ESutzBALAD6qyCLqbQSEf1a/U8Ybms5agw59yGVc+yY= -github.com/docker/cli v28.5.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v28.5.2+incompatible h1:XmG99IHcBmIAoC1PPg9eLBZPlTrNUAijsHLm8PjhBlg= +github.com/docker/cli v28.5.2+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.5.1+incompatible h1:Bm8DchhSD2J6PsFzxC35TZo4TLGR2PdW/E69rU45NhM= -github.com/docker/docker v28.5.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= +github.com/docker/docker v28.5.2+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=