service_wireguard_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package sub
  2. import (
  3. "net/url"
  4. "testing"
  5. "github.com/mhsanaei/3x-ui/v3/internal/database"
  6. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  7. wgutil "github.com/mhsanaei/3x-ui/v3/internal/util/wireguard"
  8. )
  9. func TestGenWireguardLinkFields(t *testing.T) {
  10. serverPriv, serverPub, err := wgutil.GenerateWireguardKeypair()
  11. if err != nil {
  12. t.Fatalf("keypair: %v", err)
  13. }
  14. clientPriv, _, err := wgutil.GenerateWireguardKeypair()
  15. if err != nil {
  16. t.Fatalf("client keypair: %v", err)
  17. }
  18. inbound := &model.Inbound{
  19. Listen: "203.0.113.7",
  20. Port: 51820,
  21. Protocol: model.WireGuard,
  22. Remark: "wg-sub",
  23. Settings: `{"secretKey":"` + serverPriv + `","mtu":1420,"clients":[{"email":"user","privateKey":"` + clientPriv + `","allowedIPs":["10.0.0.2/32"],"keepAlive":25}]}`,
  24. }
  25. s := &SubService{}
  26. link := s.genWireguardLink(inbound, "user")
  27. u, err := url.Parse(link)
  28. if err != nil {
  29. t.Fatalf("link does not parse: %v\n got: %s", err, link)
  30. }
  31. if u.Scheme != "wireguard" {
  32. t.Fatalf("scheme = %q, want wireguard", u.Scheme)
  33. }
  34. if u.Host != "203.0.113.7:51820" {
  35. t.Fatalf("host = %q, want 203.0.113.7:51820", u.Host)
  36. }
  37. if u.User.Username() != clientPriv {
  38. t.Fatalf("userinfo = %q, want client private key %q", u.User.Username(), clientPriv)
  39. }
  40. q := u.Query()
  41. if q.Get("publickey") != serverPub {
  42. t.Fatalf("publickey = %q, want server public key %q", q.Get("publickey"), serverPub)
  43. }
  44. if q.Get("address") != "10.0.0.2/32" {
  45. t.Fatalf("address = %q, want 10.0.0.2/32", q.Get("address"))
  46. }
  47. if q.Get("mtu") != "1420" {
  48. t.Fatalf("mtu = %q, want 1420", q.Get("mtu"))
  49. }
  50. }
  51. func TestGenWireguardLinkMultiAllowedIPs(t *testing.T) {
  52. serverPriv, _, err := wgutil.GenerateWireguardKeypair()
  53. if err != nil {
  54. t.Fatalf("keypair: %v", err)
  55. }
  56. clientPriv, _, err := wgutil.GenerateWireguardKeypair()
  57. if err != nil {
  58. t.Fatalf("client keypair: %v", err)
  59. }
  60. inbound := &model.Inbound{
  61. Listen: "203.0.113.7",
  62. Port: 51820,
  63. Protocol: model.WireGuard,
  64. Remark: "wg-sub",
  65. Settings: `{"secretKey":"` + serverPriv + `","clients":[{"email":"user","privateKey":"` + clientPriv + `","allowedIPs":["10.0.0.2/32","fd00::2/128"]}]}`,
  66. }
  67. s := &SubService{}
  68. link := s.genWireguardLink(inbound, "user")
  69. u, err := url.Parse(link)
  70. if err != nil {
  71. t.Fatalf("link does not parse: %v\n got: %s", err, link)
  72. }
  73. if got, want := u.Query().Get("address"), "10.0.0.2/32,fd00::2/128"; got != want {
  74. t.Fatalf("address = %q, want %q (all allowed IPs joined, not just the first)", got, want)
  75. }
  76. }
  77. func TestGenWireguardLinkWrongProtocol(t *testing.T) {
  78. s := &SubService{}
  79. vless := &model.Inbound{Protocol: model.VLESS, Settings: `{"clients":[{"email":"user"}]}`}
  80. if got := s.genWireguardLink(vless, "user"); got != "" {
  81. t.Fatalf("wrong protocol should yield empty link, got %q", got)
  82. }
  83. }
  84. func TestGenWireguardLinkNoKey(t *testing.T) {
  85. s := &SubService{}
  86. inbound := &model.Inbound{
  87. Protocol: model.WireGuard,
  88. Port: 51820,
  89. Settings: `{"secretKey":"x","clients":[{"email":"user"}]}`,
  90. }
  91. if got := s.genWireguardLink(inbound, "user"); got != "" {
  92. t.Fatalf("client without private key should yield empty link, got %q", got)
  93. }
  94. }
  95. func TestGetInboundsBySubIdIncludesWireguard(t *testing.T) {
  96. initSubDB(t)
  97. db := database.GetDB()
  98. in := &model.Inbound{Port: 51820, Protocol: model.WireGuard, Enable: true, Tag: "wg-sub", Settings: `{"secretKey":"x","clients":[]}`}
  99. if err := db.Create(in).Error; err != nil {
  100. t.Fatalf("create inbound: %v", err)
  101. }
  102. rec := &model.ClientRecord{Email: "u@wg", SubID: "subwg", Enable: true}
  103. if err := db.Create(rec).Error; err != nil {
  104. t.Fatalf("create client: %v", err)
  105. }
  106. if err := db.Create(&model.ClientInbound{ClientId: rec.Id, InboundId: in.Id}).Error; err != nil {
  107. t.Fatalf("create link: %v", err)
  108. }
  109. s := &SubService{}
  110. inbounds, err := s.getInboundsBySubId("subwg")
  111. if err != nil {
  112. t.Fatalf("getInboundsBySubId: %v", err)
  113. }
  114. if len(inbounds) != 1 || inbounds[0].Id != in.Id {
  115. t.Fatalf("wireguard inbound not returned for subId: %+v", inbounds)
  116. }
  117. }