From 651330c23e168f742252a9842f4aaf48c56dec56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 21:15:12 +0200 Subject: [PATCH 01/25] add user struct and new method --- database/user.go | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/database/user.go b/database/user.go index 879c88b..94b33bd 100644 --- a/database/user.go +++ b/database/user.go @@ -1,27 +1,28 @@ package database -import( - "log" -) - -const qGetUser = "select login from gf_user where session = $1" - -func GetUser(token string)string{ - conn :=Open() - defer conn.Close() - - var user string +//User object retrieved from database +type User struct{ + Id int64 + Login string + Admin bool + Session string +} - row := conn.QueryRow(qGetUser, token) +const qGetUser = "select id, login, mod, session from gf_user where id = $1" - err := row.Scan(&user) +func GetUser(id int64)(*User, error){ + conn := Open() + defer conn.Close() + + user = new(User) + var mod int64 - if err != nil{ - log.Println(err) - return "" - } + row := conn.QueryRow(qGetUser, id) + err := row.Scan(&user.Id, &user.Login, &mod, &user.Session) - return user + &user.Admin = mod == 1 + return &user +} } From db44e9c85ef412670aca526e1b8518ab9da5f6f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 21:48:16 +0200 Subject: [PATCH 02/25] change login --- web/login.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/web/login.go b/web/login.go index aaa1f18..c1b59e8 100644 --- a/web/login.go +++ b/web/login.go @@ -2,8 +2,8 @@ package web import( "net/http" - db "gofire/database" "time" + "log" ) func LoginHandler(w http.ResponseWriter, r *http.Request){ @@ -11,16 +11,13 @@ func LoginHandler(w http.ResponseWriter, r *http.Request){ username := r.FormValue("user") password := r.FormValue("pw") - token := db.IsUserPasswordValid(username, password) + //token := db.IsUserPasswordValid(username, password) - if token == ""{ + /*if token == ""{ http.Redirect(w, r, "/", http.StatusFound) return - } + }*/ - d := time.Now().Add(356*24*time.Hour) - cookie := &http.Cookie{Name:GofireSession, Value:token, Expires:d, HttpOnly:true} - http.SetCookie(w, cookie) http.Redirect(w, r, "/chat", http.StatusFound) return } From edeeb041d3066423c126ae1cf671172a66b1524c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 21:48:48 +0200 Subject: [PATCH 03/25] add cookiestore --- web/web.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/web/web.go b/web/web.go index 661cf3a..41f80d2 100644 --- a/web/web.go +++ b/web/web.go @@ -8,12 +8,18 @@ import ( "os" db "gofire/database" "fmt" + "github.com/gorilla/sessions" ) var templates *template.Template var staticDir string +const cookieName = "this-is-the-most-awesome-cookie-name" + +//memory-cookiename +var store = sessions.NewCookieStore([]byte("you-cannot-hack-this")) + func init() { tdir := os.Getenv("TEMPLATE") log.Printf("Template Directory: %s\n", tdir) From d44cf579c6f393544d961f26ebcbb333ff5817a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 21:55:06 +0200 Subject: [PATCH 04/25] add get for id --- database/user.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/database/user.go b/database/user.go index 94b33bd..bd1a7e1 100644 --- a/database/user.go +++ b/database/user.go @@ -10,6 +10,7 @@ type User struct{ const qGetUser = "select id, login, mod, session from gf_user where id = $1" +//retrieve userobject with id func GetUser(id int64)(*User, error){ conn := Open() defer conn.Close() @@ -25,4 +26,18 @@ func GetUser(id int64)(*User, error){ return &user } +const qGetUserId = "select id from gf_user where login=$1 and pw=$2" + +//get user id with username and password combination +func GetUserId(username, password)(int64, error){ + conn := Open() + defer conn + + var id int64 + + row := conn.QueryRow(qGetUserId, username, sha512(password)) + + err := row.Scan(&id) + + return id, err } From 17fd4ae1a47d4c175c74aaecd232045d203b6212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 21:58:42 +0200 Subject: [PATCH 05/25] fix syntax errors --- database/user.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/database/user.go b/database/user.go index bd1a7e1..5cc0852 100644 --- a/database/user.go +++ b/database/user.go @@ -15,23 +15,23 @@ func GetUser(id int64)(*User, error){ conn := Open() defer conn.Close() - user = new(User) + user := new(User) var mod int64 row := conn.QueryRow(qGetUser, id) - err := row.Scan(&user.Id, &user.Login, &mod, &user.Session) + err := row.Scan(user.Id, user.Login, &mod, user.Session) - &user.Admin = mod == 1 + user.Admin = mod == 1 - return &user + return user, err } const qGetUserId = "select id from gf_user where login=$1 and pw=$2" //get user id with username and password combination -func GetUserId(username, password)(int64, error){ +func GetUserId(username, password string)(int64, error){ conn := Open() - defer conn + defer conn.Close() var id int64 From ba43e83ddb562f7c3ae06906e03cdc4ac592ede4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 22:06:26 +0200 Subject: [PATCH 06/25] upgrade to memory sessionstore --- web/login.go | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/web/login.go b/web/login.go index c1b59e8..fc22f8d 100644 --- a/web/login.go +++ b/web/login.go @@ -2,8 +2,8 @@ package web import( "net/http" - "time" "log" + "gofire/database" ) func LoginHandler(w http.ResponseWriter, r *http.Request){ @@ -11,12 +11,27 @@ func LoginHandler(w http.ResponseWriter, r *http.Request){ username := r.FormValue("user") password := r.FormValue("pw") - //token := db.IsUserPasswordValid(username, password) + id, err := database.GetUserId(username, password) - /*if token == ""{ - http.Redirect(w, r, "/", http.StatusFound) - return - }*/ + log.Println(id) + + if err != nil{ + log.Println(err) + http.Redirect(w, r, "/", http.StatusFound) + return + } + + session , err := store.Get(r, cookieName) + + if err != nil{ + log.Println(err) + http.Redirect(w, r, "/", http.StatusFound) + return + } + + session.Values["id"] = id + + store.Save(r, w, session) http.Redirect(w, r, "/chat", http.StatusFound) return From be67349b85a13030c220e906e081d6a8ec97f119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 22:11:16 +0200 Subject: [PATCH 07/25] check if session is new or not --- web/chat.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/web/chat.go b/web/chat.go index 5c80385..7983e53 100644 --- a/web/chat.go +++ b/web/chat.go @@ -5,12 +5,13 @@ import( ) func ChatHandler(w http.ResponseWriter, r *http.Request){ - token := CheckSession(r) - if token == ""{ - http.Redirect(w, r, "/", http.StatusFound) - return - } + session, err := store.Get(r, cookieName) + + if err != nil || session.IsNew { + http.Redirect(w,r, "/", http.StatusFound) + return + } w.Header().Set("content-type", "text/html") templates.ExecuteTemplate(w,"chat", r.Host) From 9774d7668ab9449d360999455375076814aba425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 22:28:03 +0200 Subject: [PATCH 08/25] fix pointer problems --- database/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/user.go b/database/user.go index 5cc0852..4955c7e 100644 --- a/database/user.go +++ b/database/user.go @@ -19,7 +19,7 @@ func GetUser(id int64)(*User, error){ var mod int64 row := conn.QueryRow(qGetUser, id) - err := row.Scan(user.Id, user.Login, &mod, user.Session) + err := row.Scan(&user.Id, &user.Login, &mod, &user.Session) user.Admin = mod == 1 From f73a8be971b75dcddef059e02c3ff3257d21063f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 22:35:03 +0200 Subject: [PATCH 09/25] transferred sockethandler into web --- main.go | 4 ++-- web/socket.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 web/socket.go diff --git a/main.go b/main.go index bd05d2a..de78edd 100644 --- a/main.go +++ b/main.go @@ -6,8 +6,8 @@ import( "net/http" "os" "gofire/web" - "gofire/socket" "code.google.com/p/go.net/websocket" + "gofire/socket" ) const StandardPort = "8080" @@ -46,7 +46,7 @@ func main(){ socket.Start() log.Println("Fireserver is running") - http.Handle("/ws",websocket.Handler(socket.SocketHandler)) + http.Handle("/ws",websocket.Handler(web.SocketHandler)) log.Printf("Server started on : %s:%s",addr, port) err := http.ListenAndServe(fmt.Sprintf("%s:%s",addr,port),nil) diff --git a/web/socket.go b/web/socket.go new file mode 100644 index 0000000..0065c83 --- /dev/null +++ b/web/socket.go @@ -0,0 +1,31 @@ +package web + +import( + db "gofire/database" + "code.google.com/p/go.net/websocket" + "log" + "net/http" + "gofire/socket" +) + +func SocketHandler(conn *websocket.Conn){ + + session, err := store.Get(conn.Request(), cookieName) + + if session.IsNew || err != nil{ + log.Println("Error Socket: ", err) + http.Redirect(nil, conn.Request(), "/", http.StatusFound) + return + } + + id, _ := session.Values["id"].(int64) + + user, err := db.GetUser(id) + + if err != nil{ + log.Println("DB-Error: ",err) + return + } + + socket.RegisterConnection(conn, user) +} From 94d00073b2205afd251068283e5b2965e2eccc0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 22:35:28 +0200 Subject: [PATCH 10/25] delete sockethandler cause of move --- socket/socket.go | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/socket/socket.go b/socket/socket.go index 5673069..74da76b 100644 --- a/socket/socket.go +++ b/socket/socket.go @@ -1,7 +1,6 @@ package socket import( - "gofire/web" db "gofire/database" "code.google.com/p/go.net/websocket" "log" @@ -81,22 +80,9 @@ func (c *connection)reader(){ c.conn.Close() } - -func SocketHandler(conn *websocket.Conn){ - token := web.CheckSession(conn.Request()) - - if token == ""{ - return - } - - username := db.GetUser(token) - - if username == ""{ - return - } - +func RegisterConnection(conn *websocket.Conn, user *db.User){ c := &connection{ - username, + user.Login, conn, make(chan message), } From ae141964e7c33a36993207760120d6811c371c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 22:54:37 +0200 Subject: [PATCH 11/25] fix mod --- database/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/user.go b/database/user.go index 4955c7e..cb551a6 100644 --- a/database/user.go +++ b/database/user.go @@ -21,7 +21,7 @@ func GetUser(id int64)(*User, error){ row := conn.QueryRow(qGetUser, id) err := row.Scan(&user.Id, &user.Login, &mod, &user.Session) - user.Admin = mod == 1 + user.Admin = mod == 0 return user, err } From 88283d0492692bf5339dbe489e49c0ab836b0b92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20D=C3=A4llenbach?= Date: Fri, 31 May 2013 22:55:19 +0200 Subject: [PATCH 12/25] use user object for determining if admin --- template/chat.html | 6 +++++- web/chat.go | 21 ++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/template/chat.html b/template/chat.html index a50bd2a..2d7e513 100755 --- a/template/chat.html +++ b/template/chat.html @@ -103,6 +103,10 @@
+ {{if .User.Admin}} + + Hallo Admin + {{end}}
@@ -110,7 +114,7 @@ logout