diff options
author | Harrison Healey <harrisonmhealey@gmail.com> | 2016-06-06 13:03:56 -0400 |
---|---|---|
committer | Harrison Healey <harrisonmhealey@gmail.com> | 2016-06-06 13:03:56 -0400 |
commit | 384d0eb245e2aa325fdcfe2d8ee22a40c91af589 (patch) | |
tree | c61bbf3241625d766fa81fbebf7395db3ef3521d /api | |
parent | 2c42294bbcab3cd5cfdce9604e5872fe4a12e538 (diff) | |
download | chat-384d0eb245e2aa325fdcfe2d8ee22a40c91af589.tar.gz chat-384d0eb245e2aa325fdcfe2d8ee22a40c91af589.tar.bz2 chat-384d0eb245e2aa325fdcfe2d8ee22a40c91af589.zip |
PLT-2559 Always return successful when trying to join a channel that the user is already a member of (#3265)
* Added unit tests for SqlChannelStore.GetMember
* Fixed api routes for accessing channels by name when the name includes an underscore
* Changed join channel API to always return successful when the user is already a member of the channel
Diffstat (limited to 'api')
-rw-r--r-- | api/api.go | 4 | ||||
-rw-r--r-- | api/channel.go | 5 | ||||
-rw-r--r-- | api/channel_test.go | 32 |
3 files changed, 37 insertions, 4 deletions
diff --git a/api/api.go b/api/api.go index 63a460dc5..3404e0c0b 100644 --- a/api/api.go +++ b/api/api.go @@ -25,7 +25,7 @@ type Routes struct { Channels *mux.Router // 'api/v3/teams/{team_id:[A-Za-z0-9]+}/channels' NeedChannel *mux.Router // 'api/v3/teams/{team_id:[A-Za-z0-9]+}/channels/{channel_id:[A-Za-z0-9]+}' - NeedChannelName *mux.Router // 'api/v3/teams/{team_id:[A-Za-z0-9]+}/channels/name/{channel_name:[A-Za-z0-9-]+}' + NeedChannelName *mux.Router // 'api/v3/teams/{team_id:[A-Za-z0-9]+}/channels/name/{channel_name:[A-Za-z0-9_-]+}' Posts *mux.Router // 'api/v3/teams/{team_id:[A-Za-z0-9]+}/channels/{channel_id:[A-Za-z0-9]+}/posts' NeedPost *mux.Router // 'api/v3/teams/{team_id:[A-Za-z0-9]+}/channels/{channel_id:[A-Za-z0-9]+}/posts/{post_id:[A-Za-z0-9]+}' @@ -60,7 +60,7 @@ func InitApi() { BaseRoutes.NeedTeam = BaseRoutes.Teams.PathPrefix("/{team_id:[A-Za-z0-9]+}").Subrouter() BaseRoutes.Channels = BaseRoutes.NeedTeam.PathPrefix("/channels").Subrouter() BaseRoutes.NeedChannel = BaseRoutes.Channels.PathPrefix("/{channel_id:[A-Za-z0-9]+}").Subrouter() - BaseRoutes.NeedChannelName = BaseRoutes.Channels.PathPrefix("/name/{channel_name:[A-Za-z0-9-]+}").Subrouter() + BaseRoutes.NeedChannelName = BaseRoutes.Channels.PathPrefix("/name/{channel_name:[A-Za-z0-9_-]+}").Subrouter() BaseRoutes.Posts = BaseRoutes.NeedChannel.PathPrefix("/posts").Subrouter() BaseRoutes.NeedPost = BaseRoutes.Posts.PathPrefix("/{post_id:[A-Za-z0-9]+}").Subrouter() BaseRoutes.Commands = BaseRoutes.NeedTeam.PathPrefix("/commands").Subrouter() diff --git a/api/channel.go b/api/channel.go index 6d1604900..e0428f311 100644 --- a/api/channel.go +++ b/api/channel.go @@ -476,6 +476,11 @@ func joinChannel(c *Context, channelChannel store.StoreChannel, userChannel stor channel := cresult.Data.(*model.Channel) user := uresult.Data.(*model.User) + if mresult := <-Srv.Store.Channel().GetMember(channel.Id, user.Id); mresult.Err == nil && mresult.Data != nil { + // the user is already in the channel so just return successful + return nil, channel + } + if !c.HasPermissionsToTeam(channel.TeamId, "join") { return c.Err, nil } diff --git a/api/channel_test.go b/api/channel_test.go index 175b0a14a..5c51e4d93 100644 --- a/api/channel_test.go +++ b/api/channel_test.go @@ -462,11 +462,25 @@ func TestJoinChannelById(t *testing.T) { user3 := th.CreateUser(th.BasicClient) LinkUserToTeam(user3, team) - Client.Login(user3.Email, "pwd") + Client.Must(Client.Login(user3.Email, "Password1")) if _, err := Client.JoinChannel(rchannel.Id); err == nil { t.Fatal("shoudn't be able to join direct channel") } + + th.LoginBasic() + + if _, err := Client.JoinChannel(channel1.Id); err != nil { + t.Fatal("should be able to join public channel that we're a member of") + } + + if _, err := Client.JoinChannel(channel3.Id); err != nil { + t.Fatal("should be able to join private channel that we're a member of") + } + + if _, err := Client.JoinChannel(rchannel.Id); err != nil { + t.Fatal("should be able to join direct channel that we're a member of") + } } func TestJoinChannelByName(t *testing.T) { @@ -492,11 +506,25 @@ func TestJoinChannelByName(t *testing.T) { user3 := th.CreateUser(th.BasicClient) LinkUserToTeam(user3, team) - Client.Login(user3.Email, "pwd") + Client.Must(Client.Login(user3.Email, "Password1")) if _, err := Client.JoinChannelByName(rchannel.Name); err == nil { t.Fatal("shoudn't be able to join direct channel") } + + th.LoginBasic() + + if _, err := Client.JoinChannelByName(channel1.Name); err != nil { + t.Fatal("should be able to join public channel that we're a member of") + } + + if _, err := Client.JoinChannelByName(channel3.Name); err != nil { + t.Fatal("should be able to join private channel that we're a member of") + } + + if _, err := Client.JoinChannelByName(rchannel.Name); err != nil { + t.Fatal("should be able to join direct channel that we're a member of") + } } func TestLeaveChannel(t *testing.T) { |