Skip to content

No Filters class for accept/deny IP filtering #117

Description

@sumanjeet0012

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions