whitelist.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package access
  2. import (
  3. "strings"
  4. "imuslab.com/zoraxy/mod/netutils"
  5. )
  6. /*
  7. Whitelist.go
  8. This script handles whitelist related functions
  9. */
  10. const (
  11. EntryType_CountryCode int = 0
  12. EntryType_IP int = 1
  13. )
  14. type WhitelistEntry struct {
  15. EntryType int //Entry type of whitelist, Country Code or IP
  16. CC string //ISO Country Code
  17. IP string //IP address or range
  18. Comment string //Comment for this entry
  19. }
  20. //Geo Whitelist
  21. func (s *AccessRule) AddCountryCodeToWhitelist(countryCode string, comment string) {
  22. countryCode = strings.ToLower(countryCode)
  23. newWhitelistCC := deepCopy(*s.WhiteListCountryCode)
  24. newWhitelistCC[countryCode] = comment
  25. s.WhiteListCountryCode = &newWhitelistCC
  26. s.SaveChanges()
  27. }
  28. func (s *AccessRule) RemoveCountryCodeFromWhitelist(countryCode string) {
  29. countryCode = strings.ToLower(countryCode)
  30. newWhitelistCC := deepCopy(*s.WhiteListCountryCode)
  31. delete(newWhitelistCC, countryCode)
  32. s.WhiteListCountryCode = &newWhitelistCC
  33. s.SaveChanges()
  34. }
  35. func (s *AccessRule) IsCountryCodeWhitelisted(countryCode string) bool {
  36. countryCode = strings.ToLower(countryCode)
  37. whitelistCC := *s.WhiteListCountryCode
  38. _, ok := whitelistCC[countryCode]
  39. return ok
  40. }
  41. func (s *AccessRule) GetAllWhitelistedCountryCode() []*WhitelistEntry {
  42. whitelistedCountryCode := []*WhitelistEntry{}
  43. whitelistCC := *s.WhiteListCountryCode
  44. for cc, comment := range whitelistCC {
  45. whitelistedCountryCode = append(whitelistedCountryCode, &WhitelistEntry{
  46. EntryType: EntryType_CountryCode,
  47. CC: cc,
  48. Comment: comment,
  49. })
  50. }
  51. return whitelistedCountryCode
  52. }
  53. //IP Whitelist
  54. func (s *AccessRule) AddIPToWhiteList(ipAddr string, comment string) {
  55. newWhitelistIP := deepCopy(*s.WhiteListIP)
  56. newWhitelistIP[ipAddr] = comment
  57. s.WhiteListIP = &newWhitelistIP
  58. s.SaveChanges()
  59. }
  60. func (s *AccessRule) RemoveIPFromWhiteList(ipAddr string) {
  61. newWhitelistIP := deepCopy(*s.WhiteListIP)
  62. delete(newWhitelistIP, ipAddr)
  63. s.WhiteListIP = &newWhitelistIP
  64. s.SaveChanges()
  65. }
  66. func (s *AccessRule) IsIPWhitelisted(ipAddr string) bool {
  67. //Check for IP wildcard and CIRD rules
  68. WhitelistedIP := *s.WhiteListIP
  69. for ipOrCIDR, _ := range WhitelistedIP {
  70. wildcardMatch := netutils.MatchIpWildcard(ipAddr, ipOrCIDR)
  71. if wildcardMatch {
  72. return true
  73. }
  74. cidrMatch := netutils.MatchIpCIDR(ipAddr, ipOrCIDR)
  75. if cidrMatch {
  76. return true
  77. }
  78. }
  79. return false
  80. }
  81. func (s *AccessRule) GetAllWhitelistedIp() []*WhitelistEntry {
  82. whitelistedIp := []*WhitelistEntry{}
  83. currentWhitelistedIP := *s.WhiteListIP
  84. for ipOrCIDR, comment := range currentWhitelistedIP {
  85. thisEntry := WhitelistEntry{
  86. EntryType: EntryType_IP,
  87. IP: ipOrCIDR,
  88. Comment: comment,
  89. }
  90. whitelistedIp = append(whitelistedIp, &thisEntry)
  91. }
  92. return whitelistedIp
  93. }