summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Pointner <equinox@helsinki.at>2015-12-30 21:42:59 (GMT)
committerChristian Pointner <equinox@helsinki.at>2015-12-30 21:42:59 (GMT)
commitb48b8d760021bd7a887a24c4bbd239f90c2c2f22 (patch)
tree27c20e906a1dd83734dbdb854fb8863aa0f622c7 /src
parenta37f02747e587b25d45de98d175427d4ccb5cdf7 (diff)
web socket handler is now completed
Diffstat (limited to 'src')
-rw-r--r--src/helsinki.at/rhimport/session_store.go34
-rw-r--r--src/helsinki.at/rhimportd/ctrlWebSocket.go14
-rw-r--r--src/helsinki.at/rhimportd/main.go98
3 files changed, 27 insertions, 119 deletions
diff --git a/src/helsinki.at/rhimport/session_store.go b/src/helsinki.at/rhimport/session_store.go
index 0d149c6..9566293 100644
--- a/src/helsinki.at/rhimport/session_store.go
+++ b/src/helsinki.at/rhimport/session_store.go
@@ -89,6 +89,8 @@ type SessionStoreElement struct {
type SessionStore struct {
store map[string]map[string]*SessionStoreElement
+ conf *Config
+ rddb *RdDbChan
quit chan bool
done chan bool
newChan chan newSessionRequest
@@ -109,7 +111,7 @@ func (self *SessionStore) new(ctx *ImportContext, refId string) (resp newSession
resp.responsecode = http.StatusOK
resp.errorstring = "OK"
if !ctx.Trusted {
- if ok, err := ctx.rddb.CheckPassword(ctx.UserName, ctx.Password); err != nil {
+ if ok, err := self.rddb.CheckPassword(ctx.UserName, ctx.Password); err != nil {
resp.responsecode = http.StatusInternalServerError
resp.errorstring = err.Error()
return
@@ -127,6 +129,8 @@ func (self *SessionStore) new(ctx *ImportContext, refId string) (resp newSession
if _, exists := self.store[ctx.UserName]; !exists {
self.store[ctx.UserName] = make(map[string]*SessionStoreElement)
}
+ ctx.conf = self.conf
+ ctx.rddb = self.rddb
s := &SessionStoreElement{NewSession(ctx, func() { self.GetInterface().Remove(ctx.UserName, resp.id) }), refId}
self.store[ctx.UserName][resp.id] = s
resp.session = self.store[ctx.UserName][resp.id].s.getInterface()
@@ -151,18 +155,17 @@ func (self *SessionStore) get(user, id string) (resp getSessionResponse) {
func (self *SessionStore) list(user, password string, trusted bool) (resp listSessionsResponse) {
resp.responsecode = http.StatusOK
resp.errorstring = "OK"
- // TODO: enable this check as soon as the session store handles the rddb itself
- // if !trusted {
- // if ok, err := self.rddb.CheckPassword(user, password); err != nil {
- // resp.responsecode = http.StatusInternalServerError
- // resp.errorstring = err.Error()
- // return
- // } else if !ok {
- // resp.responsecode = http.StatusUnauthorized
- // resp.errorstring = "invalid username and/or password"
- // return
- // }
- // }
+ if !trusted {
+ if ok, err := self.rddb.CheckPassword(user, password); err != nil {
+ resp.responsecode = http.StatusInternalServerError
+ resp.errorstring = err.Error()
+ return
+ } else if !ok {
+ resp.responsecode = http.StatusUnauthorized
+ resp.errorstring = "invalid username and/or password"
+ return
+ }
+ }
resp.sessions = make(map[string]string)
if sessions, exists := self.store[user]; exists {
for id, e := range sessions {
@@ -289,9 +292,10 @@ func (self *SessionStore) Cleanup() {
close(self.removeChan)
}
-func NewSessionStore(conf *Config) (store *SessionStore, err error) {
+func NewSessionStore(conf *Config, rddb *RdDbChan) (store *SessionStore, err error) {
store = new(SessionStore)
-
+ store.conf = conf
+ store.rddb = rddb
store.quit = make(chan bool)
store.done = make(chan bool)
store.store = make(map[string]map[string]*SessionStoreElement)
diff --git a/src/helsinki.at/rhimportd/ctrlWebSocket.go b/src/helsinki.at/rhimportd/ctrlWebSocket.go
index da2978e..4c1bf45 100644
--- a/src/helsinki.at/rhimportd/ctrlWebSocket.go
+++ b/src/helsinki.at/rhimportd/ctrlWebSocket.go
@@ -192,10 +192,10 @@ func webSocketDone(res rhimport.ImportResult, userdata interface{}) bool {
return true
}
-func (self *webSocketSession) startNewSession(reqdata *webSocketRequestData, conf *rhimport.Config, rddb *rhimport.RdDbChan, sessions *rhimport.SessionStoreChan) (int, string) {
- ctx := rhimport.NewImportContext(conf, rddb, reqdata.UserName)
+func (self *webSocketSession) startNewSession(reqdata *webSocketRequestData, conf *rhimport.Config, sessions *rhimport.SessionStoreChan) (int, string) {
+ ctx := rhimport.NewImportContext(conf, nil, reqdata.UserName)
ctx.Password = reqdata.Password
- ctx.Trusted = true // TODO: set this to false as soon as the interface is working
+ ctx.Trusted = false
ctx.ShowId = reqdata.ShowId
ctx.ClearShowCarts = reqdata.ClearShowCarts
ctx.GroupName = reqdata.MusicPoolGroup
@@ -243,7 +243,7 @@ func (self *webSocketSession) reconnectSession(reqdata *webSocketRequestData, se
return http.StatusOK, "SUCCESS"
}
-func webSocketSessionHandler(reqchan <-chan webSocketRequestData, ws *websocket.Conn, conf *rhimport.Config, rddb *rhimport.RdDbChan, sessions *rhimport.SessionStoreChan) {
+func webSocketSessionHandler(reqchan <-chan webSocketRequestData, ws *websocket.Conn, conf *rhimport.Config, sessions *rhimport.SessionStoreChan) {
defer ws.Close()
session := newWebSocketSession()
@@ -258,7 +258,7 @@ func webSocketSessionHandler(reqchan <-chan webSocketRequestData, ws *websocket.
if session.id != "" {
sendWebSocketErrorResponse(ws, http.StatusBadRequest, "This connection already handles a session")
} else {
- code, errstring := session.startNewSession(&reqdata, conf, rddb, sessions)
+ code, errstring := session.startNewSession(&reqdata, conf, sessions)
if code != http.StatusOK {
sendWebSocketErrorResponse(ws, code, errstring)
} else {
@@ -283,7 +283,7 @@ func webSocketSessionHandler(reqchan <-chan webSocketRequestData, ws *websocket.
}
}
case "list":
- list, code, errstring := sessions.List(reqdata.UserName, reqdata.Password, true) // TODO: set this to false as soon as the interface is working
+ list, code, errstring := sessions.List(reqdata.UserName, reqdata.Password, false)
if code != http.StatusOK {
sendWebSocketErrorResponse(ws, code, errstring)
} else {
@@ -314,7 +314,7 @@ func webSocketHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, sessions *
}
rhdl.Println("WebSocket Client", ws.RemoteAddr(), "connected")
reqchan := make(chan webSocketRequestData)
- go webSocketSessionHandler(reqchan, ws, conf, rddb, sessions)
+ go webSocketSessionHandler(reqchan, ws, conf, sessions)
defer close(reqchan)
for {
diff --git a/src/helsinki.at/rhimportd/main.go b/src/helsinki.at/rhimportd/main.go
index 87fa3ab..21c1246 100644
--- a/src/helsinki.at/rhimportd/main.go
+++ b/src/helsinki.at/rhimportd/main.go
@@ -26,14 +26,11 @@ package main
import (
"flag"
- // "fmt"
"helsinki.at/rhimport"
"log"
- // "net/http"
"os"
"os/signal"
"sync"
- // "time"
// "io/ioutil"
)
@@ -43,99 +40,6 @@ var (
//rhdl = log.New(ioutil.Discard, "[rhimportd-dbg]\t", log.LstdFlags)
)
-// func session_test_progress1(step int, step_name string, progress float64, userdata interface{}) bool {
-// out := userdata.(chan<- string)
-// select {
-// case out <- fmt.Sprintf("CB1 %d, %s: %3.2f%%", step, step_name, progress*100):
-// default:
-// }
-// if step > 1 {
-// return false
-// }
-// return true
-// }
-
-// func session_test_progress2(step int, step_name string, progress float64, userdata interface{}) bool {
-// out := userdata.(chan<- string)
-// select {
-// case out <- fmt.Sprintf("CB2 %d, %s: %3.2f%%", step, step_name, progress*100):
-// default:
-// }
-// return true
-// }
-
-// func session_test_done(res rhimport.ImportResult, userdata interface{}) bool {
-// done := userdata.(chan<- rhimport.ImportResult)
-// done <- res
-// return true
-// }
-
-// func session_test(conf *rhimport.Config, rddb *rhimport.RdDbChan) {
-// sessions, err := rhimport.NewSessionStore(conf)
-// if err != nil {
-// rhl.Println("Error initializing Session Store:", err)
-// return
-// }
-// defer sessions.Cleanup()
-
-// store := sessions.GetInterface()
-
-// ctx := rhimport.NewImportContext(conf, rddb, "heslinki")
-// ctx.Trusted = true
-// ctx.ShowId = 10002
-// ctx.ClearShowCarts = true
-// ctx.SourceUri = "http://www.tonycuffe.com/mp3/tail%20toddle.mp3"
-
-// id, _, code, errstring := store.New(ctx)
-// if code != http.StatusOK {
-// rhl.Printf("MAIN: Error SessionStore.New(): %s", errstring)
-// return
-// }
-
-// var session *rhimport.SessionChan
-// if session, code, errstring = store.Get(ctx.UserName, id); code != http.StatusOK {
-// rhl.Printf("MAIN: Error SessionStore.Get(): %s", errstring)
-// return
-// }
-
-// dch := make(chan rhimport.ImportResult, 1)
-// if err = session.AddDoneHandler((chan<- rhimport.ImportResult)(dch), session_test_done); err != nil {
-// rhl.Printf("MAIN: Error Session.AddDoneHandler(): %s", err)
-// return
-// }
-
-// pch := make(chan string, 10)
-// if err = session.AddProgressHandler((chan<- string)(pch), session_test_progress1); err != nil {
-// rhl.Printf("MAIN: Error Session.AddProgressHandler(): %s", err)
-// }
-// go func() {
-// time.Sleep(3 * time.Second)
-// if err = session.AddProgressHandler((chan<- string)(pch), session_test_progress2); err != nil {
-// rhl.Printf("MAIN: Error Session.AddProgressHandler(): %s", err)
-// }
-// }()
-
-// rhl.Printf("MAIN: calling run for %s/%s", ctx.UserName, id)
-// session.Run(30 * time.Second)
-
-// for {
-// select {
-// case p := <-pch:
-// fmt.Println(p)
-// case r := <-dch:
-// fmt.Printf("Import finished: %+v\n", r)
-// break
-// }
-// }
-
-// rhl.Printf("MAIN: calling remove for %s/%s", ctx.UserName, id)
-// if code, errstring = store.Remove(ctx.UserName, id); code != http.StatusOK {
-// rhl.Printf("MAIN: Error SessionStore.Remove(): %s", errstring)
-// }
-
-// rhl.Printf("MAIN: remove done")
-// }
-
func main() {
web_addr_s := flag.String("web-addr", ":4080", "addr:port to listen on")
telnet_addr_s := flag.String("telnet-addr", ":4023", "addr:port to listen on")
@@ -164,7 +68,7 @@ func main() {
}
defer rddb.Cleanup()
- sessions, err := rhimport.NewSessionStore(conf)
+ sessions, err := rhimport.NewSessionStore(conf, rddb.GetInterface())
if err != nil {
rhl.Println("Error initializing Session Store:", err)
return