check_client_ip_frozen_ban_test.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package job
  2. import (
  3. "os"
  4. "strings"
  5. "testing"
  6. "time"
  7. "github.com/mhsanaei/3x-ui/v3/internal/database"
  8. )
  9. func banLineCount(t *testing.T, email string) int {
  10. t.Helper()
  11. body, err := os.ReadFile(readIpLimitLogPath())
  12. if err != nil {
  13. if os.IsNotExist(err) {
  14. return 0
  15. }
  16. t.Fatalf("read 3xipl.log: %v", err)
  17. }
  18. return strings.Count(string(body), "[LIMIT_IP] Email = "+email)
  19. }
  20. func TestUpdateInboundClientIps_FrozenLastSeenBannedOnce(t *testing.T) {
  21. setupIntegrationDB(t)
  22. const email = "frozen-ban"
  23. seedInboundWithClient(t, "inbound-frozen-ban", email, 1)
  24. now := time.Now().Unix()
  25. deadStart := now - 300
  26. live := []IPWithTimestamp{
  27. {IP: "10.2.0.1", Timestamp: deadStart},
  28. {IP: "192.0.2.7", Timestamp: now},
  29. }
  30. j := NewCheckClientIpJob()
  31. inbound, err := j.getInboundByEmail(email)
  32. if err != nil {
  33. t.Fatalf("getInboundByEmail: %v", err)
  34. }
  35. row := seedClientIps(t, email, nil)
  36. if _, banned := j.updateInboundClientIps(database.GetDB(), row, inbound, email, 1, live, true, true); !banned {
  37. t.Fatalf("first scan: the over-limit stale IP must be banned")
  38. }
  39. if got := banLineCount(t, email); got != 1 {
  40. t.Fatalf("ban lines after first scan = %d, want 1", got)
  41. }
  42. if _, banned := j.updateInboundClientIps(database.GetDB(), row, inbound, email, 1, live, true, true); banned {
  43. t.Fatalf("second scan with a frozen lastSeen must not re-ban a dead connection")
  44. }
  45. if got := banLineCount(t, email); got != 1 {
  46. t.Fatalf("ban lines after frozen rescan = %d, want still 1", got)
  47. }
  48. reconnected := []IPWithTimestamp{
  49. {IP: "10.2.0.1", Timestamp: now + 30},
  50. {IP: "192.0.2.7", Timestamp: now + 60},
  51. }
  52. if _, banned := j.updateInboundClientIps(database.GetDB(), row, inbound, email, 1, reconnected, true, true); !banned {
  53. t.Fatalf("a reconnect (advanced lastSeen) must be banned again")
  54. }
  55. if got := banLineCount(t, email); got != 2 {
  56. t.Fatalf("ban lines after reconnect = %d, want 2", got)
  57. }
  58. }