fix for mail login
This commit is contained in:
parent
68875a5f0f
commit
aa2fc45bdd
2 changed files with 56 additions and 0 deletions
|
|
@ -4,7 +4,9 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
accountapp "telesrv/internal/app/account"
|
||||||
"telesrv/internal/domain"
|
"telesrv/internal/domain"
|
||||||
"telesrv/internal/store/memory"
|
"telesrv/internal/store/memory"
|
||||||
)
|
)
|
||||||
|
|
@ -164,3 +166,47 @@ func TestEmailSignupForcesLoginEmailSetupForRealPhoneNumbers(t *testing.T) {
|
||||||
t.Fatalf("SignUp err = %v, want ErrCodeInvalid (email setup was never completed)", err)
|
t.Fatalf("SignUp err = %v, want ErrCodeInvalid (email setup was never completed)", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// An email-signup account's whole identity is the email it verified, so
|
||||||
|
// Settings' "login email" (account_passwords.login_email, the older
|
||||||
|
// recovery-email feature reused here for delivery) must reflect it right
|
||||||
|
// after SignUp — otherwise a freshly created account looks like it has no
|
||||||
|
// login email configured even though it plainly does.
|
||||||
|
func TestEmailSignupSignUpPopulatesLoginEmail(t *testing.T) {
|
||||||
|
ctx := context.Background()
|
||||||
|
users := memory.NewUserStore()
|
||||||
|
authz := memory.NewAuthorizationStore()
|
||||||
|
codes := memory.NewCodeStore()
|
||||||
|
passwords := memory.NewPasswordStore()
|
||||||
|
sender := &testMailSender{}
|
||||||
|
accountSvc := accountapp.NewService(passwords,
|
||||||
|
accountapp.WithUsers(users),
|
||||||
|
accountapp.WithLoginEmailVerification(codes, sender, time.Minute, 3, 6),
|
||||||
|
)
|
||||||
|
svc := NewService(users, authz, codes, nil, nil, "12345",
|
||||||
|
WithLoginEmail(LoginEmailOptions{Store: accountSvc, Sender: sender}),
|
||||||
|
WithEmailSignup(true))
|
||||||
|
|
||||||
|
phone, ok := domain.EncodeEmailPhone("loginemail@owpengram.local")
|
||||||
|
if !ok {
|
||||||
|
t.Fatalf("EncodeEmailPhone: ok=false")
|
||||||
|
}
|
||||||
|
hash, err := svc.SendCode(ctx, phone)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("SendCode: %v", err)
|
||||||
|
}
|
||||||
|
if _, _, needSignUp, err := svc.SignInWithEmail(ctx, domain.Authorization{}, phone, hash, sender.code); err != nil || !needSignUp {
|
||||||
|
t.Fatalf("SignInWithEmail: needSignUp=%v err=%v", needSignUp, err)
|
||||||
|
}
|
||||||
|
u, _, err := svc.SignUp(ctx, domain.Authorization{}, phone, hash, "Login", "Email")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("SignUp: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if email, found, err := accountSvc.LoginEmail(ctx, u.ID); err != nil || !found || email != "loginemail@owpengram.local" {
|
||||||
|
t.Fatalf("LoginEmail(%d) = %q found=%v err=%v, want loginemail@owpengram.local", u.ID, email, found, err)
|
||||||
|
}
|
||||||
|
if email, found, err := accountSvc.LoginEmailByPhone(ctx, u.Phone); err != nil || !found || email != "loginemail@owpengram.local" {
|
||||||
|
t.Fatalf("LoginEmailByPhone(%q) = %q found=%v err=%v", u.Phone, email, found, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1053,6 +1053,16 @@ func (s *Service) SignUp(ctx context.Context, auth domain.Authorization, phone,
|
||||||
if err := s.loginEmails.SetLoginEmail(ctx, u.ID, rec.PendingEmail); err != nil {
|
if err := s.loginEmails.SetLoginEmail(ctx, u.ID, rec.PendingEmail); err != nil {
|
||||||
return domain.User{}, domain.Message{}, err
|
return domain.User{}, domain.Message{}, err
|
||||||
}
|
}
|
||||||
|
} else if u.SignupEmail != "" && s.loginEmails != nil {
|
||||||
|
// Email-signup accounts have no phone number of their own to fall back
|
||||||
|
// on — the email they just verified *is* their account identity — so
|
||||||
|
// the "login email" shown in Settings (account_passwords.login_email,
|
||||||
|
// the older recovery-email feature reused for delivery) must be
|
||||||
|
// populated too, or a freshly created account looks like it has none
|
||||||
|
// configured even though it plainly does.
|
||||||
|
if err := s.loginEmails.SetLoginEmail(ctx, u.ID, u.SignupEmail); err != nil {
|
||||||
|
return domain.User{}, domain.Message{}, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if err := s.bind(ctx, auth, u.ID); err != nil {
|
if err := s.bind(ctx, auth, u.ID); err != nil {
|
||||||
return domain.User{}, domain.Message{}, err
|
return domain.User{}, domain.Message{}, err
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue