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
5664func 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+
152194func 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-
167213func 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