github.com/crspeller/mattermost-server@v0.0.0-20190328001957-a200beb3d111/model/session.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package model 5 6 import ( 7 "encoding/json" 8 "io" 9 "strings" 10 ) 11 12 const ( 13 SESSION_COOKIE_TOKEN = "MMAUTHTOKEN" 14 SESSION_COOKIE_USER = "MMUSERID" 15 SESSION_COOKIE_CSRF = "MMCSRF" 16 SESSION_CACHE_SIZE = 35000 17 SESSION_PROP_PLATFORM = "platform" 18 SESSION_PROP_OS = "os" 19 SESSION_PROP_BROWSER = "browser" 20 SESSION_PROP_TYPE = "type" 21 SESSION_PROP_USER_ACCESS_TOKEN_ID = "user_access_token_id" 22 SESSION_TYPE_USER_ACCESS_TOKEN = "UserAccessToken" 23 SESSION_ACTIVITY_TIMEOUT = 1000 * 60 * 5 // 5 minutes 24 SESSION_USER_ACCESS_TOKEN_EXPIRY = 100 * 365 // 100 years 25 ) 26 27 type Session struct { 28 Id string `json:"id"` 29 Token string `json:"token"` 30 CreateAt int64 `json:"create_at"` 31 ExpiresAt int64 `json:"expires_at"` 32 LastActivityAt int64 `json:"last_activity_at"` 33 UserId string `json:"user_id"` 34 DeviceId string `json:"device_id"` 35 Roles string `json:"roles"` 36 IsOAuth bool `json:"is_oauth"` 37 Props StringMap `json:"props"` 38 TeamMembers []*TeamMember `json:"team_members" db:"-"` 39 } 40 41 func (me *Session) DeepCopy() *Session { 42 copySession := *me 43 44 if me.Props != nil { 45 copySession.Props = CopyStringMap(me.Props) 46 } 47 48 if me.TeamMembers != nil { 49 copySession.TeamMembers = make([]*TeamMember, len(me.TeamMembers)) 50 for index, tm := range me.TeamMembers { 51 copySession.TeamMembers[index] = new(TeamMember) 52 *copySession.TeamMembers[index] = *tm 53 } 54 } 55 56 return ©Session 57 } 58 59 func (me *Session) ToJson() string { 60 b, _ := json.Marshal(me) 61 return string(b) 62 } 63 64 func SessionFromJson(data io.Reader) *Session { 65 var me *Session 66 json.NewDecoder(data).Decode(&me) 67 return me 68 } 69 70 func (me *Session) PreSave() { 71 if me.Id == "" { 72 me.Id = NewId() 73 } 74 75 if me.Token == "" { 76 me.Token = NewId() 77 } 78 79 me.CreateAt = GetMillis() 80 me.LastActivityAt = me.CreateAt 81 82 if me.Props == nil { 83 me.Props = make(map[string]string) 84 } 85 } 86 87 func (me *Session) Sanitize() { 88 me.Token = "" 89 } 90 91 func (me *Session) IsExpired() bool { 92 93 if me.ExpiresAt <= 0 { 94 return false 95 } 96 97 if GetMillis() > me.ExpiresAt { 98 return true 99 } 100 101 return false 102 } 103 104 func (me *Session) SetExpireInDays(days int) { 105 if me.CreateAt == 0 { 106 me.ExpiresAt = GetMillis() + (1000 * 60 * 60 * 24 * int64(days)) 107 } else { 108 me.ExpiresAt = me.CreateAt + (1000 * 60 * 60 * 24 * int64(days)) 109 } 110 } 111 112 func (me *Session) AddProp(key string, value string) { 113 114 if me.Props == nil { 115 me.Props = make(map[string]string) 116 } 117 118 me.Props[key] = value 119 } 120 121 func (me *Session) GetTeamByTeamId(teamId string) *TeamMember { 122 for _, team := range me.TeamMembers { 123 if team.TeamId == teamId { 124 return team 125 } 126 } 127 128 return nil 129 } 130 131 func (me *Session) IsMobileApp() bool { 132 return len(me.DeviceId) > 0 133 } 134 135 func (me *Session) GetUserRoles() []string { 136 return strings.Fields(me.Roles) 137 } 138 139 func (me *Session) GenerateCSRF() string { 140 token := NewId() 141 me.AddProp("csrf", token) 142 return token 143 } 144 145 func (me *Session) GetCSRF() string { 146 if me.Props == nil { 147 return "" 148 } 149 150 return me.Props["csrf"] 151 } 152 153 func SessionsToJson(o []*Session) string { 154 if b, err := json.Marshal(o); err != nil { 155 return "[]" 156 } else { 157 return string(b) 158 } 159 } 160 161 func SessionsFromJson(data io.Reader) []*Session { 162 var o []*Session 163 json.NewDecoder(data).Decode(&o) 164 return o 165 }