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
···
"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 {
···
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,
}
···
}
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) {
···
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,
···
})
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
}
+1 -1
appview/state/router.go
···
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()
}
-8
appview/state/state.go
···
"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"
···
jc *jetstream.JetstreamClient
config *config.Config
repoResolver *reporesolver.RepoResolver
-
cf *dns.Cloudflare
knotstream *eventconsumer.Consumer
spindlestream *eventconsumer.Consumer
}
···
}
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,
···
jc,
config,
repoResolver,
-
cf,
knotstream,
spindlestream,
}