diff --git a/cmd/autobrrctl/main.go b/cmd/autobrrctl/main.go index 4cd5c05..c4e87b3 100644 --- a/cmd/autobrrctl/main.go +++ b/cmd/autobrrctl/main.go @@ -77,6 +77,35 @@ func main() { if err := userRepo.Store(user); err != nil { log.Fatalf("failed to create user: %v", err) } + case "change-password": + username := flag.Arg(1) + if username == "" { + flag.Usage() + os.Exit(1) + } + + user, err := userRepo.FindByUsername(username) + if err != nil { + log.Fatalf("failed to get user: %v", err) + } + + if user == nil { + log.Fatalf("failed to get user: %v", err) + } + + password, err := readPassword() + if err != nil { + log.Fatalf("failed to read password: %v", err) + } + hashed, err := argon2id.CreateHash(string(password), argon2id.DefaultParams) + if err != nil { + log.Fatalf("failed to hash password: %v", err) + } + + user.Password = hashed + if err := userRepo.Store(*user); err != nil { + log.Fatalf("failed to create user: %v", err) + } default: flag.Usage() if cmd != "help" { diff --git a/internal/database/user.go b/internal/database/user.go index 7a105d7..aa10309 100644 --- a/internal/database/user.go +++ b/internal/database/user.go @@ -35,13 +35,24 @@ func (r *UserRepo) FindByUsername(username string) (*domain.User, error) { } func (r *UserRepo) Store(user domain.User) error { - query := `INSERT INTO users (username, password) VALUES (?, ?)` - _, err := r.db.Exec(query, user.Username, user.Password) - if err != nil { - log.Error().Stack().Err(err).Msg("error executing query") - return err + var err error + if user.ID != 0 { + update := `UPDATE users SET password = ? WHERE username = ?` + _, err = r.db.Exec(update, user.Password, user.Username) + if err != nil { + log.Error().Stack().Err(err).Msg("error executing query") + return err + } + + } else { + query := `INSERT INTO users (username, password) VALUES (?, ?)` + _, err = r.db.Exec(query, user.Username, user.Password) + if err != nil { + log.Error().Stack().Err(err).Msg("error executing query") + return err + } } - return nil + return err }