summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/diagnostics.go1
-rw-r--r--app/post.go16
-rw-r--r--app/post_test.go28
-rw-r--r--app/team.go20
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
+}