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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions