e08a64ebe4
Updates #2624. Updates #3162. Squashed commit of the following: commit 68860da717a23a0bfeba14b7fe10b5e4ad38726d Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Tue Jun 29 15:41:33 2021 +0300 all: imp types, names commit ebd4ec26636853d0d58c4e331e6a78feede20813 Merge: 239eb72116e5e09c
Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Tue Jun 29 15:14:33 2021 +0300 Merge branch 'master' into 2624-clientid-access commit 239eb7215abc47e99a0300a0f4cf56002689b1a9 Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Tue Jun 29 15:13:10 2021 +0300 all: fix client blocking check commit e6bece3ea8367b3cbe3d90702a3368c870ad4f13 Merge: 9935f2a39d1656b5
Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Tue Jun 29 13:12:28 2021 +0300 Merge branch 'master' into 2624-clientid-access commit 9935f2a30bcfae2b853f3ef610c0ab7a56a8f448 Author: Ildar Kamalov <ik@adguard.com> Date: Tue Jun 29 11:26:51 2021 +0300 client: show block button for client id commit ed786a6a74a081cd89e9d67df3537a4fadd54831 Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Fri Jun 25 15:56:23 2021 +0300 client: imp i18n commit 4fed21c68473ad408960c08a7d87624cabce1911 Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Fri Jun 25 15:34:09 2021 +0300 all: imp i18n, docs commit 55e65c0d6b939560c53dcb834a4557eb3853d194 Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Fri Jun 25 13:34:01 2021 +0300 all: fix cache, imp code, docs, tests commit c1e5a83e76deb44b1f92729bb9ddfcc6a96ac4a8 Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Thu Jun 24 19:27:12 2021 +0300 all: allow clientid in access settings
113 lines
2.3 KiB
Go
113 lines
2.3 KiB
Go
package aghnet
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
)
|
|
|
|
// ipArr is a representation of an IP address as an array of bytes.
|
|
type ipArr [16]byte
|
|
|
|
// String implements the fmt.Stringer interface for ipArr.
|
|
func (a ipArr) String() (s string) {
|
|
return net.IP(a[:]).String()
|
|
}
|
|
|
|
// IPMap is a map of IP addresses.
|
|
type IPMap struct {
|
|
m map[ipArr]interface{}
|
|
}
|
|
|
|
// NewIPMap returns a new empty IP map using hint as a size hint for the
|
|
// underlying map.
|
|
func NewIPMap(hint int) (m *IPMap) {
|
|
return &IPMap{
|
|
m: make(map[ipArr]interface{}, hint),
|
|
}
|
|
}
|
|
|
|
// ipToArr converts a net.IP into an ipArr.
|
|
//
|
|
// TODO(a.garipov): Use the slice-to-array conversion in Go 1.17.
|
|
func ipToArr(ip net.IP) (a ipArr) {
|
|
copy(a[:], ip.To16())
|
|
|
|
return a
|
|
}
|
|
|
|
// Del deletes ip from the map. Calling Del on a nil *IPMap has no effect, just
|
|
// like delete on an empty map doesn't.
|
|
func (m *IPMap) Del(ip net.IP) {
|
|
if m != nil {
|
|
delete(m.m, ipToArr(ip))
|
|
}
|
|
}
|
|
|
|
// Get returns the value from the map. Calling Get on a nil *IPMap returns nil
|
|
// and false, just like indexing on an empty map does.
|
|
func (m *IPMap) Get(ip net.IP) (v interface{}, ok bool) {
|
|
if m != nil {
|
|
v, ok = m.m[ipToArr(ip)]
|
|
|
|
return v, ok
|
|
}
|
|
|
|
return nil, false
|
|
}
|
|
|
|
// Len returns the length of the map. A nil *IPMap has a length of zero, just
|
|
// like an empty map.
|
|
func (m *IPMap) Len() (n int) {
|
|
if m == nil {
|
|
return 0
|
|
}
|
|
|
|
return len(m.m)
|
|
}
|
|
|
|
// Range calls f for each key and value present in the map in an undefined
|
|
// order. If cont is false, range stops the iteration. Calling Range on a nil
|
|
// *IPMap has no effect, just like ranging over a nil map.
|
|
func (m *IPMap) Range(f func(ip net.IP, v interface{}) (cont bool)) {
|
|
if m == nil {
|
|
return
|
|
}
|
|
|
|
for k, v := range m.m {
|
|
if !f(net.IP(k[:]), v) {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
// Set sets the value. Set panics if the m is a nil *IPMap, just like a nil map
|
|
// does.
|
|
func (m *IPMap) Set(ip net.IP, v interface{}) {
|
|
m.m[ipToArr(ip)] = v
|
|
}
|
|
|
|
// ShallowClone returns a shallow clone of the map.
|
|
func (m *IPMap) ShallowClone() (sclone *IPMap) {
|
|
if m == nil {
|
|
return nil
|
|
}
|
|
|
|
sclone = NewIPMap(m.Len())
|
|
m.Range(func(ip net.IP, v interface{}) (cont bool) {
|
|
sclone.Set(ip, v)
|
|
|
|
return true
|
|
})
|
|
|
|
return sclone
|
|
}
|
|
|
|
// String implements the fmt.Stringer interface for *IPMap.
|
|
func (m *IPMap) String() (s string) {
|
|
if m == nil {
|
|
return "<nil>"
|
|
}
|
|
|
|
return fmt.Sprint(m.m)
|
|
}
|