salamander.go 943 B

123456789101112131415161718192021222324252627
  1. package maskcompat
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. // SalamanderMinPSK is xray-core's smPSKMinLen, in bytes; the core enforces it only when a socket
  7. // opens, so a shorter password loads fine and then stops the listener or fails every dial.
  8. const SalamanderMinPSK = 4
  9. // CheckSalamanderPasswords refuses a salamander (or gecko) UDP mask the core would not open.
  10. func CheckSalamanderPasswords(finalmask any) error {
  11. fm, _ := finalmask.(map[string]any)
  12. masks, _ := fm["udp"].([]any)
  13. for _, entry := range masks {
  14. mask, _ := entry.(map[string]any)
  15. if maskType, _ := mask["type"].(string); !strings.EqualFold(maskType, "salamander") {
  16. continue
  17. }
  18. settings, _ := mask["settings"].(map[string]any)
  19. if password, _ := settings["password"].(string); len(password) < SalamanderMinPSK {
  20. return fmt.Errorf("salamander finalmask password must be at least %d bytes; xray-core refuses a shorter one", SalamanderMinPSK)
  21. }
  22. }
  23. return nil
  24. }