packager_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. origin_decoder, 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 = origin_decoder.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 := origin_decoder.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(origin_decoder)
  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. signed_decoder, 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 = signed_decoder.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(signed_decoder)
  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. origin_decoder, err := decoder.NewFSPluginDecoder("temp")
  140. if err != nil {
  141. t.Errorf("failed to create decoder: %s", err.Error())
  142. return
  143. }
  144. packager := packager.NewPackager(origin_decoder)
  145. // pack
  146. zip, err := packager.Pack()
  147. if err != nil {
  148. t.Errorf("failed to pack: %s", err.Error())
  149. return
  150. }
  151. // sign
  152. signed, err := signer.SignPlugin(zip)
  153. if err != nil {
  154. t.Errorf("failed to sign: %s", err.Error())
  155. return
  156. }
  157. // modify the signed file, signature is at the end of the file
  158. signed[len(signed)-1] = 0
  159. signed[len(signed)-2] = 0
  160. // create a new decoder
  161. signed_decoder, err := decoder.NewZipPluginDecoder(signed)
  162. if err != nil {
  163. t.Errorf("failed to create zip decoder: %s", err.Error())
  164. return
  165. }
  166. // verify
  167. err = decoder.VerifyPlugin(signed_decoder)
  168. if err == nil {
  169. t.Errorf("should fail to verify")
  170. return
  171. }
  172. }