diff --git a/appview/signup/signup.go b/appview/signup/signup.go index 884ad3a1..84aad4fc 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 fd2faf1f..7d62c9fe 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 fee5c124..b9b5a320 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, }