mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Fix: fix loading symbolically linked plugins (#35635)
This commit is contained in:
parent
c997f646cc
commit
5b5cb94809
@ -397,6 +397,24 @@ func TestPluginManager_Init(t *testing.T) {
|
|||||||
assert.False(t, pm.plugins[pluginID].IsCorePlugin)
|
assert.False(t, pm.plugins[pluginID].IsCorePlugin)
|
||||||
assert.NotNil(t, pm.plugins[("test")])
|
assert.NotNil(t, pm.plugins[("test")])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("With back-end plugin that is symlinked to plugins dir", func(t *testing.T) {
|
||||||
|
origAppURL := setting.AppUrl
|
||||||
|
t.Cleanup(func() {
|
||||||
|
setting.AppUrl = origAppURL
|
||||||
|
})
|
||||||
|
setting.AppUrl = defaultAppURL
|
||||||
|
|
||||||
|
pm := createManager(t, func(pm *PluginManager) {
|
||||||
|
pm.Cfg.PluginsPath = "testdata/symbolic-plugin-dirs"
|
||||||
|
})
|
||||||
|
err := pm.Init()
|
||||||
|
require.NoError(t, err)
|
||||||
|
// This plugin should be properly registered, even though it is symlinked to prlugins dir
|
||||||
|
require.Empty(t, pm.scanningErrors)
|
||||||
|
const pluginID = "test"
|
||||||
|
assert.NotNil(t, pm.plugins[pluginID])
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPluginManager_IsBackendOnlyPlugin(t *testing.T) {
|
func TestPluginManager_IsBackendOnlyPlugin(t *testing.T) {
|
||||||
|
1
pkg/plugins/manager/testdata/symbolic-plugin-dirs/plugin
vendored
Symbolic link
1
pkg/plugins/manager/testdata/symbolic-plugin-dirs/plugin
vendored
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../symbolic-file-links/plugin
|
@ -55,28 +55,35 @@ func walk(path string, info os.FileInfo, resolvedPath string, symlinkPathsFollow
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// We only want to lstat on directories. If this entry is a symbolic link to a file, no need to recurse.
|
|
||||||
if info.IsDir() {
|
if resolvedPath != "" && info.Mode()&os.ModeSymlink == os.ModeSymlink {
|
||||||
if resolvedPath != "" && info.Mode()&os.ModeSymlink == os.ModeSymlink {
|
// We only want to lstat on directories. If this entry is a symbolic link to a file, no need to recurse.
|
||||||
path2, err := os.Readlink(resolvedPath)
|
statInfo, err := os.Stat(resolvedPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// vout("SymLink Path: %v, links to: %v", resolvedPath, path2)
|
if !statInfo.IsDir() {
|
||||||
if symlinkPathsFollowed != nil {
|
return nil
|
||||||
if _, ok := symlinkPathsFollowed[path2]; ok {
|
|
||||||
errMsg := "potential symLink infinite loop, path: %v, link to: %v"
|
|
||||||
return fmt.Errorf(errMsg, resolvedPath, path2)
|
|
||||||
}
|
|
||||||
symlinkPathsFollowed[path2] = true
|
|
||||||
}
|
|
||||||
info2, err := os.Lstat(path2)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return walk(path, info2, path2, symlinkPathsFollowed, walkFn)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
path2, err := filepath.EvalSymlinks(resolvedPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// vout("SymLink Path: %v, links to: %v", resolvedPath, path2)
|
||||||
|
if symlinkPathsFollowed != nil {
|
||||||
|
if _, ok := symlinkPathsFollowed[path2]; ok {
|
||||||
|
errMsg := "potential symLink infinite loop, path: %v, link to: %v"
|
||||||
|
return fmt.Errorf(errMsg, resolvedPath, path2)
|
||||||
|
}
|
||||||
|
symlinkPathsFollowed[path2] = true
|
||||||
|
}
|
||||||
|
info2, err := os.Lstat(path2)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return walk(path, info2, path2, symlinkPathsFollowed, walkFn)
|
||||||
|
} else if info.IsDir() {
|
||||||
list, err := ioutil.ReadDir(path)
|
list, err := ioutil.ReadDir(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return walkFn(resolvedPath, info, err)
|
return walkFn(resolvedPath, info, err)
|
||||||
|
Loading…
Reference in New Issue
Block a user