Skip to content

Commit 8d90855

Browse files
committed
Start cookie implementation
1 parent 2cda838 commit 8d90855

File tree

1 file changed

+57
-10
lines changed

1 file changed

+57
-10
lines changed

main.go

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"html/template"
66
"log"
7+
"math/rand"
78
"net/http"
89
"time"
910

@@ -23,7 +24,14 @@ func init() {
2324
defer db.Close()
2425

2526
db.Update(func(tx *bolt.Tx) error {
26-
_, err := tx.CreateBucketIfNotExists([]byte("UsersBucket"))
27+
_, err := tx.CreateBucketIfNotExists([]byte("UsersBucket")) // username -> password
28+
if err != nil {
29+
return fmt.Errorf("Error with UsersBucket: %s", err)
30+
}
31+
return nil
32+
})
33+
db.Update(func(tx *bolt.Tx) error {
34+
_, err := tx.CreateBucketIfNotExists([]byte("CookieBucket")) // random string -> username
2735
if err != nil {
2836
return fmt.Errorf("Error with UsersBucket: %s", err)
2937
}
@@ -54,8 +62,9 @@ func LoginHandler(w http.ResponseWriter, req *http.Request, p httprouter.Params)
5462
}
5563

5664
func LogoutHandler(w http.ResponseWriter, req *http.Request, p httprouter.Params) {
57-
delete := http.Cookie{Name: "goblog", Value: "blah", Expires: time.Now(), HttpOnly: true, Path: "/"}
65+
delete := http.Cookie{Name: "goblog", Value: "delete", Expires: time.Now(), HttpOnly: true, Path: "/"}
5866
http.SetCookie(w, &delete)
67+
// Delete cookie from DB
5968
http.Redirect(w, req, "/", http.StatusFound)
6069
}
6170

@@ -119,7 +128,13 @@ func verifyUser(w http.ResponseWriter, r *http.Request, username string, passwor
119128
return nil
120129
})
121130
if password == string(correctpass) {
122-
cookie := http.Cookie{Name: "goblog", Value: "blah", Expires: time.Now().Add(time.Hour * 24 * 7 * 52), HttpOnly: true, MaxAge: 50000, Path: "/"}
131+
cookie := http.Cookie{Name: "goblog", Value: RandomString(), Expires: time.Now().Add(time.Hour * 24 * 7 * 52), HttpOnly: true, MaxAge: 50000, Path: "/"}
132+
db, err := bolt.Open("goblog.db", 0600, nil)
133+
db.Update(func(tx *bolt.Tx) error {
134+
b := tx.Bucket([]byte("CookieBucket"))
135+
err := b.Put([]byte(cookie.Value), []byte(username))
136+
return err
137+
})
123138
http.SetCookie(w, &cookie)
124139
return true
125140
}
@@ -149,21 +164,52 @@ func addUser(username string, password string) bool {
149164
}
150165
}
151166

167+
// http://stackoverflow.com/questions/22892120/how-to-generate-a-random-string-of-a-fixed-length-in-golang
168+
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
169+
const (
170+
letterIdxBits = 6 // 6 bits to represent a letter index
171+
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
172+
letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits
173+
)
174+
175+
var src = rand.NewSource(time.Now().UnixNano())
176+
177+
func RandomString() string {
178+
b := make([]byte, 20)
179+
for i, cache, remain := 20-1, src.Int63(), letterIdxMax; i >= 0; {
180+
if remain == 0 {
181+
cache, remain = src.Int63(), letterIdxMax
182+
}
183+
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
184+
b[i] = letterBytes[idx]
185+
i--
186+
}
187+
cache >>= letterIdxBits
188+
remain--
189+
}
190+
191+
return string(b)
192+
}
193+
152194
func getUser(w http.ResponseWriter, r *http.Request) string {
153195
cookie, err := r.Cookie("goblog")
154-
196+
servervalue := []byte("")
197+
db, err := bolt.Open("goblog.db", 0600, nil)
198+
db.View(func(tx *bolt.Tx) error {
199+
b := tx.Bucket([]byte("CookieBucket"))
200+
servervalue = b.Get([]byte(cookie.Value))
201+
return nil
202+
})
155203
if err == nil {
156-
if cookie.Value != "" {
157-
return cookieToUsername(cookie.Value)
204+
if len(servervalue) > 2 {
205+
if cookie.Value != "delete" {
206+
return string(servervalue)
207+
}
158208
}
159209
}
160210
return ""
161211
}
162212

163-
func cookieToUsername(cookie string) string {
164-
165-
}
166-
167213
func main() {
168214
router := httprouter.New()
169215
router.GET("/", MainPage)
@@ -173,5 +219,6 @@ func main() {
173219
router.POST("/signup/", SignupHandler)
174220
router.GET("/admin/", AdminPage)
175221
router.GET("/logout/", LogoutHandler)
222+
router.GET("/new/:email/:password", SignupHandler) // <- for testing
176223
log.Fatal(http.ListenAndServe(":1337", router))
177224
}

0 commit comments

Comments
 (0)