| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- package user
- import (
- "fmt"
- "net/http"
- "net/url"
- "github.com/porter-dev/porter/api/server/handlers"
- "github.com/porter-dev/porter/api/server/shared"
- "github.com/porter-dev/porter/api/server/shared/apierrors"
- "github.com/porter-dev/porter/api/types"
- "github.com/porter-dev/porter/internal/models"
- "github.com/porter-dev/porter/internal/notifier"
- )
- type VerifyEmailInitiateHandler struct {
- handlers.PorterHandler
- }
- func NewVerifyEmailInitiateHandler(
- config *shared.Config,
- ) *VerifyEmailInitiateHandler {
- return &VerifyEmailInitiateHandler{
- PorterHandler: handlers.NewDefaultPorterHandler(config, nil, nil),
- }
- }
- 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, &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(
- ¬ifier.SendEmailVerificationOpts{
- Email: user.Email,
- URL: fmt.Sprintf("%s/api/email/verify/finalize?%s", v.Config().ServerConf.ServerURL, queryVals.Encode()),
- },
- )
- if err != nil {
- v.HandleAPIError(w, apierrors.NewErrInternal(err))
- return
- }
- }
- type VerifyEmailFinalizeHandler struct {
- handlers.PorterHandlerReader
- }
- func NewVerifyEmailFinalizeHandler(
- config *shared.Config,
- decoderValidator shared.RequestDecoderValidator,
- ) *VerifyEmailFinalizeHandler {
- return &VerifyEmailFinalizeHandler{
- PorterHandlerReader: handlers.NewDefaultPorterHandler(config, decoderValidator, nil),
- }
- }
- func (v *VerifyEmailFinalizeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- user, _ := r.Context().Value(types.UserScope).(*models.User)
- request := &types.VerifyEmailFinalizeRequest{}
- if err := v.DecodeAndValidateNoWrite(r, request); err != nil {
- http.Redirect(w, r, "/dashboard?error="+url.QueryEscape(err.Error()), 302)
- return
- }
- token, err := VerifyToken(
- v.Repo().PWResetToken(),
- handlers.IgnoreAPIError,
- w,
- &request.VerifyTokenFinalizeRequest,
- user.Email,
- )
- if err != nil {
- http.Redirect(w, r, "/dashboard?error="+url.QueryEscape("Email verification error: valid token required"), 302)
- return
- }
- user.EmailVerified = true
- user, err = v.Repo().User().UpdateUser(user)
- if err != nil {
- http.Redirect(w, r, "/dashboard?error="+url.QueryEscape("Could not verify email address"), 302)
- return
- }
- // invalidate the token
- token.IsValid = false
- _, err = v.Repo().PWResetToken().UpdatePWResetToken(token)
- if err != nil {
- http.Redirect(w, r, "/dashboard?error="+url.QueryEscape("Could not verify email address"), 302)
- return
- }
- http.Redirect(w, r, "/dashboard", 302)
- return
- }
|