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
Этот коммит содержится в:
Harrison Healey
2018-09-04 08:33:29 -04:00
родитель 48f16b6401
Коммит 2959b53d98
16 изменённых файлов: 819 добавлений и 285 удалений

Просмотреть файл

@@ -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)
}