plugin_decoder.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package service
  2. import (
  3. "errors"
  4. "io"
  5. "mime/multipart"
  6. "github.com/gin-gonic/gin"
  7. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager"
  8. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/decoder"
  9. "github.com/langgenius/dify-plugin-daemon/internal/types/app"
  10. "github.com/langgenius/dify-plugin-daemon/internal/types/entities"
  11. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  12. "github.com/langgenius/dify-plugin-daemon/internal/utils/cache"
  13. )
  14. func UploadPluginFromPkg(
  15. config *app.Config,
  16. c *gin.Context,
  17. tenant_id string,
  18. dify_pkg_file multipart.File,
  19. verify_signature bool,
  20. ) *entities.Response {
  21. plugin_file, err := io.ReadAll(dify_pkg_file)
  22. if err != nil {
  23. return entities.NewErrorResponse(-500, err.Error())
  24. }
  25. decoder, err := decoder.NewZipPluginDecoder(plugin_file)
  26. if err != nil {
  27. return entities.NewErrorResponse(-500, err.Error())
  28. }
  29. manifest, err := decoder.Manifest()
  30. if err != nil {
  31. return entities.NewErrorResponse(-500, err.Error())
  32. }
  33. if config.ForceVerifyingSignature || verify_signature {
  34. if !manifest.Verified {
  35. return entities.NewErrorResponse(-500, errors.Join(err, errors.New(
  36. "plugin verification has been enabled, and the plugin you want to install has a bad signature",
  37. )).Error())
  38. }
  39. }
  40. plugin_unique_identifier, err := decoder.UniqueIdentity()
  41. if err != nil {
  42. return entities.NewErrorResponse(-500, err.Error())
  43. }
  44. manager := plugin_manager.Manager()
  45. if err := manager.SavePackage(plugin_unique_identifier, plugin_file); err != nil {
  46. return entities.NewErrorResponse(-500, err.Error())
  47. }
  48. return entities.NewSuccessResponse(map[string]any{
  49. "unique_identifier": plugin_unique_identifier,
  50. "manifest": manifest,
  51. })
  52. }
  53. func FetchPluginManifest(
  54. tenant_id string,
  55. plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
  56. ) *entities.Response {
  57. type ManifestCache struct {
  58. Declaration plugin_entities.PluginDeclaration `json:"declaration"`
  59. }
  60. plugin_manifest_cache, err := cache.AutoGetWithGetter(plugin_unique_identifier.String(), func() (*ManifestCache, error) {
  61. manager := plugin_manager.Manager()
  62. pkg, err := manager.GetPackage(plugin_unique_identifier)
  63. if err != nil {
  64. return nil, err
  65. }
  66. decoder, err := decoder.NewZipPluginDecoder(pkg)
  67. if err != nil {
  68. return nil, err
  69. }
  70. manifest, err := decoder.Manifest()
  71. if err != nil {
  72. return nil, err
  73. }
  74. return &ManifestCache{Declaration: manifest}, nil
  75. })
  76. if err != nil {
  77. return entities.NewErrorResponse(-500, err.Error())
  78. }
  79. return entities.NewSuccessResponse(plugin_manifest_cache)
  80. }