packager_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package plugin_packager
  2. import (
  3. _ "embed"
  4. "fmt"
  5. "os"
  6. "testing"
  7. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/decoder"
  8. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/packager"
  9. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_packager/signer"
  10. )
  11. //go:embed manifest.yaml
  12. var manifest []byte
  13. //go:embed neko.yaml
  14. var neko []byte
  15. //go:embed .difyignore
  16. var dify_ignore []byte
  17. //go:embed ignored
  18. var ignored []byte
  19. //go:embed _assets/test.svg
  20. var test_svg []byte
  21. func TestPackagerAndVerifier(t *testing.T) {
  22. // create a temp directory
  23. os.RemoveAll("temp")
  24. if err := os.Mkdir("temp", 0755); err != nil {
  25. t.Errorf("failed to create temp directory: %s", err.Error())
  26. return
  27. }
  28. defer func() {
  29. os.RemoveAll("temp")
  30. os.Remove("temp")
  31. }()
  32. // create manifest
  33. if err := os.WriteFile("temp/manifest.yaml", manifest, 0644); err != nil {
  34. t.Errorf("failed to write manifest: %s", err.Error())
  35. return
  36. }
  37. if err := os.WriteFile("temp/neko.yaml", neko, 0644); err != nil {
  38. t.Errorf("failed to write neko: %s", err.Error())
  39. return
  40. }
  41. // create .difyignore
  42. if err := os.WriteFile("temp/.difyignore", dify_ignore, 0644); err != nil {
  43. t.Errorf("failed to write .difyignore: %s", err.Error())
  44. return
  45. }
  46. // create ignored
  47. if err := os.WriteFile("temp/ignored", ignored, 0644); err != nil {
  48. t.Errorf("failed to write ignored: %s", err.Error())
  49. return
  50. }
  51. if err := os.MkdirAll("temp/_assets", 0755); err != nil {
  52. t.Errorf("failed to create _assets directory: %s", err.Error())
  53. return
  54. }
  55. if err := os.WriteFile("temp/_assets/test.svg", test_svg, 0644); err != nil {
  56. t.Errorf("failed to write test.svg: %s", err.Error())
  57. return
  58. }
  59. originDecoder, err := decoder.NewFSPluginDecoder("temp")
  60. if err != nil {
  61. t.Errorf("failed to create decoder: %s", err.Error())
  62. return
  63. }
  64. // walk
  65. err = originDecoder.Walk(func(filename string, dir string) error {
  66. if filename == "ignored" {
  67. return fmt.Errorf("should not walk into ignored")
  68. }
  69. return nil
  70. })
  71. if err != nil {
  72. t.Errorf("failed to walk: %s", err.Error())
  73. return
  74. }
  75. // check assets
  76. assets, err := originDecoder.Assets()
  77. if err != nil {
  78. t.Errorf("failed to get assets: %s", err.Error())
  79. return
  80. }
  81. if assets["test.svg"] == nil {
  82. t.Errorf("should have test.svg asset, got %v", assets)
  83. return
  84. }
  85. packager := packager.NewPackager(originDecoder)
  86. // pack
  87. zip, err := packager.Pack()
  88. if err != nil {
  89. t.Errorf("failed to pack: %s", err.Error())
  90. return
  91. }
  92. // sign
  93. signed, err := signer.SignPlugin(zip)
  94. if err != nil {
  95. t.Errorf("failed to sign: %s", err.Error())
  96. return
  97. }
  98. signedDecoder, err := decoder.NewZipPluginDecoder(signed)
  99. if err != nil {
  100. t.Errorf("failed to create zip decoder: %s", err.Error())
  101. return
  102. }
  103. // check assets
  104. assets, err = signedDecoder.Assets()
  105. if err != nil {
  106. t.Errorf("failed to get assets: %s", err.Error())
  107. return
  108. }
  109. if assets["test.svg"] == nil {
  110. t.Errorf("should have test.svg asset, got %v", assets)
  111. return
  112. }
  113. // verify
  114. err = decoder.VerifyPlugin(signedDecoder)
  115. if err != nil {
  116. t.Errorf("failed to verify: %s", err.Error())
  117. return
  118. }
  119. }
  120. func TestWrongSign(t *testing.T) {
  121. // create a temp directory
  122. if err := os.Mkdir("temp", 0755); err != nil {
  123. t.Errorf("failed to create temp directory: %s", err.Error())
  124. return
  125. }
  126. defer func() {
  127. os.RemoveAll("temp")
  128. os.Remove("temp")
  129. }()
  130. // create manifest
  131. if err := os.WriteFile("temp/manifest.yaml", manifest, 0644); err != nil {
  132. t.Errorf("failed to write manifest: %s", err.Error())
  133. return
  134. }
  135. if err := os.WriteFile("temp/neko.yaml", neko, 0644); err != nil {
  136. t.Errorf("failed to write neko: %s", err.Error())
  137. return
  138. }
  139. // create _assets directory
  140. if err := os.MkdirAll("temp/_assets", 0755); err != nil {
  141. t.Errorf("failed to create _assets directory: %s", err.Error())
  142. return
  143. }
  144. // create _assets/test.svg
  145. if err := os.WriteFile("temp/_assets/test.svg", test_svg, 0644); err != nil {
  146. t.Errorf("failed to write test.svg: %s", err.Error())
  147. return
  148. }
  149. originDecoder, err := decoder.NewFSPluginDecoder("temp")
  150. if err != nil {
  151. t.Errorf("failed to create decoder: %s", err.Error())
  152. return
  153. }
  154. packager := packager.NewPackager(originDecoder)
  155. // pack
  156. zip, err := packager.Pack()
  157. if err != nil {
  158. t.Errorf("failed to pack: %s", err.Error())
  159. return
  160. }
  161. // sign
  162. signed, err := signer.SignPlugin(zip)
  163. if err != nil {
  164. t.Errorf("failed to sign: %s", err.Error())
  165. return
  166. }
  167. // modify the signed file, signature is at the end of the file
  168. signed[len(signed)-1] = 0
  169. signed[len(signed)-2] = 0
  170. // create a new decoder
  171. signedDecoder, err := decoder.NewZipPluginDecoder(signed)
  172. if err != nil {
  173. t.Errorf("failed to create zip decoder: %s", err.Error())
  174. return
  175. }
  176. // verify
  177. err = decoder.VerifyPlugin(signedDecoder)
  178. if err == nil {
  179. t.Errorf("should fail to verify")
  180. return
  181. }
  182. }