diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/diagnostics.go | 1 | ||||
-rw-r--r-- | app/post.go | 16 | ||||
-rw-r--r-- | app/post_test.go | 28 | ||||
-rw-r--r-- | app/team.go | 20 |
4 files changed, 63 insertions, 2 deletions
diff --git a/app/diagnostics.go b/app/diagnostics.go index cda0814ca..6237f5f83 100644 --- a/app/diagnostics.go +++ b/app/diagnostics.go @@ -272,6 +272,7 @@ func (a *App) trackConfig() { "isdefault_user_status_away_timeout": isDefault(*cfg.TeamSettings.UserStatusAwayTimeout, model.TEAM_SETTINGS_DEFAULT_USER_STATUS_AWAY_TIMEOUT), "restrict_private_channel_manage_members": *cfg.TeamSettings.RestrictPrivateChannelManageMembers, "enable_X_to_leave_channels_from_LHS": *cfg.TeamSettings.EnableXToLeaveChannelsFromLHS, + "experimental_enable_automatic_replies": *cfg.TeamSettings.ExperimentalEnableAutomaticReplies, "experimental_town_square_is_read_only": *cfg.TeamSettings.ExperimentalTownSquareIsReadOnly, "experimental_primary_team": isDefault(*cfg.TeamSettings.ExperimentalPrimaryTeam, ""), }) diff --git a/app/post.go b/app/post.go index 41139da63..bc31aee44 100644 --- a/app/post.go +++ b/app/post.go @@ -9,6 +9,7 @@ import ( "encoding/hex" "encoding/json" "fmt" + "io" "net/http" "net/url" "regexp" @@ -19,6 +20,7 @@ import ( "github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/store" "github.com/mattermost/mattermost-server/utils" + "golang.org/x/net/html/charset" ) var linkWithTextRegex = regexp.MustCompile(`<([^<\|]+)\|([^>]+)>`) @@ -726,7 +728,10 @@ func (a *App) GetOpenGraphMetadata(requestURL string) *opengraph.OpenGraph { } defer consumeAndClose(res) - if err := og.ProcessHTML(res.Body); err != nil { + contentType := res.Header.Get("Content-Type") + body := forceHTMLEncodingToUTF8(res.Body, contentType) + + if err := og.ProcessHTML(body); err != nil { mlog.Error(fmt.Sprintf("GetOpenGraphMetadata processing failed for url=%v with err=%v", requestURL, err.Error())) } @@ -735,6 +740,15 @@ func (a *App) GetOpenGraphMetadata(requestURL string) *opengraph.OpenGraph { return og } +func forceHTMLEncodingToUTF8(body io.Reader, contentType string) io.Reader { + r, err := charset.NewReader(body, contentType) + if err != nil { + mlog.Error(fmt.Sprintf("forceHTMLEncodingToUTF8 failed to convert for contentType=%v with err=%v", contentType, err.Error())) + return body + } + return r +} + func makeOpenGraphURLsAbsolute(og *opengraph.OpenGraph, requestURL string) { parsedRequestURL, err := url.Parse(requestURL) if err != nil { diff --git a/app/post_test.go b/app/post_test.go index 10b957751..aefc0ea35 100644 --- a/app/post_test.go +++ b/app/post_test.go @@ -297,6 +297,34 @@ func TestImageProxy(t *testing.T) { } } +func BenchmarkForceHTMLEncodingToUTF8(b *testing.B) { + HTML := ` + <html> + <head> + <meta property="og:url" content="https://example.com/apps/mattermost"> + <meta property="og:image" content="https://images.example.com/image.png"> + </head> + </html> + ` + ContentType := "text/html; utf-8" + + b.Run("with converting", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r := forceHTMLEncodingToUTF8(strings.NewReader(HTML), ContentType) + + og := opengraph.NewOpenGraph() + og.ProcessHTML(r) + } + }) + + b.Run("without converting", func(b *testing.B) { + for i := 0; i < b.N; i++ { + og := opengraph.NewOpenGraph() + og.ProcessHTML(strings.NewReader(HTML)) + } + }) +} + func TestMakeOpenGraphURLsAbsolute(t *testing.T) { for name, tc := range map[string]struct { HTML string diff --git a/app/team.go b/app/team.go index ea2c1bda6..4fc410934 100644 --- a/app/team.go +++ b/app/team.go @@ -103,6 +103,7 @@ func (a *App) UpdateTeam(team *model.Team) (*model.Team, *model.AppError) { oldTeam.AllowOpenInvite = team.AllowOpenInvite oldTeam.CompanyName = team.CompanyName oldTeam.AllowedDomains = team.AllowedDomains + oldTeam.LastTeamIconUpdate = team.LastTeamIconUpdate if result := <-a.Srv.Store.Team().Update(oldTeam); result.Err != nil { return nil, result.Err @@ -1045,7 +1046,7 @@ func (a *App) SetTeamIconFromFile(teamId string, file multipart.File) *model.App curTime := model.GetMillis() if result := <-a.Srv.Store.Team().UpdateLastTeamIconUpdate(teamId, curTime); result.Err != nil { - return model.NewAppError("SetTeamIcon", "api.team.set_team_icon.update.app_error", nil, result.Err.Error(), http.StatusBadRequest) + return model.NewAppError("SetTeamIcon", "api.team.team_icon.update.app_error", nil, result.Err.Error(), http.StatusBadRequest) } // manually set time to avoid possible cluster inconsistencies @@ -1055,3 +1056,20 @@ func (a *App) SetTeamIconFromFile(teamId string, file multipart.File) *model.App return nil } + +func (a *App) RemoveTeamIcon(teamId string) *model.AppError { + team, err := a.GetTeam(teamId) + if err != nil { + return model.NewAppError("RemoveTeamIcon", "api.team.remove_team_icon.get_team.app_error", nil, err.Error(), http.StatusBadRequest) + } + + if result := <-a.Srv.Store.Team().UpdateLastTeamIconUpdate(teamId, 0); result.Err != nil { + return model.NewAppError("RemoveTeamIcon", "api.team.team_icon.update.app_error", nil, result.Err.Error(), http.StatusBadRequest) + } + + team.LastTeamIconUpdate = 0 + + a.sendTeamEvent(team, model.WEBSOCKET_EVENT_UPDATE_TEAM) + + return nil +} |