mirror of
https://github.com/hanzoai/team.git
synced 2026-09-30 01:57:35 +00:00
The server module named github.com/hanzoai/team/server/v8 — a path that resolves to the retired workspace's repository, not this one — while server/public still published github.com/mattermost/mattermost/server/public. Both are github.com/hanzoteam/server/... now, which is where this code actually lives. That second half is what made the binary unbootable. Upstream's public path stayed claimed by upstream, mattermost-plugin-ai imported it, and the build linked public/model twice; public/plugin's gob.Register then ran twice under one name and panicked at init, before main. Reverting the rename traded the brand for a working binary. Rebranding the plugin alongside it needs no such trade: the agents fork is github.com/hanzoteam/agents/v2 against our public module, so no module named mattermost/mattermost is in the graph at all. Measured: `go list -deps ./cmd/mattermost` names exactly one public/model, and it is ours.
190 lines
7.1 KiB
Go
190 lines
7.1 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package imageproxy
|
|
|
|
import (
|
|
"net/url"
|
|
"testing"
|
|
|
|
"github.com/hanzoteam/server/server/public/model"
|
|
"github.com/hanzoteam/server/server/v8/channels/utils/testutils"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestGetProxiedImageURL(t *testing.T) {
|
|
siteURL := "https://mattermost.example.com"
|
|
parsedURL, err := url.Parse(siteURL)
|
|
require.NoError(t, err)
|
|
|
|
imageURL := "https://hanzo.ai/wp-content/uploads/2022/02/logoHorizontal.png"
|
|
proxiedURL := "https://mattermost.example.com/v1/workspace/image?url=https%3A%2F%2Fmattermost.com%2Fwp-content%2Fuploads%2F2022%2F02%2FlogoHorizontal.png"
|
|
|
|
proxy := ImageProxy{siteURL: parsedURL}
|
|
|
|
for _, test := range []struct {
|
|
Name string
|
|
Input string
|
|
Expected string
|
|
}{
|
|
{
|
|
Name: "should proxy an image",
|
|
Input: imageURL,
|
|
Expected: proxiedURL,
|
|
},
|
|
{
|
|
Name: "should not proxy a relative image",
|
|
Input: "/static/logo.png",
|
|
Expected: "https://team.example.com/static/logo.png",
|
|
},
|
|
{
|
|
Name: "should bypass opaque URLs",
|
|
Input: "http:xyz123?query",
|
|
Expected: siteURL,
|
|
},
|
|
{
|
|
Name: "should not proxy an image on the Hanzo Team server",
|
|
Input: "https://team.example.com/static/logo.png",
|
|
Expected: "https://team.example.com/static/logo.png",
|
|
},
|
|
{
|
|
Name: "should not proxy an image that has already been proxied",
|
|
Input: proxiedURL,
|
|
Expected: proxiedURL,
|
|
},
|
|
{
|
|
Name: "should not bypass protocol relative URLs",
|
|
Input: "//mattermost.com/static/logo.png",
|
|
Expected: "https://mattermost.example.com/v1/workspace/image?url=https%3A%2F%2Fmattermost.com%2Fstatic%2Flogo.png",
|
|
},
|
|
{
|
|
Name: "should not bypass if the host prefix is same",
|
|
Input: "https://mattermost.example.com.anothersite.com/static/logo.png",
|
|
Expected: "https://mattermost.example.com/v1/workspace/image?url=https%3A%2F%2Fmattermost.example.com.anothersite.com%2Fstatic%2Flogo.png",
|
|
},
|
|
{
|
|
Name: "should not bypass for user auth URLs",
|
|
Input: "https://[email protected]/static/logo.png",
|
|
Expected: "https://mattermost.example.com/v1/workspace/image?url=https%3A%2F%2Fmattermost.example.com%40anothersite.com%2Fstatic%2Flogo.png",
|
|
},
|
|
{
|
|
Name: "should not proxy embedded image",
|
|
Input: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
|
|
Expected: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
|
|
},
|
|
} {
|
|
t.Run(test.Name, func(t *testing.T) {
|
|
assert.Equal(t, test.Expected, proxy.GetProxiedImageURL(test.Input))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGetUnproxiedImageURL(t *testing.T) {
|
|
siteURL := "https://team.example.com"
|
|
|
|
// The proxied form embeds the image URL, so the two have to name the same
|
|
// host or the round-trip this exercises is not being exercised at all.
|
|
imageURL := "https://hanzo.ai/wp-content/uploads/2022/02/logoHorizontal.png"
|
|
proxiedURL := "https://team.example.com/v1/workspace/image?url=https%3A%2F%2Fhanzo.ai%2Fwp-content%2Fuploads%2F2022%2F02%2FlogoHorizontal.png"
|
|
|
|
for _, test := range []struct {
|
|
Name string
|
|
Input string
|
|
Expected string
|
|
}{
|
|
{
|
|
Name: "should remove proxy",
|
|
Input: proxiedURL,
|
|
Expected: imageURL,
|
|
},
|
|
{
|
|
Name: "should not remove proxy from a relative image",
|
|
Input: "/static/logo.png",
|
|
Expected: "/static/logo.png",
|
|
},
|
|
{
|
|
Name: "should not remove proxy from an image on the Hanzo Team server",
|
|
Input: "https://team.example.com/static/logo.png",
|
|
Expected: "https://team.example.com/static/logo.png",
|
|
},
|
|
{
|
|
Name: "should not remove proxy from a non-proxied image",
|
|
Input: imageURL,
|
|
Expected: imageURL,
|
|
},
|
|
} {
|
|
t.Run(test.Name, func(t *testing.T) {
|
|
assert.Equal(t, test.Expected, getUnproxiedImageURL(test.Input, siteURL))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestOnConfigChange(t *testing.T) {
|
|
t.Run("should switch between backends", func(t *testing.T) {
|
|
proxy := makeTestAtmosCamoProxy()
|
|
|
|
require.Equal(t, "https://mattermost.example.com", proxy.backend.(*AtmosCamoBackend).siteURL.String())
|
|
|
|
newConfig := proxy.ConfigService.Config().Clone()
|
|
newConfig.ImageProxySettings.ImageProxyType = model.NewPointer(model.ImageProxyTypeLocal)
|
|
|
|
proxy.ConfigService.(*testutils.StaticConfigService).UpdateConfig(newConfig)
|
|
|
|
require.Equal(t, "https://mattermost.example.com", proxy.backend.(*LocalBackend).baseURL.String())
|
|
|
|
newConfig = proxy.ConfigService.Config().Clone()
|
|
newConfig.ImageProxySettings.ImageProxyType = model.NewPointer(model.ImageProxyTypeAtmosCamo)
|
|
|
|
proxy.ConfigService.(*testutils.StaticConfigService).UpdateConfig(newConfig)
|
|
|
|
require.Equal(t, "https://mattermost.example.com", proxy.backend.(*AtmosCamoBackend).siteURL.String())
|
|
})
|
|
|
|
t.Run("for local proxy, should update site URL when that changes", func(t *testing.T) {
|
|
proxy := makeTestLocalProxy()
|
|
|
|
require.Equal(t, "https://mattermost.example.com", proxy.siteURL.String())
|
|
require.Equal(t, "https://mattermost.example.com", proxy.backend.(*LocalBackend).baseURL.String())
|
|
|
|
newConfig := proxy.ConfigService.Config().Clone()
|
|
newConfig.ServiceSettings.SiteURL = new("https://new.example.com")
|
|
|
|
proxy.ConfigService.(*testutils.StaticConfigService).UpdateConfig(newConfig)
|
|
|
|
require.Equal(t, "https://new.example.com", proxy.siteURL.String())
|
|
require.Equal(t, "https://new.example.com", proxy.backend.(*LocalBackend).baseURL.String())
|
|
})
|
|
|
|
t.Run("for atmos/camo proxy, should update site URL when that changes", func(t *testing.T) {
|
|
proxy := makeTestAtmosCamoProxy()
|
|
|
|
require.Equal(t, "https://mattermost.example.com", proxy.siteURL.String())
|
|
require.Equal(t, "https://mattermost.example.com", proxy.backend.(*AtmosCamoBackend).siteURL.String())
|
|
|
|
newConfig := proxy.ConfigService.Config().Clone()
|
|
newConfig.ServiceSettings.SiteURL = new("https://new.example.com")
|
|
|
|
proxy.ConfigService.(*testutils.StaticConfigService).UpdateConfig(newConfig)
|
|
|
|
require.Equal(t, "https://new.example.com", proxy.siteURL.String())
|
|
require.Equal(t, "https://new.example.com", proxy.backend.(*AtmosCamoBackend).siteURL.String())
|
|
})
|
|
|
|
t.Run("for atmos/camo proxy, should update additional options when those change", func(t *testing.T) {
|
|
proxy := makeTestAtmosCamoProxy()
|
|
|
|
require.Equal(t, "http://images.example.com", proxy.backend.(*AtmosCamoBackend).remoteURL.String())
|
|
// require.Equal(t, "7e5f3fab20b94782b43cdb022a66985ef28ba355df2c5d5da3c9a05e4b697bac", proxy.backend.(*AtmosCamoBackend).remoteOptions)
|
|
|
|
newConfig := proxy.ConfigService.Config().Clone()
|
|
newConfig.ImageProxySettings.RemoteImageProxyURL = new("https://new.example.com")
|
|
newConfig.ImageProxySettings.RemoteImageProxyOptions = new("some other random hash")
|
|
|
|
proxy.ConfigService.(*testutils.StaticConfigService).UpdateConfig(newConfig)
|
|
|
|
require.Equal(t, "https://new.example.com", proxy.backend.(*AtmosCamoBackend).remoteURL.String())
|
|
// require.Equal(t, "some other random hash", proxy.backend.(*AtmosCamoBackend).remoteOptions)
|
|
})
|
|
}
|