@@ -200,14 +200,51 @@ func (API) Signup(ctx context.Context, email string) {
200
200
logCheck (err , "closing smtp connectiong" )
201
201
}()
202
202
203
- var user User
204
- var msg []byte
205
- var mailFrom , sendID string
206
- var eightbit , smtputf8 bool
207
- var m Message
203
+ user , msg , mailFrom , eightbit , smtputf8 , m , err := signup (ctx , email , "" , true )
204
+ if serr , ok := err .(* sherpa.Error ); ok {
205
+ panic (serr )
206
+ }
207
+ xcheckf (err , "adding user to database" )
208
+
209
+ // Send the message.
210
+ submitctx , submitcancel := context .WithTimeout (context .Background (), 10 * time .Second )
211
+ defer submitcancel ()
212
+ if err := smtpSubmit (submitctx , smtpconn , true , mailFrom , email , msg , eightbit , smtputf8 ); err != nil {
213
+ logErrorx ("submission for signup/passwordreset" , err , "userid" , user .ID )
214
+ if err := database .Delete (context .Background (), & m ); err != nil {
215
+ logErrorx ("removing metamessage added before submission error" , err )
216
+ }
217
+ xcheckf (err , "submitting verification/password reset email" )
218
+ }
219
+ slog .Info ("submitted signup/passwordreset email" , "userid" , user .ID )
220
+ }
221
+
222
+ func signup (ctx context.Context , email string , origMessageID string , viaWebsite bool ) (user User , msg []byte , mailFrom string , eightbit , smtputf8 bool , m Message , err error ) {
223
+ var sendID string
224
+
225
+ // Code below can raise panics with sherpa.Error. Catch them an return as regular error.
226
+ defer func () {
227
+ x := recover ()
228
+ if x == nil {
229
+ return
230
+ }
231
+ serr , ok := x .(* sherpa.Error )
232
+ if ! ok || err != nil {
233
+ panic (x )
234
+ }
235
+ err = serr
236
+ }()
237
+
208
238
err = database .Write (ctx , func (tx * bstore.Tx ) error {
209
239
user , err = bstore.QueryTx [User ](tx ).FilterNonzero (User {Email : email }).Get ()
210
240
if err == bstore .ErrAbsent || err == nil && user .VerifyToken != "" {
241
+ if viaWebsite && config .SignupWebsiteDisabled {
242
+ return fmt .Errorf ("signup via website currently disabled" )
243
+ }
244
+ if ! viaWebsite && config .SignupEmailDisabled {
245
+ return fmt .Errorf ("signup via email currently disabled" )
246
+ }
247
+
211
248
metaUnsubToken := user .MetaUnsubscribeToken
212
249
if metaUnsubToken == "" {
213
250
metaUnsubToken = xrandomID (16 )
@@ -239,9 +276,9 @@ func (API) Signup(ctx context.Context, email string) {
239
276
return fmt .Errorf ("adding user to database: %v" , err )
240
277
}
241
278
242
- subject , text , html , err := composeSignup (user )
279
+ subject , text , html , err := composeSignup (user , viaWebsite )
243
280
xcheckf (err , "composing signup text" )
244
- mailFrom , sendID , msg , eightbit , smtputf8 , err = compose (true , user , subject , text , html )
281
+ mailFrom , sendID , msg , eightbit , smtputf8 , err = compose (true , user , origMessageID , subject , text , html )
245
282
xcheckf (err , "composing signup message" )
246
283
247
284
m = Message {
@@ -252,7 +289,11 @@ func (API) Signup(ctx context.Context, email string) {
252
289
if err := tx .Insert (& m ); err != nil {
253
290
return fmt .Errorf ("adding outgoing message to database: %v" , err )
254
291
}
255
- xaddUserLogf (tx , user .ID , "Signup through website" )
292
+ msg := "Signup through email"
293
+ if viaWebsite {
294
+ msg = "Signup through website"
295
+ }
296
+ xaddUserLogf (tx , user .ID , msg )
256
297
257
298
return nil
258
299
}
@@ -266,9 +307,9 @@ func (API) Signup(ctx context.Context, email string) {
266
307
return fmt .Errorf ("updating user in database: %v" , err )
267
308
}
268
309
269
- subject , text , html , err := composePasswordReset (user )
310
+ subject , text , html , err := composePasswordReset (user , viaWebsite )
270
311
xcheckf (err , "composing password reset text" )
271
- mailFrom , sendID , msg , eightbit , smtputf8 , err = compose (true , user , subject , text , html )
312
+ mailFrom , sendID , msg , eightbit , smtputf8 , err = compose (true , user , origMessageID , subject , text , html )
272
313
xcheckf (err , "composing password reset message" )
273
314
274
315
m = Message {
@@ -279,23 +320,15 @@ func (API) Signup(ctx context.Context, email string) {
279
320
if err := tx .Insert (& m ); err != nil {
280
321
return fmt .Errorf ("adding outgoing message to database: %v" , err )
281
322
}
282
- xaddUserLogf (tx , user .ID , "Signup for existing account, sending password reset." )
323
+ msg := "Signup through email for existing account, sending password reset."
324
+ if viaWebsite {
325
+ msg = "Signup through website for existing account, sending password reset."
326
+ }
327
+ xaddUserLogf (tx , user .ID , msg )
283
328
284
329
return nil
285
330
})
286
- xcheckf (err , "adding user to database" )
287
-
288
- // Send the message.
289
- submitctx , submitcancel := context .WithTimeout (context .Background (), 10 * time .Second )
290
- defer submitcancel ()
291
- if err := smtpSubmit (submitctx , smtpconn , true , mailFrom , email , msg , eightbit , smtputf8 ); err != nil {
292
- logErrorx ("submission for signup/passwordreset" , err , "userid" , user .ID )
293
- if err := database .Delete (context .Background (), & m ); err != nil {
294
- logErrorx ("removing metamessage added before submission error" , err )
295
- }
296
- xcheckf (err , "submitting verification/password reset email" )
297
- }
298
- slog .Info ("submitted signup/passwordreset email" , "userid" , user .ID )
331
+ return
299
332
}
300
333
301
334
// SignupEmail returns the email address for a verify token. So we can show it, and
@@ -464,10 +497,10 @@ func (API) RequestPasswordReset(ctx context.Context, prepToken, email string) {
464
497
}
465
498
xcheckf (err , "requesting password reset" )
466
499
467
- subject , text , html , err := composePasswordReset (user )
500
+ subject , text , html , err := composePasswordReset (user , true )
468
501
xcheckf (err , "composing password reset text" )
469
502
470
- mailFrom , sendID , msg , eightbit , smtputf8 , err := compose (true , user , subject , text , html )
503
+ mailFrom , sendID , msg , eightbit , smtputf8 , err := compose (true , user , "" , subject , text , html )
471
504
xcheckf (err , "composing password reset message" )
472
505
473
506
smtpTake ()
@@ -981,17 +1014,20 @@ type Recent struct {
981
1014
}
982
1015
983
1016
type Home struct {
984
- Version string
985
- GoVersion string
986
- GoOS string
987
- GoArch string
988
- ServiceName string
989
- AdminName string
990
- AdminEmail string
991
- Note string
992
- SignupNote string
993
- SkipModulePrefixes []string
994
- Recents []Recent
1017
+ Version string
1018
+ GoVersion string
1019
+ GoOS string
1020
+ GoArch string
1021
+ ServiceName string
1022
+ AdminName string
1023
+ AdminEmail string
1024
+ Note string
1025
+ SignupNote string
1026
+ SkipModulePrefixes []string
1027
+ SignupEmailDisabled bool
1028
+ SignupWebsiteDisabled bool
1029
+ SignupAddress string
1030
+ Recents []Recent
995
1031
}
996
1032
997
1033
func _recents (ctx context.Context , n int ) (recents []Recent ) {
@@ -1015,12 +1051,15 @@ func _recents(ctx context.Context, n int) (recents []Recent) {
1015
1051
// Home returns data for the home page.
1016
1052
func (API ) Home (ctx context.Context ) (home Home ) {
1017
1053
home = Home {
1018
- Version : version ,
1019
- GoVersion : runtime .Version (),
1020
- GoOS : runtime .GOOS ,
1021
- GoArch : runtime .GOARCH ,
1022
- ServiceName : config .ServiceName ,
1023
- SkipModulePrefixes : config .SkipModulePrefixes ,
1054
+ Version : version ,
1055
+ GoVersion : runtime .Version (),
1056
+ GoOS : runtime .GOOS ,
1057
+ GoArch : runtime .GOARCH ,
1058
+ ServiceName : config .ServiceName ,
1059
+ SkipModulePrefixes : config .SkipModulePrefixes ,
1060
+ SignupEmailDisabled : config .SignupEmailDisabled ,
1061
+ SignupWebsiteDisabled : config .SignupWebsiteDisabled ,
1062
+ SignupAddress : smtp.Address {Localpart : config .Submission .From .ParsedLocalpartBase , Domain : config .Submission .From .DNSDomain }.String (),
1024
1063
}
1025
1064
1026
1065
home .Recents = _recents (ctx , 15 )
@@ -1144,7 +1183,7 @@ func (API) TestSend(ctx context.Context, secret, kind, email string) {
1144
1183
subject , text , html , err := composeSample (kind , u , loginToken )
1145
1184
xcheckf (err , "compose text" )
1146
1185
1147
- mailFrom , sendID , msg , eightbit , smtputf8 , err := compose (kind != "moduleupdates" , u , subject , text , html )
1186
+ mailFrom , sendID , msg , eightbit , smtputf8 , err := compose (kind != "moduleupdates" , u , "" , config . SubjectPrefix + subject , text , html )
1148
1187
xcheckf (err , "compose message" )
1149
1188
slog .Info ("composed test message" , "sendid" , sendID )
1150
1189
0 commit comments