package signature

import (
 "context"
 "fmt"
 "path/filepath"

 "github.com/grafana/grafana/pkg/plugins"
)

type distributorBackend struct {
 Directory, Version, Binary, UpstreamSHA, RebuiltSHA, ManifestSHA string
}

// This policy is compiled into Grafana; no runtime file or setting can expand it.
// It is consulted only AFTER upstream GPG, identity, version and root URL checks.
func (s *Signature) distributorBackend(ctx context.Context, src plugins.PluginSource, plugin plugins.FoundPlugin, manifest *PluginManifest) (distributorBackend, bool, error) {
 entry,exists:=distributorBackends[plugin.JSONData.ID]
 if !exists || src.PluginClass(ctx)!=plugins.ClassExternal || plugin.FS.Type()!=plugins.FSTypeLocal {return distributorBackend{},false,nil}
 expected:="/usr/share/grafana/data/plugins-bundled/"+entry.Directory
 if plugin.FS.Base()!=expected {return distributorBackend{},false,nil}
 resolved,err:=filepath.EvalSymlinks(plugin.FS.Base())
 if err!=nil || resolved!=expected {return distributorBackend{},false,fmt.Errorf("distributor backend path must be its packaged directory")}
 if manifest.Version!=entry.Version || manifest.Files[entry.Binary]!=entry.UpstreamSHA {return distributorBackend{},false,fmt.Errorf("distributor backend manifest binding changed")}
 if err=verifyHash(s.log,plugin,"MANIFEST.txt",entry.ManifestSHA);err!=nil {return distributorBackend{},false,err}
 return entry,true,nil
}
