Add an API to reset the password

This commit is contained in:
Nikolai Rodionov 2024-05-22 10:42:17 +02:00
parent a631d5dbfc
commit 6e1edec413
Signed by: allanger
GPG Key ID: 0AA46A90E25592AD
2 changed files with 48 additions and 1 deletions

View File

@ -86,12 +86,21 @@ func (a *AccountsServer) ResetPassword(ctx context.Context, in *accounts.Account
header := metadata.Pairs("code", code)
if err := grpc.SendHeader(ctx, header); err != nil {
return nil, err
}
}
}
return &emptypb.Empty{}, nil
}
func (acc *AccountsServer) NewPassword(ctx context.Context, in *accounts.AccountWithPasswordAndCode) (*empty.Empty, error) {
data := populateData(in.Data.GetName(), in.Password.GetPassword(), in.Data.GetEmail())
account := populateAccount(data, acc.Controller)
if err := account.NewPassword(ctx, in.GetCode()); err != nil {
return nil, err
}
return &emptypb.Empty{}, nil
}
func populateData(username, password, email string) *controllers.AccountData {
return &controllers.AccountData{
Username: username,

View File

@ -265,6 +265,44 @@ func (acc *Account) ResetPassword(ctx context.Context, emailConfig email.EmailCo
return number, nil
}
func (acc *Account) NewPassword(ctx context.Context, code string) error {
clientset, err := kubernetes.NewForConfig(acc.Controller.GetConfig())
if err != nil {
return err
}
userdata, err := clientset.CoreV1().Secrets("softplayer-accounts").Get(ctx, acc.Data.Username, metav1.GetOptions{})
if err != nil {
return err
}
acc.Data.UUID = string(userdata.Data["uuid"])
secretName := "password-reset-code"
sec, err := clientset.CoreV1().Secrets(acc.Data.UUID).Get(ctx, secretName, metav1.GetOptions{})
if err != nil {
return err
}
if realCode, ok := sec.Data["code"]; ok {
if string(realCode) != code {
return errors.New("wrong code")
}
} else {
return errors.New("secret not found")
}
passwordHash, err := hash.HashPassword(acc.Data.Password, int(acc.Params.HashCost))
if err != nil {
return nil
}
userdata.Data["password"] = []byte(passwordHash)
_, err = clientset.CoreV1().Secrets(acc.Data.UUID).Update(ctx, userdata, metav1.UpdateOptions{})
if err != nil {
return err
}
return nil
}
func (acc *Account) getToken(ctx context.Context, saSec *corev1.Secret) (string, error) {
client := acc.Controller.GetClient()
if err := client.Get(ctx, types.NamespacedName{