diff options
316 files changed, 1097 insertions, 581 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 7357796e2..66e430f7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,69 @@ # Mattermost Changelog +## UNDER DEVELOPMENT - Release v1.1.0 + +-The "UNDER DEVELOPMENT" section of the Mattermost changelog appears in the product's `master` branch to note key changes committed to master and are on their way to the next stable release. When a stable release is pushed the "UNDER DEVELOPMENT" heading is removed from the final changelog of the release. +- +-- **Final release anticipated:** 2015-10-16 + +### Release Highlights + +#### Incoming Webhooks + +Mattermost now supports incoming webhooks for channels and private groups. This developer feature is available from the Account Settings -> Integrations menu. Documentation on how developers can use the webhook functionality to build custom integrations, along with samples, is available at http://mattermost.org/webhooks. + +### Improvements + +Integrations + +- Improved support for incoming webhooks, including the ability to override a username and post as a bot instead + +Documentation + +- Contents of `/docs` now hosted at docs.mattermost.org +- Added documentation on config.json and System Console settings +- Docker Toolbox replaces deprecated Boot2Docker instructions in container install documentation + +Theme Colors + +- Improved appearance of dark themes + +System Console + +- Client side errors now written to server logs +- Added "EnableSecurityFixAlert" option to receive alerts on relevant security fix alerts +- Various improvements to System Console UI and help text + +Messaging and Notifications + +- Replaced "Quiet Mode" in the Channel Notification Settings with an option to only show unread indicator when mentioned + +### Bug Fixes + +- Fixed regression causing "Get Public Link" on images not to work +- Fixed bug where certain characters caused search errors +- Fixed bug where System Administrator did not have Team Administrator permissions +- Fixed bug causing scrolling to jump when the right hand sidebar opened and closed + +### Contributors + +Many thanks to our external contributors. In no particular order: + +- [chengweiv5](https://github.com/chengweiv5) +- [pstonier](https://github.com/pstonier) +- [teviot](https://github.com/teviot) +- [tmuwandi](https://github.com/tmuwandi) +- [driou](https://github.com/driou) +- [justyns](https://github.com/justyns) +- [drbaker](https://github.com/drbaker) +- [thomas9987](https://github.com/thomas9987) +- [chuck5](https://github.com/chuck5) +- [sjmog](https://github.com/sjmog) +- [chengkun](https://github.com/chengkun) +- [sexybern](https://github.com/sexybern) +- [tomitm](https://github.com/tomitm) +- [stephenfin](https://github.com/stephenfin) + ## Release v1.0.0 Released 2015-10-02 diff --git a/LICENSE.txt b/LICENSE.txt index f7e182eac..c0c337525 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -5,7 +5,7 @@ SOFTWARE LICENSING Mattermost server is made available under two separate licensing options: - Free Software Foundation’s GNU AGPL v.3.0, subject to the exceptions outlined in this policy; or -- Commercial licenses available from SpinPunch, Inc. by contacting commercial@mattermost.com +- Commercial licenses available from Mattermost, Inc. by contacting commercial@mattermost.com Admin Tools and Configuration Files (api/templates/, config/, model/, web/react/utils/, web/static/, web/templates/ and all subdirectories thereof) are made available under: @@ -33,7 +33,7 @@ commercial licenses are available from commercial@mattermost.com. MATTERMOST TRADEMARK GUIDELINES -Your use of the mark Mattermost is subject to SpinPunch’s prior written approval and our organization’s Trademark +Your use of the mark Mattermost is subject to Mattermost, Inc's prior written approval and our organization’s Trademark Standards of Use at http://www.mattermost.org/trademark-standards-of-use/. For trademark approval or any questions you have about using these trademarks, please email trademark@mattermost.com diff --git a/NOTICE.txt b/NOTICE.txt index f908bbd28..cc9e35af8 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,5 +1,5 @@ Mattermost Platform -© 2015 Spinpunch, Inc. All Rights Reserved. See LICENSE.txt for license information. +© 2015 Mattermost, Inc. All Rights Reserved. See LICENSE.txt for license information. NOTICES: -------- diff --git a/api/admin.go b/api/admin.go index d9714d6d2..2167868e0 100644 --- a/api/admin.go +++ b/api/admin.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/admin_test.go b/api/admin_test.go index ad7ac08f8..0e51644d8 100644 --- a/api/admin_test.go +++ b/api/admin_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/api.go b/api/api.go index a50cce946..5c3c0d8c6 100644 --- a/api/api.go +++ b/api/api.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/api_test.go b/api/api_test.go index 761f3e33f..bea949ad2 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/auto_channels.go b/api/auto_channels.go index b72e5d538..ab1fe6ed3 100644 --- a/api/auto_channels.go +++ b/api/auto_channels.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/auto_constants.go b/api/auto_constants.go index 73ecb47f8..f5d5dab0c 100644 --- a/api/auto_constants.go +++ b/api/auto_constants.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/auto_enviroment.go b/api/auto_enviroment.go index dd663533c..c6453f5da 100644 --- a/api/auto_enviroment.go +++ b/api/auto_enviroment.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/auto_posts.go b/api/auto_posts.go index a014d22ae..b64217c55 100644 --- a/api/auto_posts.go +++ b/api/auto_posts.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/auto_teams.go b/api/auto_teams.go index dd82abe8d..6677ac9bf 100644 --- a/api/auto_teams.go +++ b/api/auto_teams.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/auto_users.go b/api/auto_users.go index 39ed201b9..d1e3d494e 100644 --- a/api/auto_users.go +++ b/api/auto_users.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/channel.go b/api/channel.go index 0d22d7c00..adf125378 100644 --- a/api/channel.go +++ b/api/channel.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api @@ -26,11 +26,11 @@ func InitChannel(r *mux.Router) { sr.Handle("/update_notify_props", ApiUserRequired(updateNotifyProps)).Methods("POST") sr.Handle("/{id:[A-Za-z0-9]+}/", ApiUserRequiredActivity(getChannel, false)).Methods("GET") sr.Handle("/{id:[A-Za-z0-9]+}/extra_info", ApiUserRequired(getChannelExtraInfo)).Methods("GET") - sr.Handle("/{id:[A-Za-z0-9]+}/join", ApiUserRequired(joinChannel)).Methods("POST") - sr.Handle("/{id:[A-Za-z0-9]+}/leave", ApiUserRequired(leaveChannel)).Methods("POST") + sr.Handle("/{id:[A-Za-z0-9]+}/join", ApiUserRequired(join)).Methods("POST") + sr.Handle("/{id:[A-Za-z0-9]+}/leave", ApiUserRequired(leave)).Methods("POST") sr.Handle("/{id:[A-Za-z0-9]+}/delete", ApiUserRequired(deleteChannel)).Methods("POST") - sr.Handle("/{id:[A-Za-z0-9]+}/add", ApiUserRequired(addChannelMember)).Methods("POST") - sr.Handle("/{id:[A-Za-z0-9]+}/remove", ApiUserRequired(removeChannelMember)).Methods("POST") + sr.Handle("/{id:[A-Za-z0-9]+}/add", ApiUserRequired(addMember)).Methods("POST") + sr.Handle("/{id:[A-Za-z0-9]+}/remove", ApiUserRequired(removeMember)).Methods("POST") sr.Handle("/{id:[A-Za-z0-9]+}/update_last_viewed_at", ApiUserRequired(updateLastViewedAt)).Methods("POST") } @@ -329,7 +329,7 @@ func getChannelCounts(c *Context, w http.ResponseWriter, r *http.Request) { } } -func joinChannel(c *Context, w http.ResponseWriter, r *http.Request) { +func join(c *Context, w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) channelId := params["id"] @@ -360,43 +360,62 @@ func JoinChannel(c *Context, channelId string, role string) { channel := cresult.Data.(*model.Channel) user := uresult.Data.(*model.User) - if !c.HasPermissionsToTeam(channel.TeamId, "joinChannel") { - return - } - - if channel.DeleteAt > 0 { - c.Err = model.NewAppError("joinChannel", "The channel has been archived or deleted", "") - c.Err.StatusCode = http.StatusBadRequest + if !c.HasPermissionsToTeam(channel.TeamId, "join") { return } if channel.Type == model.CHANNEL_OPEN { - cm := &model.ChannelMember{ChannelId: channel.Id, UserId: c.Session.UserId, - Roles: role, NotifyProps: model.GetDefaultChannelNotifyProps()} - - if cmresult := <-Srv.Store.Channel().SaveMember(cm); cmresult.Err != nil { - c.Err = cmresult.Err - return - } - - post := &model.Post{ChannelId: channel.Id, Message: fmt.Sprintf( - `User %v has joined this channel.`, - user.Username), Type: model.POST_JOIN_LEAVE} - if _, err := CreatePost(c, post, false); err != nil { - l4g.Error("Failed to post join message %v", err) - c.Err = model.NewAppError("joinChannel", "Failed to send join request", "") + if _, err := AddUserToChannel(user, channel); err != nil { + c.Err = err return } - - UpdateChannelAccessCacheAndForget(c.Session.TeamId, c.Session.UserId, channel.Id) + PostUserAddRemoveMessageAndForget(c, channel.Id, fmt.Sprintf(`User %v has joined this channel.`, user.Username)) } else { - c.Err = model.NewAppError("joinChannel", "You do not have the appropriate permissions", "") + c.Err = model.NewAppError("join", "You do not have the appropriate permissions", "") c.Err.StatusCode = http.StatusForbidden return } } } +func PostUserAddRemoveMessageAndForget(c *Context, channelId string, message string) { + go func() { + post := &model.Post{ + ChannelId: channelId, + Message: message, + Type: model.POST_JOIN_LEAVE, + } + if _, err := CreatePost(c, post, false); err != nil { + l4g.Error("Failed to post join/leave message %v", err) + } + }() +} + +func AddUserToChannel(user *model.User, channel *model.Channel) (*model.ChannelMember, *model.AppError) { + if channel.DeleteAt > 0 { + return nil, model.NewAppError("AddUserToChannel", "The channel has been archived or deleted", "") + } + + if channel.Type != model.CHANNEL_OPEN && channel.Type != model.CHANNEL_PRIVATE { + return nil, model.NewAppError("AddUserToChannel", "Can not add user to this channel type", "") + } + + newMember := &model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, NotifyProps: model.GetDefaultChannelNotifyProps()} + if cmresult := <-Srv.Store.Channel().SaveMember(newMember); cmresult.Err != nil { + l4g.Error("Failed to add member user_id=%v channel_id=%v err=%v", user.Id, channel.Id, cmresult.Err) + return nil, model.NewAppError("AddUserToChannel", "Failed to add user to channel", "") + } + + go func() { + UpdateChannelAccessCache(channel.TeamId, user.Id, channel.Id) + + message := model.NewMessage(channel.TeamId, channel.Id, user.Id, model.ACTION_USER_ADDED) + PublishAndForget(message) + }() + + return newMember, nil +} + func JoinDefaultChannels(user *model.User, channelRole string) *model.AppError { // We don't call JoinChannel here since c.Session is not populated on user creation @@ -427,7 +446,7 @@ func JoinDefaultChannels(user *model.User, channelRole string) *model.AppError { return err } -func leaveChannel(c *Context, w http.ResponseWriter, r *http.Request) { +func leave(c *Context, w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) id := params["id"] @@ -445,24 +464,18 @@ func leaveChannel(c *Context, w http.ResponseWriter, r *http.Request) { channel := cresult.Data.(*model.Channel) user := uresult.Data.(*model.User) - if !c.HasPermissionsToTeam(channel.TeamId, "leaveChannel") { - return - } - - if channel.DeleteAt > 0 { - c.Err = model.NewAppError("leaveChannel", "The channel has been archived or deleted", "") - c.Err.StatusCode = http.StatusBadRequest + if !c.HasPermissionsToTeam(channel.TeamId, "leave") { return } if channel.Type == model.CHANNEL_DIRECT { - c.Err = model.NewAppError("leaveChannel", "Cannot leave a direct message channel", "") + c.Err = model.NewAppError("leave", "Cannot leave a direct message channel", "") c.Err.StatusCode = http.StatusForbidden return } if channel.Name == model.DEFAULT_CHANNEL { - c.Err = model.NewAppError("leaveChannel", "Cannot leave the default channel "+model.DEFAULT_CHANNEL, "") + c.Err = model.NewAppError("leave", "Cannot leave the default channel "+model.DEFAULT_CHANNEL, "") c.Err.StatusCode = http.StatusForbidden return } @@ -472,16 +485,9 @@ func leaveChannel(c *Context, w http.ResponseWriter, r *http.Request) { return } - UpdateChannelAccessCacheAndForget(c.Session.TeamId, c.Session.UserId, channel.Id) + RemoveUserFromChannel(c.Session.UserId, c.Session.UserId, channel) - post := &model.Post{ChannelId: channel.Id, Message: fmt.Sprintf( - `%v has left the channel.`, - user.Username), Type: model.POST_JOIN_LEAVE} - if _, err := CreatePost(c, post, false); err != nil { - l4g.Error("Failed to post leave message %v", err) - c.Err = model.NewAppError("leaveChannel", "Failed to send leave message", "") - return - } + PostUserAddRemoveMessageAndForget(c, channel.Id, fmt.Sprintf(`%v has left the channel.`, user.Username)) result := make(map[string]string) result["id"] = channel.Id @@ -656,7 +662,7 @@ func getChannelExtraInfo(c *Context, w http.ResponseWriter, r *http.Request) { } } -func addChannelMember(c *Context, w http.ResponseWriter, r *http.Request) { +func addMember(c *Context, w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) id := params["id"] @@ -664,7 +670,7 @@ func addChannelMember(c *Context, w http.ResponseWriter, r *http.Request) { userId := data["user_id"] if len(userId) != 26 { - c.SetInvalidParam("addChannelMember", "user_id") + c.SetInvalidParam("addMember", "user_id") return } @@ -674,55 +680,35 @@ func addChannelMember(c *Context, w http.ResponseWriter, r *http.Request) { nuc := Srv.Store.User().Get(userId) // Only need to be a member of the channel to add a new member - if !c.HasPermissionsToChannel(cchan, "addChannelMember") { + if !c.HasPermissionsToChannel(cchan, "addMember") { return } if nresult := <-nuc; nresult.Err != nil { - c.Err = model.NewAppError("addChannelMember", "Failed to find user to be added", "") + c.Err = model.NewAppError("addMember", "Failed to find user to be added", "") return } else if cresult := <-sc; cresult.Err != nil { - c.Err = model.NewAppError("addChannelMember", "Failed to find channel", "") + c.Err = model.NewAppError("addMember", "Failed to find channel", "") return } else { channel := cresult.Data.(*model.Channel) nUser := nresult.Data.(*model.User) - if channel.DeleteAt > 0 { - c.Err = model.NewAppError("updateChannel", "The channel has been archived or deleted", "") - c.Err.StatusCode = http.StatusBadRequest - return - } - if oresult := <-ouc; oresult.Err != nil { - c.Err = model.NewAppError("addChannelMember", "Failed to find user doing the adding", "") + c.Err = model.NewAppError("addMember", "Failed to find user doing the adding", "") return } else { oUser := oresult.Data.(*model.User) - cm := &model.ChannelMember{ChannelId: channel.Id, UserId: userId, NotifyProps: model.GetDefaultChannelNotifyProps()} - - if cmresult := <-Srv.Store.Channel().SaveMember(cm); cmresult.Err != nil { - l4g.Error("Failed to add member user_id=%v channel_id=%v err=%v", userId, id, cmresult.Err) - c.Err = model.NewAppError("addChannelMember", "Failed to add user to channel", "") + cm, err := AddUserToChannel(nUser, channel) + if err != nil { + c.Err = err return } c.LogAudit("name=" + channel.Name + " user_id=" + userId) - go func() { - post := &model.Post{ChannelId: id, Message: fmt.Sprintf( - `%v added to the channel by %v`, - nUser.Username, oUser.Username), Type: model.POST_JOIN_LEAVE} - if _, err := CreatePost(c, post, false); err != nil { - l4g.Error("Failed to post add member to channel message, err=%v", err) - } - - UpdateChannelAccessCache(c.Session.TeamId, userId, channel.Id) - message := model.NewMessage(c.Session.TeamId, channel.Id, userId, model.ACTION_USER_ADDED) - - PublishAndForget(message) - }() + PostUserAddRemoveMessageAndForget(c, channel.Id, fmt.Sprintf(`%v added to the channel by %v`, nUser.Username, oUser.Username)) <-Srv.Store.Channel().UpdateLastViewedAt(id, oUser.Id) w.Write([]byte(cm.ToJson())) @@ -730,20 +716,20 @@ func addChannelMember(c *Context, w http.ResponseWriter, r *http.Request) { } } -func removeChannelMember(c *Context, w http.ResponseWriter, r *http.Request) { +func removeMember(c *Context, w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) - id := params["id"] + channelId := params["id"] data := model.MapFromJson(r.Body) - userId := data["user_id"] + userIdToRemove := data["user_id"] - if len(userId) != 26 { - c.SetInvalidParam("addChannelMember", "user_id") + if len(userIdToRemove) != 26 { + c.SetInvalidParam("removeMember", "user_id") return } - sc := Srv.Store.Channel().Get(id) - cmc := Srv.Store.Channel().GetMember(id, c.Session.UserId) + sc := Srv.Store.Channel().Get(channelId) + cmc := Srv.Store.Channel().GetMember(channelId, c.Session.UserId) if cresult := <-sc; cresult.Err != nil { c.Err = cresult.Err @@ -753,48 +739,52 @@ func removeChannelMember(c *Context, w http.ResponseWriter, r *http.Request) { return } else { channel := cresult.Data.(*model.Channel) - channelMember := cmcresult.Data.(model.ChannelMember) + removerChannelMember := cmcresult.Data.(model.ChannelMember) - if !c.HasPermissionsToTeam(channel.TeamId, "removeChannelMember") { + if !c.HasPermissionsToTeam(channel.TeamId, "removeMember") { return } - if !strings.Contains(channelMember.Roles, model.CHANNEL_ROLE_ADMIN) && !strings.Contains(c.Session.Roles, model.ROLE_TEAM_ADMIN) { + if !strings.Contains(removerChannelMember.Roles, model.CHANNEL_ROLE_ADMIN) && !c.IsTeamAdmin() { c.Err = model.NewAppError("updateChannel", "You do not have the appropriate permissions ", "") c.Err.StatusCode = http.StatusForbidden return } - if channel.DeleteAt > 0 { - c.Err = model.NewAppError("updateChannel", "The channel has been archived or deleted", "") - c.Err.StatusCode = http.StatusBadRequest + if err := RemoveUserFromChannel(userIdToRemove, c.Session.UserId, channel); err != nil { + c.Err = model.NewAppError("updateChannel", "Unable to remove user.", err.Message) return } - if cmresult := <-Srv.Store.Channel().RemoveMember(id, userId); cmresult.Err != nil { - c.Err = cmresult.Err - return - } - - c.LogAudit("name=" + channel.Name + " user_id=" + userId) - - go func() { - UpdateChannelAccessCache(c.Session.TeamId, userId, id) - - message := model.NewMessage(c.Session.TeamId, "", userId, model.ACTION_USER_REMOVED) - message.Add("channel_id", id) - message.Add("remover", c.Session.UserId) - PublishAndForget(message) - }() + c.LogAudit("name=" + channel.Name + " user_id=" + userIdToRemove) result := make(map[string]string) result["channel_id"] = channel.Id - result["removed_user_id"] = userId + result["removed_user_id"] = userIdToRemove w.Write([]byte(model.MapToJson(result))) } } +func RemoveUserFromChannel(userIdToRemove string, removerUserId string, channel *model.Channel) *model.AppError { + if channel.DeleteAt > 0 { + return model.NewAppError("updateChannel", "The channel has been archived or deleted", "") + } + + if cmresult := <-Srv.Store.Channel().RemoveMember(channel.Id, userIdToRemove); cmresult.Err != nil { + return cmresult.Err + } + + UpdateChannelAccessCacheAndForget(channel.TeamId, userIdToRemove, channel.Id) + + message := model.NewMessage(channel.TeamId, "", userIdToRemove, model.ACTION_USER_REMOVED) + message.Add("channel_id", channel.Id) + message.Add("remover", removerUserId) + PublishAndForget(message) + + return nil +} + func updateNotifyProps(c *Context, w http.ResponseWriter, r *http.Request) { data := model.MapFromJson(r.Body) diff --git a/api/channel_benchmark_test.go b/api/channel_benchmark_test.go index 7820f4a03..58e3fa18d 100644 --- a/api/channel_benchmark_test.go +++ b/api/channel_benchmark_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/channel_test.go b/api/channel_test.go index e6c7ed80e..899016065 100644 --- a/api/channel_test.go +++ b/api/channel_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/command.go b/api/command.go index 427922344..94b2cd2f8 100644 --- a/api/command.go +++ b/api/command.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/command_test.go b/api/command_test.go index 360c4da58..476748c6b 100644 --- a/api/command_test.go +++ b/api/command_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/context.go b/api/context.go index e80582b2a..bd9744bf8 100644 --- a/api/context.go +++ b/api/context.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/context_test.go b/api/context_test.go index 23a5b75b9..a9e2afa0f 100644 --- a/api/context_test.go +++ b/api/context_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/export.go b/api/export.go index aff34073f..fa9686005 100644 --- a/api/export.go +++ b/api/export.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/file.go b/api/file.go index bb9aa00d8..9ebcd821b 100644 --- a/api/file.go +++ b/api/file.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/file_benchmark_test.go b/api/file_benchmark_test.go index 47f8bff43..a02bffa0e 100644 --- a/api/file_benchmark_test.go +++ b/api/file_benchmark_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/file_test.go b/api/file_test.go index 657c08131..b337eadc4 100644 --- a/api/file_test.go +++ b/api/file_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/import.go b/api/import.go index c465825b4..81de78975 100644 --- a/api/import.go +++ b/api/import.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/oauth.go b/api/oauth.go index 26c3c5da8..5753db8bd 100644 --- a/api/oauth.go +++ b/api/oauth.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/oauth_test.go b/api/oauth_test.go index 18db49bc5..64d9c6fd9 100644 --- a/api/oauth_test.go +++ b/api/oauth_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/post.go b/api/post.go index 65dad0eb6..58fd3488a 100644 --- a/api/post.go +++ b/api/post.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/post_benchmark_test.go b/api/post_benchmark_test.go index 861c687fb..00eb3c468 100644 --- a/api/post_benchmark_test.go +++ b/api/post_benchmark_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/post_test.go b/api/post_test.go index 358611240..1971b6114 100644 --- a/api/post_test.go +++ b/api/post_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/server.go b/api/server.go index 3f23d8df6..347f0e2c9 100644 --- a/api/server.go +++ b/api/server.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/server_test.go b/api/server_test.go index 2d1d57392..a9837203f 100644 --- a/api/server_test.go +++ b/api/server_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/sharding.go b/api/sharding.go index 569d3a232..2a5db408c 100644 --- a/api/sharding.go +++ b/api/sharding.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/slackimport.go b/api/slackimport.go index 4e6c01dbb..06032c068 100644 --- a/api/slackimport.go +++ b/api/slackimport.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/team.go b/api/team.go index 8e5d634aa..6aa5ec1bb 100644 --- a/api/team.go +++ b/api/team.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api @@ -248,7 +248,7 @@ func createTeam(c *Context, w http.ResponseWriter, r *http.Request) { func CreateTeam(c *Context, team *model.Team) *model.Team { if !utils.Cfg.EmailSettings.EnableSignUpWithEmail { c.Err = model.NewAppError("createTeam", "Team sign-up with email is disabled.", "") - c.Err.StatusCode = http.StatusNotImplemented + c.Err.StatusCode = http.StatusForbidden return nil } @@ -432,9 +432,9 @@ func emailTeams(c *Context, w http.ResponseWriter, r *http.Request) { } subjectPage := NewServerTemplatePage("find_teams_subject") - subjectPage.Props["SiteURL"] = c.GetSiteURL() + subjectPage.ClientProps["SiteURL"] = c.GetSiteURL() bodyPage := NewServerTemplatePage("find_teams_body") - bodyPage.Props["SiteURL"] = c.GetSiteURL() + bodyPage.ClientProps["SiteURL"] = c.GetSiteURL() if result := <-Srv.Store.Team().GetTeamsForEmail(email); result.Err != nil { c.Err = result.Err diff --git a/api/team_test.go b/api/team_test.go index e2a7cf430..9b701911b 100644 --- a/api/team_test.go +++ b/api/team_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/templates/email_change_body.html b/api/templates/email_change_body.html index 0ec4ace2a..41fd6e4c3 100644 --- a/api/templates/email_change_body.html +++ b/api/templates/email_change_body.html @@ -9,7 +9,7 @@ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <tr> <td style="padding: 20px 20px 10px; text-align:left;"> - <img src="{{.Props.SiteURL}}/static/images/{{.ClientProps.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> + <img src="{{.Props.SiteURL}}/static/images/logo-email.png" width="130px" style="opacity: 0.5" alt=""> </td> </tr> <tr> @@ -18,7 +18,7 @@ <tr> <td style="border-bottom: 1px solid #ddd; padding: 0 0 20px;"> <h2 style="font-weight: normal; margin-top: 10px;">You updated your email</h2> - <p>You updated your email for {{.Props.TeamDisplayName}} on {{ .Props.TeamURL }}<br> If this change wasn't initiated by you, please reply to this email and let us know.</p> + <p>You email address for {{.Props.TeamDisplayName}} has been changed to {{.Props.NewEmail}}.<br>If you did not make this change, please contact the system administrator.</p> </td> </tr> <tr> @@ -37,7 +37,7 @@ <img width="65" src="{{.Props.SiteURL}}/static/images/circles.png" alt=""> </p> <p style="padding: 0 50px;"> - (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> + (c) 2015 Mattermost, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> If you no longer wish to receive these emails, click on the following link: <a href="mailto:{{.ClientProps.FeedbackEmail}}?subject=Unsubscribe&body=Unsubscribe" style="text-decoration: none; color:#2389D7;">Unsubscribe</a> </p> </td> @@ -51,4 +51,3 @@ </table> {{end}} - diff --git a/api/templates/email_change_subject.html b/api/templates/email_change_subject.html index 5690b148a..962ae868e 100644 --- a/api/templates/email_change_subject.html +++ b/api/templates/email_change_subject.html @@ -1 +1 @@ -{{define "email_change_subject"}}You updated your email for {{.Props.TeamDisplayName}} on {{ .Props.Domain }}{{end}} +{{define "email_change_subject"}}[{{.ClientProps.SiteName}}] Your email address has changed for {{.Props.TeamDisplayName}}{{end}} diff --git a/api/templates/email_change_verify_body.html b/api/templates/email_change_verify_body.html new file mode 100644 index 000000000..1e1bcc22d --- /dev/null +++ b/api/templates/email_change_verify_body.html @@ -0,0 +1,56 @@ +{{define "email_change_verify_body"}} + +<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="margin-top: 20px; line-height: 1.7; color: #555;"> + <tr> + <td> + <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 660px; font-family: Helvetica, Arial, sans-serif; font-size: 14px; background: #FFF;"> + <tr> + <td style="border: 1px solid #ddd;"> + <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> + <tr> + <td style="padding: 20px 20px 10px; text-align:left;"> + <img src="{{.Props.SiteURL}}/static/images/{{.ClientProps.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> + </td> + </tr> + <tr> + <td> + <table border="0" cellpadding="0" cellspacing="0" style="padding: 20px 50px 0; text-align: center; margin: 0 auto"> + <tr> + <td style="border-bottom: 1px solid #ddd; padding: 0 0 20px;"> + <h2 style="font-weight: normal; margin-top: 10px;">You updated your email</h2> + <p>To finish updating your email address for {{.Props.TeamDisplayName}}, please click the link below to confirm this is the right address.</p> + <p style="margin: 20px 0 15px"> + <a href="{{.Props.VerifyUrl}}" style="background: #2389D7; border-radius: 3px; color: #fff; border: none; outline: none; min-width: 200px; padding: 15px 25px; font-size: 14px; font-family: inherit; cursor: pointer; -webkit-appearance: none;text-decoration: none;">Verify Email</a> + </p> + </td> + </tr> + <tr> + <td style="color: #999; padding-top: 20px; line-height: 25px; font-size: 13px;"> + Any questions at all, mail us any time: <a href="mailto:{{.ClientProps.FeedbackEmail}}" style="text-decoration: none; color:#2389D7;">{{.ClientProps.FeedbackEmail}}</a>.<br> + Best wishes,<br> + The {{.ClientProps.SiteName}} Team<br> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td style="text-align: center;color: #AAA; font-size: 11px; padding-bottom: 10px;"> + <p style="margin: 25px 0;"> + <img width="65" src="{{.Props.SiteURL}}/static/images/circles.png" alt=""> + </p> + <p style="padding: 0 50px;"> + (c) 2015 Mattermost, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> + If you no longer wish to receive these emails, click on the following link: <a href="mailto:{{.ClientProps.FeedbackEmail}}?subject=Unsubscribe&body=Unsubscribe" style="text-decoration: none; color:#2389D7;">Unsubscribe</a> + </p> + </td> + </tr> + </table> + </td> + </tr> + </table> + </td> + </tr> +</table> + +{{end}} diff --git a/api/templates/email_change_verify_subject.html b/api/templates/email_change_verify_subject.html new file mode 100644 index 000000000..5e2ac1452 --- /dev/null +++ b/api/templates/email_change_verify_subject.html @@ -0,0 +1 @@ +{{define "email_change_verify_subject"}}[{{.ClientProps.SiteName}}] Verify new email address for {{.Props.TeamDisplayName}}{{end}} diff --git a/api/templates/find_teams_body.html b/api/templates/find_teams_body.html index 9d34b7a23..41f9dac01 100644 --- a/api/templates/find_teams_body.html +++ b/api/templates/find_teams_body.html @@ -9,7 +9,7 @@ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <tr> <td style="padding: 20px 20px 10px; text-align:left;"> - <img src="{{.Props.SiteURL}}/static/images/{{.ClientProps.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> + <img src="{{.ClientProps.SiteURL}}/static/images/logo-email.png" width="130px" style="opacity: 0.5" alt=""> </td> </tr> <tr> @@ -42,10 +42,10 @@ <tr> <td style="text-align: center;color: #AAA; font-size: 11px; padding-bottom: 10px;"> <p style="margin: 25px 0;"> - <img width="65" src="{{.Props.SiteURL}}/static/images/circles.png" alt=""> + <img width="65" src="{{.ClientProps.SiteURL}}/static/images/circles.png" alt=""> </p> <p style="padding: 0 50px;"> - (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> + (c) 2015 Mattermost, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> If you no longer wish to receive these emails, click on the following link: <a href="mailto:{{.ClientProps.FeedbackEmail}}?subject=Unsubscribe&body=Unsubscribe" style="text-decoration: none; color:#2389D7;">Unsubscribe</a> </p> </td> diff --git a/api/templates/invite_body.html b/api/templates/invite_body.html index 9e1ce33b2..57feef5d9 100644 --- a/api/templates/invite_body.html +++ b/api/templates/invite_body.html @@ -9,7 +9,7 @@ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <tr> <td style="padding: 20px 20px 10px; text-align:left;"> - <img src="{{.Props.SiteURL}}/static/images/{{.ClientProps.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> + <img src="{{.Props.SiteURL}}/static/images/logo-email.png" width="130px" style="opacity: 0.5" alt=""> </td> </tr> <tr> @@ -40,7 +40,7 @@ <img width="65" src="{{.Props.SiteURL}}/static/images/circles.png" alt=""> </p> <p style="padding: 0 50px;"> - (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> + (c) 2015 Mattermost, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> If you no longer wish to receive these emails, click on the following link: <a href="mailto:{{.ClientProps.FeedbackEmail}}?subject=Unsubscribe&body=Unsubscribe" style="text-decoration: none; color:#2389D7;">Unsubscribe</a> </p> </td> diff --git a/api/templates/password_change_body.html b/api/templates/password_change_body.html index 3fef3a5c8..542df4b74 100644 --- a/api/templates/password_change_body.html +++ b/api/templates/password_change_body.html @@ -9,7 +9,7 @@ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <tr> <td style="padding: 20px 20px 10px; text-align:left;"> - <img src="{{.Props.SiteURL}}/static/images/{{.ClientProps.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> + <img src="{{.Props.SiteURL}}/static/images/logo-email.png" width="130px" style="opacity: 0.5" alt=""> </td> </tr> <tr> @@ -37,7 +37,7 @@ <img width="65" src="{{.Props.SiteURL}}/static/images/circles.png" alt=""> </p> <p style="padding: 0 50px;"> - (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> + (c) 2015 Mattermost, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> If you no longer wish to receive these emails, click on the following link: <a href="mailto:{{.ClientProps.FeedbackEmail}}?subject=Unsubscribe&body=Unsubscribe" style="text-decoration: none; color:#2389D7;">Unsubscribe</a> </p> </td> diff --git a/api/templates/post_body.html b/api/templates/post_body.html index a6b81e2f6..63a53bf3c 100644 --- a/api/templates/post_body.html +++ b/api/templates/post_body.html @@ -9,7 +9,7 @@ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <tr> <td style="padding: 20px 20px 10px; text-align:left;"> - <img src="{{.Props.SiteURL}}/static/images/{{.ClientProps.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> + <img src="{{.Props.SiteURL}}/static/images/logo-email.png" width="130px" style="opacity: 0.5" alt=""> </td> </tr> <tr> @@ -40,7 +40,7 @@ <img width="65" src="{{.Props.SiteURL}}/static/images/circles.png" alt=""> </p> <p style="padding: 0 50px;"> - (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> + (c) 2015 Mattermost, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> If you no longer wish to receive these emails, click on the following link: <a href="mailto:{{.ClientProps.FeedbackEmail}}?subject=Unsubscribe&body=Unsubscribe" style="text-decoration: none; color:#2389D7;">Unsubscribe</a> </p> </td> diff --git a/api/templates/reset_body.html b/api/templates/reset_body.html index dc6152627..4bafc57e8 100644 --- a/api/templates/reset_body.html +++ b/api/templates/reset_body.html @@ -9,7 +9,7 @@ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <tr> <td style="padding: 20px 20px 10px; text-align:left;"> - <img src="{{.Props.SiteURL}}/static/images/{{.ClientProps.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> + <img src="{{.Props.SiteURL}}/static/images/logo-email.png" width="130px" style="opacity: 0.5" alt=""> </td> </tr> <tr> @@ -40,7 +40,7 @@ <img width="65" src="{{.Props.SiteURL}}/static/images/circles.png" alt=""> </p> <p style="padding: 0 50px;"> - (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> + (c) 2015 Mattermost, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> If you no longer wish to receive these emails, click on the following link: <a href="mailto:{{.ClientProps.FeedbackEmail}}?subject=Unsubscribe&body=Unsubscribe" style="text-decoration: none; color:#2389D7;">Unsubscribe</a> </p> </td> diff --git a/api/templates/signup_team_body.html b/api/templates/signup_team_body.html index e6ffb3a5b..dc2cb32ec 100644 --- a/api/templates/signup_team_body.html +++ b/api/templates/signup_team_body.html @@ -9,7 +9,7 @@ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <tr> <td style="padding: 20px 20px 10px; text-align:left;"> - <img src="{{.Props.SiteURL}}/static/images/{{.ClientProps.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> + <img src="{{.Props.SiteURL}}/static/images/logo-email.png" width="130px" style="opacity: 0.5" alt=""> </td> </tr> <tr> @@ -40,7 +40,7 @@ <img width="65" src="{{.Props.SiteURL}}/static/images/circles.png" alt=""> </p> <p style="padding: 0 50px;"> - (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> + (c) 2015 Mattermost, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> If you no longer wish to receive these emails, click on the following link: <a href="mailto:{{.ClientProps.FeedbackEmail}}?subject=Unsubscribe&body=Unsubscribe" style="text-decoration: none; color:#2389D7;">Unsubscribe</a> </p> </td> diff --git a/api/templates/verify_body.html b/api/templates/verify_body.html index 8187c8908..0613b5dd5 100644 --- a/api/templates/verify_body.html +++ b/api/templates/verify_body.html @@ -9,7 +9,7 @@ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <tr> <td style="padding: 20px 20px 10px; text-align:left;"> - <img src="{{.Props.SiteURL}}/static/images/{{.ClientProps.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> + <img src="{{.Props.SiteURL}}/static/images/logo-email.png" width="130px" style="opacity: 0.5" alt=""> </td> </tr> <tr> @@ -40,7 +40,7 @@ <img width="65" src="{{.Props.SiteURL}}/static/images/circles.png" alt=""> </p> <p style="padding: 0 50px;"> - (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> + (c) 2015 Mattermost, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> If you no longer wish to receive these emails, click on the following link: <a href="mailto:{{.ClientProps.FeedbackEmail}}?subject=Unsubscribe&body=Unsubscribe" style="text-decoration: none; color:#2389D7;">Unsubscribe</a> </p> </td> diff --git a/api/templates/welcome_body.html b/api/templates/welcome_body.html index 5fe3450b7..94b597cbb 100644 --- a/api/templates/welcome_body.html +++ b/api/templates/welcome_body.html @@ -9,7 +9,7 @@ <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <tr> <td style="padding: 20px 20px 10px; text-align:left;"> - <img src="{{.Props.SiteURL}}/static/images/{{.ClientProps.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> + <img src="{{.Props.SiteURL}}/static/images/logo-email.png" width="130px" style="opacity: 0.5" alt=""> </td> </tr> <tr> @@ -31,7 +31,7 @@ <img width="65" src="{{.Props.SiteURL}}/static/images/circles.png" alt=""> </p> <p style="padding: 0 50px;"> - (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> + (c) 2015 Mattermost, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> If you no longer wish to receive these emails, click on the following link: <a href="mailto:{{.ClientProps.FeedbackEmail}}?subject=Unsubscribe&body=Unsubscribe" style="text-decoration: none; color:#2389D7;">Unsubscribe</a> </p> </td> diff --git a/api/user.go b/api/user.go index 78f8768a4..faf828cf9 100644 --- a/api/user.go +++ b/api/user.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api @@ -887,7 +887,11 @@ func updateUser(c *Context, w http.ResponseWriter, r *http.Request) { l4g.Error(tresult.Err.Message) } else { team := tresult.Data.(*model.Team) - fireAndForgetEmailChangeEmail(rusers[1].Email, team.DisplayName, c.GetTeamURLFromTeam(team), c.GetSiteURL()) + fireAndForgetEmailChangeEmail(rusers[1].Email, rusers[0].Email, team.DisplayName, c.GetTeamURLFromTeam(team), c.GetSiteURL()) + + if utils.Cfg.EmailSettings.RequireEmailVerification { + FireAndForgetEmailChangeVerifyEmail(rusers[0].Id, rusers[0].Email, team.Name, team.DisplayName, c.GetSiteURL(), c.GetTeamURLFromTeam(team)) + } } } @@ -1328,7 +1332,7 @@ func fireAndForgetPasswordChangeEmail(email, teamDisplayName, teamURL, siteURL, }() } -func fireAndForgetEmailChangeEmail(email, teamDisplayName, teamURL, siteURL string) { +func fireAndForgetEmailChangeEmail(oldEmail, newEmail, teamDisplayName, teamURL, siteURL string) { go func() { subjectPage := NewServerTemplatePage("email_change_subject") @@ -1338,14 +1342,34 @@ func fireAndForgetEmailChangeEmail(email, teamDisplayName, teamURL, siteURL stri bodyPage.Props["SiteURL"] = siteURL bodyPage.Props["TeamDisplayName"] = teamDisplayName bodyPage.Props["TeamURL"] = teamURL + bodyPage.Props["NewEmail"] = newEmail - if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { - l4g.Error("Failed to send update password email successfully err=%v", err) + if err := utils.SendMail(oldEmail, subjectPage.Render(), bodyPage.Render()); err != nil { + l4g.Error("Failed to send email change notification email successfully err=%v", err) } }() } +func FireAndForgetEmailChangeVerifyEmail(userId, newUserEmail, teamName, teamDisplayName, siteURL, teamURL string) { + go func() { + + link := fmt.Sprintf("%s/verify_email?uid=%s&hid=%s&teamname=%s&email=%s", siteURL, userId, model.HashPassword(userId), teamName, newUserEmail) + + subjectPage := NewServerTemplatePage("email_change_verify_subject") + subjectPage.Props["SiteURL"] = siteURL + subjectPage.Props["TeamDisplayName"] = teamDisplayName + bodyPage := NewServerTemplatePage("email_change_verify_body") + bodyPage.Props["SiteURL"] = siteURL + bodyPage.Props["TeamDisplayName"] = teamDisplayName + bodyPage.Props["VerifyUrl"] = link + + if err := utils.SendMail(newUserEmail, subjectPage.Render(), bodyPage.Render()); err != nil { + l4g.Error("Failed to send email change verification email successfully err=%v", err) + } + }() +} + func updateUserNotify(c *Context, w http.ResponseWriter, r *http.Request) { props := model.MapFromJson(r.Body) diff --git a/api/user_test.go b/api/user_test.go index baa567dec..77309e5b2 100644 --- a/api/user_test.go +++ b/api/user_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/web_conn.go b/api/web_conn.go index 4315f5650..a5099e520 100644 --- a/api/web_conn.go +++ b/api/web_conn.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/web_hub.go b/api/web_hub.go index 15528c612..f80488824 100644 --- a/api/web_hub.go +++ b/api/web_hub.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/web_socket.go b/api/web_socket.go index 75936a8d5..298e44b44 100644 --- a/api/web_socket.go +++ b/api/web_socket.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/web_socket_test.go b/api/web_socket_test.go index 49a4c6870..63c4dd05d 100644 --- a/api/web_socket_test.go +++ b/api/web_socket_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api @@ -55,12 +55,17 @@ func TestSocket(t *testing.T) { time.Sleep(300 * time.Millisecond) Client.Must(Client.JoinChannel(channel1.Id)) - // Read the join channel message that gets generated + // Read the user_added message that gets generated var rmsg model.Message if err := c2.ReadJSON(&rmsg); err != nil { t.Fatal(err) } + // Read the second user_added message that gets generated + if err := c2.ReadJSON(&rmsg); err != nil { + t.Fatal(err) + } + // Test sending message without a channelId m := model.NewMessage("", "", "", model.ACTION_TYPING) m.Add("RootId", model.NewId()) diff --git a/api/web_team_hub.go b/api/web_team_hub.go index 31c8dfedf..c57de550f 100644 --- a/api/web_team_hub.go +++ b/api/web_team_hub.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/webhook.go b/api/webhook.go index e694b202c..de4ba6691 100644 --- a/api/webhook.go +++ b/api/webhook.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/api/webhook_test.go b/api/webhook_test.go index 22883f8ca..16b9c9529 100644 --- a/api/webhook_test.go +++ b/api/webhook_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package api diff --git a/config/config.json b/config/config.json index 88da33215..919737da7 100644 --- a/config/config.json +++ b/config/config.json @@ -78,7 +78,7 @@ "PrivacySettings": { "ShowEmailAddress": true, "ShowFullName": true, - "EnableDiagnostic": false + "EnableSecurityFixAlert": true }, "GitLabSettings": { "Enable": false, diff --git a/doc/help/Manage-Team.md b/doc/help/Manage-Team.md new file mode 100644 index 000000000..b45ea4283 --- /dev/null +++ b/doc/help/Manage-Team.md @@ -0,0 +1,37 @@ +# Manage Team + +The Manage Team menu is used to change the user roles assigned to members belonging to a team. + +## User Roles + +The following user roles are assigned from the **Manage Team** menu option in the team site main menu. + +### System Admin + +The System Administrator is typically a member of the IT staff and has the follow privileges: + +- Access to the System Console from the main menu in any team site. +- Change any setting on the Mattermost server available in the System Console. +- Promote and demote other users to and from the System Admin role. +- This role also has all the privileges of the Team Administrator as described below + +The first user added to a newly installed Mattermost system is assigned the System Admin role. + +### Team Admin + +The Team Administrator is typically a non-technical end user and has the following privileges: + +- Access to the "Team Settings" menu from the team site main menu +- Ability to change the team name and import data from Slack export files +- Access to the "Manage Team" menu and change user roles to the levels of Team Administrator, Member and Inactive + +### Member + +This is the default role given to end users who join the system. Members have basic permissions to use the Mattermost team site. + +### Inactive + +This status is given to users whose accounts are marked inactive. These users can no longer log into the system. + +Because Mattermost is designed as a system-of-record, there is not an option to delete users from the Mattermost system, as such an operation could compromise the integrity of message archives. + diff --git a/doc/help/README.md b/doc/help/README.md new file mode 100644 index 000000000..d07424c70 --- /dev/null +++ b/doc/help/README.md @@ -0,0 +1,12 @@ +# Help + +The help section of the Mattermost documentation is intended for use by end users learning about the Mattermost concepts, usage, terminology and user interface. + +_Note: Help documentation is a work-in-progress. Community contributions highly welcome. Please see [guidelines for contributing](https://forum.mattermost.org/t/help-improve-mattermost-documentation/194)._ + +## Team Site Main Menu + +You can access the **Team Site Main Menu** by clicking on the three vertical dots at the top of the left sidebar in a team site. Here we describe the various options available from the menu: + +- [Manage Teams](Manage-Team.md) + diff --git a/docker/0.7/Dockerfile b/docker/0.7/Dockerfile index 6e82fd809..202d42dbc 100644 --- a/docker/0.7/Dockerfile +++ b/docker/0.7/Dockerfile @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +# Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. # See License.txt for license information. FROM ubuntu:14.04 diff --git a/docker/0.7/docker-entry.sh b/docker/0.7/docker-entry.sh index ce9f91c40..6bd2a1263 100755 --- a/docker/0.7/docker-entry.sh +++ b/docker/0.7/docker-entry.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +# Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. # See License.txt for license information. mkdir -p web/static/js diff --git a/docker/1.0/Dockerfile b/docker/1.0/Dockerfile index be87f9f89..a41c73514 100644 --- a/docker/1.0/Dockerfile +++ b/docker/1.0/Dockerfile @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +# Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. # See License.txt for license information. FROM ubuntu:14.04 diff --git a/docker/1.0/docker-entry.sh b/docker/1.0/docker-entry.sh index ce9f91c40..6bd2a1263 100755 --- a/docker/1.0/docker-entry.sh +++ b/docker/1.0/docker-entry.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +# Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. # See License.txt for license information. mkdir -p web/static/js diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile index cdfdc1845..0e8b8853f 100644 --- a/docker/dev/Dockerfile +++ b/docker/dev/Dockerfile @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +# Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. # See License.txt for license information. FROM ubuntu:14.04 diff --git a/docker/dev/config_docker.json b/docker/dev/config_docker.json index ef91a21ea..ab5b0a7be 100644 --- a/docker/dev/config_docker.json +++ b/docker/dev/config_docker.json @@ -78,7 +78,7 @@ "PrivacySettings": { "ShowEmailAddress": true, "ShowFullName": true, - "EnableDiagnostic": false + "EnableSecurityFixAlert": true }, "GitLabSettings": { "Enable": false, diff --git a/docker/dev/docker-entry.sh b/docker/dev/docker-entry.sh index ce9f91c40..6bd2a1263 100755 --- a/docker/dev/docker-entry.sh +++ b/docker/dev/docker-entry.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +# Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. # See License.txt for license information. mkdir -p web/static/js diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index 55725e293..71da0a7fa 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +# Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. # See License.txt for license information. FROM ubuntu:14.04 diff --git a/docker/local/config_docker.json b/docker/local/config_docker.json index ef91a21ea..ab5b0a7be 100644 --- a/docker/local/config_docker.json +++ b/docker/local/config_docker.json @@ -78,7 +78,7 @@ "PrivacySettings": { "ShowEmailAddress": true, "ShowFullName": true, - "EnableDiagnostic": false + "EnableSecurityFixAlert": true }, "GitLabSettings": { "Enable": false, diff --git a/docker/local/docker-entry.sh b/docker/local/docker-entry.sh index 16583e525..a03ea7d0d 100755 --- a/docker/local/docker-entry.sh +++ b/docker/local/docker-entry.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +# Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. # See License.txt for license information. mkdir -p web/static/js diff --git a/manualtesting/manual_testing.go b/manualtesting/manual_testing.go index a517b0c0e..3fbdd5fd7 100644 --- a/manualtesting/manual_testing.go +++ b/manualtesting/manual_testing.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package manualtesting diff --git a/manualtesting/test_autolink.go b/manualtesting/test_autolink.go index 5dfdadfb4..e4d49659a 100644 --- a/manualtesting/test_autolink.go +++ b/manualtesting/test_autolink.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package manualtesting diff --git a/mattermost.go b/mattermost.go index e78e8d04a..6c0f0a1bf 100644 --- a/mattermost.go +++ b/mattermost.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package main @@ -6,6 +6,9 @@ package main import ( "flag" "fmt" + "io/ioutil" + "net/http" + "net/url" "os" "os/signal" "runtime" @@ -63,7 +66,7 @@ func main() { manualtesting.InitManualTesting() } - diagnosticsJob() + securityAndDiagnosticsJob() // wait for kill signal before attempting to gracefully shutdown // the running service @@ -75,49 +78,85 @@ func main() { } } -func diagnosticsJob() { +func securityAndDiagnosticsJob() { go func() { for { - if utils.Cfg.PrivacySettings.EnableDiagnostic && !model.IsOfficalBuild() { + if utils.Cfg.PrivacySettings.EnableSecurityFixAlert && model.IsOfficalBuild() { if result := <-api.Srv.Store.System().Get(); result.Err == nil { props := result.Data.(model.StringMap) - lastTime, _ := strconv.ParseInt(props["LastDiagnosticTime"], 10, 0) + lastSecurityTime, _ := strconv.ParseInt(props["LastSecurityTime"], 10, 0) currentTime := model.GetMillis() - if (currentTime - lastTime) > 1000*60*60*24*7 { - l4g.Info("Sending error and diagnostic information to mattermost") + id := props["DiagnosticId"] + if len(id) == 0 { + id = model.NewId() + systemId := &model.System{Name: "DiagnosticId", Value: id} + <-api.Srv.Store.System().Save(systemId) + } - id := props["DiagnosticId"] - if len(id) == 0 { - id = model.NewId() - systemId := &model.System{Name: "DiagnosticId", Value: id} - <-api.Srv.Store.System().Save(systemId) - } + v := url.Values{} + v.Set(utils.PROP_DIAGNOSTIC_ID, id) + v.Set(utils.PROP_DIAGNOSTIC_BUILD, model.CurrentVersion+"."+model.BuildNumber) + v.Set(utils.PROP_DIAGNOSTIC_DATABASE, utils.Cfg.SqlSettings.DriverName) + v.Set(utils.PROP_DIAGNOSTIC_OS, runtime.GOOS) + v.Set(utils.PROP_DIAGNOSTIC_CATEGORY, utils.VAL_DIAGNOSTIC_CATEGORY_DEFAULT) + + if (currentTime - lastSecurityTime) > 1000*60*60*24*1 { + l4g.Info("Checking for security update from Mattermost") - systemLastTime := &model.System{Name: "LastDiagnosticTime", Value: strconv.FormatInt(currentTime, 10)} - if lastTime == 0 { - <-api.Srv.Store.System().Save(systemLastTime) + systemSecurityLastTime := &model.System{Name: "LastSecurityTime", Value: strconv.FormatInt(currentTime, 10)} + if lastSecurityTime == 0 { + <-api.Srv.Store.System().Save(systemSecurityLastTime) } else { - <-api.Srv.Store.System().Update(systemLastTime) + <-api.Srv.Store.System().Update(systemSecurityLastTime) } - m := make(map[string]string) - m[utils.PROP_DIAGNOSTIC_ID] = id - m[utils.PROP_DIAGNOSTIC_BUILD] = model.CurrentVersion + "." + model.BuildNumber - m[utils.PROP_DIAGNOSTIC_DATABASE] = utils.Cfg.SqlSettings.DriverName - m[utils.PROP_DIAGNOSTIC_OS] = runtime.GOOS - m[utils.PROP_DIAGNOSTIC_CATEGORY] = utils.VAL_DIAGNOSTIC_CATEGORY_DEFALUT - - if ucr := <-api.Srv.Store.User().GetTotalUsersCount(); ucr.Err == nil { - m[utils.PROP_DIAGNOSTIC_USER_COUNT] = strconv.FormatInt(ucr.Data.(int64), 10) + res, err := http.Get(utils.DIAGNOSTIC_URL + "/security?" + v.Encode()) + if err != nil { + l4g.Error("Failed to get security update information from Mattermost.") + return } - utils.SendDiagnostic(m) + bulletins := model.SecurityBulletinsFromJson(res.Body) + + for _, bulletin := range bulletins { + if bulletin.AppliesToVersion == model.CurrentVersion { + if props["SecurityBulletin_"+bulletin.Id] == "" { + if results := <-api.Srv.Store.User().GetSystemAdminProfiles(); results.Err != nil { + l4g.Error("Failed to get system admins for security update information from Mattermost.") + return + } else { + users := results.Data.(map[string]*model.User) + + resBody, err := http.Get(utils.DIAGNOSTIC_URL + "/bulletins/" + bulletin.Id) + if err != nil { + l4g.Error("Failed to get security bulletin details") + return + } + + body, err := ioutil.ReadAll(resBody.Body) + res.Body.Close() + if err != nil || resBody.StatusCode != 200 { + l4g.Error("Failed to read security bulletin details") + return + } + + for _, user := range users { + l4g.Info("Sending security bulletin for " + bulletin.Id + " to " + user.Email) + utils.SendMail(user.Email, "Mattermost Security Bulletin", string(body)) + } + } + + bulletinSeen := &model.System{Name: "SecurityBulletin_" + bulletin.Id, Value: bulletin.Id} + <-api.Srv.Store.System().Save(bulletinSeen) + } + } + } } } } - time.Sleep(time.Hour * 24) + time.Sleep(time.Hour * 4) } }() } diff --git a/mkdocs.yml b/mkdocs.yml index d7113e03e..a8b37ecad 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,7 +3,7 @@ site_url: http://docs.mattermost.org repo_url: https://github.com/mattermost/platform repo_name: GitHub site_favicon: favicon.ico -copyright: "Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved." +copyright: "Copyright (c) 2015 Mattermost, Inc. All Rights Reserved." strict: true docs_dir: doc site_dir: documentation-html diff --git a/model/access.go b/model/access.go index 44a0463ac..89a1271c1 100644 --- a/model/access.go +++ b/model/access.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/access_test.go b/model/access_test.go index e385c0586..a018a2919 100644 --- a/model/access_test.go +++ b/model/access_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/audit.go b/model/audit.go index 9f3640350..8fa1d5584 100644 --- a/model/audit.go +++ b/model/audit.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/audit_test.go b/model/audit_test.go index a309f5c65..f4a2b6bcc 100644 --- a/model/audit_test.go +++ b/model/audit_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/audits.go b/model/audits.go index 9c88deef9..36c80629f 100644 --- a/model/audits.go +++ b/model/audits.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/audits_test.go b/model/audits_test.go index 59b510f54..6c7104475 100644 --- a/model/audits_test.go +++ b/model/audits_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/authorize.go b/model/authorize.go index 6eaac97f1..4176a9b89 100644 --- a/model/authorize.go +++ b/model/authorize.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/authorize_test.go b/model/authorize_test.go index 14524ad84..3fedc37e4 100644 --- a/model/authorize_test.go +++ b/model/authorize_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/channel.go b/model/channel.go index a7f007960..076ddf0b5 100644 --- a/model/channel.go +++ b/model/channel.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/channel_count.go b/model/channel_count.go index 19d6ac150..6cc1b2f2d 100644 --- a/model/channel_count.go +++ b/model/channel_count.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/channel_data.go b/model/channel_data.go index 234bdec6e..731d50e70 100644 --- a/model/channel_data.go +++ b/model/channel_data.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/channel_extra.go b/model/channel_extra.go index 3a918b524..c6f0ca192 100644 --- a/model/channel_extra.go +++ b/model/channel_extra.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/channel_list.go b/model/channel_list.go index 09f14a986..49ba384a2 100644 --- a/model/channel_list.go +++ b/model/channel_list.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/channel_member.go b/model/channel_member.go index 3ae612700..e822ba443 100644 --- a/model/channel_member.go +++ b/model/channel_member.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/channel_member_test.go b/model/channel_member_test.go index edbb46e9b..cff48ae27 100644 --- a/model/channel_member_test.go +++ b/model/channel_member_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/channel_test.go b/model/channel_test.go index 21fe71889..e5dfa3734 100644 --- a/model/channel_test.go +++ b/model/channel_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/client.go b/model/client.go index a291cc4f2..11beb9a87 100644 --- a/model/client.go +++ b/model/client.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/command.go b/model/command.go index 83243cc98..2b26aad1c 100644 --- a/model/command.go +++ b/model/command.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/command_test.go b/model/command_test.go index e3b732c02..61302ea10 100644 --- a/model/command_test.go +++ b/model/command_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/config.go b/model/config.go index c67b36063..e4b99ad4a 100644 --- a/model/config.go +++ b/model/config.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model @@ -110,9 +110,9 @@ type RateLimitSettings struct { } type PrivacySettings struct { - ShowEmailAddress bool - ShowFullName bool - EnableDiagnostic bool + ShowEmailAddress bool + ShowFullName bool + EnableSecurityFixAlert bool } type TeamSettings struct { diff --git a/model/file.go b/model/file.go index 85545d718..b7806b3b4 100644 --- a/model/file.go +++ b/model/file.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/gitlab.go b/model/gitlab.go index d281b6ea0..9f86c7b72 100644 --- a/model/gitlab.go +++ b/model/gitlab.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/message.go b/model/message.go index 8598bea0e..122af4d9c 100644 --- a/model/message.go +++ b/model/message.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/message_test.go b/model/message_test.go index eb0c75193..182678d8e 100644 --- a/model/message_test.go +++ b/model/message_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/oauth.go b/model/oauth.go index 3b31e677d..0320e7ec7 100644 --- a/model/oauth.go +++ b/model/oauth.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/oauth_test.go b/model/oauth_test.go index 2530ead98..2ba36666c 100644 --- a/model/oauth_test.go +++ b/model/oauth_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/post.go b/model/post.go index 1fc5963c3..11f3ad0d5 100644 --- a/model/post.go +++ b/model/post.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/post_list.go b/model/post_list.go index 88e3a9193..862673ef3 100644 --- a/model/post_list.go +++ b/model/post_list.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/post_list_test.go b/model/post_list_test.go index 7ce36c399..8a34327ce 100644 --- a/model/post_list_test.go +++ b/model/post_list_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/post_test.go b/model/post_test.go index a6b880fa0..f498c83e6 100644 --- a/model/post_test.go +++ b/model/post_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/security_bulletin.go b/model/security_bulletin.go new file mode 100644 index 000000000..8d9be6d3b --- /dev/null +++ b/model/security_bulletin.go @@ -0,0 +1,55 @@ +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +package model + +import ( + "encoding/json" + "io" +) + +type SecurityBulletin struct { + Id string `json:"id"` + AppliesToVersion string `json:"applies_to_version"` +} + +type SecurityBulletins []SecurityBulletin + +func (me *SecurityBulletin) ToJson() string { + b, err := json.Marshal(me) + if err != nil { + return "" + } else { + return string(b) + } +} + +func SecurityBulletinFromJson(data io.Reader) *SecurityBulletin { + decoder := json.NewDecoder(data) + var o SecurityBulletin + err := decoder.Decode(&o) + if err == nil { + return &o + } else { + return nil + } +} + +func (me SecurityBulletins) ToJson() string { + if b, err := json.Marshal(me); err != nil { + return "[]" + } else { + return string(b) + } +} + +func SecurityBulletinsFromJson(data io.Reader) SecurityBulletins { + decoder := json.NewDecoder(data) + var o SecurityBulletins + err := decoder.Decode(&o) + if err == nil { + return o + } else { + return nil + } +} diff --git a/model/session.go b/model/session.go index bb4d987a7..e2c1d4c55 100644 --- a/model/session.go +++ b/model/session.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/session_test.go b/model/session_test.go index 4df2a0d76..4cffcb9c0 100644 --- a/model/session_test.go +++ b/model/session_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/suggest_command.go b/model/suggest_command.go index 0c07ac58e..7bc35369c 100644 --- a/model/suggest_command.go +++ b/model/suggest_command.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/suggest_command_test.go b/model/suggest_command_test.go index a92b676ad..6be700859 100644 --- a/model/suggest_command_test.go +++ b/model/suggest_command_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/system.go b/model/system.go index c79391cca..033f660b3 100644 --- a/model/system.go +++ b/model/system.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/system_test.go b/model/system_test.go index 14ba0db2e..3f60eb5f9 100644 --- a/model/system_test.go +++ b/model/system_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/team.go b/model/team.go index f80fa3b11..c0f6524cd 100644 --- a/model/team.go +++ b/model/team.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/team_signup.go b/model/team_signup.go index 143ba8db1..e36420449 100644 --- a/model/team_signup.go +++ b/model/team_signup.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/team_signup_test.go b/model/team_signup_test.go index eb2fbc69f..a830842aa 100644 --- a/model/team_signup_test.go +++ b/model/team_signup_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/team_test.go b/model/team_test.go index 0dec07559..fd2428f03 100644 --- a/model/team_test.go +++ b/model/team_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/user.go b/model/user.go index d8000a7e2..15016f8dc 100644 --- a/model/user.go +++ b/model/user.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/user_test.go b/model/user_test.go index d9c1a00b6..662ae35a6 100644 --- a/model/user_test.go +++ b/model/user_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/utils.go b/model/utils.go index 93b8c4512..269144afc 100644 --- a/model/utils.go +++ b/model/utils.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/utils_test.go b/model/utils_test.go index 0f26526b2..7f14bcdf0 100644 --- a/model/utils_test.go +++ b/model/utils_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/version.go b/model/version.go index efa1697db..d03f64ba2 100644 --- a/model/version.go +++ b/model/version.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/version_test.go b/model/version_test.go index 24dbedaa6..33e8dc93e 100644 --- a/model/version_test.go +++ b/model/version_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/webhook.go b/model/webhook.go index 9b4db3246..3bf034908 100644 --- a/model/webhook.go +++ b/model/webhook.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/model/webhook_test.go b/model/webhook_test.go index ddbe18cd3..5297d7d90 100644 --- a/model/webhook_test.go +++ b/model/webhook_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package model diff --git a/store/sql_audit_store.go b/store/sql_audit_store.go index a595d50e2..898cf8f78 100644 --- a/store/sql_audit_store.go +++ b/store/sql_audit_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_audit_store_test.go b/store/sql_audit_store_test.go index 4d804d150..e265db837 100644 --- a/store/sql_audit_store_test.go +++ b/store/sql_audit_store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_channel_store.go b/store/sql_channel_store.go index 3bbe7e716..56e190fee 100644 --- a/store/sql_channel_store.go +++ b/store/sql_channel_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store @@ -38,6 +38,8 @@ func NewSqlChannelStore(sqlStore *SqlStore) ChannelStore { } func (s SqlChannelStore) UpgradeSchemaIfNeeded() { + + // BEGIN REMOVE AFTER 1.1.0 if s.CreateColumnIfNotExists("ChannelMembers", "NotifyProps", "varchar(2000)", "varchar(2000)", "{}") { // populate NotifyProps from existing NotifyLevel field @@ -80,6 +82,7 @@ func (s SqlChannelStore) UpgradeSchemaIfNeeded() { s.RemoveColumnIfExists("ChannelMembers", "NotifyLevel") } + // END REMOVE AFTER 1.1.0 } func (s SqlChannelStore) CreateIndexesIfNotExists() { diff --git a/store/sql_channel_store_test.go b/store/sql_channel_store_test.go index b6d05684b..b4e0f7593 100644 --- a/store/sql_channel_store_test.go +++ b/store/sql_channel_store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_oauth_store.go b/store/sql_oauth_store.go index 2a6fa3118..db52e379b 100644 --- a/store/sql_oauth_store.go +++ b/store/sql_oauth_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_oauth_store_test.go b/store/sql_oauth_store_test.go index 08e1388e0..3f05f1c92 100644 --- a/store/sql_oauth_store_test.go +++ b/store/sql_oauth_store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_post_store.go b/store/sql_post_store.go index 8d62eaad0..07077bd64 100644 --- a/store/sql_post_store.go +++ b/store/sql_post_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_post_store_test.go b/store/sql_post_store_test.go index 62d7b0100..9a7679454 100644 --- a/store/sql_post_store_test.go +++ b/store/sql_post_store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_session_store.go b/store/sql_session_store.go index 22411389d..15ec6924b 100644 --- a/store/sql_session_store.go +++ b/store/sql_session_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_session_store_test.go b/store/sql_session_store_test.go index 3d8aafe25..068e5fc19 100644 --- a/store/sql_session_store_test.go +++ b/store/sql_session_store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_store.go b/store/sql_store.go index 3ef9cfbc4..900543460 100644 --- a/store/sql_store.go +++ b/store/sql_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store @@ -84,13 +84,6 @@ func NewSqlStore() Store { } } - // Temporary upgrade code, remove after 0.8.0 release - if sqlStore.DoesTableExist("Sessions") { - if sqlStore.DoesColumnExist("Sessions", "AltId") { - sqlStore.GetMaster().Exec("DROP TABLE IF EXISTS Sessions") - } - } - sqlStore.team = NewSqlTeamStore(sqlStore) sqlStore.channel = NewSqlChannelStore(sqlStore) sqlStore.post = NewSqlPostStore(sqlStore) diff --git a/store/sql_store_test.go b/store/sql_store_test.go index 84dbf5705..a9e25cb33 100644 --- a/store/sql_store_test.go +++ b/store/sql_store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_system_store.go b/store/sql_system_store.go index ca22de2a6..a4cb52d4d 100644 --- a/store/sql_system_store.go +++ b/store/sql_system_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_system_store_test.go b/store/sql_system_store_test.go index 0f03b8f0e..8ff5445cc 100644 --- a/store/sql_system_store_test.go +++ b/store/sql_system_store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_team_store.go b/store/sql_team_store.go index 109fe5401..de44782cf 100644 --- a/store/sql_team_store.go +++ b/store/sql_team_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store @@ -28,7 +28,6 @@ func NewSqlTeamStore(sqlStore *SqlStore) TeamStore { } func (s SqlTeamStore) UpgradeSchemaIfNeeded() { - s.RemoveColumnIfExists("Teams", "AllowValet") } func (s SqlTeamStore) CreateIndexesIfNotExists() { diff --git a/store/sql_team_store_test.go b/store/sql_team_store_test.go index 1f13e466c..3d9b4d435 100644 --- a/store/sql_team_store_test.go +++ b/store/sql_team_store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_user_store.go b/store/sql_user_store.go index 0a723d965..011acd7e4 100644 --- a/store/sql_user_store.go +++ b/store/sql_user_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store @@ -41,7 +41,6 @@ func NewSqlUserStore(sqlStore *SqlStore) UserStore { } func (us SqlUserStore) UpgradeSchemaIfNeeded() { - us.CreateColumnIfNotExists("Users", "ThemeProps", "varchar(2000)", "character varying(2000)", "{}") } func (us SqlUserStore) CreateIndexesIfNotExists() { @@ -370,6 +369,37 @@ func (us SqlUserStore) GetProfiles(teamId string) StoreChannel { return storeChannel } +func (us SqlUserStore) GetSystemAdminProfiles() StoreChannel { + + storeChannel := make(StoreChannel) + + go func() { + result := StoreResult{} + + var users []*model.User + + if _, err := us.GetReplica().Select(&users, "SELECT * FROM Users WHERE Roles = :Roles", map[string]interface{}{"Roles": "system_admin"}); err != nil { + result.Err = model.NewAppError("SqlUserStore.GetSystemAdminProfiles", "We encounted an error while finding user profiles", err.Error()) + } else { + + userMap := make(map[string]*model.User) + + for _, u := range users { + u.Password = "" + u.AuthData = "" + userMap[u.Id] = u + } + + result.Data = userMap + } + + storeChannel <- result + close(storeChannel) + }() + + return storeChannel +} + func (us SqlUserStore) GetByEmail(teamId string, email string) StoreChannel { storeChannel := make(StoreChannel) diff --git a/store/sql_user_store_test.go b/store/sql_user_store_test.go index e2a454023..be21c8bd2 100644 --- a/store/sql_user_store_test.go +++ b/store/sql_user_store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store @@ -259,6 +259,29 @@ func TestUserStoreGetProfiles(t *testing.T) { } } +func TestUserStoreGetSystemAdminProfiles(t *testing.T) { + Setup() + + u1 := model.User{} + u1.TeamId = model.NewId() + u1.Email = model.NewId() + Must(store.User().Save(&u1)) + + u2 := model.User{} + u2.TeamId = u1.TeamId + u2.Email = model.NewId() + Must(store.User().Save(&u2)) + + if r1 := <-store.User().GetSystemAdminProfiles(); r1.Err != nil { + t.Fatal(r1.Err) + } else { + users := r1.Data.(map[string]*model.User) + if len(users) <= 0 { + t.Fatal("invalid returned system admin users") + } + } +} + func TestUserStoreGetByEmail(t *testing.T) { Setup() diff --git a/store/sql_webhook_store.go b/store/sql_webhook_store.go index e309f79e4..42a91a80e 100644 --- a/store/sql_webhook_store.go +++ b/store/sql_webhook_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/sql_webhook_store_test.go b/store/sql_webhook_store_test.go index 0a015eaf9..6f4ef4354 100644 --- a/store/sql_webhook_store_test.go +++ b/store/sql_webhook_store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store diff --git a/store/store.go b/store/store.go index 887913bc6..1c4d08e36 100644 --- a/store/store.go +++ b/store/store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package store @@ -104,6 +104,7 @@ type UserStore interface { UpdateFailedPasswordAttempts(userId string, attempts int) StoreChannel GetForExport(teamId string) StoreChannel GetTotalUsersCount() StoreChannel + GetSystemAdminProfiles() StoreChannel } type SessionStore interface { diff --git a/utils/apns.go b/utils/apns.go index f73c6d8f8..3d07f17ec 100644 --- a/utils/apns.go +++ b/utils/apns.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package utils diff --git a/utils/config.go b/utils/config.go index 90e44259a..44ee14a6e 100644 --- a/utils/config.go +++ b/utils/config.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package utils @@ -191,6 +191,7 @@ func getClientProperties(c *model.Config) map[string]string { props["SendEmailNotifications"] = strconv.FormatBool(c.EmailSettings.SendEmailNotifications) props["EnableSignUpWithEmail"] = strconv.FormatBool(c.EmailSettings.EnableSignUpWithEmail) + props["RequireEmailVerification"] = strconv.FormatBool(c.EmailSettings.RequireEmailVerification) props["FeedbackEmail"] = c.EmailSettings.FeedbackEmail props["EnableSignUpWithGitLab"] = strconv.FormatBool(c.GitLabSettings.Enable) diff --git a/utils/config_test.go b/utils/config_test.go index 4d37b4e88..0b334d36c 100644 --- a/utils/config_test.go +++ b/utils/config_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package utils diff --git a/utils/diagnostic.go b/utils/diagnostic.go index 9a61ae934..da02e771b 100644 --- a/utils/diagnostic.go +++ b/utils/diagnostic.go @@ -1,45 +1,35 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package utils import ( "net/http" - - l4g "code.google.com/p/log4go" + "net/url" "github.com/mattermost/platform/model" ) const ( + DIAGNOSTIC_URL = "https://d7zmvsa9e04kk.cloudfront.net" + PROP_DIAGNOSTIC_ID = "id" PROP_DIAGNOSTIC_CATEGORY = "c" - VAL_DIAGNOSTIC_CATEGORY_DEFALUT = "d" + VAL_DIAGNOSTIC_CATEGORY_DEFAULT = "d" PROP_DIAGNOSTIC_BUILD = "b" PROP_DIAGNOSTIC_DATABASE = "db" PROP_DIAGNOSTIC_OS = "os" PROP_DIAGNOSTIC_USER_COUNT = "uc" ) -func SendDiagnostic(data model.StringMap) *model.AppError { - if Cfg.PrivacySettings.EnableDiagnostic && !model.IsOfficalBuild() { - - query := "?" - for name, value := range data { - if len(query) > 1 { - query += "&" - } +func SendDiagnostic(values url.Values) { + if Cfg.PrivacySettings.EnableSecurityFixAlert && model.IsOfficalBuild() { - query += name + "=" + UrlEncode(value) - } - - res, err := http.Get("http://d7zmvsa9e04kk.cloudfront.net/i" + query) + res, err := http.Get(DIAGNOSTIC_URL + "/i?" + values.Encode()) if err != nil { - l4g.Error("Failed to send diagnostics %v", err.Error()) + return } res.Body.Close() } - - return nil } diff --git a/utils/mail.go b/utils/mail.go index f6fe1ce00..c91c15a6a 100644 --- a/utils/mail.go +++ b/utils/mail.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package utils diff --git a/utils/random.go b/utils/random.go index ca2ace949..99743e777 100644 --- a/utils/random.go +++ b/utils/random.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package utils diff --git a/utils/textgeneration.go b/utils/textgeneration.go index 6d353cc24..420d6fb29 100644 --- a/utils/textgeneration.go +++ b/utils/textgeneration.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package utils diff --git a/utils/urlencode.go b/utils/urlencode.go index 63a8f7880..dc8b9acfd 100644 --- a/utils/urlencode.go +++ b/utils/urlencode.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package utils diff --git a/web/react/components/about_build_modal.jsx b/web/react/components/about_build_modal.jsx new file mode 100644 index 000000000..e8a46086a --- /dev/null +++ b/web/react/components/about_build_modal.jsx @@ -0,0 +1,62 @@ +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +var Modal = ReactBootstrap.Modal; + +export default class AboutBuildModal extends React.Component { + constructor(props) { + super(props); + this.doHide = this.doHide.bind(this); + } + + doHide() { + this.props.onModalDismissed(); + } + + render() { + const config = global.window.config; + + return ( + <Modal + show={this.props.show} + onHide={this.doHide} + > + <Modal.Header closeButton={true}> + <Modal.Title>{`Mattermost ${config.Version}`}</Modal.Title> + </Modal.Header> + <Modal.Body> + <div className='row form-group'> + <div className='col-sm-3 info__label'>{'Build Number:'}</div> + <div className='col-sm-9'>{config.BuildNumber}</div> + </div> + <div className='row form-group'> + <div className='col-sm-3 info__label'>{'Build Date:'}</div> + <div className='col-sm-9'>{config.BuildDate}</div> + </div> + <div className='row'> + <div className='col-sm-3 info__label'>{'Build Hash:'}</div> + <div className='col-sm-9'>{config.BuildHash}</div> + </div> + </Modal.Body> + <Modal.Footer> + <button + type='button' + className='btn btn-default' + onClick={this.doHide} + > + {'Close'} + </button> + </Modal.Footer> + </Modal> + ); + } +} + +AboutBuildModal.defaultProps = { + show: false +}; + +AboutBuildModal.propTypes = { + show: React.PropTypes.bool.isRequired, + onModalDismissed: React.PropTypes.func.isRequired +};
\ No newline at end of file diff --git a/web/react/components/access_history_modal.jsx b/web/react/components/access_history_modal.jsx index 0dfd36717..2ad4d5b00 100644 --- a/web/react/components/access_history_modal.jsx +++ b/web/react/components/access_history_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/activity_log_modal.jsx b/web/react/components/activity_log_modal.jsx index ff370c32e..1fe2133ec 100644 --- a/web/react/components/activity_log_modal.jsx +++ b/web/react/components/activity_log_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/admin_console/admin_controller.jsx b/web/react/components/admin_console/admin_controller.jsx index f40e48f70..f2fb8ac78 100644 --- a/web/react/components/admin_console/admin_controller.jsx +++ b/web/react/components/admin_console/admin_controller.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AdminSidebar = require('./admin_sidebar.jsx'); diff --git a/web/react/components/admin_console/admin_navbar_dropdown.jsx b/web/react/components/admin_console/admin_navbar_dropdown.jsx index a3ab81079..21ec5c3cf 100644 --- a/web/react/components/admin_console/admin_navbar_dropdown.jsx +++ b/web/react/components/admin_console/admin_navbar_dropdown.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Utils = require('../../utils/utils.jsx'); diff --git a/web/react/components/admin_console/admin_sidebar.jsx b/web/react/components/admin_console/admin_sidebar.jsx index f102661b2..bc6ad1931 100644 --- a/web/react/components/admin_console/admin_sidebar.jsx +++ b/web/react/components/admin_console/admin_sidebar.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AdminSidebarHeader = require('./admin_sidebar_header.jsx'); diff --git a/web/react/components/admin_console/admin_sidebar_header.jsx b/web/react/components/admin_console/admin_sidebar_header.jsx index 81798da45..c80811bcd 100644 --- a/web/react/components/admin_console/admin_sidebar_header.jsx +++ b/web/react/components/admin_console/admin_sidebar_header.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AdminNavbarDropdown = require('./admin_navbar_dropdown.jsx'); diff --git a/web/react/components/admin_console/email_settings.jsx b/web/react/components/admin_console/email_settings.jsx index 3432f69ff..c028d605d 100644 --- a/web/react/components/admin_console/email_settings.jsx +++ b/web/react/components/admin_console/email_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/admin_console/gitlab_settings.jsx b/web/react/components/admin_console/gitlab_settings.jsx index 759892ad3..6b97287e4 100644 --- a/web/react/components/admin_console/gitlab_settings.jsx +++ b/web/react/components/admin_console/gitlab_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/admin_console/image_settings.jsx b/web/react/components/admin_console/image_settings.jsx index e08d39ca8..24ed5a0a8 100644 --- a/web/react/components/admin_console/image_settings.jsx +++ b/web/react/components/admin_console/image_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/admin_console/log_settings.jsx b/web/react/components/admin_console/log_settings.jsx index 608ef9cc0..367605f14 100644 --- a/web/react/components/admin_console/log_settings.jsx +++ b/web/react/components/admin_console/log_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/admin_console/logs.jsx b/web/react/components/admin_console/logs.jsx index 0bb749bbd..3449c78d9 100644 --- a/web/react/components/admin_console/logs.jsx +++ b/web/react/components/admin_console/logs.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AdminStore = require('../../stores/admin_store.jsx'); diff --git a/web/react/components/admin_console/privacy_settings.jsx b/web/react/components/admin_console/privacy_settings.jsx index c74d321e6..a32ca3136 100644 --- a/web/react/components/admin_console/privacy_settings.jsx +++ b/web/react/components/admin_console/privacy_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); @@ -30,7 +30,7 @@ export default class PrivacySettings extends React.Component { var config = this.props.config; config.PrivacySettings.ShowEmailAddress = React.findDOMNode(this.refs.ShowEmailAddress).checked; config.PrivacySettings.ShowFullName = React.findDOMNode(this.refs.ShowFullName).checked; - config.PrivacySettings.EnableDiagnostic = React.findDOMNode(this.refs.EnableDiagnostic).checked; + config.PrivacySettings.EnableSecurityFixAlert = React.findDOMNode(this.refs.EnableSecurityFixAlert).checked; Client.saveConfig( config, @@ -140,7 +140,7 @@ export default class PrivacySettings extends React.Component { <div className='form-group'> <label className='control-label col-sm-4' - htmlFor='EnableDiagnostic' + htmlFor='EnableSecurityFixAlert' > {'Send Error and Diagnostic: '} </label> @@ -148,10 +148,10 @@ export default class PrivacySettings extends React.Component { <label className='radio-inline'> <input type='radio' - name='EnableDiagnostic' + name='EnableSecurityFixAlert' value='true' - ref='EnableDiagnostic' - defaultChecked={this.props.config.PrivacySettings.EnableDiagnostic} + ref='EnableSecurityFixAlert' + defaultChecked={this.props.config.PrivacySettings.EnableSecurityFixAlert} onChange={this.handleChange} /> {'true'} @@ -159,14 +159,14 @@ export default class PrivacySettings extends React.Component { <label className='radio-inline'> <input type='radio' - name='EnableDiagnostic' + name='EnableSecurityFixAlert' value='false' - defaultChecked={!this.props.config.PrivacySettings.EnableDiagnostic} + defaultChecked={!this.props.config.PrivacySettings.EnableSecurityFixAlert} onChange={this.handleChange} /> {'false'} </label> - <p className='help-text'>{'When true, The server will periodically send error and diagnostic information to Mattermost.'}</p> + <p className='help-text'>{'When true, System Administrators are notified by email if a relevant security fix alert has been announced in the last 12 hours. Requires email to be enabled.'}</p> </div> </div> diff --git a/web/react/components/admin_console/rate_settings.jsx b/web/react/components/admin_console/rate_settings.jsx index 0081daca3..65c39ac42 100644 --- a/web/react/components/admin_console/rate_settings.jsx +++ b/web/react/components/admin_console/rate_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/admin_console/reset_password_modal.jsx b/web/react/components/admin_console/reset_password_modal.jsx index 0b83edb17..75264be45 100644 --- a/web/react/components/admin_console/reset_password_modal.jsx +++ b/web/react/components/admin_console/reset_password_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/admin_console/select_team_modal.jsx b/web/react/components/admin_console/select_team_modal.jsx index 343f65131..21d1c25c3 100644 --- a/web/react/components/admin_console/select_team_modal.jsx +++ b/web/react/components/admin_console/select_team_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Modal = ReactBootstrap.Modal; diff --git a/web/react/components/admin_console/service_settings.jsx b/web/react/components/admin_console/service_settings.jsx index b2d1b7b4d..3968d9820 100644 --- a/web/react/components/admin_console/service_settings.jsx +++ b/web/react/components/admin_console/service_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/admin_console/sql_settings.jsx b/web/react/components/admin_console/sql_settings.jsx index 0e0ceb9af..16a69e664 100644 --- a/web/react/components/admin_console/sql_settings.jsx +++ b/web/react/components/admin_console/sql_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/admin_console/team_settings.jsx b/web/react/components/admin_console/team_settings.jsx index 0f6f819d3..a517c56fe 100644 --- a/web/react/components/admin_console/team_settings.jsx +++ b/web/react/components/admin_console/team_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/admin_console/team_users.jsx b/web/react/components/admin_console/team_users.jsx index 0a971ff15..ffb412159 100644 --- a/web/react/components/admin_console/team_users.jsx +++ b/web/react/components/admin_console/team_users.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/admin_console/user_item.jsx b/web/react/components/admin_console/user_item.jsx index c5c6e19d4..665ccd719 100644 --- a/web/react/components/admin_console/user_item.jsx +++ b/web/react/components/admin_console/user_item.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/authorize.jsx b/web/react/components/authorize.jsx index dd4479ad4..74709bcab 100644 --- a/web/react/components/authorize.jsx +++ b/web/react/components/authorize.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../utils/client.jsx'); diff --git a/web/react/components/change_url_modal.jsx b/web/react/components/change_url_modal.jsx index 3553e1107..f8db13392 100644 --- a/web/react/components/change_url_modal.jsx +++ b/web/react/components/change_url_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Modal = ReactBootstrap.Modal; diff --git a/web/react/components/channel_header.jsx b/web/react/components/channel_header.jsx index f15974d35..e47db073d 100644 --- a/web/react/components/channel_header.jsx +++ b/web/react/components/channel_header.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const ChannelStore = require('../stores/channel_store.jsx'); @@ -58,7 +58,9 @@ export default class ChannelHeader extends React.Component { $('.channel-header__info .description').popover({placement: 'bottom', trigger: 'hover', html: true, delay: {show: 500, hide: 500}}); } onSocketChange(msg) { - if (msg.action === 'new_user') { + if (msg.action === 'new_user' || + msg.action === 'user_added' || + (msg.action === 'user_removed' && msg.user_id !== UserStore.getCurrentId())) { AsyncClient.getChannelExtraInfo(true); } } diff --git a/web/react/components/channel_info_modal.jsx b/web/react/components/channel_info_modal.jsx index fdd9a5c17..d6de958e7 100644 --- a/web/react/components/channel_info_modal.jsx +++ b/web/react/components/channel_info_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var ChannelStore = require('../stores/channel_store.jsx'); diff --git a/web/react/components/channel_invite_modal.jsx b/web/react/components/channel_invite_modal.jsx index 82fc51184..1e621c683 100644 --- a/web/react/components/channel_invite_modal.jsx +++ b/web/react/components/channel_invite_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/channel_loader.jsx b/web/react/components/channel_loader.jsx index 39c86405c..d16069725 100644 --- a/web/react/components/channel_loader.jsx +++ b/web/react/components/channel_loader.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. /* This is a special React control with the sole purpose of making all the AsyncClient calls diff --git a/web/react/components/channel_members.jsx b/web/react/components/channel_members.jsx index 53c854eb7..0cd384977 100644 --- a/web/react/components/channel_members.jsx +++ b/web/react/components/channel_members.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/channel_notifications.jsx b/web/react/components/channel_notifications.jsx index ed76b7bce..2114be905 100644 --- a/web/react/components/channel_notifications.jsx +++ b/web/react/components/channel_notifications.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var SettingItemMin = require('./setting_item_min.jsx'); diff --git a/web/react/components/command_list.jsx b/web/react/components/command_list.jsx index e027e87ae..a6d9d5d70 100644 --- a/web/react/components/command_list.jsx +++ b/web/react/components/command_list.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var client = require('../utils/client.jsx'); diff --git a/web/react/components/confirm_modal.jsx b/web/react/components/confirm_modal.jsx index cb3b9c5e3..12002f33f 100644 --- a/web/react/components/confirm_modal.jsx +++ b/web/react/components/confirm_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class ConfirmModal extends React.Component { diff --git a/web/react/components/create_comment.jsx b/web/react/components/create_comment.jsx index 9c233ea26..add4125d7 100644 --- a/web/react/components/create_comment.jsx +++ b/web/react/components/create_comment.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); @@ -106,10 +106,11 @@ export default class CreateComment extends React.Component { let state = {}; if (err.message === 'Invalid RootId parameter') { + PostStore.removePendingPost(post.channel_id, post.pending_post_id); + if ($('#post_deleted').length > 0) { $('#post_deleted').modal('show'); } - PostStore.removePendingPost(post.pending_post_id); } else { post.state = Constants.POST_FAILED; PostStore.updatePendingPost(post); diff --git a/web/react/components/create_post.jsx b/web/react/components/create_post.jsx index 6e83f4faf..ed265ab02 100644 --- a/web/react/components/create_post.jsx +++ b/web/react/components/create_post.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/components/delete_channel_modal.jsx b/web/react/components/delete_channel_modal.jsx index 71c636921..9358c98d7 100644 --- a/web/react/components/delete_channel_modal.jsx +++ b/web/react/components/delete_channel_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Client = require('../utils/client.jsx'); diff --git a/web/react/components/delete_post_modal.jsx b/web/react/components/delete_post_modal.jsx index 8e48a7a1c..ea7d76b1e 100644 --- a/web/react/components/delete_post_modal.jsx +++ b/web/react/components/delete_post_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../utils/client.jsx'); diff --git a/web/react/components/edit_channel_modal.jsx b/web/react/components/edit_channel_modal.jsx index 27219aba5..6ccf12be6 100644 --- a/web/react/components/edit_channel_modal.jsx +++ b/web/react/components/edit_channel_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Client = require('../utils/client.jsx'); diff --git a/web/react/components/edit_post_modal.jsx b/web/react/components/edit_post_modal.jsx index ad7bd30b5..165a28a64 100644 --- a/web/react/components/edit_post_modal.jsx +++ b/web/react/components/edit_post_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../utils/client.jsx'); diff --git a/web/react/components/email_verify.jsx b/web/react/components/email_verify.jsx index 391de3326..2b413b848 100644 --- a/web/react/components/email_verify.jsx +++ b/web/react/components/email_verify.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class EmailVerify extends React.Component { diff --git a/web/react/components/error_bar.jsx b/web/react/components/error_bar.jsx index 5aa55be93..b100fd337 100644 --- a/web/react/components/error_bar.jsx +++ b/web/react/components/error_bar.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var ErrorStore = require('../stores/error_store.jsx'); diff --git a/web/react/components/file_attachment.jsx b/web/react/components/file_attachment.jsx index 888f24aa5..659da4f5e 100644 --- a/web/react/components/file_attachment.jsx +++ b/web/react/components/file_attachment.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var utils = require('../utils/utils.jsx'); diff --git a/web/react/components/file_attachment_list.jsx b/web/react/components/file_attachment_list.jsx index 212d4a958..ae08e5635 100644 --- a/web/react/components/file_attachment_list.jsx +++ b/web/react/components/file_attachment_list.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var ViewImageModal = require('./view_image.jsx'); diff --git a/web/react/components/file_preview.jsx b/web/react/components/file_preview.jsx index 33382a439..a40ed1dcf 100644 --- a/web/react/components/file_preview.jsx +++ b/web/react/components/file_preview.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/file_upload.jsx b/web/react/components/file_upload.jsx index 0e9297b7b..e947fc50c 100644 --- a/web/react/components/file_upload.jsx +++ b/web/react/components/file_upload.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var client = require('../utils/client.jsx'); diff --git a/web/react/components/file_upload_overlay.jsx b/web/react/components/file_upload_overlay.jsx index 265924206..4fcee6cb0 100644 --- a/web/react/components/file_upload_overlay.jsx +++ b/web/react/components/file_upload_overlay.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class FileUploadOverlay extends React.Component { diff --git a/web/react/components/find_team.jsx b/web/react/components/find_team.jsx index eb2683a88..59c4e08e3 100644 --- a/web/react/components/find_team.jsx +++ b/web/react/components/find_team.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var utils = require('../utils/utils.jsx'); diff --git a/web/react/components/get_link_modal.jsx b/web/react/components/get_link_modal.jsx index 6e0728862..234013b93 100644 --- a/web/react/components/get_link_modal.jsx +++ b/web/react/components/get_link_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/invite_member_modal.jsx b/web/react/components/invite_member_modal.jsx index 395b98630..2ca39d1b1 100644 --- a/web/react/components/invite_member_modal.jsx +++ b/web/react/components/invite_member_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var utils = require('../utils/utils.jsx'); diff --git a/web/react/components/loading_screen.jsx b/web/react/components/loading_screen.jsx index b0f42ce86..9849205f2 100644 --- a/web/react/components/loading_screen.jsx +++ b/web/react/components/loading_screen.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class LoadingScreen extends React.Component { diff --git a/web/react/components/login.jsx b/web/react/components/login.jsx index 54df75cbc..997abce68 100644 --- a/web/react/components/login.jsx +++ b/web/react/components/login.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/member_list.jsx b/web/react/components/member_list.jsx index 65495b569..fe744760f 100644 --- a/web/react/components/member_list.jsx +++ b/web/react/components/member_list.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var MemberListItem = require('./member_list_item.jsx'); diff --git a/web/react/components/member_list_item.jsx b/web/react/components/member_list_item.jsx index 158ff65be..5c3695ad4 100644 --- a/web/react/components/member_list_item.jsx +++ b/web/react/components/member_list_item.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/member_list_team.jsx b/web/react/components/member_list_team.jsx index 064330c8d..5ca40a39d 100644 --- a/web/react/components/member_list_team.jsx +++ b/web/react/components/member_list_team.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const MemberListTeamItem = require('./member_list_team_item.jsx'); diff --git a/web/react/components/member_list_team_item.jsx b/web/react/components/member_list_team_item.jsx index 629fb2ec4..9a104aa32 100644 --- a/web/react/components/member_list_team_item.jsx +++ b/web/react/components/member_list_team_item.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/mention.jsx b/web/react/components/mention.jsx index ef7cec408..aeed724a8 100644 --- a/web/react/components/mention.jsx +++ b/web/react/components/mention.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/mention_list.jsx b/web/react/components/mention_list.jsx index 72f51013c..b9ba5f58c 100644 --- a/web/react/components/mention_list.jsx +++ b/web/react/components/mention_list.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/message_wrapper.jsx b/web/react/components/message_wrapper.jsx index 5adf4f228..00c427c79 100644 --- a/web/react/components/message_wrapper.jsx +++ b/web/react/components/message_wrapper.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var TextFormatting = require('../utils/text_formatting.jsx'); diff --git a/web/react/components/more_channels.jsx b/web/react/components/more_channels.jsx index 487192d91..884b0d6ca 100644 --- a/web/react/components/more_channels.jsx +++ b/web/react/components/more_channels.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var utils = require('../utils/utils.jsx'); diff --git a/web/react/components/more_direct_channels.jsx b/web/react/components/more_direct_channels.jsx index c71abd43a..31ecb4c5d 100644 --- a/web/react/components/more_direct_channels.jsx +++ b/web/react/components/more_direct_channels.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var ChannelStore = require('../stores/channel_store.jsx'); diff --git a/web/react/components/msg_typing.jsx b/web/react/components/msg_typing.jsx index d9823c3cf..569942390 100644 --- a/web/react/components/msg_typing.jsx +++ b/web/react/components/msg_typing.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var SocketStore = require('../stores/socket_store.jsx'); diff --git a/web/react/components/navbar.jsx b/web/react/components/navbar.jsx index bdb50cd9e..6503bd801 100644 --- a/web/react/components/navbar.jsx +++ b/web/react/components/navbar.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../utils/client.jsx'); diff --git a/web/react/components/navbar_dropdown.jsx b/web/react/components/navbar_dropdown.jsx index 30c4e94ae..b6defc393 100644 --- a/web/react/components/navbar_dropdown.jsx +++ b/web/react/components/navbar_dropdown.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Utils = require('../utils/utils.jsx'); @@ -6,6 +6,8 @@ var client = require('../utils/client.jsx'); var UserStore = require('../stores/user_store.jsx'); var TeamStore = require('../stores/team_store.jsx'); +var AboutBuildModal = require('./about_build_modal.jsx'); + var Constants = require('../utils/constants.jsx'); function getStateFromStores() { @@ -18,7 +20,9 @@ export default class NavbarDropdown extends React.Component { this.blockToggle = false; this.handleLogoutClick = this.handleLogoutClick.bind(this); + this.handleAboutModal = this.handleAboutModal.bind(this); this.onListenerChange = this.onListenerChange.bind(this); + this.aboutModalDismissed = this.aboutModalDismissed.bind(this); this.state = getStateFromStores(); } @@ -26,6 +30,12 @@ export default class NavbarDropdown extends React.Component { e.preventDefault(); client.logout(); } + handleAboutModal() { + this.setState({showAboutModal: true}); + } + aboutModalDismissed() { + this.setState({showAboutModal: false}); + } componentDidMount() { UserStore.addTeamsChangeListener(this.onListenerChange); TeamStore.addChangeListener(this.onListenerChange); @@ -228,6 +238,18 @@ export default class NavbarDropdown extends React.Component { {'Report a Problem'} </a> </li> + <li> + <a + href='#' + onClick={this.handleAboutModal} + > + {'About Mattermost'} + </a> + </li> + <AboutBuildModal + show={this.state.showAboutModal} + onModalDismissed={this.aboutModalDismissed} + /> </ul> </li> </ul> diff --git a/web/react/components/new_channel_flow.jsx b/web/react/components/new_channel_flow.jsx index df6a119d5..186cfc2b0 100644 --- a/web/react/components/new_channel_flow.jsx +++ b/web/react/components/new_channel_flow.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/new_channel_modal.jsx b/web/react/components/new_channel_modal.jsx index c8ef59b4a..c3d9c046d 100644 --- a/web/react/components/new_channel_modal.jsx +++ b/web/react/components/new_channel_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/notify_counts.jsx b/web/react/components/notify_counts.jsx index f34b4669f..54b9e4289 100644 --- a/web/react/components/notify_counts.jsx +++ b/web/react/components/notify_counts.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var utils = require('../utils/utils.jsx'); diff --git a/web/react/components/password_reset.jsx b/web/react/components/password_reset.jsx index 399d3b7b9..54d126144 100644 --- a/web/react/components/password_reset.jsx +++ b/web/react/components/password_reset.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var PasswordResetSendLink = require('./password_reset_send_link.jsx'); diff --git a/web/react/components/password_reset_form.jsx b/web/react/components/password_reset_form.jsx index dae582627..0ef187114 100644 --- a/web/react/components/password_reset_form.jsx +++ b/web/react/components/password_reset_form.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var client = require('../utils/client.jsx'); diff --git a/web/react/components/password_reset_send_link.jsx b/web/react/components/password_reset_send_link.jsx index 37d4a58cb..78fbcaa2f 100644 --- a/web/react/components/password_reset_send_link.jsx +++ b/web/react/components/password_reset_send_link.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/popover_list_members.jsx b/web/react/components/popover_list_members.jsx index aaaea3c6f..5d9052fd7 100644 --- a/web/react/components/popover_list_members.jsx +++ b/web/react/components/popover_list_members.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/post.jsx b/web/react/components/post.jsx index ac9c9252e..64d6776b4 100644 --- a/web/react/components/post.jsx +++ b/web/react/components/post.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var PostHeader = require('./post_header.jsx'); diff --git a/web/react/components/post_body.jsx b/web/react/components/post_body.jsx index 1d94cab47..e87ac6743 100644 --- a/web/react/components/post_body.jsx +++ b/web/react/components/post_body.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const FileAttachmentList = require('./file_attachment_list.jsx'); diff --git a/web/react/components/post_deleted_modal.jsx b/web/react/components/post_deleted_modal.jsx index d284a9d1b..87afc6a7f 100644 --- a/web/react/components/post_deleted_modal.jsx +++ b/web/react/components/post_deleted_modal.jsx @@ -1,14 +1,42 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); +var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); +var Constants = require('../utils/constants.jsx'); +var ActionTypes = Constants.ActionTypes; export default class PostDeletedModal extends React.Component { constructor(props) { super(props); + this.handleClose = this.handleClose.bind(this); + this.state = {}; } + componentDidMount() { + $(React.findDOMNode(this.refs.modal)).on('hidden.bs.modal', () => { + this.handleClose(); + }); + } + handleClose() { + AppDispatcher.handleServerAction({ + type: ActionTypes.RECIEVED_SEARCH, + results: null + }); + + AppDispatcher.handleServerAction({ + type: ActionTypes.RECIEVED_SEARCH_TERM, + term: null, + do_search: false, + is_mention_search: false + }); + + AppDispatcher.handleServerAction({ + type: ActionTypes.RECIEVED_POST_SELECTED, + results: null + }); + } render() { var currentUser = UserStore.getCurrentUser(); @@ -31,17 +59,17 @@ export default class PostDeletedModal extends React.Component { data-dismiss='modal' aria-label='Close' > - <span aria-hidden='true'>×</span> + <span aria-hidden='true'>{'×'}</span> </button> <h4 className='modal-title' id='myModalLabel' > - Comment could not be posted + {'Comment could not be posted'} </h4> </div> <div className='modal-body'> - <p>Someone deleted the message on which you tried to post a comment.</p> + <p>{'Someone deleted the message on which you tried to post a comment.'}</p> </div> <div className='modal-footer'> <button @@ -49,7 +77,7 @@ export default class PostDeletedModal extends React.Component { className='btn btn-primary' data-dismiss='modal' > - Okay + {'Okay'} </button> </div> </div> diff --git a/web/react/components/post_header.jsx b/web/react/components/post_header.jsx index dd79b3e36..0ba5ce6b5 100644 --- a/web/react/components/post_header.jsx +++ b/web/react/components/post_header.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserProfile = require('./user_profile.jsx'); diff --git a/web/react/components/post_info.jsx b/web/react/components/post_info.jsx index c1e8979a4..87962641f 100644 --- a/web/react/components/post_info.jsx +++ b/web/react/components/post_info.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/post_list.jsx b/web/react/components/post_list.jsx index 6741a9bdd..643b38af5 100644 --- a/web/react/components/post_list.jsx +++ b/web/react/components/post_list.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var PostStore = require('../stores/post_store.jsx'); @@ -379,13 +379,9 @@ export default class PostList extends React.Component { <p className='channel-intro__content'> Welcome to {channel.display_name}! <br/><br/> - This is the first channel teammates see when they - <br/> - sign up - use it for posting updates everyone needs to know. + This is the first channel teammates see when they sign up - use it for posting updates everyone needs to know. <br/><br/> - To create a new channel or join an existing one, go to - <br/> - the Left Hand Sidebar under “Channels” and click “More…”. + To create a new channel or join an existing one, go to the Left Sidebar under “Channels” and click “More…”. <br/> </p> </div> diff --git a/web/react/components/post_list_container.jsx b/web/react/components/post_list_container.jsx index e59d85d41..09cee6218 100644 --- a/web/react/components/post_list_container.jsx +++ b/web/react/components/post_list_container.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const PostList = require('./post_list.jsx'); diff --git a/web/react/components/register_app_modal.jsx b/web/react/components/register_app_modal.jsx index 473ff3f91..e93c44126 100644 --- a/web/react/components/register_app_modal.jsx +++ b/web/react/components/register_app_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../utils/client.jsx'); diff --git a/web/react/components/removed_from_channel_modal.jsx b/web/react/components/removed_from_channel_modal.jsx index b7ec85457..ca35d6fb0 100644 --- a/web/react/components/removed_from_channel_modal.jsx +++ b/web/react/components/removed_from_channel_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var ChannelStore = require('../stores/channel_store.jsx'); @@ -26,13 +26,13 @@ export default class RemovedFromChannelModal extends React.Component { BrowserStore.removeItem('channel-removed-state'); } + var townSquare = ChannelStore.getByName('town-square'); + setTimeout(() => utils.switchChannel(townSquare), 1); + this.setState(newState); } handleClose() { - var townSquare = ChannelStore.getByName('town-square'); - utils.switchChannel(townSquare); - this.setState({channelName: '', remover: ''}); } @@ -98,4 +98,4 @@ export default class RemovedFromChannelModal extends React.Component { return <div/>; } -}
\ No newline at end of file +} diff --git a/web/react/components/rename_channel_modal.jsx b/web/react/components/rename_channel_modal.jsx index d60206ecf..7f7d4554c 100644 --- a/web/react/components/rename_channel_modal.jsx +++ b/web/react/components/rename_channel_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/rhs_comment.jsx b/web/react/components/rhs_comment.jsx index aa355f8cc..d1ed9b2c0 100644 --- a/web/react/components/rhs_comment.jsx +++ b/web/react/components/rhs_comment.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var PostStore = require('../stores/post_store.jsx'); diff --git a/web/react/components/rhs_header_post.jsx b/web/react/components/rhs_header_post.jsx index f55c4095e..856eea91d 100644 --- a/web/react/components/rhs_header_post.jsx +++ b/web/react/components/rhs_header_post.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/components/rhs_root_post.jsx b/web/react/components/rhs_root_post.jsx index 13ab0c982..c44844f34 100644 --- a/web/react/components/rhs_root_post.jsx +++ b/web/react/components/rhs_root_post.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var ChannelStore = require('../stores/channel_store.jsx'); diff --git a/web/react/components/rhs_thread.jsx b/web/react/components/rhs_thread.jsx index 2f23d80d9..41fd74adb 100644 --- a/web/react/components/rhs_thread.jsx +++ b/web/react/components/rhs_thread.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var PostStore = require('../stores/post_store.jsx'); @@ -23,7 +23,7 @@ export default class RhsThread extends React.Component { } getStateFromStores() { var postList = PostStore.getSelectedPost(); - if (!postList || postList.order.length < 1) { + if (!postList || postList.order.length < 1 || !postList.posts[postList.order[0]]) { return {postList: {}}; } @@ -49,7 +49,10 @@ export default class RhsThread extends React.Component { }.bind(this)); } componentDidUpdate() { - $('.post-right__scroll').scrollTop($('.post-right__scroll')[0].scrollHeight); + if ($('.post-right__scroll')[0]) { + $('.post-right__scroll').scrollTop($('.post-right__scroll')[0].scrollHeight); + } + $('.post-right__scroll').perfectScrollbar('update'); this.resize(); } @@ -67,7 +70,7 @@ export default class RhsThread extends React.Component { // if something was changed in the channel like adding a // comment or post then lets refresh the sidebar list var currentSelected = PostStore.getSelectedPost(); - if (!currentSelected || currentSelected.order.length === 0) { + if (!currentSelected || currentSelected.order.length === 0 || !currentSelected.posts[currentSelected.order[0]]) { return; } @@ -103,7 +106,7 @@ export default class RhsThread extends React.Component { render() { var postList = this.state.postList; - if (postList == null) { + if (postList == null || !postList.order) { return ( <div></div> ); diff --git a/web/react/components/search_bar.jsx b/web/react/components/search_bar.jsx index 77166fef9..a6f9441ec 100644 --- a/web/react/components/search_bar.jsx +++ b/web/react/components/search_bar.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var client = require('../utils/client.jsx'); diff --git a/web/react/components/search_results.jsx b/web/react/components/search_results.jsx index 6ee817171..5eea3c501 100644 --- a/web/react/components/search_results.jsx +++ b/web/react/components/search_results.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var PostStore = require('../stores/post_store.jsx'); diff --git a/web/react/components/search_results_header.jsx b/web/react/components/search_results_header.jsx index 4e8a3ef10..fdd449c2d 100644 --- a/web/react/components/search_results_header.jsx +++ b/web/react/components/search_results_header.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/components/search_results_item.jsx b/web/react/components/search_results_item.jsx index bdefdbee8..75d2e7a45 100644 --- a/web/react/components/search_results_item.jsx +++ b/web/react/components/search_results_item.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var PostStore = require('../stores/post_store.jsx'); diff --git a/web/react/components/setting_item_max.jsx b/web/react/components/setting_item_max.jsx index 1bffa7c79..d2cbc798e 100644 --- a/web/react/components/setting_item_max.jsx +++ b/web/react/components/setting_item_max.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class SettingItemMax extends React.Component { diff --git a/web/react/components/setting_item_min.jsx b/web/react/components/setting_item_min.jsx index 2c0fdf2f4..2a72be207 100644 --- a/web/react/components/setting_item_min.jsx +++ b/web/react/components/setting_item_min.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class SettingItemMin extends React.Component { diff --git a/web/react/components/setting_picture.jsx b/web/react/components/setting_picture.jsx index ddad4fd53..c9031e67c 100644 --- a/web/react/components/setting_picture.jsx +++ b/web/react/components/setting_picture.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class SettingPicture extends React.Component { diff --git a/web/react/components/setting_upload.jsx b/web/react/components/setting_upload.jsx index ccb26cc58..c7107b84d 100644 --- a/web/react/components/setting_upload.jsx +++ b/web/react/components/setting_upload.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class SettingsUpload extends React.Component { diff --git a/web/react/components/settings_sidebar.jsx b/web/react/components/settings_sidebar.jsx index 4c4675788..b5d2132d7 100644 --- a/web/react/components/settings_sidebar.jsx +++ b/web/react/components/settings_sidebar.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class SettingsSidebar extends React.Component { diff --git a/web/react/components/sidebar.jsx b/web/react/components/sidebar.jsx index 88eaed335..4ac1fd4a0 100644 --- a/web/react/components/sidebar.jsx +++ b/web/react/components/sidebar.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var ChannelStore = require('../stores/channel_store.jsx'); @@ -262,7 +262,7 @@ export default class Sidebar extends React.Component { if (msg.user_id === UserStore.getCurrentId()) { AsyncClient.getChannels(true); - if (msg.props.channel_id === ChannelStore.getCurrentId() && $('#removed_from_channel').length > 0) { + if (msg.props.remover !== msg.user_id && msg.props.channel_id === ChannelStore.getCurrentId() && $('#removed_from_channel').length > 0) { var sentState = {}; sentState.channelName = ChannelStore.getCurrent().display_name; sentState.remover = UserStore.getProfile(msg.props.remover).username; diff --git a/web/react/components/sidebar_header.jsx b/web/react/components/sidebar_header.jsx index 33de35064..c3709bc0a 100644 --- a/web/react/components/sidebar_header.jsx +++ b/web/react/components/sidebar_header.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var NavbarDropdown = require('./navbar_dropdown.jsx'); diff --git a/web/react/components/sidebar_right.jsx b/web/react/components/sidebar_right.jsx index 573515a46..4e6985a86 100644 --- a/web/react/components/sidebar_right.jsx +++ b/web/react/components/sidebar_right.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var SearchResults = require('./search_results.jsx'); diff --git a/web/react/components/sidebar_right_menu.jsx b/web/react/components/sidebar_right_menu.jsx index 2df2c8ffd..ea2bcf9a4 100644 --- a/web/react/components/sidebar_right_menu.jsx +++ b/web/react/components/sidebar_right_menu.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/signup_team.jsx b/web/react/components/signup_team.jsx index 4112138fa..48cf2c73c 100644 --- a/web/react/components/signup_team.jsx +++ b/web/react/components/signup_team.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const ChoosePage = require('./team_signup_choose_auth.jsx'); diff --git a/web/react/components/signup_team_complete.jsx b/web/react/components/signup_team_complete.jsx index 9c03c5c2f..c30132885 100644 --- a/web/react/components/signup_team_complete.jsx +++ b/web/react/components/signup_team_complete.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var WelcomePage = require('./team_signup_welcome_page.jsx'); diff --git a/web/react/components/signup_user_complete.jsx b/web/react/components/signup_user_complete.jsx index 4e17c6d06..75661f812 100644 --- a/web/react/components/signup_user_complete.jsx +++ b/web/react/components/signup_user_complete.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/team_export_tab.jsx b/web/react/components/team_export_tab.jsx index 2914904ad..e15e3a372 100644 --- a/web/react/components/team_export_tab.jsx +++ b/web/react/components/team_export_tab.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../utils/client.jsx'); diff --git a/web/react/components/team_general_tab.jsx b/web/react/components/team_general_tab.jsx index ca438df78..923180e27 100644 --- a/web/react/components/team_general_tab.jsx +++ b/web/react/components/team_general_tab.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const SettingItemMin = require('./setting_item_min.jsx'); diff --git a/web/react/components/team_import_tab.jsx b/web/react/components/team_import_tab.jsx index 79f03510f..40f06c382 100644 --- a/web/react/components/team_import_tab.jsx +++ b/web/react/components/team_import_tab.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var utils = require('../utils/utils.jsx'); diff --git a/web/react/components/team_members.jsx b/web/react/components/team_members.jsx index 0cd22437e..0f60d93b2 100644 --- a/web/react/components/team_members.jsx +++ b/web/react/components/team_members.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../stores/user_store.jsx'); diff --git a/web/react/components/team_settings.jsx b/web/react/components/team_settings.jsx index e91aa20bc..e14da4f04 100644 --- a/web/react/components/team_settings.jsx +++ b/web/react/components/team_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var TeamStore = require('../stores/team_store.jsx'); diff --git a/web/react/components/team_settings_modal.jsx b/web/react/components/team_settings_modal.jsx index a96aadccf..b55373dba 100644 --- a/web/react/components/team_settings_modal.jsx +++ b/web/react/components/team_settings_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const SettingsSidebar = require('./settings_sidebar.jsx'); diff --git a/web/react/components/team_signup_choose_auth.jsx b/web/react/components/team_signup_choose_auth.jsx index b8264b887..fa898f63c 100644 --- a/web/react/components/team_signup_choose_auth.jsx +++ b/web/react/components/team_signup_choose_auth.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class ChooseAuthPage extends React.Component { @@ -52,7 +52,7 @@ export default class ChooseAuthPage extends React.Component { <div> {buttons} <div className='form-group margin--extra-2x'> - <span><a href='/find_team'>{'Find my team'}</a></span> + <span><a href='/find_team'>{'Find my teams'}</a></span> </div> </div> ); diff --git a/web/react/components/team_signup_display_name_page.jsx b/web/react/components/team_signup_display_name_page.jsx index c0d0ed366..65da4bc96 100644 --- a/web/react/components/team_signup_display_name_page.jsx +++ b/web/react/components/team_signup_display_name_page.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var utils = require('../utils/utils.jsx'); diff --git a/web/react/components/team_signup_email_item.jsx b/web/react/components/team_signup_email_item.jsx index 01330a46c..219f14eef 100644 --- a/web/react/components/team_signup_email_item.jsx +++ b/web/react/components/team_signup_email_item.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/team_signup_password_page.jsx b/web/react/components/team_signup_password_page.jsx index 105e4817a..dce8105ca 100644 --- a/web/react/components/team_signup_password_page.jsx +++ b/web/react/components/team_signup_password_page.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../utils/client.jsx'); diff --git a/web/react/components/team_signup_send_invites_page.jsx b/web/react/components/team_signup_send_invites_page.jsx index 8d8fb92ff..e7bc0272d 100644 --- a/web/react/components/team_signup_send_invites_page.jsx +++ b/web/react/components/team_signup_send_invites_page.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var EmailItem = require('./team_signup_email_item.jsx'); diff --git a/web/react/components/team_signup_url_page.jsx b/web/react/components/team_signup_url_page.jsx index a682bb49e..398a52f7d 100644 --- a/web/react/components/team_signup_url_page.jsx +++ b/web/react/components/team_signup_url_page.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/team_signup_username_page.jsx b/web/react/components/team_signup_username_page.jsx index 0053b011d..53a389c4c 100644 --- a/web/react/components/team_signup_username_page.jsx +++ b/web/react/components/team_signup_username_page.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/team_signup_welcome_page.jsx b/web/react/components/team_signup_welcome_page.jsx index 019456c9f..78a41eed5 100644 --- a/web/react/components/team_signup_welcome_page.jsx +++ b/web/react/components/team_signup_welcome_page.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/team_signup_with_email.jsx b/web/react/components/team_signup_with_email.jsx index 4fb1c0d01..9376a4564 100644 --- a/web/react/components/team_signup_with_email.jsx +++ b/web/react/components/team_signup_with_email.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Utils = require('../utils/utils.jsx'); @@ -14,8 +14,8 @@ export default class EmailSignUpPage extends React.Component { } handleSubmit(e) { e.preventDefault(); - let team = {}; - let state = {serverError: ''}; + var team = {}; + var state = {serverError: ''}; team.email = React.findDOMNode(this.refs.email).value.trim().toLowerCase(); if (!team.email || !Utils.isEmail(team.email)) { @@ -31,20 +31,25 @@ export default class EmailSignUpPage extends React.Component { } Client.signupTeam(team.email, - function success(data) { + (data) => { if (data.follow_link) { window.location.href = data.follow_link; } else { window.location.href = `/signup_team_confirm/?email=${encodeURIComponent(team.email)}`; } }, - function fail(err) { + (err) => { state.serverError = err.message; this.setState(state); - }.bind(this) + } ); } render() { + var serverError = null; + if (this.state.serverError) { + serverError = <div className='form-group has-error'><label className='control-label'>{this.state.serverError}</label></div>; + } + return ( <form role='form' @@ -65,11 +70,12 @@ export default class EmailSignUpPage extends React.Component { className='btn btn-md btn-primary' type='submit' > - Sign up + {'Sign up'} </button> + {serverError} </div> <div className='form-group margin--extra-2x'> - <span><a href='/find_team'>{`Find my team`}</a></span> + <span><a href='/find_team'>{`Find my teams`}</a></span> </div> </form> ); diff --git a/web/react/components/team_signup_with_sso.jsx b/web/react/components/team_signup_with_sso.jsx index 14f281f7a..011bfebff 100644 --- a/web/react/components/team_signup_with_sso.jsx +++ b/web/react/components/team_signup_with_sso.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var utils = require('../utils/utils.jsx'); @@ -40,17 +40,17 @@ export default class SSOSignUpPage extends React.Component { client.createTeamWithSSO(team, this.props.service, - function success(data) { + (data) => { if (data.follow_link) { window.location.href = data.follow_link; } else { window.location.href = '/' + team.name + '/channels/town-square'; } }, - function fail(err) { + (err) => { state.serverError = err.message; this.setState(state); - }.bind(this) + } ); } nameChange() { @@ -85,7 +85,7 @@ export default class SSOSignUpPage extends React.Component { disabled={disabled} > <span className='icon'/> - <span>Create team with GitLab Account</span> + <span>{'Create team with GitLab Account'}</span> </a> ); } @@ -112,7 +112,7 @@ export default class SSOSignUpPage extends React.Component { {serverError} </div> <div className='form-group margin--extra-2x'> - <span><a href='/find_team'>{'Find my team'}</a></span> + <span><a href='/find_team'>{'Find my teams'}</a></span> </div> </form> ); diff --git a/web/react/components/textbox.jsx b/web/react/components/textbox.jsx index 5f5316013..0563c294a 100644 --- a/web/react/components/textbox.jsx +++ b/web/react/components/textbox.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/components/unread_channel_indicator.jsx b/web/react/components/unread_channel_indicator.jsx index 12a67633e..6ae06528b 100644 --- a/web/react/components/unread_channel_indicator.jsx +++ b/web/react/components/unread_channel_indicator.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. // Indicator for the left sidebar which indicate if there's unread posts in a channel that is not shown diff --git a/web/react/components/user_profile.jsx b/web/react/components/user_profile.jsx index ceb8f52a7..948f06444 100644 --- a/web/react/components/user_profile.jsx +++ b/web/react/components/user_profile.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Utils = require('../utils/utils.jsx'); diff --git a/web/react/components/user_settings/custom_theme_chooser.jsx b/web/react/components/user_settings/custom_theme_chooser.jsx index c680d75d1..44b3f4544 100644 --- a/web/react/components/user_settings/custom_theme_chooser.jsx +++ b/web/react/components/user_settings/custom_theme_chooser.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Constants = require('../../utils/constants.jsx'); diff --git a/web/react/components/user_settings/import_theme_modal.jsx b/web/react/components/user_settings/import_theme_modal.jsx index 3301c6596..de0663874 100644 --- a/web/react/components/user_settings/import_theme_modal.jsx +++ b/web/react/components/user_settings/import_theme_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const UserStore = require('../../stores/user_store.jsx'); diff --git a/web/react/components/user_settings/manage_incoming_hooks.jsx b/web/react/components/user_settings/manage_incoming_hooks.jsx index 899dbcd05..90b4039c7 100644 --- a/web/react/components/user_settings/manage_incoming_hooks.jsx +++ b/web/react/components/user_settings/manage_incoming_hooks.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Client = require('../../utils/client.jsx'); diff --git a/web/react/components/user_settings/premade_theme_chooser.jsx b/web/react/components/user_settings/premade_theme_chooser.jsx index 8116bffcc..22cfcebcd 100644 --- a/web/react/components/user_settings/premade_theme_chooser.jsx +++ b/web/react/components/user_settings/premade_theme_chooser.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Utils = require('../../utils/utils.jsx'); diff --git a/web/react/components/user_settings/user_settings.jsx b/web/react/components/user_settings/user_settings.jsx index 0eab333c4..5ce9b6330 100644 --- a/web/react/components/user_settings/user_settings.jsx +++ b/web/react/components/user_settings/user_settings.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../../stores/user_store.jsx'); diff --git a/web/react/components/user_settings/user_settings_appearance.jsx b/web/react/components/user_settings/user_settings_appearance.jsx index be6cf1f42..6d64e83b6 100644 --- a/web/react/components/user_settings/user_settings_appearance.jsx +++ b/web/react/components/user_settings/user_settings_appearance.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../../stores/user_store.jsx'); diff --git a/web/react/components/user_settings/user_settings_developer.jsx b/web/react/components/user_settings/user_settings_developer.jsx index d9fb43902..c2d7a9710 100644 --- a/web/react/components/user_settings/user_settings_developer.jsx +++ b/web/react/components/user_settings/user_settings_developer.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var SettingItemMin = require('../setting_item_min.jsx'); diff --git a/web/react/components/user_settings/user_settings_general.jsx b/web/react/components/user_settings/user_settings_general.jsx index c1d4c4ab5..c23c61948 100644 --- a/web/react/components/user_settings/user_settings_general.jsx +++ b/web/react/components/user_settings/user_settings_general.jsx @@ -1,7 +1,8 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../../stores/user_store.jsx'); +var ErrorStore = require('../../stores/error_store.jsx'); var SettingItemMin = require('../setting_item_min.jsx'); var SettingItemMax = require('../setting_item_max.jsx'); var SettingPicture = require('../setting_picture.jsx'); @@ -27,6 +28,7 @@ export default class UserSettingsGeneralTab extends React.Component { this.updateLastName = this.updateLastName.bind(this); this.updateNickname = this.updateNickname.bind(this); this.updateEmail = this.updateEmail.bind(this); + this.updateConfirmEmail = this.updateConfirmEmail.bind(this); this.updatePicture = this.updatePicture.bind(this); this.updateSection = this.updateSection.bind(this); @@ -96,6 +98,7 @@ export default class UserSettingsGeneralTab extends React.Component { var user = UserStore.getCurrentUser(); var email = this.state.email.trim().toLowerCase(); + var confirmEmail = this.state.confirmEmail.trim().toLowerCase(); if (user.email === email) { return; @@ -106,8 +109,12 @@ export default class UserSettingsGeneralTab extends React.Component { return; } - user.email = email; + if (email !== confirmEmail) { + this.setState({emailError: 'The new emails you entered do not match'}); + return; + } + user.email = email; this.submitUser(user); } submitUser(user) { @@ -115,6 +122,13 @@ export default class UserSettingsGeneralTab extends React.Component { function updateSuccess() { this.updateSection(''); AsyncClient.getMe(); + const verificationEnabled = global.window.config.SendEmailNotifications === 'true' && global.window.config.RequireEmailVerification === 'true'; + + if (verificationEnabled) { + ErrorStore.storeLastError({message: 'Check your email at ' + user.email + ' to verify the address.'}); + ErrorStore.emitChange(); + this.setState({emailChangeInProgress: true}); + } }.bind(this), function updateFailure(err) { var state = this.setupInitialState(this.props); @@ -177,6 +191,9 @@ export default class UserSettingsGeneralTab extends React.Component { updateEmail(e) { this.setState({email: e.target.value}); } + updateConfirmEmail(e) { + this.setState({confirmEmail: e.target.value}); + } updatePicture(e) { if (e.target.files && e.target.files[0]) { this.setState({picture: e.target.files[0]}); @@ -188,7 +205,8 @@ export default class UserSettingsGeneralTab extends React.Component { } } updateSection(section) { - this.setState(assign({}, this.setupInitialState(this.props), {clientError: '', serverError: '', emailError: ''})); + const emailChangeInProgress = this.state.emailChangeInProgress; + this.setState(assign({}, this.setupInitialState(this.props), {emailChangeInProgress: emailChangeInProgress, clientError: '', serverError: '', emailError: ''})); this.submitActive = false; this.props.updateSection(section); } @@ -208,9 +226,9 @@ export default class UserSettingsGeneralTab extends React.Component { } setupInitialState(props) { var user = props.user; - var emailEnabled = global.window.config.SendEmailNotifications === 'true'; + return {username: user.username, firstName: user.first_name, lastName: user.last_name, nickname: user.nickname, - email: user.email, picture: null, loadingPicture: false, emailEnabled: emailEnabled}; + email: user.email, confirmEmail: '', picture: null, loadingPicture: false, emailChangeInProgress: false}; } render() { var user = this.props.user; @@ -434,10 +452,19 @@ export default class UserSettingsGeneralTab extends React.Component { } var emailSection; if (this.props.activeSection === 'email') { - let helpText = <div>Email is used for notifications, and requires verification if changed.</div>; + const emailEnabled = global.window.config.SendEmailNotifications === 'true'; + const emailVerificationEnabled = global.window.config.RequireEmailVerification === 'true'; + let helpText = 'Email is used for notifications, and requires verification if changed.'; - if (!this.state.emailEnabled) { + if (!emailEnabled) { helpText = <div className='setting-list__hint text-danger'>{'Email has been disabled by your system administrator. No notification emails will be sent until it is enabled.'}</div>; + } else if (!emailVerificationEnabled) { + helpText = 'Email is used for notifications.'; + } else if (this.state.emailChangeInProgress) { + const newEmail = UserStore.getCurrentUser().email; + if (newEmail) { + helpText = 'A verification email was sent to ' + newEmail + '.'; + } } inputs.push( @@ -453,6 +480,22 @@ export default class UserSettingsGeneralTab extends React.Component { /> </div> </div> + </div> + ); + + inputs.push( + <div key='confirmEmailSetting'> + <div className='form-group'> + <label className='col-sm-5 control-label'>{'Confirm Email'}</label> + <div className='col-sm-7'> + <input + className='form-control' + type='text' + onChange={this.updateConfirmEmail} + value={this.state.confirmEmail} + /> + </div> + </div> {helpText} </div> ); @@ -471,10 +514,22 @@ export default class UserSettingsGeneralTab extends React.Component { /> ); } else { + let describe = ''; + if (this.state.emailChangeInProgress) { + const newEmail = UserStore.getCurrentUser().email; + if (newEmail) { + describe = 'New Address: ' + newEmail + '\nCheck your email to verify the above address.'; + } else { + describe = 'Check your email to verify your new address'; + } + } else { + describe = UserStore.getCurrentUser().email; + } + emailSection = ( <SettingItemMin title='Email' - describe={UserStore.getCurrentUser().email} + describe={describe} updateSection={function updateEmailSection() { this.updateSection('email'); }.bind(this)} diff --git a/web/react/components/user_settings/user_settings_integrations.jsx b/web/react/components/user_settings/user_settings_integrations.jsx index cb45c5178..ea3f72f27 100644 --- a/web/react/components/user_settings/user_settings_integrations.jsx +++ b/web/react/components/user_settings/user_settings_integrations.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var SettingItemMin = require('../setting_item_min.jsx'); diff --git a/web/react/components/user_settings/user_settings_modal.jsx b/web/react/components/user_settings/user_settings_modal.jsx index 5113d2429..19b97fc85 100644 --- a/web/react/components/user_settings/user_settings_modal.jsx +++ b/web/react/components/user_settings/user_settings_modal.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var SettingsSidebar = require('../settings_sidebar.jsx'); diff --git a/web/react/components/user_settings/user_settings_notifications.jsx b/web/react/components/user_settings/user_settings_notifications.jsx index e83f18aab..4728a33ee 100644 --- a/web/react/components/user_settings/user_settings_notifications.jsx +++ b/web/react/components/user_settings/user_settings_notifications.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore = require('../../stores/user_store.jsx'); diff --git a/web/react/components/user_settings/user_settings_security.jsx b/web/react/components/user_settings/user_settings_security.jsx index b59c08af0..74190781c 100644 --- a/web/react/components/user_settings/user_settings_security.jsx +++ b/web/react/components/user_settings/user_settings_security.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var SettingItemMin = require('../setting_item_min.jsx'); @@ -251,17 +251,6 @@ export default class SecurityTab extends React.Component { <div className='divider-dark first'/> {passwordSection} <div className='divider-dark'/> - <ul - className='section-min' - > - <li className='col-sm-10 section-title'>{'Version ' + global.window.config.Version}</li> - <li className='col-sm-7 section-describe'> - <div className='text-nowrap'>{'Build Number: ' + global.window.config.BuildNumber}</div> - <div className='text-nowrap'>{'Build Date: ' + global.window.config.BuildDate}</div> - <div className='text-nowrap'>{'Build Hash: ' + global.window.config.BuildHash}</div> - </li> - </ul> - <div className='divider-dark'/> <br></br> <a data-toggle='modal' diff --git a/web/react/components/view_image.jsx b/web/react/components/view_image.jsx index fe34034dc..8ef68dd0a 100644 --- a/web/react/components/view_image.jsx +++ b/web/react/components/view_image.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Client = require('../utils/client.jsx'); diff --git a/web/react/components/view_image_popover_bar.jsx b/web/react/components/view_image_popover_bar.jsx index 132212afb..5b3ee540c 100644 --- a/web/react/components/view_image_popover_bar.jsx +++ b/web/react/components/view_image_popover_bar.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. export default class ViewImagePopoverBar extends React.Component { diff --git a/web/react/dispatcher/app_dispatcher.jsx b/web/react/dispatcher/app_dispatcher.jsx index 04e026f46..388e82a51 100644 --- a/web/react/dispatcher/app_dispatcher.jsx +++ b/web/react/dispatcher/app_dispatcher.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Dispatcher = require('flux').Dispatcher; diff --git a/web/react/pages/admin_console.jsx b/web/react/pages/admin_console.jsx index 689a6b3a2..7e7dcfae8 100644 --- a/web/react/pages/admin_console.jsx +++ b/web/react/pages/admin_console.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var ErrorBar = require('../components/error_bar.jsx'); diff --git a/web/react/pages/authorize.jsx b/web/react/pages/authorize.jsx index 8ea8b13eb..1338e6cc2 100644 --- a/web/react/pages/authorize.jsx +++ b/web/react/pages/authorize.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Authorize = require('../components/authorize.jsx'); diff --git a/web/react/pages/channel.jsx b/web/react/pages/channel.jsx index c333fd57d..4d6d3fd15 100644 --- a/web/react/pages/channel.jsx +++ b/web/react/pages/channel.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/pages/find_team.jsx b/web/react/pages/find_team.jsx index dd11857ac..d901e380b 100644 --- a/web/react/pages/find_team.jsx +++ b/web/react/pages/find_team.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var FindTeam = require('../components/find_team.jsx'); diff --git a/web/react/pages/home.jsx b/web/react/pages/home.jsx index 2299c306e..5f0fa9d96 100644 --- a/web/react/pages/home.jsx +++ b/web/react/pages/home.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var ChannelStore = require('../stores/channel_store.jsx'); diff --git a/web/react/pages/login.jsx b/web/react/pages/login.jsx index f78e0f37a..17835c47f 100644 --- a/web/react/pages/login.jsx +++ b/web/react/pages/login.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var Login = require('../components/login.jsx'); diff --git a/web/react/pages/password_reset.jsx b/web/react/pages/password_reset.jsx index b7bfdcd5e..6f9c5eab1 100644 --- a/web/react/pages/password_reset.jsx +++ b/web/react/pages/password_reset.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var PasswordReset = require('../components/password_reset.jsx'); diff --git a/web/react/pages/signup_team.jsx b/web/react/pages/signup_team.jsx index d0e08f446..06b5cfad9 100644 --- a/web/react/pages/signup_team.jsx +++ b/web/react/pages/signup_team.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var SignupTeam = require('../components/signup_team.jsx'); diff --git a/web/react/pages/signup_team_complete.jsx b/web/react/pages/signup_team_complete.jsx index ec77e6602..572117867 100644 --- a/web/react/pages/signup_team_complete.jsx +++ b/web/react/pages/signup_team_complete.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var SignupTeamComplete = require('../components/signup_team_complete.jsx'); diff --git a/web/react/pages/signup_user_complete.jsx b/web/react/pages/signup_user_complete.jsx index cc7607187..63a55b4a1 100644 --- a/web/react/pages/signup_user_complete.jsx +++ b/web/react/pages/signup_user_complete.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var SignupUserComplete = require('../components/signup_user_complete.jsx'); diff --git a/web/react/pages/verify.jsx b/web/react/pages/verify.jsx index 16a9846e5..7f06ff6fb 100644 --- a/web/react/pages/verify.jsx +++ b/web/react/pages/verify.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var EmailVerify = require('../components/email_verify.jsx'); diff --git a/web/react/stores/admin_store.jsx b/web/react/stores/admin_store.jsx index 7b2aeb631..cf16d031c 100644 --- a/web/react/stores/admin_store.jsx +++ b/web/react/stores/admin_store.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/stores/browser_store.jsx b/web/react/stores/browser_store.jsx index 27a74fb2b..c2e7df58e 100644 --- a/web/react/stores/browser_store.jsx +++ b/web/react/stores/browser_store.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var UserStore; diff --git a/web/react/stores/channel_store.jsx b/web/react/stores/channel_store.jsx index b9ba37c27..d1f548d50 100644 --- a/web/react/stores/channel_store.jsx +++ b/web/react/stores/channel_store.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/stores/error_store.jsx b/web/react/stores/error_store.jsx index ece7d8522..a4c42dcb7 100644 --- a/web/react/stores/error_store.jsx +++ b/web/react/stores/error_store.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/stores/post_store.jsx b/web/react/stores/post_store.jsx index 29ce47300..d8da48000 100644 --- a/web/react/stores/post_store.jsx +++ b/web/react/stores/post_store.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/stores/socket_store.jsx b/web/react/stores/socket_store.jsx index 9f354965e..77e7067ad 100644 --- a/web/react/stores/socket_store.jsx +++ b/web/react/stores/socket_store.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/stores/team_store.jsx b/web/react/stores/team_store.jsx index fd9117747..7001acdb1 100644 --- a/web/react/stores/team_store.jsx +++ b/web/react/stores/team_store.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/stores/user_store.jsx b/web/react/stores/user_store.jsx index 8842263fa..fa74f812d 100644 --- a/web/react/stores/user_store.jsx +++ b/web/react/stores/user_store.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/react/utils/async_client.jsx b/web/react/utils/async_client.jsx index 7db3ef30d..a903f055b 100644 --- a/web/react/utils/async_client.jsx +++ b/web/react/utils/async_client.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var client = require('./client.jsx'); diff --git a/web/react/utils/constants.jsx b/web/react/utils/constants.jsx index 8fd0ab79b..affc49196 100644 --- a/web/react/utils/constants.jsx +++ b/web/react/utils/constants.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var keyMirror = require('keymirror'); diff --git a/web/react/utils/emoticons.jsx b/web/react/utils/emoticons.jsx index a7c837199..94bb91503 100644 --- a/web/react/utils/emoticons.jsx +++ b/web/react/utils/emoticons.jsx @@ -1,27 +1,27 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const emoticonPatterns = { - smile: /:-?\)/g, // :) - open_mouth: /:o/gi, // :o - scream: /:-o/gi, // :-o - smirk: /:-?]/g, // :] - grinning: /:-?d/gi, // :D - stuck_out_tongue_closed_eyes: /x-d/gi, // x-d - stuck_out_tongue_winking_eye: /:-?p/gi, // :p - rage: /:-?[\[@]/g, // :@ - frowning: /:-?\(/g, // :( - sob: /:['’]-?\(|:'\(/g, // :`( - kissing_heart: /:-?\*/g, // :* - pensive: /:-?\//g, // :/ - confounded: /:-?s/gi, // :s - flushed: /:-?\|/g, // :| - relaxed: /:-?\$/g, // :$ - mask: /:-x/gi, // :-x - heart: /<3|<3/g, // <3 - broken_heart: /<\/3|</3/g, // </3 - thumbsup: /:\+1:/g, // :+1: - thumbsdown: /:\-1:/g // :-1: + smile: /(^|\s)(:-?\))($|\s)/g, // :) + open_mouth: /(^|\s)(:o)($|\s)/gi, // :o + scream: /(^|\s)(:-o)($|\s)/gi, // :-o + smirk: /(^|\s)(:-?])($|\s)/g, // :] + grinning: /(^|\s)(:-?d)($|\s)/gi, // :D + stuck_out_tongue_closed_eyes: /(^|\s)(x-d)($|\s)/gi, // x-d + stuck_out_tongue: /(^|\s)(:-?p)($|\s)/gi, // :p + rage: /(^|\s)(:-?[\[@])($|\s)/g, // :@ + frowning: /(^|\s)(:-?\()($|\s)/g, // :( + sob: /(^|\s)(:['’]-?\(|:'\(|:'\()($|\s)/g, // :`( + kissing_heart: /(^|\s)(:-?\*)($|\s)/g, // :* + pensive: /(^|\s)(:-?\/)($|\s)/g, // :/ + confounded: /(^|\s)(:-?s)($|\s)/gi, // :s + flushed: /(^|\s)(:-?\|)($|\s)/g, // :| + relaxed: /(^|\s)(:-?\$)($|\s)/g, // :$ + mask: /(^|\s)(:-x)($|\s)/gi, // :-x + heart: /(^|\s)(<3|<3)($|\s)/g, // <3 + broken_heart: /(^|\s)(<\/3|</3)($|\s)/g, // </3 + thumbsup: /(^|\s)(:\+1:)($|\s)/g, // :+1: + thumbsdown: /(^|\s)(:\-1:)($|\s)/g // :-1: }; function initializeEmoticonMap() { @@ -126,7 +126,7 @@ const emoticonMap = initializeEmoticonMap(); export function handleEmoticons(text, tokens) { let output = text; - function replaceEmoticonWithToken(match, name) { + function replaceEmoticonWithToken(match, prefix, name, suffix) { if (emoticonMap[name]) { const index = tokens.size; const alias = `MM_EMOTICON${index}`; @@ -136,18 +136,18 @@ export function handleEmoticons(text, tokens) { originalText: match }); - return alias; + return prefix + alias + suffix; } return match; } - output = output.replace(/:([a-zA-Z0-9_-]+):/g, replaceEmoticonWithToken); + output = output.replace(/(^|\s):([a-zA-Z0-9_-]+):($|\s)/g, replaceEmoticonWithToken); $.each(emoticonPatterns, (name, pattern) => { // this might look a bit funny, but since the name isn't contained in the actual match // like with the named emoticons, we need to add it in manually - output = output.replace(pattern, (match) => replaceEmoticonWithToken(match, name)); + output = output.replace(pattern, (match, prefix, emoticon, suffix) => replaceEmoticonWithToken(match, prefix, name, suffix)); }); return output; diff --git a/web/react/utils/markdown.jsx b/web/react/utils/markdown.jsx index 7e88f8644..12d6dd424 100644 --- a/web/react/utils/markdown.jsx +++ b/web/react/utils/markdown.jsx @@ -1,7 +1,8 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const TextFormatting = require('./text_formatting.jsx'); +const Utils = require('./utils.jsx'); const marked = require('marked'); @@ -39,7 +40,14 @@ export class MattermostMarkdownRenderer extends marked.Renderer { if (title) { output += ' title="' + title + '"'; } - output += ' target="_blank">' + text + '</a>'; + + if (outHref.lastIndexOf(Utils.getTeamURLFromAddressBar(), 0) === 0) { + output += '>'; + } else { + output += ' target="_blank">'; + } + + output += text + '</a>'; return output; } diff --git a/web/react/utils/text_formatting.jsx b/web/react/utils/text_formatting.jsx index 34e42cbae..2b6e6e14e 100644 --- a/web/react/utils/text_formatting.jsx +++ b/web/react/utils/text_formatting.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const Autolinker = require('autolinker'); @@ -96,8 +96,13 @@ function autolinkUrls(text, tokens) { const index = tokens.size; const alias = `MM_LINK${index}`; + var target = 'target="_blank"'; + if (url.lastIndexOf(Utils.getTeamURLFromAddressBar(), 0) === 0) { + target = ''; + } + tokens.set(alias, { - value: `<a class='theme' target='_blank' href='${url}'>${linkText}</a>`, + value: `<a class="theme" ${target} href="${url}">${linkText}</a>`, originalText: linkText }); diff --git a/web/react/utils/utils.jsx b/web/react/utils/utils.jsx index f79f3492f..f9166063e 100644 --- a/web/react/utils/utils.jsx +++ b/web/react/utils/utils.jsx @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); diff --git a/web/sass-files/sass/partials/_settings.scss b/web/sass-files/sass/partials/_settings.scss index 9369cc097..8debb0b4e 100644 --- a/web/sass-files/sass/partials/_settings.scss +++ b/web/sass-files/sass/partials/_settings.scss @@ -132,6 +132,7 @@ .section-describe { @include opacity(0.7); + white-space:pre; } .divider-dark { diff --git a/web/static/images/Battlehouse-logodark.png b/web/static/images/Battlehouse-logodark.png Binary files differdeleted file mode 100644 index 1fc5b68ca..000000000 --- a/web/static/images/Battlehouse-logodark.png +++ /dev/null diff --git a/web/static/images/Mattermost-logodark.png b/web/static/images/Mattermost-logodark.png Binary files differdeleted file mode 100644 index c16978ba8..000000000 --- a/web/static/images/Mattermost-logodark.png +++ /dev/null diff --git a/web/static/images/Bladekick-logodark.png b/web/static/images/logo-email.png Binary files differindex c16978ba8..c16978ba8 100644 --- a/web/static/images/Bladekick-logodark.png +++ b/web/static/images/logo-email.png diff --git a/web/templates/footer.html b/web/templates/footer.html index 4b15295b4..296e902cf 100644 --- a/web/templates/footer.html +++ b/web/templates/footer.html @@ -4,7 +4,7 @@ <span class="pull-right footer-site-name">{{ .ClientProps.SiteName }}</span> </div> <div class="col-xs-12"> - <span class="pull-right footer-link copyright">© 2015 SpinPunch</span> + <span class="pull-right footer-link copyright">© 2015 Mattermost, Inc.</span> <a id="help_link" class="pull-right footer-link" href="#">Help</a> <a id="terms_link" class="pull-right footer-link" href="#">Terms</a> <a id="privacy_link" class="pull-right footer-link" href="#">Privacy</a> diff --git a/web/web.go b/web/web.go index b87636187..7ab50a073 100644 --- a/web/web.go +++ b/web/web.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package web @@ -372,11 +372,22 @@ func getChannel(c *api.Context, w http.ResponseWriter, r *http.Request) { return } - //api.Handle404(w, r) - //Bad channel urls just redirect to the town-square for now + // We will attempt to auto-join open channels + if cr := <-api.Srv.Store.Channel().GetByName(c.Session.TeamId, name); cr.Err != nil { + http.Redirect(w, r, c.GetTeamURL()+"/channels/town-square", http.StatusFound) + } else { + channel := cr.Data.(*model.Channel) + if channel.Type == model.CHANNEL_OPEN { + api.JoinChannel(c, channel.Id, "") + if c.Err != nil { + return + } - http.Redirect(w, r, c.GetTeamURL()+"/channels/town-square", http.StatusFound) - return + channelId = channel.Id + } else { + http.Redirect(w, r, c.GetTeamURL()+"/channels/town-square", http.StatusFound) + } + } } } @@ -414,7 +425,12 @@ func verifyEmail(c *api.Context, w http.ResponseWriter, r *http.Request) { return } else { user := result.Data.(*model.User) - api.FireAndForgetVerifyEmail(user.Id, user.Email, team.Name, team.DisplayName, c.GetSiteURL(), c.GetTeamURLFromTeam(team)) + + if user.LastActivityAt > 0 { + api.FireAndForgetEmailChangeVerifyEmail(user.Id, user.Email, team.Name, team.DisplayName, c.GetSiteURL(), c.GetTeamURLFromTeam(team)) + } else { + api.FireAndForgetVerifyEmail(user.Id, user.Email, team.Name, team.DisplayName, c.GetSiteURL(), c.GetTeamURLFromTeam(team)) + } newAddress := strings.Replace(r.URL.String(), "&resend=true", "&resend_success=true", -1) http.Redirect(w, r, newAddress, http.StatusFound) diff --git a/web/web_test.go b/web/web_test.go index 165c2ba09..ae29356c1 100644 --- a/web/web_test.go +++ b/web/web_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. package web |