Skip to content

feat: Support For Network ACL Endpoints #706

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ For more code samples on how to integrate the auth0-python SDK in your Python ap
- Jobs() ( `Auth0().jobs` )
- LogStreams() ( `Auth0().log_streams` )
- Logs() ( `Auth0().logs` )
- NetworkAcls() ( `Auth0().network_acls` )
- Organizations() ( `Auth0().organizations` )
- Prompts() ( `Auth0().prompts` )
- ResourceServers() (`Auth0().resource_servers` )
Expand Down
2 changes: 2 additions & 0 deletions auth0/management/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from .jobs import Jobs
from .log_streams import LogStreams
from .logs import Logs
from .network_acls import NetworkAcls
from .organizations import Organizations
from .resource_servers import ResourceServers
from .roles import Roles
Expand Down Expand Up @@ -55,6 +56,7 @@
"Jobs",
"LogStreams",
"Logs",
"NetworkAcls"
"Organizations",
"ResourceServers",
"Roles",
Expand Down
2 changes: 2 additions & 0 deletions auth0/management/auth0.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from .jobs import Jobs
from .log_streams import LogStreams
from .logs import Logs
from .network_acls import NetworkAcls
from .organizations import Organizations
from .prompts import Prompts
from .resource_servers import ResourceServers
Expand Down Expand Up @@ -79,6 +80,7 @@ def __init__(
self.jobs = Jobs(domain, token, rest_options=rest_options)
self.log_streams = LogStreams(domain, token, rest_options=rest_options)
self.logs = Logs(domain, token, rest_options=rest_options)
self.network_acls = NetworkAcls(domain, token, rest_options=rest_options)
self.organizations = Organizations(domain, token, rest_options=rest_options)
self.prompts = Prompts(domain, token, rest_options=rest_options)
self.resource_servers = ResourceServers(
Expand Down
138 changes: 138 additions & 0 deletions auth0/management/network_acls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
from __future__ import annotations

from typing import Any, List # List is being used as list is already a method.

from ..rest import RestClient, RestClientOptions
from ..types import TimeoutType


class NetworkAcls:
"""Auth0 Netwrok Acls endpoints

Args:
domain (str): Your Auth0 domain, e.g: 'username.auth0.com'

token (str): Management API v2 Token

telemetry (bool, optional): Enable or disable Telemetry
(defaults to True)

timeout (float or tuple, optional): Change the requests
connect and read timeout. Pass a tuple to specify
both values separately or a float to set both to it.
(defaults to 5.0 for both)

protocol (str, optional): Protocol to use when making requests.
(defaults to "https")

rest_options (RestClientOptions): Pass an instance of
RestClientOptions to configure additional RestClient
options, such as rate-limit retries.
(defaults to None)
"""

def __init__(
self,
domain: str,
token: str,
telemetry: bool = True,
timeout: TimeoutType = 5.0,
protocol: str = "https",
rest_options: RestClientOptions | None = None,
) -> None:
self.domain = domain
self.protocol = protocol
self.client = RestClient(
jwt=token, telemetry=telemetry, timeout=timeout, options=rest_options
)

def _url(self, id: str | None = None) -> str:
url = f"{self.protocol}://{self.domain}/api/v2/network-acls"
if id is not None:
return f"{url}/{id}"
return url

def all(
self,
page: int = 0,
per_page: int = 25,
include_totals: bool = True,
) -> List[dict[str, Any]]:
"""List self-service profiles.

Args:
page (int, optional): The result's page number (zero based). By default,
retrieves the first page of results.

per_page (int, optional): The amount of entries per page. By default,
retrieves 25 results per page.

include_totals (bool, optional): True if the query summary is
to be included in the result, False otherwise. Defaults to True.

See: https://auth0.com/docs/api/management/v2/network-acls/get-network-acls
"""

params = {
"page": page,
"per_page": per_page,
"include_totals": str(include_totals).lower(),
}

return self.client.get(self._url(), params=params)

def create(self, body: dict[str, Any]) -> dict[str, Any]:
"""Create a new self-service profile.

Args:
body (dict): Attributes for the new access control list.

See: https://auth0.com/docs/api/management/v2/network-acls/post-network-acls
"""

return self.client.post(self._url(), data=body)

def get(self, id: str) -> dict[str, Any]:
"""Get a self-service profile.

Args:
id (str): The id of the access control list to retrieve.

See: https://auth0.com/docs/api/management/v2/network-acls/get-network-acls-by-id
"""

return self.client.get(self._url(id))

def delete(self, id: str) -> None:
"""Delete a self-service profile.

Args:
id (str): The id of the access control list to delete.

See: https://auth0.com/docs/api/management/v2/network-acls/delete-network-acls-by-id
"""

self.client.delete(self._url(id))

def update(self, id: str, body: dict[str, Any]) -> dict[str, Any]:
"""Update a access control list.

Args:
id (str): The id of the access control list to update.

body (dict): Attributes of the access control list to modify.

See: https://auth0.com/docs/api/management/v2/network-acls/put-network-acls-by-id
"""

return self.client.put(self._url(id), data=body)

def update_partial(self, id: str, body: dict[str, Any]) -> dict[str, Any]:
"""Update partially the access control list.

See: https://auth0.com/docs/api/management/v2/network-acls/patch-network-acls-by-id
"""

return self.client.patch(self._url(id), data=body)


4 changes: 4 additions & 0 deletions auth0/test/management/test_auth0.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from ...management.jobs import Jobs
from ...management.log_streams import LogStreams
from ...management.logs import Logs
from ...management.network_acls import NetworkAcls
from ...management.organizations import Organizations
from ...management.prompts import Prompts
from ...management.resource_servers import ResourceServers
Expand Down Expand Up @@ -89,6 +90,9 @@ def test_log_streams(self):

def test_logs(self):
self.assertIsInstance(self.a0.logs, Logs)

def test_network_acls(self):
self.assertIsInstance(self.a0.network_acls, NetworkAcls)

def test_organizations(self):
self.assertIsInstance(self.a0.organizations, Organizations)
Expand Down
90 changes: 90 additions & 0 deletions auth0/test/management/test_network_acls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import unittest
from unittest import mock

from ...management.network_acls import NetworkAcls


class TestNetworkAcls(unittest.TestCase):
def test_init_with_optionals(self):
t = NetworkAcls(
domain="domain", token="jwttoken", telemetry=False, timeout=(10, 2)
)
self.assertEqual(t.client.options.timeout, (10, 2))
telemetry_header = t.client.base_headers.get("Auth0-Client", None)
self.assertEqual(telemetry_header, None)

@mock.patch("auth0.management.network_acls.RestClient")
def test_all(self, mock_rc):
mock_instance = mock_rc.return_value

s = NetworkAcls(domain="domain", token="jwttoken")
s.all()

mock_instance.get.assert_called_with(
"https://domain/api/v2/network-acls",
params={"page": 0, "per_page": 25, "include_totals": "true"},
)

s.all(page=1, per_page=50, include_totals=False)

mock_instance.get.assert_called_with(
"https://domain/api/v2/network-acls",
params={"page": 1, "per_page": 50, "include_totals": "false"},
)

@mock.patch("auth0.management.network_acls.RestClient")
def test_create(self, mock_rc):
mock_instance = mock_rc.return_value

s = NetworkAcls(domain="domain", token="jwttoken")
s.create({"name": "test"})

mock_instance.post.assert_called_with(
"https://domain/api/v2/network-acls", data={"name": "test"}
)

@mock.patch("auth0.management.network_acls.RestClient")
def test_get(self, mock_rc):
mock_instance = mock_rc.return_value

s = NetworkAcls(domain="domain", token="jwttoken")
s.get("an-id")

mock_instance.get.assert_called_with(
"https://domain/api/v2/network-acls/an-id"
)

@mock.patch("auth0.management.network_acls.RestClient")
def test_delete(self, mock_rc):
mock_instance = mock_rc.return_value

s = NetworkAcls(domain="domain", token="jwttoken")
s.delete("an-id")

mock_instance.delete.assert_called_with(
"https://domain/api/v2/network-acls/an-id"
)

@mock.patch("auth0.management.network_acls.RestClient")
def test_update(self, mock_rc):
mock_instance = mock_rc.return_value

s = NetworkAcls(domain="domain", token="jwttoken")
s.update("an-id", {"a": "b", "c": "d"})

mock_instance.put.assert_called_with(
"https://domain/api/v2/network-acls/an-id",
data={"a": "b", "c": "d"},
)

@mock.patch("auth0.management.network_acls.RestClient")
def test_update_partial(self, mock_rc):
mock_instance = mock_rc.return_value

s = NetworkAcls(domain="domain", token="jwttoken")
s.update_partial("an-id", {"a": "b", "c": "d"})

mock_instance.patch.assert_called_with(
"https://domain/api/v2/network-acls/an-id",
data={"a": "b", "c": "d"},
)
10 changes: 9 additions & 1 deletion docs/source/management.rst
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,14 @@ management.logs module
:undoc-members:
:show-inheritance:

management.network\_acls module
-----------------------------------------

.. automodule:: auth0.management.network_acls
:members:
:undoc-members:
:show-inheritance:

management.organizations module
----------------------------------

Expand Down Expand Up @@ -177,7 +185,7 @@ management.rules module
:undoc-members:
:show-inheritance:

management.self_service_profiles module
management.self\_service\_profiles module
-----------------------------------------

.. automodule:: auth0.management.self_service_profiles
Expand Down
14 changes: 7 additions & 7 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ asynctest==0.13.0 ; python_version >= "3.7" and python_version < "3.8"
attrs==23.1.0 ; python_version >= "3.7" and python_version < "4.0"
certifi==2025.1.31 ; python_version >= "3.7" and python_version < "4.0"
cffi==1.17.1 ; python_version >= "3.7" and python_version < "4.0"
charset-normalizer==3.2.0 ; python_version >= "3.7" and python_version < "4.0"
charset-normalizer==3.4.2 ; python_version >= "3.7" and python_version < "4.0"
click==8.1.8 ; python_version >= "3.7" and python_version < "4.0"
colorama==0.4.6 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" or python_version >= "3.7" and python_version < "4.0" and platform_system == "Windows"
coverage[toml]==7.2.7 ; python_version >= "3.7" and python_version < "4.0"
Expand All @@ -16,16 +16,16 @@ exceptiongroup==1.1.3 ; python_version >= "3.7" and python_version < "3.11"
frozenlist==1.5.0 ; python_version >= "3.7" and python_version < "4.0"
idna==3.10 ; python_version >= "3.7" and python_version < "4.0"
importlib-metadata==6.7.0 ; python_version >= "3.7" and python_version < "3.8"
iniconfig==2.0.0 ; python_version >= "3.7" and python_version < "4.0"
mock==5.1.0 ; python_version >= "3.7" and python_version < "4.0"
iniconfig==2.1.0 ; python_version >= "3.7" and python_version < "4.0"
mock==5.2.0 ; python_version >= "3.7" and python_version < "4.0"
multidict==6.0.4 ; python_version >= "3.7" and python_version < "4.0"
packaging==23.1 ; python_version >= "3.7" and python_version < "4.0"
pipx==1.2.0 ; python_version >= "3.7" and python_version < "4.0"
pluggy==1.2.0 ; python_version >= "3.7" and python_version < "4.0"
pycparser==2.21 ; python_version >= "3.7" and python_version < "4.0"
pyjwt==2.9.0 ; python_version >= "3.7" and python_version < "4.0"
pyopenssl==25.0.0 ; python_version >= "3.7" and python_version < "4.0"
pytest-aiohttp==1.0.4 ; python_version >= "3.7" and python_version < "4.0"
pyopenssl==25.1.0 ; python_version >= "3.7" and python_version < "4.0"
pytest-aiohttp==1.0.5 ; python_version >= "3.7" and python_version < "4.0"
pytest-asyncio==0.23.8 ; python_version >= "3.7" and python_version < "4.0"
pytest-cov==4.1.0 ; python_version >= "3.7" and python_version < "4.0"
pytest==7.4.0 ; python_version >= "3.7" and python_version < "4.0"
Expand All @@ -35,7 +35,7 @@ responses==0.23.3 ; python_version >= "3.7" and python_version < "4.0"
tomli==2.0.1 ; python_version >= "3.7" and python_full_version <= "3.11.0a6"
types-pyyaml==6.0.12.11 ; python_version >= "3.7" and python_version < "4.0"
typing-extensions==4.7.1 ; python_version >= "3.7" and python_version < "3.8"
urllib3==2.2.2 ; python_version >= "3.7" and python_version < "4.0"
userpath==1.9.0 ; python_version >= "3.7" and python_version < "4.0"
urllib3==2.5.0 ; python_version >= "3.7" and python_version < "4.0"
userpath==1.9.2 ; python_version >= "3.7" and python_version < "4.0"
yarl==1.20.0 ; python_version >= "3.7" and python_version < "4.0"
zipp==3.19.1 ; python_version >= "3.7" and python_version < "3.8"