MM-53764 - Fix: Improve limits on Opengraph Data Cache (#24177)
* enforce strict opengraph cache entry size limit * move json marshalling and error checking into parsOpenGraphMetadata fn * fix linting * fix potential nil deref * Revert "fix potential nil deref" This reverts commit 095bcd496e9b8d97ca63d3a99e2e46eec58ef7ae. * Revert "fix linting" This reverts commit f3e1f7b27634ca0567fd0fef01ac23f5e39009a7. * Revert "move json marshalling and error checking into parsOpenGraphMetadata fn" This reverts commit ba9a1e13b0fb9d4579077b7b37666e950a5fb6ed. * Revert "enforce strict opengraph cache entry size limit" This reverts commit d1de4a8fa40e58ac85c85f66de27ec5aca884b18. * remove /opengraph api endpoint * i18n * removing unneeded action and reducer
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
ad142c958e
Коммит
7b0b0d8609
@@ -81,8 +81,6 @@ type Routes struct {
|
||||
OAuthApps *mux.Router // 'api/v4/oauth/apps'
|
||||
OAuthApp *mux.Router // 'api/v4/oauth/apps/{app_id:[A-Za-z0-9]+}'
|
||||
|
||||
OpenGraph *mux.Router // 'api/v4/opengraph'
|
||||
|
||||
SAML *mux.Router // 'api/v4/saml'
|
||||
Compliance *mux.Router // 'api/v4/compliance'
|
||||
Cluster *mux.Router // 'api/v4/cluster'
|
||||
@@ -240,8 +238,6 @@ func Init(srv *app.Server) (*API, error) {
|
||||
|
||||
api.BaseRoutes.ReactionByNameForPostForUser = api.BaseRoutes.PostForUser.PathPrefix("/reactions/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}").Subrouter()
|
||||
|
||||
api.BaseRoutes.OpenGraph = api.BaseRoutes.APIRoot.PathPrefix("/opengraph").Subrouter()
|
||||
|
||||
api.BaseRoutes.Roles = api.BaseRoutes.APIRoot.PathPrefix("/roles").Subrouter()
|
||||
api.BaseRoutes.Schemes = api.BaseRoutes.APIRoot.PathPrefix("/schemes").Subrouter()
|
||||
|
||||
@@ -294,7 +290,6 @@ func Init(srv *app.Server) (*API, error) {
|
||||
api.InitEmoji()
|
||||
api.InitOAuth()
|
||||
api.InitReaction()
|
||||
api.InitOpenGraph()
|
||||
api.InitPlugin()
|
||||
api.InitRole()
|
||||
api.InitScheme()
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
package api4
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/mattermost/mattermost/server/public/model"
|
||||
"github.com/mattermost/mattermost/server/public/shared/mlog"
|
||||
)
|
||||
|
||||
func (api *API) InitOpenGraph() {
|
||||
api.BaseRoutes.OpenGraph.Handle("", api.APISessionRequired(getOpenGraphMetadata)).Methods("POST")
|
||||
}
|
||||
|
||||
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)
|
||||
return
|
||||
}
|
||||
|
||||
props := model.StringInterfaceFromJSON(r.Body)
|
||||
|
||||
url := ""
|
||||
ok := false
|
||||
if url, ok = props["url"].(string); url == "" || !ok {
|
||||
c.SetInvalidParam("url")
|
||||
return
|
||||
}
|
||||
|
||||
buf, err := c.App.GetOpenGraphMetadata(url)
|
||||
if err != nil {
|
||||
mlog.Warn("GetOpenGraphMetadata request failed",
|
||||
mlog.String("requestURL", url),
|
||||
mlog.Err(err))
|
||||
w.Write([]byte(`{"url": ""}`))
|
||||
return
|
||||
}
|
||||
w.Write(buf)
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
package api4
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/mattermost/mattermost/server/public/model"
|
||||
)
|
||||
|
||||
func TestGetOpenGraphMetadata(t *testing.T) {
|
||||
th := Setup(t).InitBasic()
|
||||
defer th.TearDown()
|
||||
|
||||
client := th.Client
|
||||
|
||||
enableLinkPreviews := *th.App.Config().ServiceSettings.EnableLinkPreviews
|
||||
allowedInternalConnections := *th.App.Config().ServiceSettings.AllowedUntrustedInternalConnections
|
||||
defer func() {
|
||||
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableLinkPreviews = enableLinkPreviews })
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
cfg.ServiceSettings.AllowedUntrustedInternalConnections = &allowedInternalConnections
|
||||
})
|
||||
}()
|
||||
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableLinkPreviews = true })
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.ServiceSettings.AllowedUntrustedInternalConnections = "localhost,127.0.0.1"
|
||||
})
|
||||
|
||||
ogDataCacheMissCount := 0
|
||||
|
||||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
ogDataCacheMissCount++
|
||||
|
||||
if r.URL.Path == "/og-data/" {
|
||||
fmt.Fprintln(w, `
|
||||
<html><head><meta property="og:type" content="article" />
|
||||
<meta property="og:title" content="Test Title" />
|
||||
<meta property="og:url" content="http://example.com/" />
|
||||
</head><body></body></html>
|
||||
`)
|
||||
} else if r.URL.Path == "/no-og-data/" {
|
||||
fmt.Fprintln(w, `<html><head></head><body></body></html>`)
|
||||
}
|
||||
}))
|
||||
|
||||
for _, data := range [](map[string]any){
|
||||
{"path": "/og-data/", "title": "Test Title", "cacheMissCount": 1},
|
||||
{"path": "/no-og-data/", "title": "", "cacheMissCount": 2},
|
||||
|
||||
// Data should be cached for following
|
||||
{"path": "/og-data/", "title": "Test Title", "cacheMissCount": 2},
|
||||
{"path": "/no-og-data/", "title": "", "cacheMissCount": 2},
|
||||
} {
|
||||
|
||||
openGraph, _, err := client.OpenGraph(context.Background(), ts.URL+data["path"].(string))
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equalf(t, openGraph["title"], data["title"].(string),
|
||||
"OG data title mismatch for path \"%s\".")
|
||||
|
||||
require.Equal(t, ogDataCacheMissCount, data["cacheMissCount"].(int),
|
||||
"Cache miss count didn't match.")
|
||||
}
|
||||
|
||||
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableLinkPreviews = false })
|
||||
_, resp, err := client.OpenGraph(context.Background(), ts.URL+"/og-data/")
|
||||
require.Error(t, err)
|
||||
CheckNotImplementedStatus(t, resp)
|
||||
}
|
||||
@@ -2391,10 +2391,6 @@
|
||||
"other": "{{.Count}} images sent: {{.Filenames}}"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "api.post.link_preview_disabled.app_error",
|
||||
"translation": "Link previews have been disabled by the system administrator."
|
||||
},
|
||||
{
|
||||
"id": "api.post.patch_post.can_not_update_post_in_deleted.error",
|
||||
"translation": "Can not update a post in a deleted channel."
|
||||
|
||||
@@ -467,10 +467,6 @@ func (c *Client4) oAuthAppRoute(appId string) string {
|
||||
return fmt.Sprintf("/oauth/apps/%v", appId)
|
||||
}
|
||||
|
||||
func (c *Client4) openGraphRoute() string {
|
||||
return "/opengraph"
|
||||
}
|
||||
|
||||
func (c *Client4) jobsRoute() string {
|
||||
return "/jobs"
|
||||
}
|
||||
@@ -6779,21 +6775,6 @@ func (c *Client4) GetSupportedTimezone(ctx context.Context) ([]string, *Response
|
||||
return timezones, BuildResponse(r), nil
|
||||
}
|
||||
|
||||
// Open Graph Metadata Section
|
||||
|
||||
// OpenGraph return the open graph metadata for a particular url if the site have the metadata.
|
||||
func (c *Client4) OpenGraph(ctx context.Context, url string) (map[string]string, *Response, error) {
|
||||
requestBody := make(map[string]string)
|
||||
requestBody["url"] = url
|
||||
|
||||
r, err := c.DoAPIPost(ctx, c.openGraphRoute(), MapToJSON(requestBody))
|
||||
if err != nil {
|
||||
return nil, BuildResponse(r), err
|
||||
}
|
||||
defer closeBody(r)
|
||||
return MapFromJSON(r.Body), BuildResponse(r), nil
|
||||
}
|
||||
|
||||
// Jobs Section
|
||||
|
||||
// GetJob gets a single job.
|
||||
|
||||
Ссылка в новой задаче
Block a user