MM-11272 Add OpenGraph and image dimension metadata to posts (#9313)
* Move OpenGraph code into its own file * Move OpenGraph image proxying to app layer * Move test file code out of api4 package * MM-11272 Add OpenGraph and image dimension metadata to posts
Этот коммит содержится в:
@@ -4,7 +4,6 @@
|
||||
package api4
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
@@ -746,22 +745,6 @@ func CheckInternalErrorStatus(t *testing.T, resp *model.Response) {
|
||||
}
|
||||
}
|
||||
|
||||
func readTestFile(name string) ([]byte, error) {
|
||||
path, _ := utils.FindDir("tests")
|
||||
file, err := os.Open(filepath.Join(path, name))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
data := &bytes.Buffer{}
|
||||
if _, err := io.Copy(data, file); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return data.Bytes(), nil
|
||||
}
|
||||
}
|
||||
|
||||
// Similar to s3.New() but allows initialization of signature v2 or signature v4 client.
|
||||
// If signV2 input is false, function always returns signature v4.
|
||||
//
|
||||
|
||||
@@ -6,6 +6,8 @@ package api4
|
||||
import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
"github.com/mattermost/mattermost-server/utils/testutils"
|
||||
)
|
||||
|
||||
func TestGetBrandImage(t *testing.T) {
|
||||
@@ -29,7 +31,7 @@ func TestUploadBrandImage(t *testing.T) {
|
||||
defer th.TearDown()
|
||||
Client := th.Client
|
||||
|
||||
data, err := readTestFile("test.png")
|
||||
data, err := testutils.ReadTestFile("test.png")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
|
||||
"github.com/mattermost/mattermost-server/model"
|
||||
"github.com/mattermost/mattermost-server/store"
|
||||
"github.com/mattermost/mattermost-server/utils/testutils"
|
||||
)
|
||||
|
||||
func TestUploadFileAsMultipart(t *testing.T) {
|
||||
@@ -25,7 +26,7 @@ func TestUploadFileAsMultipart(t *testing.T) {
|
||||
var uploadInfo *model.FileInfo
|
||||
var data []byte
|
||||
var err error
|
||||
if data, err = readTestFile("test.png"); err != nil {
|
||||
if data, err = testutils.ReadTestFile("test.png"); err != nil {
|
||||
t.Fatal(err)
|
||||
} else if fileResp, resp := Client.UploadFile(data, channel.Id, "test.png"); resp.Error != nil {
|
||||
t.Fatal(resp.Error)
|
||||
@@ -138,7 +139,7 @@ func TestUploadFileAsRequestBody(t *testing.T) {
|
||||
var uploadInfo *model.FileInfo
|
||||
var data []byte
|
||||
var err error
|
||||
if data, err = readTestFile("test.png"); err != nil {
|
||||
if data, err = testutils.ReadTestFile("test.png"); err != nil {
|
||||
t.Fatal(err)
|
||||
} else if fileResp, resp := Client.UploadFileAsRequestBody(data, channel.Id, "test.png"); resp.Error != nil {
|
||||
t.Fatal(resp.Error)
|
||||
@@ -263,7 +264,7 @@ func TestGetFile(t *testing.T) {
|
||||
fileId := ""
|
||||
var sent []byte
|
||||
var err error
|
||||
if sent, err = readTestFile("test.png"); err != nil {
|
||||
if sent, err = testutils.ReadTestFile("test.png"); err != nil {
|
||||
t.Fatal(err)
|
||||
} else {
|
||||
fileResp, resp := Client.UploadFile(sent, channel.Id, "test.png")
|
||||
@@ -378,7 +379,7 @@ func TestGetFileThumbnail(t *testing.T) {
|
||||
fileId := ""
|
||||
var sent []byte
|
||||
var err error
|
||||
if sent, err = readTestFile("test.png"); err != nil {
|
||||
if sent, err = testutils.ReadTestFile("test.png"); err != nil {
|
||||
t.Fatal(err)
|
||||
} else {
|
||||
fileResp, resp := Client.UploadFile(sent, channel.Id, "test.png")
|
||||
@@ -437,7 +438,7 @@ func TestGetFileLink(t *testing.T) {
|
||||
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.PublicLinkSalt = model.NewId() })
|
||||
|
||||
fileId := ""
|
||||
if data, err := readTestFile("test.png"); err != nil {
|
||||
if data, err := testutils.ReadTestFile("test.png"); err != nil {
|
||||
t.Fatal(err)
|
||||
} else {
|
||||
fileResp, resp := Client.UploadFile(data, channel.Id, "test.png")
|
||||
@@ -506,7 +507,7 @@ func TestGetFilePreview(t *testing.T) {
|
||||
fileId := ""
|
||||
var sent []byte
|
||||
var err error
|
||||
if sent, err = readTestFile("test.png"); err != nil {
|
||||
if sent, err = testutils.ReadTestFile("test.png"); err != nil {
|
||||
t.Fatal(err)
|
||||
} else {
|
||||
fileResp, resp := Client.UploadFile(sent, channel.Id, "test.png")
|
||||
@@ -559,7 +560,7 @@ func TestGetFileInfo(t *testing.T) {
|
||||
fileId := ""
|
||||
var sent []byte
|
||||
var err error
|
||||
if sent, err = readTestFile("test.png"); err != nil {
|
||||
if sent, err = testutils.ReadTestFile("test.png"); err != nil {
|
||||
t.Fatal(err)
|
||||
} else {
|
||||
fileResp, resp := Client.UploadFile(sent, channel.Id, "test.png")
|
||||
@@ -632,7 +633,7 @@ func TestGetPublicFile(t *testing.T) {
|
||||
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.FileSettings.PublicLinkSalt = GenerateTestId() })
|
||||
|
||||
fileId := ""
|
||||
if data, err := readTestFile("test.png"); err != nil {
|
||||
if data, err := testutils.ReadTestFile("test.png"); err != nil {
|
||||
t.Fatal(err)
|
||||
} else {
|
||||
fileResp, resp := Client.UploadFile(data, channel.Id, "test.png")
|
||||
|
||||
@@ -6,7 +6,6 @@ package api4
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/dyatlov/go-opengraph/opengraph"
|
||||
"github.com/mattermost/mattermost-server/model"
|
||||
"github.com/mattermost/mattermost-server/utils"
|
||||
)
|
||||
@@ -27,22 +26,6 @@ func (api *API) InitOpenGraph() {
|
||||
})
|
||||
}
|
||||
|
||||
func OpenGraphDataWithProxyAddedToImageURLs(ogdata *opengraph.OpenGraph, toProxyURL func(string) string) *opengraph.OpenGraph {
|
||||
for _, image := range ogdata.Images {
|
||||
var url string
|
||||
if image.SecureURL != "" {
|
||||
url = image.SecureURL
|
||||
} else {
|
||||
url = image.URL
|
||||
}
|
||||
|
||||
image.URL = ""
|
||||
image.SecureURL = toProxyURL(url)
|
||||
}
|
||||
|
||||
return ogdata
|
||||
}
|
||||
|
||||
func getOpenGraphMetadata(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
if !*c.App.Config().ServiceSettings.EnableLinkPreviews {
|
||||
c.Err = model.NewAppError("getOpenGraphMetadata", "api.post.link_preview_disabled.app_error", nil, "", http.StatusNotImplemented)
|
||||
@@ -65,12 +48,6 @@ func getOpenGraphMetadata(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
og := c.App.GetOpenGraphMetadata(url)
|
||||
|
||||
// If image proxy enabled modify open graph data to feed though proxy
|
||||
if toProxyURL := c.App.ImageProxyAdder(); toProxyURL != nil {
|
||||
og = OpenGraphDataWithProxyAddedToImageURLs(og, toProxyURL)
|
||||
}
|
||||
|
||||
ogJSON, err := og.ToJSON()
|
||||
openGraphDataCache.AddWithExpiresInSecs(props["url"], ogJSON, 3600) // Cache would expire after 1 hour
|
||||
if err != nil {
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/mattermost/mattermost-server/model"
|
||||
"github.com/mattermost/mattermost-server/services/mailservice"
|
||||
"github.com/mattermost/mattermost-server/utils"
|
||||
"github.com/mattermost/mattermost-server/utils/testutils"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -1813,7 +1814,7 @@ func TestImportTeam(t *testing.T) {
|
||||
t.Run("ImportTeam", func(t *testing.T) {
|
||||
var data []byte
|
||||
var err error
|
||||
data, err = readTestFile("Fake_Team_Import.zip")
|
||||
data, err = testutils.ReadTestFile("Fake_Team_Import.zip")
|
||||
if err != nil && len(data) == 0 {
|
||||
t.Fatal("Error while reading the test file.")
|
||||
}
|
||||
@@ -1874,7 +1875,7 @@ func TestImportTeam(t *testing.T) {
|
||||
t.Run("WrongPermission", func(t *testing.T) {
|
||||
var data []byte
|
||||
var err error
|
||||
data, err = readTestFile("Fake_Team_Import.zip")
|
||||
data, err = testutils.ReadTestFile("Fake_Team_Import.zip")
|
||||
if err != nil && len(data) == 0 {
|
||||
t.Fatal("Error while reading the test file.")
|
||||
}
|
||||
@@ -2029,7 +2030,7 @@ func TestSetTeamIcon(t *testing.T) {
|
||||
Client := th.Client
|
||||
team := th.BasicTeam
|
||||
|
||||
data, err := readTestFile("test.png")
|
||||
data, err := testutils.ReadTestFile("test.png")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -2109,7 +2110,7 @@ func TestRemoveTeamIcon(t *testing.T) {
|
||||
team := th.BasicTeam
|
||||
|
||||
th.LoginTeamAdmin()
|
||||
data, _ := readTestFile("test.png")
|
||||
data, _ := testutils.ReadTestFile("test.png")
|
||||
Client.SetTeamIcon(team.Id, data)
|
||||
|
||||
_, resp := Client.RemoveTeamIcon(team.Id)
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/mattermost/mattermost-server/app"
|
||||
"github.com/mattermost/mattermost-server/model"
|
||||
"github.com/mattermost/mattermost-server/store"
|
||||
"github.com/mattermost/mattermost-server/utils/testutils"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -2265,7 +2266,7 @@ func TestSetProfileImage(t *testing.T) {
|
||||
Client := th.Client
|
||||
user := th.BasicUser
|
||||
|
||||
data, err := readTestFile("test.png")
|
||||
data, err := testutils.ReadTestFile("test.png")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user