Просмотр исходного кода

auto-send email verification on signup

Alexander Belanger 4 лет назад
Родитель
Сommit
ef620f10a1

+ 5 - 0
api/server/handlers/user/create.go

@@ -77,6 +77,11 @@ func (u *UserCreateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
+	// non-fatal send email verification
+	if !user.EmailVerified {
+		startEmailVerification(u.Config(), w, r, user)
+	}
+
 	u.Config().AnalyticsClient.Identify(analytics.CreateSegmentIdentifyUser(user))
 
 	u.Config().AnalyticsClient.Track(analytics.UserCreateTrack(&analytics.UserCreateTrackOpts{

+ 33 - 26
api/server/handlers/user/email_verify.go

@@ -30,35 +30,10 @@ func NewVerifyEmailInitiateHandler(
 func (v *VerifyEmailInitiateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	user, _ := r.Context().Value(types.UserScope).(*models.User)
 
-	pwReset, rawToken, err := CreatePWResetTokenForEmail(
-		v.Repo().PWResetToken(),
-		v.HandleAPIError,
-		w,
-		r,
-		&types.InitiateResetUserPasswordRequest{
-			Email: user.Email,
-		},
-	)
-
-	if err != nil {
-		return
-	}
-
-	queryVals := url.Values{
-		"token":    []string{rawToken},
-		"token_id": []string{fmt.Sprintf("%d", pwReset.ID)},
-	}
-
-	err = v.Config().UserNotifier.SendEmailVerification(
-		&notifier.SendEmailVerificationOpts{
-			Email: user.Email,
-			URL:   fmt.Sprintf("%s/api/email/verify/finalize?%s", v.Config().ServerConf.ServerURL, queryVals.Encode()),
-		},
-	)
+	err := startEmailVerification(v.Config(), w, r, user)
 
 	if err != nil {
 		v.HandleAPIError(w, r, apierrors.NewErrInternal(err))
-		return
 	}
 }
 
@@ -126,3 +101,35 @@ func (v *VerifyEmailFinalizeHandler) ServeHTTP(w http.ResponseWriter, r *http.Re
 	http.Redirect(w, r, "/dashboard", 302)
 	return
 }
+
+func startEmailVerification(
+	config *config.Config,
+	w http.ResponseWriter, r *http.Request,
+	user *models.User,
+) error {
+	pwReset, rawToken, err := CreatePWResetTokenForEmail(
+		config.Repo.PWResetToken(),
+		handlers.IgnoreAPIError,
+		w,
+		r,
+		&types.InitiateResetUserPasswordRequest{
+			Email: user.Email,
+		},
+	)
+
+	if err != nil {
+		return err
+	}
+
+	queryVals := url.Values{
+		"token":    []string{rawToken},
+		"token_id": []string{fmt.Sprintf("%d", pwReset.ID)},
+	}
+
+	return config.UserNotifier.SendEmailVerification(
+		&notifier.SendEmailVerificationOpts{
+			Email: user.Email,
+			URL:   fmt.Sprintf("%s/api/email/verify/finalize?%s", config.ServerConf.ServerURL, queryVals.Encode()),
+		},
+	)
+}

+ 5 - 0
api/server/handlers/user/github_callback.go

@@ -83,6 +83,11 @@ func (p *UserOAuthGithubCallbackHandler) ServeHTTP(w http.ResponseWriter, r *htt
 		return
 	}
 
+	// non-fatal send email verification
+	if !user.EmailVerified {
+		startEmailVerification(p.Config(), w, r, user)
+	}
+
 	if session.Values["query_params"] != "" {
 		http.Redirect(w, r, fmt.Sprintf("/dashboard?%s", session.Values["query_params"]), 302)
 	} else {

+ 5 - 0
api/server/handlers/user/google_callback.go

@@ -86,6 +86,11 @@ func (p *UserOAuthGoogleCallbackHandler) ServeHTTP(w http.ResponseWriter, r *htt
 		return
 	}
 
+	// non-fatal send email verification
+	if !user.EmailVerified {
+		startEmailVerification(p.Config(), w, r, user)
+	}
+
 	if session.Values["query_params"] != "" {
 		http.Redirect(w, r, fmt.Sprintf("/dashboard?%s", session.Values["query_params"]), 302)
 	} else {