changeset 513:b6796cd91604

Simplified the function channel inside the session store.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 24 Aug 2018 18:06:24 +0200
parents 7474e9922ed5
children 4a1db55a9920
files pkg/auth/store.go
diffstat 1 files changed, 55 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/auth/store.go	Fri Aug 24 18:04:25 2018 +0200
+++ b/pkg/auth/store.go	Fri Aug 24 18:06:24 2018 +0200
@@ -17,26 +17,26 @@
 type SessionStore struct {
 	storage  *bolt.DB
 	sessions map[string]*Session
-	cmds     chan func(*SessionStore)
+	cmds     chan func()
 }
 
 var sessionsBucket = []byte("sessions")
 
 func NewSessionStore(filename string) (*SessionStore, error) {
 
-	pcp := &SessionStore{
+	ss := &SessionStore{
 		sessions: make(map[string]*Session),
-		cmds:     make(chan func(*SessionStore)),
+		cmds:     make(chan func()),
 	}
-	if err := pcp.openStorage(filename); err != nil {
+	if err := ss.openStorage(filename); err != nil {
 		return nil, err
 	}
-	go pcp.run()
-	return pcp, nil
+	go ss.run()
+	return ss, nil
 }
 
 // openStorage opens a storage file.
-func (pcp *SessionStore) openStorage(filename string) error {
+func (ss *SessionStore) openStorage(filename string) error {
 
 	// No file, nothing to restore/persist.
 	if filename == "" {
@@ -62,7 +62,7 @@
 			if err := session.deserialize(bytes.NewReader(v)); err != nil {
 				return err
 			}
-			pcp.sessions[string(k)] = &session
+			ss.sessions[string(k)] = &session
 		}
 
 		return nil
@@ -73,37 +73,37 @@
 		return err
 	}
 
-	pcp.storage = db
+	ss.storage = db
 	return nil
 }
 
-func (pcp *SessionStore) run() {
+func (ss *SessionStore) run() {
 	for {
 		select {
-		case cmd := <-pcp.cmds:
-			cmd(pcp)
+		case cmd := <-ss.cmds:
+			cmd()
 		case <-time.After(time.Minute * 5):
-			pcp.cleanToken()
+			ss.cleanToken()
 		}
 	}
 }
 
-func (pcp *SessionStore) cleanToken() {
+func (ss *SessionStore) cleanToken() {
 	now := time.Now()
-	for token, session := range pcp.sessions {
+	for token, session := range ss.sessions {
 		expires := time.Unix(session.ExpiresAt, 0)
 		if expires.Before(now) {
-			delete(pcp.sessions, token)
-			pcp.remove(token)
+			delete(ss.sessions, token)
+			ss.remove(token)
 		}
 	}
 }
 
-func (pcp *SessionStore) remove(token string) {
-	if pcp.storage == nil {
+func (ss *SessionStore) remove(token string) {
+	if ss.storage == nil {
 		return
 	}
-	err := pcp.storage.Update(func(tx *bolt.Tx) error {
+	err := ss.storage.Update(func(tx *bolt.Tx) error {
 		b := tx.Bucket(sessionsBucket)
 		return b.Delete([]byte(token))
 	})
@@ -112,25 +112,25 @@
 	}
 }
 
-func (pcp *SessionStore) Delete(token string) bool {
+func (ss *SessionStore) Delete(token string) bool {
 	res := make(chan bool)
-	pcp.cmds <- func(pcp *SessionStore) {
-		if _, found := pcp.sessions[token]; !found {
+	ss.cmds <- func() {
+		if _, found := ss.sessions[token]; !found {
 			res <- false
 			return
 		}
-		delete(pcp.sessions, token)
-		pcp.remove(token)
+		delete(ss.sessions, token)
+		ss.remove(token)
 		res <- true
 	}
 	return <-res
 }
 
-func (pcp *SessionStore) store(token string, session *Session) {
-	if pcp.storage == nil {
+func (ss *SessionStore) store(token string, session *Session) {
+	if ss.storage == nil {
 		return
 	}
-	err := pcp.storage.Update(func(tx *bolt.Tx) error {
+	err := ss.storage.Update(func(tx *bolt.Tx) error {
 		b := tx.Bucket(sessionsBucket)
 		var buf bytes.Buffer
 		if err := session.serialize(&buf); err != nil {
@@ -143,25 +143,24 @@
 	}
 }
 
-func (pcp *SessionStore) Add(token string, session *Session) *Session {
-	res := make(chan *Session)
+func (ss *SessionStore) Add(token string, session *Session) {
+	res := make(chan struct{})
 
-	pcp.cmds <- func(cp *SessionStore) {
-		s := pcp.sessions[token]
+	ss.cmds <- func() {
+		defer close(res)
+		s := ss.sessions[token]
 		if s == nil {
 			s = session
-			pcp.sessions[token] = session
+			ss.sessions[token] = session
 		}
 		s.touch()
-		pcp.store(token, s)
-		res <- s
+		ss.store(token, s)
 	}
 
-	s := <-res
-	return s
+	<-res
 }
 
-func (pcp *SessionStore) Renew(token string) (string, error) {
+func (ss *SessionStore) Renew(token string) (string, error) {
 
 	type result struct {
 		newToken string
@@ -170,18 +169,18 @@
 
 	resCh := make(chan result)
 
-	pcp.cmds <- func(cp *SessionStore) {
-		session := pcp.sessions[token]
+	ss.cmds <- func() {
+		session := ss.sessions[token]
 		if session == nil {
 			resCh <- result{err: ErrNoSuchToken}
 		} else {
-			delete(pcp.sessions, token)
-			pcp.remove(token)
+			delete(ss.sessions, token)
+			ss.remove(token)
 			newToken := GenerateSessionKey()
 			// TODO: Ensure that this is not racy!
 			session.ExpiresAt = time.Now().Add(maxTokenValid).Unix()
-			pcp.sessions[newToken] = session
-			pcp.store(newToken, session)
+			ss.sessions[newToken] = session
+			ss.store(newToken, session)
 			resCh <- result{newToken: newToken}
 		}
 	}
@@ -190,36 +189,36 @@
 	return r.newToken, r.err
 }
 
-func (pcp *SessionStore) Session(token string) *Session {
+func (ss *SessionStore) Session(token string) *Session {
 	res := make(chan *Session)
-	pcp.cmds <- func(pcp *SessionStore) {
-		session := pcp.sessions[token]
+	ss.cmds <- func() {
+		session := ss.sessions[token]
 		if session == nil {
 			res <- nil
 		} else {
 			session.touch()
-			pcp.store(token, session)
+			ss.store(token, session)
 			res <- session
 		}
 	}
 	return <-res
 }
 
-func (pcp *SessionStore) Logout(user string) {
-	pcp.cmds <- func(pcp *SessionStore) {
-		for token, session := range pcp.sessions {
+func (ss *SessionStore) Logout(user string) {
+	ss.cmds <- func() {
+		for token, session := range ss.sessions {
 			if session.User == user {
-				delete(pcp.sessions, token)
-				pcp.remove(token)
+				delete(ss.sessions, token)
+				ss.remove(token)
 			}
 		}
 	}
 }
 
-func (pcp *SessionStore) Shutdown() error {
-	if db := pcp.storage; db != nil {
+func (ss *SessionStore) Shutdown() error {
+	if db := ss.storage; db != nil {
 		log.Println("info: shutdown persistent connection pool.")
-		pcp.storage = nil
+		ss.storage = nil
 		return db.Close()
 	}
 	log.Println("info: shutdown in-memory connection pool.")