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 &copySession
    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  }