· 5 years ago · Oct 10, 2020, 10:56 AM
1package main
2
3import (
4 "bufio"
5 "database/sql"
6 "fmt"
7 "log"
8 "os"
9 "strings"
10
11 _ "github.com/mattn/go-sqlite3"
12)
13
14func login(sc *bufio.Reader) bool {
15 fmt.Print("Master Password: ")
16 pass, err := sc.ReadString('\n')
17 if err != nil {
18 log.Fatal(err)
19 }
20 pass = strings.TrimSuffix(pass, "\n")
21
22 return pass == "alok"
23}
24
25func options(sc *bufio.Reader) int {
26 fmt.Println("\n1. Add new password.")
27 fmt.Println("2. Remove password.")
28 fmt.Println("3. Query password.")
29 fmt.Println("4. Delete Database")
30
31 var choice int
32 fmt.Print(": ")
33 fmt.Scanf("%d", &choice)
34 fmt.Println()
35
36 return choice
37}
38
39// func goOptions(sc *bufio.Reader) error {
40// fmt.Println()
41// fmt.Print("Go back to options. [y/N]")
42// goOptions, err := sc.ReadString('\n')
43// if err != nil {
44// return err
45// }
46// goOptions = strings.TrimSuffix(goOptions, "\n")
47
48// if goOptions == "y" {
49// options(sc)
50// }
51// return nil
52// }
53
54func goBack(sc *bufio.Reader) (bool, error) {
55 fmt.Println()
56 fmt.Print("Continue? [y, N]: ")
57
58 input, err := sc.ReadString('\n')
59 if err != nil {
60 return false, err
61 }
62
63 input = strings.TrimSuffix(input, "\n")
64 if input == "y" {
65 return true, nil
66 } else {
67 return false, nil
68 }
69}
70
71func base(db *sql.DB, sc *bufio.Reader) {
72
73 var choice int
74 choice = options(sc)
75
76 switch choice {
77 case 1:
78 err := addPassword(db, sc)
79 if err != nil {
80 log.Fatal(err)
81 }
82 // case 2:
83 // err = removePassword(db, sc) TODO: Create a function to remove data.
84 case 3:
85 err := queryPassword(db, sc)
86 if err != nil {
87 log.Fatal(err)
88 }
89 }
90}
91
92func main() {
93 sc := bufio.NewReader(os.Stdin)
94
95 db, err := sql.Open("sqlite3", "./pass.db")
96 if err != nil {
97 log.Fatal(err)
98 }
99 defer db.Close()
100
101 err = createTable(db)
102 if err != nil {
103 log.Fatal(err)
104 }
105 authenticated := login(sc)
106 if authenticated {
107 base(db, sc)
108 } else {
109 log.Fatal("Wrong Password!!")
110 }
111}
112
113func createTable(db *sql.DB) error {
114 smt, err := db.Prepare("CREATE TABLE IF NOT EXISTS Passwords(Service, Password)")
115 if err != nil {
116 return err
117 }
118 smt.Exec()
119
120 return nil
121}
122
123func addPassword(db *sql.DB, sc *bufio.Reader) error {
124 fmt.Print("Service: ")
125 serviceName, err := sc.ReadString('\n')
126 if err != nil {
127 return err
128 }
129 serviceName = strings.TrimSuffix(serviceName, "\n")
130 fmt.Print("Password: ")
131 password, err := sc.ReadString('\n')
132 if err != nil {
133 return err
134 }
135 password = strings.TrimSuffix(password, "\n")
136
137 smt, err := db.Prepare("INSERT INTO Passwords(Service, Password) VALUES(?, ?)")
138 if err != nil {
139 return err
140 }
141 smt.Exec(serviceName, password)
142
143 cond, err := goBack(sc)
144 if err != nil {
145 return err
146 }
147
148 if cond {
149 base(db, sc)
150 } else {
151 fmt.Println("Thanks for using :P")
152 }
153 return nil
154}
155
156func queryPassword(db *sql.DB, sc *bufio.Reader) error {
157 fmt.Print("Service: ")
158 serviceName, err := sc.ReadString('\n')
159 if err != nil {
160 return err
161 }
162 serviceName = strings.TrimSuffix(serviceName, "\n")
163
164 rows, err := db.Query("SELECT Service, Password FROM Passwords")
165 if err != nil {
166 return err
167 }
168
169 var service, password string
170 for rows.Next() {
171 rows.Scan(&service, &password)
172 if service == serviceName {
173 break
174 }
175 }
176 fmt.Println("Password:", password)
177
178 cond, err := goBack(sc)
179 if err != nil {
180 return err
181 }
182
183 if cond {
184 base(db, sc)
185 } else {
186 fmt.Println("Thanks for using :P")
187 }
188 return nil
189}
190