diff --git a/api4/plugin_test.go b/api4/plugin_test.go index bbb6aaa48f..7915149380 100644 --- a/api4/plugin_test.go +++ b/api4/plugin_test.go @@ -7,6 +7,7 @@ import ( "bytes" "encoding/base64" "encoding/json" + "fmt" "io/ioutil" "net/http" "net/http/httptest" @@ -23,6 +24,7 @@ import ( "github.com/mattermost/mattermost-server/v5/utils" "github.com/mattermost/mattermost-server/v5/utils/fileutils" + svg "github.com/h2non/go-is-svg" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -602,10 +604,15 @@ func TestGetInstalledMarketplacePlugins(t *testing.T) { manifest, resp := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) CheckNoError(t, resp) + testIcon, err := ioutil.ReadFile(filepath.Join(path, "test.svg")) + require.NoError(t, err) + require.True(t, svg.Is(testIcon)) + testIconData := fmt.Sprintf("data:image/svg+xml;base64,%s", base64.StdEncoding.EncodeToString(testIcon)) + expectedPlugins := append(samplePlugins, &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ HomepageURL: "https://example.com/homepage", - IconData: "", + IconData: testIconData, DownloadURL: "", Labels: []model.MarketplaceLabel{{ Name: "Local", @@ -711,6 +718,11 @@ func TestSearchGetMarketplacePlugins(t *testing.T) { tarDataV2, err := ioutil.ReadFile(filepath.Join(path, "testplugin2.tar.gz")) require.NoError(t, err) + testIcon, err := ioutil.ReadFile(filepath.Join(path, "test.svg")) + require.NoError(t, err) + require.True(t, svg.Is(testIcon)) + testIconData := fmt.Sprintf("data:image/svg+xml;base64,%s", base64.StdEncoding.EncodeToString(testIcon)) + t.Run("search installed plugin", func(t *testing.T) { th := Setup().InitBasic() defer th.TearDown() @@ -740,7 +752,7 @@ func TestSearchGetMarketplacePlugins(t *testing.T) { plugin1 := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ HomepageURL: "https://example.com/homepage", - IconData: "", + IconData: testIconData, DownloadURL: "", Labels: []model.MarketplaceLabel{{ Name: "Local", @@ -754,10 +766,11 @@ func TestSearchGetMarketplacePlugins(t *testing.T) { manifest, resp = th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarDataV2)) CheckNoError(t, resp) + plugin2 := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ - HomepageURL: "https://example.com/homepage2", - IconData: "", + IconData: testIconData, + HomepageURL: "https://example.com/homepage", DownloadURL: "", Labels: []model.MarketplaceLabel{{ Name: "Local", @@ -896,8 +909,14 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { manifest, resp := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) CheckNoError(t, resp) + testIcon, err := ioutil.ReadFile(filepath.Join(path, "test.svg")) + require.NoError(t, err) + require.True(t, svg.Is(testIcon)) + testIconData := fmt.Sprintf("data:image/svg+xml;base64,%s", base64.StdEncoding.EncodeToString(testIcon)) + newPlugin := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ + IconData: testIconData, HomepageURL: "https://example.com/homepage", Manifest: manifest, }, @@ -930,10 +949,16 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { manifest, resp := th.SystemAdminClient.UploadPlugin(bytes.NewReader(tarData)) CheckNoError(t, resp) + testIcon, err := ioutil.ReadFile(filepath.Join(path, "test.svg")) + require.NoError(t, err) + require.True(t, svg.Is(testIcon)) + testIconData := fmt.Sprintf("data:image/svg+xml;base64,%s", base64.StdEncoding.EncodeToString(testIcon)) + newPlugin := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ - HomepageURL: "https://example.com/homepage", Manifest: manifest, + IconData: testIconData, + HomepageURL: "https://example.com/homepage", Labels: []model.MarketplaceLabel{{ Name: "Local", Description: "This plugin is not listed in the marketplace", diff --git a/app/plugin.go b/app/plugin.go index f6bf9400d7..61f572480e 100644 --- a/app/plugin.go +++ b/app/plugin.go @@ -534,7 +534,9 @@ func (a *App) mergePrepackagedPlugins(remoteMarketplacePlugins map[string]*model prepackagedMarketplace := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ - Manifest: prepackaged.Manifest, + HomepageURL: prepackaged.Manifest.HomepageURL, + IconData: prepackaged.IconData, + Manifest: prepackaged.Manifest, }, } @@ -587,6 +589,14 @@ func (a *App) mergeLocalPlugins(remoteMarketplacePlugins map[string]*model.Marke continue } + iconData := "" + if plugin.Manifest.IconPath != "" { + iconData, err = getIcon(filepath.Join(plugin.Path, plugin.Manifest.IconPath)) + if err != nil { + mlog.Warn("Error loading local plugin icon", mlog.String("plugin", plugin.Manifest.Id), mlog.String("icon_path", plugin.Manifest.IconPath), mlog.Err(err)) + } + } + var labels []model.MarketplaceLabel if *a.Config().PluginSettings.EnableRemoteMarketplace { // Labels should not (yet) be localized as the labels sent by the Marketplace are not (yet) localizable. @@ -598,6 +608,7 @@ func (a *App) mergeLocalPlugins(remoteMarketplacePlugins map[string]*model.Marke remoteMarketplacePlugins[plugin.Manifest.Id] = &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ + IconData: iconData, HomepageURL: plugin.Manifest.HomepageURL, Labels: labels, Manifest: plugin.Manifest, @@ -813,7 +824,7 @@ func getPrepackagedPlugin(pluginPath *pluginSignaturePath, pluginFile io.ReadSee } if manifest.IconPath != "" { - iconData, err := getIcon(manifest.IconPath) + iconData, err := getIcon(filepath.Join(pluginDir, manifest.IconPath)) if err != nil { return nil, "", errors.Wrapf(err, "Failed to read icon at %s", manifest.IconPath) } diff --git a/tests/testplugin.tar.gz b/tests/testplugin.tar.gz index b746bd84b0..4685d1c345 100644 Binary files a/tests/testplugin.tar.gz and b/tests/testplugin.tar.gz differ diff --git a/tests/testplugin.tar.gz.asc b/tests/testplugin.tar.gz.asc index e171ec3def..0fe8e1ad1e 100644 --- a/tests/testplugin.tar.gz.asc +++ b/tests/testplugin.tar.gz.asc @@ -1,14 +1,14 @@ -----BEGIN PGP SIGNATURE----- -iQGzBAABCAAdFiEE8/rOReDeZCyL1qjmTHxlYsGSzB8FAl4hYxIACgkQTHxlYsGS -zB97wwwAqI1gZQsOg6zsKIPCJ6kQ721rG5EaI/eDseRbKnxaFdcoe2+QzqDXE0Ax -P5RhZBKr+5hcS4msxjKPPMAVUZeMrhM7pYFV7y1zSkYQkyk8bcfspL3bVbAT4lXA -x2u2HN6zQqajmX5231hM60ScyIaQXE4aAyruJs4Jw0Cky+NWbXlmo+VVacRxjjp4 -eAodiF+WNuQb0+72qdrvaP/X6PVi/eKe3uv/fWGOKeQUb7yV8WBOcXbyhA7qHY9F -n2utzLXyu34UBKlkUA7T/RQvFFJCzZAoctR3oN0lPOVdRzRIw0T1WqSxRNbnRgW4 -YPJdKvED7M68HFpdK37SBiMDivseU9I9vOfHRoaQlCK8CYTs1qHPx2hrivj7s5qN -DStkmzcx1C6OwDt93my3M7WdUHeQ96ryXxFpS9Fj6vYdNTgOE03CW1WIPoNxXJme -FHu5o9DNr0bNcsye8TNWqoemmM6NlAEdk239NoODwMwtoTia2eufmfMqkgeH8kR8 -BNCgEYSq -=8YEF +iQGzBAABCAAdFiEE8/rOReDeZCyL1qjmTHxlYsGSzB8FAl4hzNEACgkQTHxlYsGS +zB9+oQv+LoGzdDKmJu1J021S5lw6fIoUtEB0AUFHXZyij9bSLhMxey8LbW5l6JnG +0Op0SEDU4c97eQMwFvfrLnJDepziFrlSZmt60v/6LxEraB4CfCQ/D6M2/dkcERnG +c7AUsbObiS6eYpkw5isLz6dP8LoHZBSl4Sw2aSujQL1IvPC3tAzkBDZ7HlxRK4Py +x9ekBj26mrkwY+1A6to3GofK1fSo8NZtstuJ2408r4crGplOXahLrW2hW5f++4pJ +L0c4945emSO5XkHXMlz46WcRNvgEAeaLMZwmKxfVH5gDR9kbzrrEgDQibSZtn+mF +mfMk22vlJ4wZUGnvWnbpEKUWllwmJcCXUkHc/Xw8s8vB+qcToAWZYFzIxydiUdVm +oUzDvh/QcG2G4I6q+Qp2YqZs8QVCSJIQN50AAXKnNEh1D0M9EiK/3e/GfHvNnPwQ +uWjNw0bXKBIduDl/dZp7DSSRmtkFAmwu+tAZZbzaqb+qRzL1GuWneZbcgyCpze1C +KXSi4aDJ +=1iVn -----END PGP SIGNATURE----- diff --git a/tests/testplugin.tar.gz.sig b/tests/testplugin.tar.gz.sig index 360c9e0eba..d983985624 100644 Binary files a/tests/testplugin.tar.gz.sig and b/tests/testplugin.tar.gz.sig differ diff --git a/tests/testplugin2.tar.gz b/tests/testplugin2.tar.gz index 9523f955d6..7e822f37e6 100644 Binary files a/tests/testplugin2.tar.gz and b/tests/testplugin2.tar.gz differ diff --git a/tests/testplugin2.tar.gz.asc b/tests/testplugin2.tar.gz.asc new file mode 100644 index 0000000000..704155e829 --- /dev/null +++ b/tests/testplugin2.tar.gz.asc @@ -0,0 +1,14 @@ +-----BEGIN PGP SIGNATURE----- + +iQGzBAABCAAdFiEE8/rOReDeZCyL1qjmTHxlYsGSzB8FAl4fca4ACgkQTHxlYsGS +zB8qkgv/cTe71xkIHALB0HAvnd2HD6NqA3/AdOWIvZtmtU8une2s6Int28sPMkt9 +HNmVsBpiDnsmB+jfkrf4NXpCVn3to/gB1qWSmudPWb+b54XGdD8SGOpmCT9Fd2qN +EGHjgvmHJ/2F5PQ5B+FazLflyFn0JcA+BCikBcJfmTvDdBgEwR5QEsowDy5mLb3v +AxKZR9PnmOkAt0/fs2geyqPZ1s+NTlsIHRP0Hvtkxq7BvQJWoTmcJb5mFbBvAz24 +nsXzGpAFKpBjx9v9WErcq8Fy2Ad3Iqu7mKgTQxPrpreCRZceWJg327fFr8A2YVCU +Zo2cC/+By2GUmnotHVD4abead0J8t3eVyexg0CwOstQCeIEKfYtuU8UuyJtqhO6t +cKkE1oiBOo7TtYdWRQyR/9zlim7Wlj94WvquJLemCfazoQdq68hyvGa6C2lakZx3 +iSzYw00V6U+aEXffadzXnmbQiJKcOu7gIyumBbGIDLOfM5ypACvnCNHxQ/mlYHjD ++HOR5g+1 +=FsxQ +-----END PGP SIGNATURE----- diff --git a/tests/testplugin2.tar.gz.sig b/tests/testplugin2.tar.gz.sig index a8d16b54e2..9c4221b1f4 100644 Binary files a/tests/testplugin2.tar.gz.sig and b/tests/testplugin2.tar.gz.sig differ