whitelist.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package whitelist
  2. import (
  3. "errors"
  4. "log"
  5. "strings"
  6. "imuslab.com/arozos/mod/auth/accesscontrol"
  7. "imuslab.com/arozos/mod/database"
  8. )
  9. /*
  10. Whitelist
  11. */
  12. type WhiteList struct {
  13. database *database.Database
  14. Enabled bool
  15. }
  16. func NewWhitelistManager(sysdb *database.Database) *WhiteList {
  17. sysdb.NewTable("ipwhitelist")
  18. whitelistEnabled := false
  19. if sysdb.KeyExists("ipwhitelist", "enable") {
  20. err := sysdb.Read("ipwhitelist", "enable", &whitelistEnabled)
  21. if err != nil {
  22. log.Println("[Auth/Whitelist] Unable to load previous enable state from database. Using default.")
  23. }
  24. }
  25. return &WhiteList{
  26. database: sysdb,
  27. Enabled: whitelistEnabled,
  28. }
  29. }
  30. func (wl *WhiteList) SetWhitelistEnabled(enable bool) {
  31. if enable {
  32. wl.Enabled = true
  33. wl.database.Write("ipwhitelist", "enable", true)
  34. } else {
  35. wl.Enabled = false
  36. wl.database.Write("ipwhitelist", "enable", false)
  37. }
  38. }
  39. func (wl *WhiteList) IsWhitelisted(ip string) bool {
  40. //Check if whitelist is enabled
  41. if wl.Enabled == false {
  42. return true
  43. }
  44. //Check if this is reserved IP address
  45. if ip == "127.0.0.1" || ip == "localhost" {
  46. return true
  47. }
  48. //Check if this particular ip is whitelisted
  49. if wl.database.KeyExists("ipwhitelist", ip) {
  50. return true
  51. }
  52. //The ip might be inside as a range. Do a range search.
  53. //Need optimization, current implementation is O(N)
  54. for _, thisIpRange := range wl.ListWhitelistedIpRanges() {
  55. if accesscontrol.IpInRange(ip, thisIpRange) {
  56. return true
  57. }
  58. }
  59. return false
  60. }
  61. func (wl *WhiteList) ListWhitelistedIpRanges() []string {
  62. entries, err := wl.database.ListTable("ipwhitelist")
  63. if err != nil {
  64. return []string{}
  65. }
  66. results := []string{"127.0.0.1"}
  67. for _, keypairs := range entries {
  68. thisIpRange := keypairs[0]
  69. if string(thisIpRange) == "enable" || accesscontrol.ValidateIpRange(string(thisIpRange)) != nil {
  70. //Reserved key field
  71. continue
  72. }
  73. results = append(results, string(thisIpRange))
  74. }
  75. return results
  76. }
  77. func (wl *WhiteList) SetWhitelist(ipRange string) error {
  78. //Check if the IP range is correct
  79. err := accesscontrol.ValidateIpRange(ipRange)
  80. if err != nil {
  81. return err
  82. }
  83. //Push it to the ban list
  84. ipRange = strings.TrimSpace(ipRange)
  85. ipRange = strings.ReplaceAll(ipRange, " ", "")
  86. return wl.database.Write("ipwhitelist", ipRange, true)
  87. }
  88. func (wl *WhiteList) UnsetWhitelist(ipRange string) error {
  89. //Check if the IP range is correct
  90. err := accesscontrol.ValidateIpRange(ipRange)
  91. if err != nil {
  92. return err
  93. }
  94. //Check if the ip range is banned
  95. if !wl.database.KeyExists("ipwhitelist", ipRange) {
  96. return errors.New("invalid IP range given")
  97. }
  98. //Ip range exists, remove it from database
  99. return wl.database.Delete("ipwhitelist", ipRange)
  100. }