1
0

vmess_tls_import_test.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package sub
  2. import (
  3. "encoding/json"
  4. "testing"
  5. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  6. "github.com/mhsanaei/3x-ui/v3/internal/util/link"
  7. )
  8. // The vmess object carries the certificate checks the panel exported, so
  9. // importing that same link has to rebuild them instead of dropping them.
  10. func TestVmessTLSVerifyFieldsSurviveExportImport(t *testing.T) {
  11. in := &model.Inbound{
  12. Id: 940002, Listen: "203.0.113.1", Port: 8443, Protocol: model.VMESS,
  13. Settings: `{"clients":[{"id":"11111111-2222-4333-8444-555555555555","email":"user"}]}`,
  14. StreamSettings: `{"network":"tcp","security":"tls","tcpSettings":{"header":{"type":"none"}},` +
  15. `"tlsSettings":{"serverName":"vmess.example.com","alpn":["h2"],"settings":{` +
  16. `"fingerprint":"chrome","echConfigList":"AEX+DQBB","verifyPeerCertByName":"vcn.example.com",` +
  17. `"pinnedPeerCertSha256":["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="]}}}`,
  18. }
  19. exported := (&SubService{}).genVmessLink(in, "user")
  20. if exported == "" {
  21. t.Fatal("genVmessLink produced nothing")
  22. }
  23. parsed, err := link.ParseLink(exported)
  24. if err != nil {
  25. t.Fatalf("ParseLink: %v", err)
  26. }
  27. raw, err := json.Marshal(parsed.Outbound["streamSettings"])
  28. if err != nil {
  29. t.Fatalf("marshal stream: %v", err)
  30. }
  31. var stream map[string]any
  32. if err := json.Unmarshal(raw, &stream); err != nil {
  33. t.Fatalf("stream json: %v", err)
  34. }
  35. tlsSettings, _ := stream["tlsSettings"].(map[string]any)
  36. if tlsSettings == nil {
  37. t.Fatalf("no tlsSettings: %s", raw)
  38. }
  39. // The core reads these joined strings in its config, as applySecurity writes them.
  40. for field, want := range map[string]string{
  41. "serverName": "vmess.example.com",
  42. "fingerprint": "chrome",
  43. "echConfigList": "AEX+DQBB",
  44. "verifyPeerCertByName": "vcn.example.com",
  45. "pinnedPeerCertSha256": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
  46. } {
  47. if tlsSettings[field] != want {
  48. t.Errorf("tlsSettings[%q] = %v, want %q", field, tlsSettings[field], want)
  49. }
  50. }
  51. alpn, _ := tlsSettings["alpn"].([]any)
  52. if len(alpn) != 1 || alpn[0] != "h2" {
  53. t.Errorf("alpn = %v, want [h2]", tlsSettings["alpn"])
  54. }
  55. }