1
0

geodb.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package geodb
  2. import (
  3. _ "embed"
  4. "net/http"
  5. "imuslab.com/zoraxy/mod/database"
  6. "imuslab.com/zoraxy/mod/netutils"
  7. )
  8. //go:embed geoipv4.csv
  9. var geoipv4 []byte //Geodb dataset for ipv4
  10. //go:embed geoipv6.csv
  11. var geoipv6 []byte //Geodb dataset for ipv6
  12. type Store struct {
  13. geodb [][]string //Parsed geodb list
  14. geodbIpv6 [][]string //Parsed geodb list for ipv6
  15. geotrie *trie
  16. geotrieIpv6 *trie
  17. //geoipCache sync.Map
  18. sysdb *database.Database
  19. option *StoreOptions
  20. }
  21. type StoreOptions struct {
  22. AllowSlowIpv4LookUp bool
  23. AllowSloeIpv6Lookup bool
  24. }
  25. type CountryInfo struct {
  26. CountryIsoCode string
  27. ContinetCode string
  28. }
  29. func NewGeoDb(sysdb *database.Database, option *StoreOptions) (*Store, error) {
  30. parsedGeoData, err := parseCSV(geoipv4)
  31. if err != nil {
  32. return nil, err
  33. }
  34. parsedGeoDataIpv6, err := parseCSV(geoipv6)
  35. if err != nil {
  36. return nil, err
  37. }
  38. var ipv4Trie *trie
  39. if !option.AllowSlowIpv4LookUp {
  40. ipv4Trie = constrctTrieTree(parsedGeoData)
  41. }
  42. var ipv6Trie *trie
  43. if !option.AllowSloeIpv6Lookup {
  44. ipv6Trie = constrctTrieTree(parsedGeoDataIpv6)
  45. }
  46. return &Store{
  47. geodb: parsedGeoData,
  48. geotrie: ipv4Trie,
  49. geodbIpv6: parsedGeoDataIpv6,
  50. geotrieIpv6: ipv6Trie,
  51. sysdb: sysdb,
  52. option: option,
  53. }, nil
  54. }
  55. func (s *Store) ResolveCountryCodeFromIP(ipstring string) (*CountryInfo, error) {
  56. cc := s.search(ipstring)
  57. return &CountryInfo{
  58. CountryIsoCode: cc,
  59. ContinetCode: "",
  60. }, nil
  61. }
  62. func (s *Store) Close() {
  63. }
  64. func (s *Store) GetRequesterCountryISOCode(r *http.Request) string {
  65. ipAddr := netutils.GetRequesterIP(r)
  66. if ipAddr == "" {
  67. return ""
  68. }
  69. if netutils.IsPrivateIP(ipAddr) {
  70. return "LAN"
  71. }
  72. countryCode, err := s.ResolveCountryCodeFromIP(ipAddr)
  73. if err != nil {
  74. return ""
  75. }
  76. return countryCode.CountryIsoCode
  77. }