reset password command

This commit is contained in:
Niko Abeler 2023-08-12 20:39:07 +02:00
parent b0a6a0d417
commit 0bbcde6ff6
6 changed files with 71 additions and 1 deletions

View File

@ -36,6 +36,21 @@ func (s *AuthorService) Create(name string, password string) (*model.Author, err
return s.repo.Create(name, hash) return s.repo.Create(name, hash)
} }
func (s *AuthorService) SetPassword(name string, password string) error {
hash, err := hashPassword(password)
if err != nil {
return err
}
author, err := s.repo.FindByName(name)
if err != nil {
return err
}
author.PasswordHash = hash
err = s.repo.Update(author)
return err
}
func (s *AuthorService) FindByName(name string) (*model.Author, error) { func (s *AuthorService) FindByName(name string) (*model.Author, error) {
return s.repo.FindByName(name) return s.repo.FindByName(name)
} }

View File

@ -27,6 +27,8 @@ type AuthorRepository interface {
// Create creates a new author // Create creates a new author
// It returns an error if the name is already taken // It returns an error if the name is already taken
Create(name string, passwordHash string) (*model.Author, error) Create(name string, passwordHash string) (*model.Author, error)
Update(author *model.Author) error
// FindByName finds an author by name // FindByName finds an author by name
// It returns an error if the author is not found // It returns an error if the author is not found
FindByName(name string) (*model.Author, error) FindByName(name string) (*model.Author, error)

View File

@ -56,11 +56,13 @@ func getWebmentionService() *app.WebmentionService {
interactionRepo := infra.NewInteractionRepo(db, interactionRegister) interactionRepo := infra.NewInteractionRepo(db, interactionRegister)
configRepo := infra.NewConfigRepo(db)
bus := app.NewEventBus() bus := app.NewEventBus()
http := infra.OwlHttpClient{} http := infra.OwlHttpClient{}
return app.NewWebmentionService( return app.NewWebmentionService(
interactionRepo, entryRepo, &http, bus, configRepo, interactionRepo, entryRepo, &http, bus,
) )
} }

26
cmd/owl/reset_password.go Normal file
View File

@ -0,0 +1,26 @@
package main
import (
"owl-blogs/infra"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(resetPasswordCmd)
resetPasswordCmd.Flags().StringVarP(&user, "user", "u", "", "The user name")
resetPasswordCmd.MarkFlagRequired("user")
resetPasswordCmd.Flags().StringVarP(&password, "password", "p", "", "The new password")
resetPasswordCmd.MarkFlagRequired("password")
}
var resetPasswordCmd = &cobra.Command{
Use: "reset-password",
Short: "Resets the password of an author",
Long: `Resets the password of an author`,
Run: func(cmd *cobra.Command, args []string) {
db := infra.NewSqliteDB(DbPath)
App(db).AuthorService.Create(user, password)
},
}

View File

@ -59,3 +59,12 @@ func (r *DefaultAuthorRepo) Create(name string, passwordHash string) (*model.Aut
PasswordHash: author.PasswordHash, PasswordHash: author.PasswordHash,
}, nil }, nil
} }
func (r *DefaultAuthorRepo) Update(author *model.Author) error {
sqlA := sqlAuthor{
Name: author.Name,
PasswordHash: author.PasswordHash,
}
_, err := r.db.NamedExec("UPDATE authors SET password_hash = :password_hash WHERE name = :name", sqlA)
return err
}

View File

@ -45,3 +45,19 @@ func TestAuthorRepoNoSideEffect(t *testing.T) {
require.Equal(t, author2.Name, "name2") require.Equal(t, author2.Name, "name2")
require.Equal(t, author2.PasswordHash, "password2") require.Equal(t, author2.PasswordHash, "password2")
} }
func TestAuthorUpdate(t *testing.T) {
repo := setupAutherRepo()
author, err := repo.Create("name1", "password1")
require.NoError(t, err)
author.PasswordHash = "password2"
err = repo.Update(author)
require.NoError(t, err)
author, err = repo.FindByName("name1")
require.NoError(t, err)
require.Equal(t, author.PasswordHash, "password2")
}