소스 검색

feat: support force verifying sig

Yeuoly 9 달 전
부모
커밋
69072bd8d5
3개의 변경된 파일25개의 추가작업 그리고 3개의 파일을 삭제
  1. 1 1
      internal/server/controllers/plugins.go
  2. 14 1
      internal/service/install_plugin.go
  3. 10 1
      internal/types/models/curd/atomic.go

+ 1 - 1
internal/server/controllers/plugins.go

@@ -49,7 +49,7 @@ func InstallPluginFromPkg(app *app.Config) gin.HandlerFunc {
 		}
 		defer dify_pkg_file.Close()
 
-		service.InstallPluginFromPkg(c, tenant_id, dify_pkg_file)
+		service.InstallPluginFromPkg(app, c, tenant_id, dify_pkg_file)
 	}
 }
 

+ 14 - 1
internal/service/install_plugin.go

@@ -1,6 +1,7 @@
 package service
 
 import (
+	"errors"
 	"fmt"
 	"io"
 	"mime/multipart"
@@ -8,7 +9,9 @@ import (
 	"github.com/gin-gonic/gin"
 	"github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager"
 	"github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/decoder"
+	"github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/verifier"
 	"github.com/langgenius/dify-plugin-daemon/internal/db"
+	"github.com/langgenius/dify-plugin-daemon/internal/types/app"
 	"github.com/langgenius/dify-plugin-daemon/internal/types/entities"
 	"github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
 	"github.com/langgenius/dify-plugin-daemon/internal/types/models"
@@ -16,7 +19,7 @@ import (
 	"github.com/langgenius/dify-plugin-daemon/internal/utils/stream"
 )
 
-func InstallPluginFromPkg(c *gin.Context, tenant_id string, dify_pkg_file multipart.File) {
+func InstallPluginFromPkg(config *app.Config, c *gin.Context, tenant_id string, dify_pkg_file multipart.File) {
 	manager := plugin_manager.Manager()
 
 	plugin_file, err := io.ReadAll(dify_pkg_file)
@@ -31,6 +34,16 @@ func InstallPluginFromPkg(c *gin.Context, tenant_id string, dify_pkg_file multip
 		return
 	}
 
+	if config.ForceVerifyingSignature {
+		err := verifier.VerifyPlugin(decoder)
+		if err != nil {
+			c.JSON(200, entities.NewErrorResponse(-500, errors.Join(err, errors.New(
+				"force verification has been enabled, and the plugin you want to install has a bad signature",
+			)).Error()))
+			return
+		}
+	}
+
 	baseSSEService(
 		func() (*stream.Stream[plugin_manager.PluginInstallResponse], error) {
 			return manager.Install(tenant_id, decoder)

+ 10 - 1
internal/types/models/curd/atomic.go

@@ -24,7 +24,16 @@ func InstallPlugin(
 	var plugin_to_be_returns *models.Plugin
 	var installation_to_be_returns *models.PluginInstallation
 
-	err := db.WithTransaction(func(tx *gorm.DB) error {
+	// check if already installed
+	_, err := db.GetOne[models.PluginInstallation](
+		db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
+	)
+
+	if err == nil {
+		return nil, nil, errors.New("plugin already installed")
+	}
+
+	err = db.WithTransaction(func(tx *gorm.DB) error {
 		p, err := db.GetOne[models.Plugin](
 			db.WithTransactionContext(tx),
 			db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),