Go's multiaddr package provides a Filters struct for managing accept/deny IP ranges. Python has no equivalent.
Problem
Go:
filters := multiaddr.NewFilters()
filters.AddFilter(ipnet, multiaddr.ActionDeny)
if filters.AddrBlocked(ma) {
// reject connection
}
Python has no address filtering capability.
Proposed Solution
Add multiaddr/filters.py:
import ipaddress
from enum import Enum
class Action(Enum):
ACCEPT = 1
DENY = 2
class Filters:
def __init__(self, default_action: Action = Action.ACCEPT):
self.default_action = default_action
self._filters: list[tuple[ipaddress.IPv4Network | IPv6Network, Action]] = []
def add_filter(self, network: str | ipaddress.IPv4Network, action: Action):
if isinstance(network, str):
network = ipaddress.ip_network(network)
self._filters.append((network, action))
def addr_blocked(self, ma: Multiaddr) -> bool:
"""Return True if the multiaddr should be denied."""
ip = _extract_ip(ma)
if ip is None:
return self.default_action == Action.DENY
action = self.default_action
for network, filter_action in self._filters:
if ip in network:
action = filter_action
return action == Action.DENY
Related
Go's
multiaddrpackage provides aFiltersstruct for managing accept/deny IP ranges. Python has no equivalent.Problem
Go:
Python has no address filtering capability.
Proposed Solution
Add
multiaddr/filters.py:Related
filter.go