+22
-3
appview/signup/signup.go
+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
+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
-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
}