63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package repl
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/spf13/cobra"
|
|
"gitlink.org.cn/cloudream/jcs-pub/coordinator/internal/db"
|
|
cortypes "gitlink.org.cn/cloudream/jcs-pub/coordinator/types"
|
|
"golang.org/x/crypto/bcrypt"
|
|
"golang.org/x/term"
|
|
)
|
|
|
|
func init() {
|
|
userCmd := &cobra.Command{
|
|
Use: "user",
|
|
Short: "user command",
|
|
}
|
|
RootCmd.AddCommand(userCmd)
|
|
|
|
createCmd := &cobra.Command{
|
|
Use: "create [account] [nickName]",
|
|
Short: "create a new user account",
|
|
Args: cobra.ExactArgs(2),
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
userCreate(GetCmdCtx(cmd), args[0], args[1])
|
|
},
|
|
}
|
|
userCmd.AddCommand(createCmd)
|
|
}
|
|
|
|
func userCreate(ctx *CommandContext, account string, nickName string) {
|
|
_, err := ctx.repl.db.User().GetByAccount(ctx.repl.db.DefCtx(), account)
|
|
if err == nil {
|
|
fmt.Printf("user %s already exists\n", account)
|
|
return
|
|
}
|
|
|
|
fmt.Printf("input account password: ")
|
|
pass, err := term.ReadPassword(int(os.Stdin.Fd()))
|
|
if err != nil {
|
|
fmt.Println("error reading password:", err)
|
|
return
|
|
}
|
|
|
|
passHash, err := bcrypt.GenerateFromPassword(pass, bcrypt.DefaultCost)
|
|
if err != nil {
|
|
fmt.Println("error hashing password:", err)
|
|
return
|
|
}
|
|
|
|
user, err := db.DoTx02(ctx.repl.db, func(tx db.SQLContext) (cortypes.User, error) {
|
|
return ctx.repl.db.User().Create(tx, account, hex.EncodeToString(passHash), nickName)
|
|
})
|
|
if err != nil {
|
|
fmt.Println("error creating user:", err)
|
|
return
|
|
}
|
|
|
|
fmt.Printf("user %s created\n", user.Account)
|
|
}
|