comparison auth/connection.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 3d0988d9f867
children 11d1a488b08f
comparison
equal deleted inserted replaced
214:da24df80c25d 215:f345edb409b2
1 package auth 1 package auth
2 2
3 import ( 3 import (
4 "database/sql" 4 "database/sql"
5 "encoding/binary"
6 "errors" 5 "errors"
7 "io" 6 "io"
8 "log" 7 "log"
9 "sync" 8 "sync"
10 "time" 9 "time"
40 func (c *Connection) serialize(w io.Writer) error { 39 func (c *Connection) serialize(w io.Writer) error {
41 if err := c.session.serialize(w); err != nil { 40 if err := c.session.serialize(w); err != nil {
42 return err 41 return err
43 } 42 }
44 access, err := c.last().MarshalText() 43 access, err := c.last().MarshalText()
45 if err == nil { 44 if err != nil {
46 err = binary.Write(w, binary.BigEndian, string(access)) 45 return err
47 } 46 }
48 return err 47 wr := binWriter{w: w}
48 wr.write(uint32(len(access)))
49 wr.write(access)
50 return wr.err
49 } 51 }
50 52
51 func (c *Connection) deserialize(r io.Reader) error { 53 func (c *Connection) deserialize(r io.Reader) error {
52 session := new(Session) 54 session := new(Session)
53 if err := session.deserialize(r); err != nil { 55 if err := session.deserialize(r); err != nil {
54 return err 56 return err
55 } 57 }
56 58
57 var access string 59 rd := binReader{r: r}
58 if err := binary.Read(r, binary.BigEndian, &access); err != nil { 60 var l uint32
59 return err 61 rd.read(&l)
62 access := make([]byte, l)
63 rd.read(access)
64
65 if rd.err != nil {
66 return rd.err
60 } 67 }
61 68
62 var t time.Time 69 var t time.Time
63 if err := t.UnmarshalText([]byte(access)); err != nil { 70 if err := t.UnmarshalText(access); err != nil {
64 return err 71 return err
65 } 72 }
66 73
67 *c = Connection{ 74 *c = Connection{
68 session: session, 75 session: session,