github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/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 "strconv" 10 "strings" 11 12 "github.com/mattermost/mattermost-server/v5/mlog" 13 ) 14 15 const ( 16 SESSION_COOKIE_TOKEN = "MMAUTHTOKEN" 17 SESSION_COOKIE_USER = "MMUSERID" 18 SESSION_COOKIE_CSRF = "MMCSRF" 19 SESSION_CACHE_SIZE = 35000 20 SESSION_PROP_PLATFORM = "platform" 21 SESSION_PROP_OS = "os" 22 SESSION_PROP_BROWSER = "browser" 23 SESSION_PROP_TYPE = "type" 24 SESSION_PROP_USER_ACCESS_TOKEN_ID = "user_access_token_id" 25 SESSION_PROP_IS_BOT = "is_bot" 26 SESSION_PROP_IS_BOT_VALUE = "true" 27 SESSION_TYPE_USER_ACCESS_TOKEN = "UserAccessToken" 28 SESSION_PROP_IS_GUEST = "is_guest" 29 SESSION_ACTIVITY_TIMEOUT = 1000 * 60 * 5 // 5 minutes 30 SESSION_USER_ACCESS_TOKEN_EXPIRY = 100 * 365 // 100 years 31 ) 32 33 type Session struct { 34 Id string `json:"id"` 35 Token string `json:"token"` 36 CreateAt int64 `json:"create_at"` 37 ExpiresAt int64 `json:"expires_at"` 38 LastActivityAt int64 `json:"last_activity_at"` 39 UserId string `json:"user_id"` 40 DeviceId string `json:"device_id"` 41 Roles string `json:"roles"` 42 IsOAuth bool `json:"is_oauth"` 43 ExpiredNotify bool `json:"expired_notify"` 44 Props StringMap `json:"props"` 45 TeamMembers []*TeamMember `json:"team_members" db:"-"` 46 Local bool `json:"local" db:"-"` 47 } 48 49 // Returns true if the session is unrestricted, which should grant it 50 // with all permissions. This is used for local mode sessions 51 func (me *Session) IsUnrestricted() bool { 52 return me.Local 53 } 54 55 func (me *Session) DeepCopy() *Session { 56 copySession := *me 57 58 if me.Props != nil { 59 copySession.Props = CopyStringMap(me.Props) 60 } 61 62 if me.TeamMembers != nil { 63 copySession.TeamMembers = make([]*TeamMember, len(me.TeamMembers)) 64 for index, tm := range me.TeamMembers { 65 copySession.TeamMembers[index] = new(TeamMember) 66 *copySession.TeamMembers[index] = *tm 67 } 68 } 69 70 return ©Session 71 } 72 73 func (me *Session) ToJson() string { 74 b, _ := json.Marshal(me) 75 return string(b) 76 } 77 78 func SessionFromJson(data io.Reader) *Session { 79 var me *Session 80 json.NewDecoder(data).Decode(&me) 81 return me 82 } 83 84 func (me *Session) PreSave() { 85 if me.Id == "" { 86 me.Id = NewId() 87 } 88 89 if me.Token == "" { 90 me.Token = NewId() 91 } 92 93 me.CreateAt = GetMillis() 94 me.LastActivityAt = me.CreateAt 95 96 if me.Props == nil { 97 me.Props = make(map[string]string) 98 } 99 } 100 101 func (me *Session) Sanitize() { 102 me.Token = "" 103 } 104 105 func (me *Session) IsExpired() bool { 106 107 if me.ExpiresAt <= 0 { 108 return false 109 } 110 111 if GetMillis() > me.ExpiresAt { 112 return true 113 } 114 115 return false 116 } 117 118 // Deprecated: SetExpireInDays is deprecated and should not be used. 119 // Use (*App).SetSessionExpireInDays instead which handles the 120 // cases where the new ExpiresAt is not relative to CreateAt. 121 func (me *Session) SetExpireInDays(days int) { 122 if me.CreateAt == 0 { 123 me.ExpiresAt = GetMillis() + (1000 * 60 * 60 * 24 * int64(days)) 124 } else { 125 me.ExpiresAt = me.CreateAt + (1000 * 60 * 60 * 24 * int64(days)) 126 } 127 } 128 129 func (me *Session) AddProp(key string, value string) { 130 131 if me.Props == nil { 132 me.Props = make(map[string]string) 133 } 134 135 me.Props[key] = value 136 } 137 138 func (me *Session) GetTeamByTeamId(teamId string) *TeamMember { 139 for _, team := range me.TeamMembers { 140 if team.TeamId == teamId { 141 return team 142 } 143 } 144 145 return nil 146 } 147 148 func (me *Session) IsMobileApp() bool { 149 return len(me.DeviceId) > 0 || me.IsMobile() 150 } 151 152 func (me *Session) IsMobile() bool { 153 val, ok := me.Props[USER_AUTH_SERVICE_IS_MOBILE] 154 if !ok { 155 return false 156 } 157 isMobile, err := strconv.ParseBool(val) 158 if err != nil { 159 mlog.Error("Error parsing boolean property from Session", mlog.Err(err)) 160 return false 161 } 162 return isMobile 163 } 164 165 func (me *Session) IsSaml() bool { 166 val, ok := me.Props[USER_AUTH_SERVICE_IS_SAML] 167 if !ok { 168 return false 169 } 170 isSaml, err := strconv.ParseBool(val) 171 if err != nil { 172 mlog.Error("Error parsing boolean property from Session", mlog.Err(err)) 173 return false 174 } 175 return isSaml 176 } 177 178 func (me *Session) IsSSOLogin() bool { 179 return me.IsOAuth || me.IsSaml() 180 } 181 182 func (me *Session) GetUserRoles() []string { 183 return strings.Fields(me.Roles) 184 } 185 186 func (me *Session) GenerateCSRF() string { 187 token := NewId() 188 me.AddProp("csrf", token) 189 return token 190 } 191 192 func (me *Session) GetCSRF() string { 193 if me.Props == nil { 194 return "" 195 } 196 197 return me.Props["csrf"] 198 } 199 200 func SessionsToJson(o []*Session) string { 201 if b, err := json.Marshal(o); err != nil { 202 return "[]" 203 } else { 204 return string(b) 205 } 206 } 207 208 func SessionsFromJson(data io.Reader) []*Session { 209 var o []*Session 210 json.NewDecoder(data).Decode(&o) 211 return o 212 }