packager_test.go 3.9 KB

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