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 "tangled.sh/tangled.sh/core/appview/pages" 15 "tangled.sh/tangled.sh/core/appview/state/userutil" 16 "tangled.sh/tangled.sh/core/appview/xrpcclient" 17 ) 18 19 type Signup struct { ··· 27 l *slog.Logger 28 } 29 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 return &Signup{ 32 config: cfg, 33 db: database, 34 - cf: cf, 35 posthog: pc, 36 idResolver: idResolver, 37 pages: pages, 38 l: l, 39 } ··· 49 } 50 51 func (s *Signup) signup(w http.ResponseWriter, r *http.Request) { 52 emailId := r.FormValue("email") 53 54 if !email.IsValidEmail(emailId) { ··· 132 return 133 } 134 135 err = s.cf.CreateDNSRecord(r.Context(), dns.Record{ 136 Type: "TXT", 137 Name: "_atproto." + username, ··· 141 }) 142 if err != nil { 143 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.") 145 return 146 } 147
··· 14 "tangled.sh/tangled.sh/core/appview/pages" 15 "tangled.sh/tangled.sh/core/appview/state/userutil" 16 "tangled.sh/tangled.sh/core/appview/xrpcclient" 17 + "tangled.sh/tangled.sh/core/idresolver" 18 ) 19 20 type Signup struct { ··· 28 l *slog.Logger 29 } 30 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 + 41 return &Signup{ 42 config: cfg, 43 db: database, 44 posthog: pc, 45 idResolver: idResolver, 46 + cf: cf, 47 pages: pages, 48 l: l, 49 } ··· 59 } 60 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 + } 65 emailId := r.FormValue("email") 66 67 if !email.IsValidEmail(emailId) { ··· 145 return 146 } 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 + 154 err = s.cf.CreateDNSRecord(r.Context(), dns.Record{ 155 Type: "TXT", 156 Name: "_atproto." + username, ··· 160 }) 161 if err != nil { 162 s.l.Error("failed to create DNS record", "error", err) 163 + s.pages.Notice(w, "signup-error", "Failed to create DNS record for your handle. Please contact support.") 164 return 165 } 166
+1 -1
appview/state/router.go
··· 223 func (s *State) SignupRouter() http.Handler { 224 logger := log.New("signup") 225 226 - sig := signup.New(s.config, s.cf, s.db, s.posthog, s.idResolver, s.pages, logger) 227 return sig.Router() 228 }
··· 223 func (s *State) SignupRouter() http.Handler { 224 logger := log.New("signup") 225 226 + sig := signup.New(s.config, s.db, s.posthog, s.idResolver, s.pages, logger) 227 return sig.Router() 228 }
-8
appview/state/state.go
··· 20 "tangled.sh/tangled.sh/core/appview/cache/session" 21 "tangled.sh/tangled.sh/core/appview/config" 22 "tangled.sh/tangled.sh/core/appview/db" 23 - "tangled.sh/tangled.sh/core/appview/dns" 24 "tangled.sh/tangled.sh/core/appview/notify" 25 "tangled.sh/tangled.sh/core/appview/oauth" 26 "tangled.sh/tangled.sh/core/appview/pages" ··· 47 jc *jetstream.JetstreamClient 48 config *config.Config 49 repoResolver *reporesolver.RepoResolver 50 - cf *dns.Cloudflare 51 knotstream *eventconsumer.Consumer 52 spindlestream *eventconsumer.Consumer 53 } ··· 139 } 140 notifier := notify.NewMergedNotifier(notifiers...) 141 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 state := &State{ 148 d, 149 notifier, ··· 156 jc, 157 config, 158 repoResolver, 159 - cf, 160 knotstream, 161 spindlestream, 162 }
··· 20 "tangled.sh/tangled.sh/core/appview/cache/session" 21 "tangled.sh/tangled.sh/core/appview/config" 22 "tangled.sh/tangled.sh/core/appview/db" 23 "tangled.sh/tangled.sh/core/appview/notify" 24 "tangled.sh/tangled.sh/core/appview/oauth" 25 "tangled.sh/tangled.sh/core/appview/pages" ··· 46 jc *jetstream.JetstreamClient 47 config *config.Config 48 repoResolver *reporesolver.RepoResolver 49 knotstream *eventconsumer.Consumer 50 spindlestream *eventconsumer.Consumer 51 } ··· 137 } 138 notifier := notify.NewMergedNotifier(notifiers...) 139 140 state := &State{ 141 d, 142 notifier, ··· 149 jc, 150 config, 151 repoResolver, 152 knotstream, 153 spindlestream, 154 }