· 5 years ago · Oct 10, 2020, 10:32 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 if pass == "alok" {
23 return true
24 }
25 return false
26}
27
28func options(sc *bufio.Reader) int {
29 fmt.Println("\n1. Add new password.")
30 fmt.Println("2. Remove password.")
31 fmt.Println("3. Query password.")
32 fmt.Println("4. Delete Database")
33
34 var choice int
35 fmt.Print(": ")
36 fmt.Scanf("%d", &choice)
37 fmt.Println()
38
39 return choice
40}
41
42func goOptions(sc *bufio.Reader) error {
43 fmt.Println()
44 fmt.Print("Go back to options. [y/N]")
45 goOptions, err := sc.ReadString('\n')
46 if err != nil {
47 return err
48 }
49 goOptions = strings.TrimSuffix(goOptions, "\n")
50
51 if goOptions == "y" {
52 options(sc)
53 }
54 return nil
55}
56
57func main() {
58 sc := bufio.NewReader(os.Stdin)
59
60 authenticated := login(sc)
61 var choice int
62 if authenticated {
63 choice = options(sc)
64 } else {
65 fmt.Println("Wrong password.")
66 }
67
68 db, err := sql.Open("sqlite3", "./pass.db")
69 if err != nil {
70 log.Fatal(err)
71 fmt.Println("Error opening DataBase.")
72 }
73 defer db.Close()
74
75 err = createTable(db)
76 if err != nil {
77 log.Fatal(err)
78 fmt.Println("Error creating table.")
79 }
80
81 switch choice {
82 case 1:
83 err = addPassword(db, sc)
84 if err != nil {
85 log.Fatal(err)
86 }
87 // case 2:
88 // err = removePassword(db, sc) TODO: Create a function to remove data.
89 case 3:
90 err = queryPassword(db, sc)
91 if err != nil {
92 log.Fatal(err)
93 }
94 }
95}
96
97func createTable(db *sql.DB) error {
98 smt, err := db.Prepare("CREATE TABLE IF NOT EXISTS Passwords(Service, Password)")
99 if err != nil {
100 return err
101 }
102 smt.Exec()
103
104 return nil
105}
106
107func addPassword(db *sql.DB, sc *bufio.Reader) error {
108 fmt.Print("Service: ")
109 serviceName, err := sc.ReadString('\n')
110 if err != nil {
111 return err
112 }
113 serviceName = strings.TrimSuffix(serviceName, "\n")
114 fmt.Print("Password: ")
115 password, err := sc.ReadString('\n')
116 if err != nil {
117 return err
118 }
119 password = strings.TrimSuffix(password, "\n")
120
121 smt, err := db.Prepare("INSERT INTO Passwords(Service, Password) VALUES(?, ?)")
122 if err != nil {
123 return err
124 }
125 smt.Exec(serviceName, password)
126 goOptions(sc)
127 return nil
128}
129
130func queryPassword(db *sql.DB, sc *bufio.Reader) error {
131 fmt.Print("Service: ")
132 serviceName, err := sc.ReadString('\n')
133 if err != nil {
134 return err
135 }
136 serviceName = strings.TrimSuffix(serviceName, "\n")
137
138 rows, err := db.Query("SELECT Service, Password FROM Passwords")
139 if err != nil {
140 return err
141 }
142
143 var service, password string
144 for rows.Next() {
145 rows.Scan(&service, &password)
146 if service == serviceName {
147 break
148 }
149 }
150 goOptions(sc)
151 return nil
152}
153