source: code/trunk/cmd/sojuctl/main.go@ 251

Last change on this file since 251 was 251, checked in by admin, 5 years ago

Add ability to change password

File size: 2.2 KB
Line 
1package main
2
3import (
4 "flag"
5 "fmt"
6 "log"
7 "os"
8
9 "git.sr.ht/~emersion/soju"
10 "git.sr.ht/~emersion/soju/config"
11 "golang.org/x/crypto/bcrypt"
12 "golang.org/x/crypto/ssh/terminal"
13)
14
15const usage = `usage: sojuctl [-config path] <action> [options...]
16
17 create-user <username> Create a new user
18 change-password <username> Change password for a user
19 help Show this help message
20`
21
22func init() {
23 flag.Usage = func() {
24 fmt.Fprintf(flag.CommandLine.Output(), usage)
25 }
26}
27
28func main() {
29 var configPath string
30 flag.StringVar(&configPath, "config", "", "path to configuration file")
31 flag.Parse()
32
33 var cfg *config.Server
34 if configPath != "" {
35 var err error
36 cfg, err = config.Load(configPath)
37 if err != nil {
38 log.Fatalf("failed to load config file: %v", err)
39 }
40 } else {
41 cfg = config.Defaults()
42 }
43
44 db, err := soju.OpenSQLDB(cfg.SQLDriver, cfg.SQLSource)
45 if err != nil {
46 log.Fatalf("failed to open database: %v", err)
47 }
48
49 switch cmd := flag.Arg(0); cmd {
50 case "create-user":
51 username := flag.Arg(1)
52 if username == "" {
53 flag.Usage()
54 os.Exit(1)
55 }
56
57 fmt.Printf("Password: ")
58 password, err := terminal.ReadPassword(int(os.Stdin.Fd()))
59 if err != nil {
60 log.Fatalf("failed to read password: %v", err)
61 }
62 fmt.Printf("\n")
63
64 hashed, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
65 if err != nil {
66 log.Fatalf("failed to hash password: %v", err)
67 }
68
69 user := soju.User{
70 Username: username,
71 Password: string(hashed),
72 }
73 if err := db.CreateUser(&user); err != nil {
74 log.Fatalf("failed to create user: %v", err)
75 }
76 case "change-password":
77 username := flag.Arg(1)
78 if username == "" {
79 flag.Usage()
80 os.Exit(1)
81 }
82
83 fmt.Printf("New password: ")
84 password, err := terminal.ReadPassword(int(os.Stdin.Fd()))
85 if err != nil {
86 log.Fatalf("failed to read new password: %v", err)
87 }
88 fmt.Printf("\n")
89
90 hashed, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
91 if err != nil {
92 log.Fatalf("failed to hash password: %v", err)
93 }
94
95 user := soju.User{
96 Username: username,
97 Password: string(hashed),
98 }
99 if err := db.UpdatePassword(&user); err != nil {
100 log.Fatalf("failed to update password: %v", err)
101 }
102
103 default:
104 flag.Usage()
105 if cmd != "help" {
106 os.Exit(1)
107 }
108 }
109}
Note: See TracBrowser for help on using the repository browser.