|
@@ -3,8 +3,8 @@ package geodb
|
|
|
import (
|
|
|
_ "embed"
|
|
|
"log"
|
|
|
+ "net"
|
|
|
"net/http"
|
|
|
- "strings"
|
|
|
|
|
|
"imuslab.com/zoraxy/mod/database"
|
|
|
)
|
|
@@ -112,170 +112,6 @@ func (s *Store) Close() {
|
|
|
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- Country code based black / white list
|
|
|
-*/
|
|
|
-
|
|
|
-func (s *Store) AddCountryCodeToBlackList(countryCode string) {
|
|
|
- countryCode = strings.ToLower(countryCode)
|
|
|
- s.sysdb.Write("blacklist-cn", countryCode, true)
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) RemoveCountryCodeFromBlackList(countryCode string) {
|
|
|
- countryCode = strings.ToLower(countryCode)
|
|
|
- s.sysdb.Delete("blacklist-cn", countryCode)
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) AddCountryCodeToWhitelist(countryCode string) {
|
|
|
- countryCode = strings.ToLower(countryCode)
|
|
|
- s.sysdb.Write("whitelist-cn", countryCode, true)
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) RemoveCountryCodeFromWhitelist(countryCode string) {
|
|
|
- countryCode = strings.ToLower(countryCode)
|
|
|
- s.sysdb.Delete("whitelist-cn", countryCode)
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) IsCountryCodeBlacklisted(countryCode string) bool {
|
|
|
- countryCode = strings.ToLower(countryCode)
|
|
|
- var isBlacklisted bool = false
|
|
|
- s.sysdb.Read("blacklist-cn", countryCode, &isBlacklisted)
|
|
|
- return isBlacklisted
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) IsCountryCodeWhitelisted(countryCode string) bool {
|
|
|
- countryCode = strings.ToLower(countryCode)
|
|
|
- var isWhitelisted bool = false
|
|
|
- s.sysdb.Read("whitelist-cn", countryCode, &isWhitelisted)
|
|
|
- return isWhitelisted
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) GetAllBlacklistedCountryCode() []string {
|
|
|
- bannedCountryCodes := []string{}
|
|
|
- entries, err := s.sysdb.ListTable("blacklist-cn")
|
|
|
- if err != nil {
|
|
|
- return bannedCountryCodes
|
|
|
- }
|
|
|
- for _, keypairs := range entries {
|
|
|
- ip := string(keypairs[0])
|
|
|
- bannedCountryCodes = append(bannedCountryCodes, ip)
|
|
|
- }
|
|
|
-
|
|
|
- return bannedCountryCodes
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) GetAllWhitelistedCountryCode() []string {
|
|
|
- whitelistedCountryCode := []string{}
|
|
|
- entries, err := s.sysdb.ListTable("whitelist-cn")
|
|
|
- if err != nil {
|
|
|
- return whitelistedCountryCode
|
|
|
- }
|
|
|
- for _, keypairs := range entries {
|
|
|
- ip := string(keypairs[0])
|
|
|
- whitelistedCountryCode = append(whitelistedCountryCode, ip)
|
|
|
- }
|
|
|
-
|
|
|
- return whitelistedCountryCode
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- IP based black / whitelist
|
|
|
-*/
|
|
|
-
|
|
|
-func (s *Store) AddIPToBlackList(ipAddr string) {
|
|
|
- s.sysdb.Write("blacklist-ip", ipAddr, true)
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) RemoveIPFromBlackList(ipAddr string) {
|
|
|
- s.sysdb.Delete("blacklist-ip", ipAddr)
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) AddIPToWhiteList(ipAddr string) {
|
|
|
- s.sysdb.Write("whitelist-ip", ipAddr, true)
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) RemoveIPFromWhiteList(ipAddr string) {
|
|
|
- s.sysdb.Delete("whitelist-ip", ipAddr)
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) IsIPBlacklisted(ipAddr string) bool {
|
|
|
- var isBlacklisted bool = false
|
|
|
- s.sysdb.Read("blacklist-ip", ipAddr, &isBlacklisted)
|
|
|
- if isBlacklisted {
|
|
|
- return true
|
|
|
- }
|
|
|
-
|
|
|
- //Check for IP wildcard and CIRD rules
|
|
|
- AllBlacklistedIps := s.GetAllBlacklistedIp()
|
|
|
- for _, blacklistRule := range AllBlacklistedIps {
|
|
|
- wildcardMatch := MatchIpWildcard(ipAddr, blacklistRule)
|
|
|
- if wildcardMatch {
|
|
|
- return true
|
|
|
- }
|
|
|
-
|
|
|
- cidrMatch := MatchIpCIDR(ipAddr, blacklistRule)
|
|
|
- if cidrMatch {
|
|
|
- return true
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return false
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) IsIPWhitelisted(ipAddr string) bool {
|
|
|
- var isBlacklisted bool = false
|
|
|
- s.sysdb.Read("whitelist-ip", ipAddr, &isBlacklisted)
|
|
|
- if isBlacklisted {
|
|
|
- return true
|
|
|
- }
|
|
|
-
|
|
|
- //Check for IP wildcard and CIRD rules
|
|
|
- AllBlacklistedIps := s.GetAllBlacklistedIp()
|
|
|
- for _, blacklistRule := range AllBlacklistedIps {
|
|
|
- wildcardMatch := MatchIpWildcard(ipAddr, blacklistRule)
|
|
|
- if wildcardMatch {
|
|
|
- return true
|
|
|
- }
|
|
|
-
|
|
|
- cidrMatch := MatchIpCIDR(ipAddr, blacklistRule)
|
|
|
- if cidrMatch {
|
|
|
- return true
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return false
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) GetAllBlacklistedIp() []string {
|
|
|
- bannedIps := []string{}
|
|
|
- entries, err := s.sysdb.ListTable("blacklist-ip")
|
|
|
- if err != nil {
|
|
|
- return bannedIps
|
|
|
- }
|
|
|
-
|
|
|
- for _, keypairs := range entries {
|
|
|
- ip := string(keypairs[0])
|
|
|
- bannedIps = append(bannedIps, ip)
|
|
|
- }
|
|
|
-
|
|
|
- return bannedIps
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Store) GetAllWhitelistedIp() []string {
|
|
|
- whitelistedIp := []string{}
|
|
|
- entries, err := s.sysdb.ListTable("whitelist-ip")
|
|
|
- if err != nil {
|
|
|
- return whitelistedIp
|
|
|
- }
|
|
|
-
|
|
|
- for _, keypairs := range entries {
|
|
|
- ip := string(keypairs[0])
|
|
|
- whitelistedIp = append(whitelistedIp, ip)
|
|
|
- }
|
|
|
-
|
|
|
- return whitelistedIp
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
Check if a IP address is blacklisted, in either country or IP blacklist
|
|
|
IsBlacklisted default return is false (allow access)
|
|
@@ -341,6 +177,23 @@ func (s *Store) IsWhitelisted(ipAddr string) bool {
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
+// A helper function that check both blacklist and whitelist for access
|
|
|
+// for both geoIP and ip / CIDR ranges
|
|
|
+func (s *Store) AllowIpAccess(ipaddr string) bool {
|
|
|
+ if s.IsBlacklisted(ipaddr) {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ return s.IsWhitelisted(ipaddr)
|
|
|
+}
|
|
|
+
|
|
|
+func (s *Store) AllowConnectionAccess(conn net.Conn) bool {
|
|
|
+ if addr, ok := conn.RemoteAddr().(*net.TCPAddr); ok {
|
|
|
+ return s.AllowIpAccess(addr.IP.String())
|
|
|
+ }
|
|
|
+ return true
|
|
|
+}
|
|
|
+
|
|
|
func (s *Store) GetRequesterCountryISOCode(r *http.Request) string {
|
|
|
ipAddr := GetRequesterIP(r)
|
|
|
if ipAddr == "" {
|