diff options
-rw-r--r-- | api/web_conn.go | 79 | ||||
-rw-r--r-- | api/web_hub.go | 7 | ||||
-rw-r--r-- | model/team_member.go | 23 | ||||
-rw-r--r-- | store/sql_channel_store.go | 124 | ||||
-rw-r--r-- | store/sql_channel_store_test.go | 91 | ||||
-rw-r--r-- | store/store.go | 4 |
6 files changed, 42 insertions, 286 deletions
diff --git a/api/web_conn.go b/api/web_conn.go index c842e2df1..f4bd493bb 100644 --- a/api/web_conn.go +++ b/api/web_conn.go @@ -21,28 +21,28 @@ const ( ) type WebConn struct { - WebSocket *websocket.Conn - Send chan model.WebSocketMessage - SessionToken string - UserId string - T goi18n.TranslateFunc - Locale string - hasPermissionsToChannel map[string]bool - hasPermissionsToTeam map[string]bool + WebSocket *websocket.Conn + Send chan model.WebSocketMessage + SessionToken string + UserId string + T goi18n.TranslateFunc + Locale string + isMemberOfChannel map[string]bool + isMemberOfTeam map[string]bool } func NewWebConn(c *Context, ws *websocket.Conn) *WebConn { go SetStatusOnline(c.Session.UserId, c.Session.Id, false) return &WebConn{ - Send: make(chan model.WebSocketMessage, 64), - WebSocket: ws, - UserId: c.Session.UserId, - SessionToken: c.Session.Token, - T: c.T, - Locale: c.Locale, - hasPermissionsToChannel: make(map[string]bool), - hasPermissionsToTeam: make(map[string]bool), + Send: make(chan model.WebSocketMessage, 64), + WebSocket: ws, + UserId: c.Session.UserId, + SessionToken: c.Session.Token, + T: c.T, + Locale: c.Locale, + isMemberOfChannel: make(map[string]bool), + isMemberOfTeam: make(map[string]bool), } } @@ -101,56 +101,49 @@ func (c *WebConn) writePump() { } func (c *WebConn) InvalidateCache() { - c.hasPermissionsToChannel = make(map[string]bool) - c.hasPermissionsToTeam = make(map[string]bool) + c.isMemberOfTeam = make(map[string]bool) + c.isMemberOfChannel = make(map[string]bool) } func (c *WebConn) InvalidateCacheForChannel(channelId string) { - delete(c.hasPermissionsToChannel, channelId) + delete(c.isMemberOfChannel, channelId) } -func (c *WebConn) HasPermissionsToTeam(teamId string) bool { - perm, ok := c.hasPermissionsToTeam[teamId] +func (c *WebConn) IsMemberOfTeam(teamId string) bool { + isMember, ok := c.isMemberOfTeam[teamId] if !ok { session := GetSession(c.SessionToken) if session == nil { - perm = false - c.hasPermissionsToTeam[teamId] = perm + isMember = false + c.isMemberOfTeam[teamId] = isMember } else { member := session.GetTeamByTeamId(teamId) if member != nil { - perm = true - c.hasPermissionsToTeam[teamId] = perm + isMember = true + c.isMemberOfTeam[teamId] = isMember } else { - perm = true - c.hasPermissionsToTeam[teamId] = perm + isMember = true + c.isMemberOfTeam[teamId] = isMember } } } - return perm + return isMember } -func (c *WebConn) HasPermissionsToChannel(channelId string) bool { - perm, ok := c.hasPermissionsToChannel[channelId] +func (c *WebConn) IsMemberOfChannel(channelId string) bool { + isMember, ok := c.isMemberOfChannel[channelId] if !ok { - if cresult := <-Srv.Store.Channel().CheckPermissionsToNoTeam(channelId, c.UserId); cresult.Err != nil { - perm = false - c.hasPermissionsToChannel[channelId] = perm + if cresult := <-Srv.Store.Channel().GetMember(channelId, c.UserId); cresult.Err != nil { + isMember = false + c.isMemberOfChannel[channelId] = isMember } else { - count := cresult.Data.(int64) - - if count == 1 { - perm = true - c.hasPermissionsToChannel[channelId] = perm - } else { - perm = false - c.hasPermissionsToChannel[channelId] = perm - } + isMember = true + c.isMemberOfChannel[channelId] = isMember } } - return perm + return isMember } diff --git a/api/web_hub.go b/api/web_hub.go index 309d560a9..18c218634 100644 --- a/api/web_hub.go +++ b/api/web_hub.go @@ -5,6 +5,7 @@ package api import ( "fmt" + l4g "github.com/alecthomas/log4go" "github.com/mattermost/platform/einterfaces" @@ -154,7 +155,7 @@ func shouldSendEvent(webCon *WebConn, msg *model.WebSocketEvent) bool { // We have to make sure the user is in the channel. Otherwise system messages that // post about users in channels they are not in trigger warnings. if len(msg.ChannelId) > 0 { - allowed := webCon.HasPermissionsToChannel(msg.ChannelId) + allowed := webCon.IsMemberOfChannel(msg.ChannelId) if !allowed { return false @@ -176,7 +177,7 @@ func shouldSendEvent(webCon *WebConn, msg *model.WebSocketEvent) bool { // Only report events to users who are in the team for the event if len(msg.TeamId) > 0 { - allowed := webCon.HasPermissionsToTeam(msg.TeamId) + allowed := webCon.IsMemberOfTeam(msg.TeamId) if !allowed { return false @@ -185,7 +186,7 @@ func shouldSendEvent(webCon *WebConn, msg *model.WebSocketEvent) bool { // Only report events to users who are in the channel for the event execept deleted events if len(msg.ChannelId) > 0 && msg.Event != model.WEBSOCKET_EVENT_CHANNEL_DELETED { - allowed := webCon.HasPermissionsToChannel(msg.ChannelId) + allowed := webCon.IsMemberOfChannel(msg.ChannelId) if !allowed { return false diff --git a/model/team_member.go b/model/team_member.go index f03b064ec..a040e916b 100644 --- a/model/team_member.go +++ b/model/team_member.go @@ -55,23 +55,6 @@ func TeamMembersFromJson(data io.Reader) []*TeamMember { } } -func IsInTeamRole(teamRoles string, inRole string) bool { - roles := strings.Split(teamRoles, " ") - - for _, r := range roles { - if r == inRole { - return true - } - - } - - return false -} - -func (o *TeamMember) IsTeamAdmin() bool { - return true -} - func (o *TeamMember) IsValid() *AppError { if len(o.TeamId) != 26 { @@ -82,12 +65,6 @@ func (o *TeamMember) IsValid() *AppError { return NewLocAppError("TeamMember.IsValid", "model.team_member.is_valid.user_id.app_error", nil, "") } - /*for _, role := range strings.Split(o.Roles, " ") { - if !(role == "" || role == ROLE_TEAM_ADMIN.Id) { - return NewLocAppError("TeamMember.IsValid", "model.team_member.is_valid.role.app_error", nil, "role="+role) - } - }*/ - return nil } diff --git a/store/sql_channel_store.go b/store/sql_channel_store.go index c0f9bddf0..99a36b1cd 100644 --- a/store/sql_channel_store.go +++ b/store/sql_channel_store.go @@ -730,130 +730,6 @@ func (s SqlChannelStore) PermanentDeleteMembersByUser(userId string) StoreChanne return storeChannel } -func (s SqlChannelStore) CheckPermissionsToNoTeam(channelId string, userId string) StoreChannel { - storeChannel := make(StoreChannel, 1) - - go func() { - result := StoreResult{} - - count, err := s.GetReplica().SelectInt( - `SELECT - COUNT(0) - FROM - Channels, - ChannelMembers - WHERE - Channels.Id = ChannelMembers.ChannelId - AND Channels.DeleteAt = 0 - AND ChannelMembers.ChannelId = :ChannelId - AND ChannelMembers.UserId = :UserId`, - map[string]interface{}{"ChannelId": channelId, "UserId": userId}) - if err != nil { - result.Err = model.NewLocAppError("SqlChannelStore.CheckPermissionsTo", "store.sql_channel.check_permissions.app_error", nil, "channel_id="+channelId+", user_id="+userId+", "+err.Error()) - } else { - result.Data = count - } - - storeChannel <- result - close(storeChannel) - }() - - return storeChannel -} - -func (s SqlChannelStore) CheckPermissionsTo(teamId string, channelId string, userId string) StoreChannel { - storeChannel := make(StoreChannel, 1) - - go func() { - result := StoreResult{} - - count, err := s.GetReplica().SelectInt( - `SELECT - COUNT(0) - FROM - Channels, - ChannelMembers - WHERE - Channels.Id = ChannelMembers.ChannelId - AND (Channels.TeamId = :TeamId OR Channels.TeamId = '') - AND Channels.DeleteAt = 0 - AND ChannelMembers.ChannelId = :ChannelId - AND ChannelMembers.UserId = :UserId`, - map[string]interface{}{"TeamId": teamId, "ChannelId": channelId, "UserId": userId}) - if err != nil { - result.Err = model.NewLocAppError("SqlChannelStore.CheckPermissionsTo", "store.sql_channel.check_permissions.app_error", nil, "channel_id="+channelId+", user_id="+userId+", "+err.Error()) - } else { - result.Data = count - } - - storeChannel <- result - close(storeChannel) - }() - - return storeChannel -} - -func (s SqlChannelStore) CheckPermissionsToByName(teamId string, channelName string, userId string) StoreChannel { - storeChannel := make(StoreChannel, 1) - - go func() { - result := StoreResult{} - - channelId, err := s.GetReplica().SelectStr( - `SELECT - Channels.Id - FROM - Channels, - ChannelMembers - WHERE - Channels.Id = ChannelMembers.ChannelId - AND (Channels.TeamId = :TeamId OR Channels.TeamId = '') - AND Channels.Name = :Name - AND Channels.DeleteAt = 0 - AND ChannelMembers.UserId = :UserId`, - map[string]interface{}{"TeamId": teamId, "Name": channelName, "UserId": userId}) - if err != nil { - result.Err = model.NewLocAppError("SqlChannelStore.CheckPermissionsToByName", "store.sql_channel.check_permissions_by_name.app_error", nil, "channel_id="+channelName+", user_id="+userId+", "+err.Error()) - } else { - result.Data = channelId - } - - storeChannel <- result - close(storeChannel) - }() - - return storeChannel -} - -func (s SqlChannelStore) CheckOpenChannelPermissions(teamId string, channelId string) StoreChannel { - storeChannel := make(StoreChannel, 1) - - go func() { - result := StoreResult{} - - count, err := s.GetReplica().SelectInt( - `SELECT - COUNT(0) - FROM - Channels - WHERE - Channels.Id = :ChannelId - AND Channels.TeamId = :TeamId - AND Channels.Type = :ChannelType`, - map[string]interface{}{"ChannelId": channelId, "TeamId": teamId, "ChannelType": model.CHANNEL_OPEN}) - if err != nil { - result.Err = model.NewLocAppError("SqlChannelStore.CheckOpenChannelPermissions", "store.sql_channel.check_open_channel_permissions.app_error", nil, "channel_id="+channelId+", "+err.Error()) - } else { - result.Data = count - } - - storeChannel <- result - close(storeChannel) - }() - - return storeChannel -} - func (s SqlChannelStore) SetLastViewedAt(channelId string, userId string, newLastViewedAt int64) StoreChannel { storeChannel := make(StoreChannel, 1) diff --git a/store/sql_channel_store_test.go b/store/sql_channel_store_test.go index 6a567f470..519fdea6a 100644 --- a/store/sql_channel_store_test.go +++ b/store/sql_channel_store_test.go @@ -4,9 +4,10 @@ package store import ( - "github.com/mattermost/platform/model" "testing" "time" + + "github.com/mattermost/platform/model" ) func TestChannelStoreSave(t *testing.T) { @@ -442,94 +443,6 @@ func TestChannelDeleteMemberStore(t *testing.T) { } } -func TestChannelStorePermissionsTo(t *testing.T) { - Setup() - - o1 := model.Channel{} - o1.TeamId = model.NewId() - o1.DisplayName = "Channel1" - o1.Name = "a" + model.NewId() + "b" - o1.Type = model.CHANNEL_OPEN - Must(store.Channel().Save(&o1)) - - m1 := model.ChannelMember{} - m1.ChannelId = o1.Id - m1.UserId = model.NewId() - m1.NotifyProps = model.GetDefaultChannelNotifyProps() - Must(store.Channel().SaveMember(&m1)) - - count := (<-store.Channel().CheckPermissionsTo(o1.TeamId, o1.Id, m1.UserId)).Data.(int64) - if count != 1 { - t.Fatal("should have permissions") - } - - count = (<-store.Channel().CheckPermissionsToNoTeam(o1.Id, m1.UserId)).Data.(int64) - if count != 1 { - t.Fatal("should have permissions") - } - - count = (<-store.Channel().CheckPermissionsTo("junk", o1.Id, m1.UserId)).Data.(int64) - if count != 0 { - t.Fatal("shouldn't have permissions") - } - - count = (<-store.Channel().CheckPermissionsTo(o1.TeamId, "junk", m1.UserId)).Data.(int64) - if count != 0 { - t.Fatal("shouldn't have permissions") - } - - count = (<-store.Channel().CheckPermissionsToNoTeam("junk", m1.UserId)).Data.(int64) - if count != 0 { - t.Fatal("shouldn't have permissions") - } - - count = (<-store.Channel().CheckPermissionsTo(o1.TeamId, o1.Id, "junk")).Data.(int64) - if count != 0 { - t.Fatal("shouldn't have permissions") - } - - count = (<-store.Channel().CheckPermissionsToNoTeam(o1.Id, "junk")).Data.(int64) - if count != 0 { - t.Fatal("shouldn't have permissions") - } - - channelId := (<-store.Channel().CheckPermissionsToByName(o1.TeamId, o1.Name, m1.UserId)).Data.(string) - if channelId != o1.Id { - t.Fatal("should have permissions") - } - - channelId = (<-store.Channel().CheckPermissionsToByName(o1.TeamId, "missing", m1.UserId)).Data.(string) - if channelId != "" { - t.Fatal("should not have permissions") - } -} - -func TestChannelStoreOpenChannelPermissionsTo(t *testing.T) { - Setup() - - o1 := model.Channel{} - o1.TeamId = model.NewId() - o1.DisplayName = "Channel1" - o1.Name = "a" + model.NewId() + "b" - o1.Type = model.CHANNEL_OPEN - Must(store.Channel().Save(&o1)) - - count := (<-store.Channel().CheckOpenChannelPermissions(o1.TeamId, o1.Id)).Data.(int64) - if count != 1 { - t.Fatal("should have permissions") - } - - count = (<-store.Channel().CheckOpenChannelPermissions("junk", o1.Id)).Data.(int64) - if count != 0 { - t.Fatal("shouldn't have permissions") - } - - count = (<-store.Channel().CheckOpenChannelPermissions(o1.TeamId, "junk")).Data.(int64) - if count != 0 { - t.Fatal("shouldn't have permissions") - } -} - func TestChannelStoreGetChannels(t *testing.T) { Setup() diff --git a/store/store.go b/store/store.go index 620a99ff3..fbe415986 100644 --- a/store/store.go +++ b/store/store.go @@ -95,10 +95,6 @@ type ChannelStore interface { RemoveMember(channelId string, userId string) StoreChannel PermanentDeleteMembersByUser(userId string) StoreChannel GetExtraMembers(channelId string, limit int) StoreChannel - CheckPermissionsTo(teamId string, channelId string, userId string) StoreChannel - CheckPermissionsToNoTeam(channelId string, userId string) StoreChannel - CheckOpenChannelPermissions(teamId string, channelId string) StoreChannel - CheckPermissionsToByName(teamId string, channelName string, userId string) StoreChannel UpdateLastViewedAt(channelId string, userId string) StoreChannel SetLastViewedAt(channelId string, userId string, newLastViewedAt int64) StoreChannel IncrementMentionCount(channelId string, userId string) StoreChannel |