63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
|
package admintools
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
|
||
|
"git.handmade.network/hmn/hmn/src/auth"
|
||
|
"git.handmade.network/hmn/hmn/src/db"
|
||
|
"git.handmade.network/hmn/hmn/src/website"
|
||
|
"github.com/jackc/pgx/v4"
|
||
|
"github.com/spf13/cobra"
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
setPasswordCommand := &cobra.Command{
|
||
|
Use: "setpassword [username] [new password]",
|
||
|
Short: "Replace a user's password",
|
||
|
Run: func(cmd *cobra.Command, args []string) {
|
||
|
if len(args) < 2 {
|
||
|
fmt.Printf("You must provide a username and a password.\n\n")
|
||
|
cmd.Usage()
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
|
||
|
username := args[0]
|
||
|
password := args[1]
|
||
|
|
||
|
ctx := context.Background()
|
||
|
conn := db.NewConnPool(1, 1)
|
||
|
defer conn.Close()
|
||
|
|
||
|
row := conn.QueryRow(ctx, "SELECT id, username FROM auth_user WHERE lower(username) = lower($1)", username)
|
||
|
var id int
|
||
|
var canonicalUsername string
|
||
|
err := row.Scan(&id, &canonicalUsername)
|
||
|
if err != nil {
|
||
|
if errors.Is(err, pgx.ErrNoRows) {
|
||
|
fmt.Printf("User '%s' not found\n", username)
|
||
|
os.Exit(1)
|
||
|
} else {
|
||
|
panic(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
hashedPassword, err := auth.HashPassword(password)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
err = auth.UpdatePassword(ctx, conn, canonicalUsername, hashedPassword)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
fmt.Printf("Successfully updated password for '%s'\n", canonicalUsername)
|
||
|
},
|
||
|
}
|
||
|
|
||
|
website.WebsiteCommand.AddCommand(setPasswordCommand)
|
||
|
}
|