Mercurial > gemma
comparison auth/session.go @ 339:33b59c848771
Factored out some miscellaneous code into own package.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Sun, 05 Aug 2018 15:35:29 +0200 |
parents | e48da6f427c8 |
children | 4c211ad5349e |
comparison
equal
deleted
inserted
replaced
338:dabe189369ad | 339:33b59c848771 |
---|---|
1 package auth | 1 package auth |
2 | 2 |
3 import ( | 3 import ( |
4 "crypto/rand" | |
5 "encoding/base64" | 4 "encoding/base64" |
6 "io" | 5 "io" |
7 "time" | 6 "time" |
7 | |
8 "gemma.intevation.de/gemma/misc" | |
8 ) | 9 ) |
9 | 10 |
10 type Roles []string | 11 type Roles []string |
11 | 12 |
12 type Session struct { | 13 type Session struct { |
40 Roles: roles, | 41 Roles: roles, |
41 } | 42 } |
42 } | 43 } |
43 | 44 |
44 func (s *Session) serialize(w io.Writer) error { | 45 func (s *Session) serialize(w io.Writer) error { |
45 wr := binWriter{w: w} | 46 wr := misc.BinWriter{W: w} |
46 wr.write(s.ExpiresAt) | 47 wr.Write(s.ExpiresAt) |
47 wr.writeString(s.User) | 48 wr.WriteString(s.User) |
48 wr.writeString(s.Password) | 49 wr.WriteString(s.Password) |
49 wr.write(uint32(len(s.Roles))) | 50 wr.Write(uint32(len(s.Roles))) |
50 for _, role := range s.Roles { | 51 for _, role := range s.Roles { |
51 wr.writeString(role) | 52 wr.WriteString(role) |
52 } | 53 } |
53 return wr.err | 54 return wr.Err |
54 } | 55 } |
55 | 56 |
56 func (s *Session) deserialize(r io.Reader) error { | 57 func (s *Session) deserialize(r io.Reader) error { |
57 var x Session | 58 var x Session |
58 var n uint32 | 59 var n uint32 |
59 rd := binReader{r: r} | 60 rd := misc.BinReader{R: r} |
60 rd.read(&x.ExpiresAt) | 61 rd.Read(&x.ExpiresAt) |
61 rd.readString(&x.User) | 62 rd.ReadString(&x.User) |
62 rd.readString(&x.Password) | 63 rd.ReadString(&x.Password) |
63 rd.read(&n) | 64 rd.Read(&n) |
64 x.Roles = make(Roles, n) | 65 x.Roles = make(Roles, n) |
65 for i := uint32(0); n > 0 && i < n; i++ { | 66 for i := uint32(0); n > 0 && i < n; i++ { |
66 rd.readString(&x.Roles[i]) | 67 rd.ReadString(&x.Roles[i]) |
67 } | 68 } |
68 if rd.err == nil { | 69 if rd.Err == nil { |
69 *s = x | 70 *s = x |
70 } | 71 } |
71 return rd.err | 72 return rd.Err |
72 } | 73 } |
73 | 74 |
74 func GenerateSessionKey() string { | 75 func GenerateSessionKey() string { |
75 return base64.URLEncoding.EncodeToString(GenerateRandomKey(sessionKeyLength)) | 76 return base64.URLEncoding.EncodeToString( |
76 } | 77 misc.GenerateRandomKey(sessionKeyLength)) |
77 | |
78 func GenerateRandomKey(length int) []byte { | |
79 k := make([]byte, length) | |
80 if _, err := io.ReadFull(rand.Reader, k); err != nil { | |
81 return nil | |
82 } | |
83 return k | |
84 } | 78 } |
85 | 79 |
86 func GenerateSession(user, password string) (string, *Session, error) { | 80 func GenerateSession(user, password string) (string, *Session, error) { |
87 roles, err := AllOtherRoles(user, password) | 81 roles, err := AllOtherRoles(user, password) |
88 if err != nil { | 82 if err != nil { |