mirror of
https://github.com/zitadel/zitadel.git
synced 2024-12-15 04:18:01 +00:00
82e7333169
* feat(api): add password reset and change to user service * integration tests * invalidate password check after password change * handle notification type * fix proto
72 lines
2.7 KiB
Go
72 lines
2.7 KiB
Go
package user
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/zitadel/zitadel/internal/api/authz"
|
|
"github.com/zitadel/zitadel/internal/api/grpc/object/v2"
|
|
"github.com/zitadel/zitadel/internal/domain"
|
|
caos_errs "github.com/zitadel/zitadel/internal/errors"
|
|
user "github.com/zitadel/zitadel/pkg/grpc/user/v2alpha"
|
|
)
|
|
|
|
func (s *Server) PasswordReset(ctx context.Context, req *user.PasswordResetRequest) (_ *user.PasswordResetResponse, err error) {
|
|
var details *domain.ObjectDetails
|
|
var code *string
|
|
|
|
switch m := req.GetMedium().(type) {
|
|
case *user.PasswordResetRequest_SendLink:
|
|
details, code, err = s.command.RequestPasswordResetURLTemplate(ctx, req.GetUserId(), m.SendLink.GetUrlTemplate(), notificationTypeToDomain(m.SendLink.GetNotificationType()))
|
|
case *user.PasswordResetRequest_ReturnCode:
|
|
details, code, err = s.command.RequestPasswordResetReturnCode(ctx, req.GetUserId())
|
|
case nil:
|
|
details, code, err = s.command.RequestPasswordReset(ctx, req.GetUserId())
|
|
default:
|
|
err = caos_errs.ThrowUnimplementedf(nil, "USERv2-SDeeg", "verification oneOf %T in method RequestPasswordReset not implemented", m)
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &user.PasswordResetResponse{
|
|
Details: object.DomainToDetailsPb(details),
|
|
VerificationCode: code,
|
|
}, nil
|
|
}
|
|
|
|
func notificationTypeToDomain(notificationType user.NotificationType) domain.NotificationType {
|
|
switch notificationType {
|
|
case user.NotificationType_NOTIFICATION_TYPE_Email:
|
|
return domain.NotificationTypeEmail
|
|
case user.NotificationType_NOTIFICATION_TYPE_SMS:
|
|
return domain.NotificationTypeSms
|
|
case user.NotificationType_NOTIFICATION_TYPE_Unspecified:
|
|
return domain.NotificationTypeEmail
|
|
default:
|
|
return domain.NotificationTypeEmail
|
|
}
|
|
}
|
|
|
|
func (s *Server) SetPassword(ctx context.Context, req *user.SetPasswordRequest) (_ *user.SetPasswordResponse, err error) {
|
|
var resourceOwner = authz.GetCtxData(ctx).ResourceOwner
|
|
var details *domain.ObjectDetails
|
|
|
|
switch v := req.GetVerification().(type) {
|
|
case *user.SetPasswordRequest_CurrentPassword:
|
|
details, err = s.command.ChangePassword(ctx, resourceOwner, req.GetUserId(), v.CurrentPassword, req.GetNewPassword().GetPassword(), "")
|
|
case *user.SetPasswordRequest_VerificationCode:
|
|
details, err = s.command.SetPasswordWithVerifyCode(ctx, resourceOwner, req.GetUserId(), v.VerificationCode, req.GetNewPassword().GetPassword(), "")
|
|
case nil:
|
|
details, err = s.command.SetPassword(ctx, resourceOwner, req.GetUserId(), req.GetNewPassword().GetPassword(), req.GetNewPassword().GetChangeRequired())
|
|
default:
|
|
err = caos_errs.ThrowUnimplementedf(nil, "USERv2-SFdf2", "verification oneOf %T in method SetPasswordRequest not implemented", v)
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &user.SetPasswordResponse{
|
|
Details: object.DomainToDetailsPb(details),
|
|
}, nil
|
|
}
|