From 5c9f5380a6e1ad3e1f05f267921cfe951ea618c3 Mon Sep 17 00:00:00 2001 From: Anirudh Oppiliappan Date: Wed, 6 Aug 2025 21:30:04 +0300 Subject: [PATCH] appview/signup: disable signup route if cloudflare config is unavailable Change-Id: nuzkstrsqpzpotuupmouwvsywpxspnvu Signed-off-by: Anirudh Oppiliappan --- appview/signup/signup.go | 25 ++++++++++++++++++++++--- appview/state/router.go | 2 +- appview/state/state.go | 8 -------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/appview/signup/signup.go b/appview/signup/signup.go index 884ad3a..84aad4f 100644 --- a/appview/signup/signup.go +++ b/appview/signup/signup.go @@ -14,6 +14,7 @@ import ( "tangled.sh/tangled.sh/core/appview/pages" "tangled.sh/tangled.sh/core/appview/state/userutil" "tangled.sh/tangled.sh/core/appview/xrpcclient" + "tangled.sh/tangled.sh/core/idresolver" ) type Signup struct { @@ -27,13 +28,22 @@ type Signup struct { l *slog.Logger } -func New(cfg *config.Config, cf *dns.Cloudflare, database *db.DB, pc posthog.Client, idResolver *idresolver.Resolver, pages *pages.Pages, l *slog.Logger) *Signup { +func New(cfg *config.Config, database *db.DB, pc posthog.Client, idResolver *idresolver.Resolver, pages *pages.Pages, l *slog.Logger) *Signup { + var cf *dns.Cloudflare + if cfg.Cloudflare.ApiToken != "" && cfg.Cloudflare.ZoneId != "" { + var err error + cf, err = dns.NewCloudflare(cfg) + if err != nil { + l.Warn("failed to create cloudflare client, signup will be disabled", "error", err) + } + } + return &Signup{ config: cfg, db: database, - cf: cf, posthog: pc, idResolver: idResolver, + cf: cf, pages: pages, l: l, } @@ -49,6 +59,9 @@ func (s *Signup) Router() http.Handler { } func (s *Signup) signup(w http.ResponseWriter, r *http.Request) { + if s.cf == nil { + http.Error(w, "signup is disabled", http.StatusFailedDependency) + } emailId := r.FormValue("email") if !email.IsValidEmail(emailId) { @@ -132,6 +145,12 @@ func (s *Signup) complete(w http.ResponseWriter, r *http.Request) { return } + if s.cf == nil { + s.l.Error("cloudflare client is nil", "error", "Cloudflare integration is not enabled in configuration") + s.pages.Notice(w, "signup-error", "Account signup is currently disabled. DNS record creation is not available. Please contact support.") + return + } + err = s.cf.CreateDNSRecord(r.Context(), dns.Record{ Type: "TXT", Name: "_atproto." + username, @@ -141,7 +160,7 @@ func (s *Signup) complete(w http.ResponseWriter, r *http.Request) { }) if err != nil { s.l.Error("failed to create DNS record", "error", err) - s.pages.Notice(w, "signup-error", "Failed to complete sign up. Try again later.") + s.pages.Notice(w, "signup-error", "Failed to create DNS record for your handle. Please contact support.") return } diff --git a/appview/state/router.go b/appview/state/router.go index fd2faf1..7d62c9f 100644 --- a/appview/state/router.go +++ b/appview/state/router.go @@ -223,6 +223,6 @@ func (s *State) PipelinesRouter(mw *middleware.Middleware) http.Handler { func (s *State) SignupRouter() http.Handler { logger := log.New("signup") - sig := signup.New(s.config, s.cf, s.db, s.posthog, s.idResolver, s.pages, logger) + sig := signup.New(s.config, s.db, s.posthog, s.idResolver, s.pages, logger) return sig.Router() } diff --git a/appview/state/state.go b/appview/state/state.go index fee5c12..b9b5a32 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -20,7 +20,6 @@ import ( "tangled.sh/tangled.sh/core/appview/cache/session" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/dns" "tangled.sh/tangled.sh/core/appview/notify" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" @@ -47,7 +46,6 @@ type State struct { jc *jetstream.JetstreamClient config *config.Config repoResolver *reporesolver.RepoResolver - cf *dns.Cloudflare knotstream *eventconsumer.Consumer spindlestream *eventconsumer.Consumer } @@ -139,11 +137,6 @@ func Make(ctx context.Context, config *config.Config) (*State, error) { } notifier := notify.NewMergedNotifier(notifiers...) - cf, err := dns.NewCloudflare(config) - if err != nil { - return nil, fmt.Errorf("failed to create Cloudflare client: %w", err) - } - state := &State{ d, notifier, @@ -156,7 +149,6 @@ func Make(ctx context.Context, config *config.Config) (*State, error) { jc, config, repoResolver, - cf, knotstream, spindlestream, } -- 2.43.0