Mercurial > gemma
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, |