appview/signup: disable signup route if cloudflare config is unavailable #407

merged
opened by anirudh.fi targeting master from push-qlzpkvltqlzm
Changed files
+23 -12
appview
+22 -3
appview/signup/signup.go
··· 14 14 "tangled.sh/tangled.sh/core/appview/pages" 15 15 "tangled.sh/tangled.sh/core/appview/state/userutil" 16 16 "tangled.sh/tangled.sh/core/appview/xrpcclient" 17 + "tangled.sh/tangled.sh/core/idresolver" 17 18 ) 18 19 19 20 type Signup struct { ··· 27 28 l *slog.Logger 28 29 } 29 30 30 - func New(cfg *config.Config, cf *dns.Cloudflare, database *db.DB, pc posthog.Client, idResolver *idresolver.Resolver, pages *pages.Pages, l *slog.Logger) *Signup { 31 + func New(cfg *config.Config, database *db.DB, pc posthog.Client, idResolver *idresolver.Resolver, pages *pages.Pages, l *slog.Logger) *Signup { 32 + var cf *dns.Cloudflare 33 + if cfg.Cloudflare.ApiToken != "" && cfg.Cloudflare.ZoneId != "" { 34 + var err error 35 + cf, err = dns.NewCloudflare(cfg) 36 + if err != nil { 37 + l.Warn("failed to create cloudflare client, signup will be disabled", "error", err) 38 + } 39 + } 40 + 31 41 return &Signup{ 32 42 config: cfg, 33 43 db: database, 34 - cf: cf, 35 44 posthog: pc, 36 45 idResolver: idResolver, 46 + cf: cf, 37 47 pages: pages, 38 48 l: l, 39 49 } ··· 49 59 } 50 60 51 61 func (s *Signup) signup(w http.ResponseWriter, r *http.Request) { 62 + if s.cf == nil { 63 + http.Error(w, "signup is disabled", http.StatusFailedDependency) 64 + } 52 65 emailId := r.FormValue("email") 53 66 54 67 if !email.IsValidEmail(emailId) { ··· 132 145 return 133 146 } 134 147 148 + if s.cf == nil { 149 + s.l.Error("cloudflare client is nil", "error", "Cloudflare integration is not enabled in configuration") 150 + s.pages.Notice(w, "signup-error", "Account signup is currently disabled. DNS record creation is not available. Please contact support.") 151 + return 152 + } 153 + 135 154 err = s.cf.CreateDNSRecord(r.Context(), dns.Record{ 136 155 Type: "TXT", 137 156 Name: "_atproto." + username, ··· 141 160 }) 142 161 if err != nil { 143 162 s.l.Error("failed to create DNS record", "error", err) 144 - s.pages.Notice(w, "signup-error", "Failed to complete sign up. Try again later.") 163 + s.pages.Notice(w, "signup-error", "Failed to create DNS record for your handle. Please contact support.") 145 164 return 146 165 } 147 166
+1 -1
appview/state/router.go
··· 223 223 func (s *State) SignupRouter() http.Handler { 224 224 logger := log.New("signup") 225 225 226 - sig := signup.New(s.config, s.cf, s.db, s.posthog, s.idResolver, s.pages, logger) 226 + sig := signup.New(s.config, s.db, s.posthog, s.idResolver, s.pages, logger) 227 227 return sig.Router() 228 228 }
-8
appview/state/state.go
··· 20 20 "tangled.sh/tangled.sh/core/appview/cache/session" 21 21 "tangled.sh/tangled.sh/core/appview/config" 22 22 "tangled.sh/tangled.sh/core/appview/db" 23 - "tangled.sh/tangled.sh/core/appview/dns" 24 23 "tangled.sh/tangled.sh/core/appview/notify" 25 24 "tangled.sh/tangled.sh/core/appview/oauth" 26 25 "tangled.sh/tangled.sh/core/appview/pages" ··· 47 46 jc *jetstream.JetstreamClient 48 47 config *config.Config 49 48 repoResolver *reporesolver.RepoResolver 50 - cf *dns.Cloudflare 51 49 knotstream *eventconsumer.Consumer 52 50 spindlestream *eventconsumer.Consumer 53 51 } ··· 139 137 } 140 138 notifier := notify.NewMergedNotifier(notifiers...) 141 139 142 - cf, err := dns.NewCloudflare(config) 143 - if err != nil { 144 - return nil, fmt.Errorf("failed to create Cloudflare client: %w", err) 145 - } 146 - 147 140 state := &State{ 148 141 d, 149 142 notifier, ··· 156 149 jc, 157 150 config, 158 151 repoResolver, 159 - cf, 160 152 knotstream, 161 153 spindlestream, 162 154 }