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 {