mirror of
https://github.com/grafana/grafana.git
synced 2025-07-28 19:02:29 +08:00
Add check for update/uninstall of plugins (#91889)
This commit is contained in:

committed by
GitHub

parent
134b9f731f
commit
55381a3e77
@ -458,6 +458,12 @@ func (hs *HTTPServer) InstallPlugin(c *contextmodel.ReqContext) response.Respons
|
|||||||
|
|
||||||
hs.log.Info("Plugin install/update requested", "pluginId", pluginID, "user", c.Login)
|
hs.log.Info("Plugin install/update requested", "pluginId", pluginID, "user", c.Login)
|
||||||
|
|
||||||
|
for _, preinstalled := range hs.Cfg.InstallPlugins {
|
||||||
|
if preinstalled.ID == pluginID && preinstalled.Version != "" {
|
||||||
|
return response.Error(http.StatusConflict, "Cannot update a pinned pre-installed plugin", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
compatOpts := plugins.NewCompatOpts(hs.Cfg.BuildVersion, runtime.GOOS, runtime.GOARCH)
|
compatOpts := plugins.NewCompatOpts(hs.Cfg.BuildVersion, runtime.GOOS, runtime.GOARCH)
|
||||||
err := hs.pluginInstaller.Add(c.Req.Context(), pluginID, dto.Version, compatOpts)
|
err := hs.pluginInstaller.Add(c.Req.Context(), pluginID, dto.Version, compatOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -496,6 +502,12 @@ func (hs *HTTPServer) UninstallPlugin(c *contextmodel.ReqContext) response.Respo
|
|||||||
return response.Error(http.StatusNotFound, "Plugin not installed", nil)
|
return response.Error(http.StatusNotFound, "Plugin not installed", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, preinstalled := range hs.Cfg.InstallPlugins {
|
||||||
|
if preinstalled.ID == pluginID {
|
||||||
|
return response.Error(http.StatusConflict, "Cannot uninstall a pre-installed plugin", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
err := hs.pluginInstaller.Remove(c.Req.Context(), pluginID, plugin.Info.Version)
|
err := hs.pluginInstaller.Remove(c.Req.Context(), pluginID, plugin.Info.Version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, plugins.ErrPluginNotInstalled) {
|
if errors.Is(err, plugins.ErrPluginNotInstalled) {
|
||||||
|
@ -55,7 +55,7 @@ func Test_PluginsInstallAndUninstall(t *testing.T) {
|
|||||||
canInstall := []ac.Permission{{Action: pluginaccesscontrol.ActionInstall}}
|
canInstall := []ac.Permission{{Action: pluginaccesscontrol.ActionInstall}}
|
||||||
cannotInstall := []ac.Permission{{Action: "plugins:cannotinstall"}}
|
cannotInstall := []ac.Permission{{Action: "plugins:cannotinstall"}}
|
||||||
|
|
||||||
pluginID := "grafana-test-datasource"
|
pluginID := ""
|
||||||
localOrg := int64(1)
|
localOrg := int64(1)
|
||||||
globalOrg := int64(ac.GlobalOrgID)
|
globalOrg := int64(ac.GlobalOrgID)
|
||||||
|
|
||||||
@ -66,6 +66,7 @@ func Test_PluginsInstallAndUninstall(t *testing.T) {
|
|||||||
pluginAdminEnabled bool
|
pluginAdminEnabled bool
|
||||||
pluginAdminExternalManageEnabled bool
|
pluginAdminExternalManageEnabled bool
|
||||||
singleOrganization bool
|
singleOrganization bool
|
||||||
|
preInstalledPlugin bool
|
||||||
}
|
}
|
||||||
tcs := []testCase{
|
tcs := []testCase{
|
||||||
{expectedCode: http.StatusNotFound, permissionOrg: globalOrg, permissions: canInstall, pluginAdminEnabled: true, pluginAdminExternalManageEnabled: true},
|
{expectedCode: http.StatusNotFound, permissionOrg: globalOrg, permissions: canInstall, pluginAdminEnabled: true, pluginAdminExternalManageEnabled: true},
|
||||||
@ -76,6 +77,7 @@ func Test_PluginsInstallAndUninstall(t *testing.T) {
|
|||||||
{expectedCode: http.StatusForbidden, permissionOrg: localOrg, permissions: canInstall, pluginAdminEnabled: true, pluginAdminExternalManageEnabled: false},
|
{expectedCode: http.StatusForbidden, permissionOrg: localOrg, permissions: canInstall, pluginAdminEnabled: true, pluginAdminExternalManageEnabled: false},
|
||||||
{expectedCode: http.StatusForbidden, permissionOrg: localOrg, permissions: cannotInstall, pluginAdminEnabled: true, pluginAdminExternalManageEnabled: false, singleOrganization: true},
|
{expectedCode: http.StatusForbidden, permissionOrg: localOrg, permissions: cannotInstall, pluginAdminEnabled: true, pluginAdminExternalManageEnabled: false, singleOrganization: true},
|
||||||
{expectedCode: http.StatusOK, permissionOrg: localOrg, permissions: canInstall, pluginAdminEnabled: true, pluginAdminExternalManageEnabled: false, singleOrganization: true},
|
{expectedCode: http.StatusOK, permissionOrg: localOrg, permissions: canInstall, pluginAdminEnabled: true, pluginAdminExternalManageEnabled: false, singleOrganization: true},
|
||||||
|
{expectedCode: http.StatusConflict, permissionOrg: globalOrg, permissions: canInstall, pluginAdminEnabled: true, pluginAdminExternalManageEnabled: false, preInstalledPlugin: true},
|
||||||
}
|
}
|
||||||
|
|
||||||
testName := func(action string, tc testCase) string {
|
testName := func(action string, tc testCase) string {
|
||||||
@ -84,11 +86,16 @@ func Test_PluginsInstallAndUninstall(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range tcs {
|
for _, tc := range tcs {
|
||||||
|
pluginID = "grafana-test-datasource"
|
||||||
|
if tc.preInstalledPlugin {
|
||||||
|
pluginID = "grafana-preinstalled-datasource"
|
||||||
|
}
|
||||||
server := SetupAPITestServer(t, func(hs *HTTPServer) {
|
server := SetupAPITestServer(t, func(hs *HTTPServer) {
|
||||||
hs.Cfg = setting.NewCfg()
|
hs.Cfg = setting.NewCfg()
|
||||||
hs.Cfg.PluginAdminEnabled = tc.pluginAdminEnabled
|
hs.Cfg.PluginAdminEnabled = tc.pluginAdminEnabled
|
||||||
hs.Cfg.PluginAdminExternalManageEnabled = tc.pluginAdminExternalManageEnabled
|
hs.Cfg.PluginAdminExternalManageEnabled = tc.pluginAdminExternalManageEnabled
|
||||||
hs.Cfg.RBAC.SingleOrganization = tc.singleOrganization
|
hs.Cfg.RBAC.SingleOrganization = tc.singleOrganization
|
||||||
|
hs.Cfg.InstallPlugins = []setting.InstallPlugin{{ID: "grafana-preinstalled-datasource", Version: "1.0.0"}}
|
||||||
|
|
||||||
hs.orgService = &orgtest.FakeOrgService{ExpectedOrg: &org.Org{}}
|
hs.orgService = &orgtest.FakeOrgService{ExpectedOrg: &org.Org{}}
|
||||||
hs.accesscontrolService = &actest.FakeService{}
|
hs.accesscontrolService = &actest.FakeService{}
|
||||||
|
Reference in New Issue
Block a user