test.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/env python3
  2. """Placeholder helpers: detect TEST-NET, load_botnet_file flags, warn_placeholders per kind."""
  3. import sys, os, tempfile
  4. err = []
  5. from core._botnet import is_placeholder, load_botnet_file, warn_placeholders, GUIDANCE, PLACEHOLDER_NETS
  6. if not (str(PLACEHOLDER_NETS[0]) == "203.0.113.0/24"):
  7. err.append("PLACEHOLDER_NETS missing TEST-NET-3")
  8. cases = [
  9. ("203.0.113.5", True),
  10. ("192.0.2.1", True),
  11. ("198.51.100.99", True),
  12. ("8.8.8.8", False),
  13. ("https://example.com/", False),
  14. ("https://203.0.113.1/path", True),
  15. ("203.0.113.1:11211", True),
  16. ("", True),
  17. ]
  18. for entry, expected in cases:
  19. got = is_placeholder(entry)
  20. if got != expected:
  21. err.append(f"is_placeholder({entry!r}) = {got}, expected {expected}")
  22. with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
  23. f.write("")
  24. empty_path = f.name
  25. entries, empty, all_ph = load_botnet_file(empty_path)
  26. if not empty or entries:
  27. err.append(f"empty file: empty={empty}, entries={entries}")
  28. with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
  29. f.write("203.0.113.10\n203.0.113.11\n")
  30. ph_path = f.name
  31. entries, empty, all_ph = load_botnet_file(ph_path)
  32. if empty or not all_ph or len(entries) != 2:
  33. err.append(f"all-placeholders: empty={empty}, all_ph={all_ph}, entries={entries}")
  34. with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
  35. f.write("8.8.8.8\n203.0.113.99\n")
  36. mix_path = f.name
  37. entries, empty, all_ph = load_botnet_file(mix_path)
  38. if empty or all_ph or len(entries) != 2:
  39. err.append(f"mixed: empty={empty}, all_ph={all_ph}, entries={entries}")
  40. for kind in ["open-redirect", "dns", "ntp", "snmp", "memcached", "cldap",
  41. "ssdp", "qotd", "tftp", "wsdisco", "coap", "mssql",
  42. "arms", "plex", "netbios", "ripv1", "middlebox", "chargen", "reflector"]:
  43. if kind not in GUIDANCE:
  44. err.append(f"missing GUIDANCE for kind: {kind}")
  45. os.unlink(empty_path); os.unlink(ph_path); os.unlink(mix_path)
  46. print(f"placeholder cases: {len(cases) - len(err)} / {len(cases)}")
  47. print(f"GUIDANCE entries: {len(GUIDANCE)}")
  48. for e in err:
  49. print("FAIL:", e)
  50. sys.exit(0 if not err else 1)