diff auth/session.go @ 215:f345edb409b2

Made serialisation and deserialisation of sessions more robust (fixed a small bug on the way).
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 24 Jul 2018 11:09:18 +0200
parents e85413e5befa
children a7b2db8b3d18
line wrap: on
line diff
--- a/auth/session.go	Tue Jul 24 10:58:38 2018 +0200
+++ b/auth/session.go	Tue Jul 24 11:09:18 2018 +0200
@@ -3,7 +3,6 @@
 import (
 	"crypto/rand"
 	"encoding/base64"
-	"encoding/binary"
 	"io"
 	"time"
 )
@@ -32,43 +31,33 @@
 }
 
 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)
-		}
+	wr := binWriter{w: w}
+	wr.write(s.ExpiresAt)
+	wr.writeString(s.User)
+	wr.writeString(s.Password)
+	wr.write(uint32(len(s.Roles)))
+	for _, role := range s.Roles {
+		wr.writeString(role)
 	}
-	write(s.ExpiresAt)
-	write(s.User)
-	write(s.Password)
-	write(uint32(len(s.Roles)))
-	for _, role := range s.Roles {
-		write(role)
-	}
-	return err
+	return wr.err
 }
 
 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
 	var n uint32
-	read(&x.ExpiresAt)
-	read(&x.User)
-	read(&x.Password)
-	read(&n)
+	rd := binReader{r: r}
+	rd.read(&x.ExpiresAt)
+	rd.readString(&x.User)
+	rd.readString(&x.Password)
+	rd.read(&n)
 	x.Roles = make([]string, n)
 	for i := uint32(0); n > 0 && i < n; i++ {
-		read(&x.Roles[i])
+		rd.readString(&x.Roles[i])
 	}
-	if err == nil {
+	if rd.err == nil {
 		*s = x
 	}
-	return err
+	return rd.err
 }
 
 func GenerateSessionKey() string {