changeset 197:e85413e5befa

Cleaned up serialisation/deserilisation of sessions a bit.
author Sascha L. Teichmann <teichmann@intevation.de>
date Fri, 20 Jul 2018 22:50:59 +0200
parents b67208d82543
children c20e86a3c073
files auth/connection.go auth/persistent.go auth/session.go
diffstat 3 files changed, 32 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/auth/connection.go	Fri Jul 20 18:31:45 2018 +0200
+++ b/auth/connection.go	Fri Jul 20 22:50:59 2018 +0200
@@ -58,9 +58,9 @@
 	return buf.Bytes()
 }
 
-func (c *Connection) unserialize(r io.Reader) error {
+func (c *Connection) deserialize(r io.Reader) error {
 	session := new(Session)
-	if err := session.unserialize(r); err != nil {
+	if err := session.deserialize(r); err != nil {
 		return err
 	}
 
--- a/auth/persistent.go	Fri Jul 20 18:31:45 2018 +0200
+++ b/auth/persistent.go	Fri Jul 20 22:50:59 2018 +0200
@@ -36,7 +36,7 @@
 
 		for k, v := c.First(); k != nil; k, v = c.Next() {
 			var conn Connection
-			if err := conn.unserialize(bytes.NewReader(v)); err != nil {
+			if err := conn.deserialize(bytes.NewReader(v)); err != nil {
 				return err
 			}
 			conns[string(k)] = &conn
--- a/auth/session.go	Fri Jul 20 18:31:45 2018 +0200
+++ b/auth/session.go	Fri Jul 20 22:50:59 2018 +0200
@@ -31,31 +31,44 @@
 	}
 }
 
-func (s *Session) serialize(w io.Writer) {
-	binary.Write(w, binary.BigEndian, s.ExpiresAt)
-	binary.Write(w, binary.BigEndian, s.User)
-	binary.Write(w, binary.BigEndian, s.Password)
-	binary.Write(w, binary.BigEndian, uint32(len(s.Roles)))
+func (s *Session) serialize(w io.Writer) error {
+	var err error
+	write := func(data interface{}) {
+		if err == nil {
+			err = binary.Write(w, binary.BigEndian, data)
+		}
+	}
+	write(s.ExpiresAt)
+	write(s.User)
+	write(s.Password)
+	write(uint32(len(s.Roles)))
 	for _, role := range s.Roles {
-		binary.Write(w, binary.BigEndian, role)
+		write(role)
 	}
+	return err
 }
 
-func (s *Session) unserialize(r io.Reader) error {
+func (s *Session) deserialize(r io.Reader) error {
+	var err error
+	read := func(data interface{}) {
+		if err == nil {
+			err = binary.Read(r, binary.BigEndian, data)
+		}
+	}
 	var x Session
-	binary.Read(r, binary.BigEndian, &x.ExpiresAt)
-	binary.Read(r, binary.BigEndian, &x.User)
-	binary.Read(r, binary.BigEndian, &x.Password)
 	var n uint32
-	binary.Read(r, binary.BigEndian, &n)
+	read(&x.ExpiresAt)
+	read(&x.User)
+	read(&x.Password)
+	read(&n)
 	x.Roles = make([]string, n)
 	for i := uint32(0); n > 0 && i < n; i++ {
-		if err := binary.Read(r, binary.BigEndian, &x.Roles[i]); err != nil {
-			return err
-		}
+		read(&x.Roles[i])
 	}
-	*s = x
-	return nil
+	if err == nil {
+		*s = x
+	}
+	return err
 }
 
 func GenerateSessionKey() string {