123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package whitelist
- import (
- "errors"
- "log"
- "strings"
- "imuslab.com/arozos/mod/auth/accesscontrol"
- "imuslab.com/arozos/mod/database"
- )
- /*
- Whitelist
- */
- type WhiteList struct {
- database *database.Database
- Enabled bool
- }
- func NewWhitelistManager(sysdb *database.Database) *WhiteList {
- sysdb.NewTable("ipwhitelist")
- whitelistEnabled := false
- if sysdb.KeyExists("ipwhitelist", "enable") {
- err := sysdb.Read("ipwhitelist", "enable", &whitelistEnabled)
- if err != nil {
- log.Println("[Auth/Whitelist] Unable to load previous enable state from database. Using default.")
- }
- }
- return &WhiteList{
- database: sysdb,
- Enabled: whitelistEnabled,
- }
- }
- func (wl *WhiteList) SetWhitelistEnabled(enable bool) {
- if enable {
- wl.Enabled = true
- wl.database.Write("ipwhitelist", "enable", true)
- } else {
- wl.Enabled = false
- wl.database.Write("ipwhitelist", "enable", false)
- }
- }
- func (wl *WhiteList) IsWhitelisted(ip string) bool {
- //Check if whitelist is enabled
- if wl.Enabled == false {
- return true
- }
- //Check if this is reserved IP address
- if ip == "127.0.0.1" || ip == "localhost" {
- return true
- }
- //Check if this particular ip is whitelisted
- if wl.database.KeyExists("ipwhitelist", ip) {
- return true
- }
- //The ip might be inside as a range. Do a range search.
- //Need optimization, current implementation is O(N)
- for _, thisIpRange := range wl.ListWhitelistedIpRanges() {
- if accesscontrol.IpInRange(ip, thisIpRange) {
- return true
- }
- }
- return false
- }
- func (wl *WhiteList) ListWhitelistedIpRanges() []string {
- entries, err := wl.database.ListTable("ipwhitelist")
- if err != nil {
- return []string{}
- }
- results := []string{"127.0.0.1"}
- for _, keypairs := range entries {
- thisIpRange := keypairs[0]
- if string(thisIpRange) == "enable" || accesscontrol.ValidateIpRange(string(thisIpRange)) != nil {
- //Reserved key field
- continue
- }
- results = append(results, string(thisIpRange))
- }
- return results
- }
- func (wl *WhiteList) SetWhitelist(ipRange string) error {
- //Check if the IP range is correct
- err := accesscontrol.ValidateIpRange(ipRange)
- if err != nil {
- return err
- }
- //Push it to the ban list
- ipRange = strings.TrimSpace(ipRange)
- ipRange = strings.ReplaceAll(ipRange, " ", "")
- return wl.database.Write("ipwhitelist", ipRange, true)
- }
- func (wl *WhiteList) UnsetWhitelist(ipRange string) error {
- //Check if the IP range is correct
- err := accesscontrol.ValidateIpRange(ipRange)
- if err != nil {
- return err
- }
- //Check if the ip range is banned
- if !wl.database.KeyExists("ipwhitelist", ipRange) {
- return errors.New("invalid IP range given")
- }
- //Ip range exists, remove it from database
- return wl.database.Delete("ipwhitelist", ipRange)
- }
|