github.com/hahmadia/mattermost-server@v5.11.1+incompatible/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 &copySession
    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  }