diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f47fd2..28c2dd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,30 @@ # Change Log (v2.8.1+) +## v4.1.1 [2025-03-05] + +__What's New:__ + +* None + +__Enhancements:__ + +* None + +__Bug Fixes:__ + +* Added missing `409 Conflict` to `exceptions.allowed_exceptions` +* Added missing zero in the `PP-` errors in `exceptions.badrequest` +* Raise specific `InvalidTenantError` when DNS resolution fails in `helpers.utils.parse_tenant`. +* Updated type hint typo, from `list` to `dict`, in `[my_access|my_resources].list`. + +__Dependencies:__ + +* `jmespath >= 1.0.1` + +__Other:__ + +* None + ## v4.1.0 [2025-02-28] __What's New:__ diff --git a/pyproject.toml b/pyproject.toml index 5c047fd..ec998d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,8 @@ classifiers = [ license = {file = "LICENSE"} requires-python = ">=3.9" dependencies = [ - "requests>=2.32.0" + "requests>=2.32.0", + "jmespath>=1.0.1" ] dynamic = ["version"] keywords = ["britive", "cpam", "identity", "jit"] diff --git a/src/britive/__init__.py b/src/britive/__init__.py index fa721b4..47cbba7 100644 --- a/src/britive/__init__.py +++ b/src/britive/__init__.py @@ -1 +1 @@ -__version__ = '4.1.0' +__version__ = '4.1.1' diff --git a/src/britive/exceptions/__init__.py b/src/britive/exceptions/__init__.py index ff8d271..779a2f2 100644 --- a/src/britive/exceptions/__init__.py +++ b/src/britive/exceptions/__init__.py @@ -22,6 +22,10 @@ class ApprovalWorkflowTimedOut(BritiveException): pass +class Conflict(BritiveException): + pass + + class ForbiddenRequest(BritiveException): pass @@ -165,6 +169,7 @@ class UserNotAssociatedWithDefaultIdentityProvider(BritiveException): 403: ForbiddenRequest, 404: NotFound, 405: MethodNotAllowed, + 409: Conflict, 500: InternalServerError, 503: ServiceUnavailable, } diff --git a/src/britive/exceptions/badrequest.py b/src/britive/exceptions/badrequest.py index fe5bb6b..4c56f76 100644 --- a/src/britive/exceptions/badrequest.py +++ b/src/britive/exceptions/badrequest.py @@ -473,12 +473,12 @@ class GenericError(BritiveBadRequestException): 'PF-0002': ProfileFavoriteDeleteError, 'PF-0003': ProfileFavoriteReadError, # Profile Policy related - 'PP-001': ProfilePolicyPermissionsError, - 'PP-002': ProfilePolicyInvalidTokenError, - 'PP-003': ProfilePolicyCreationError, - 'PP-004': ProfilePolicyUpdateError, - 'PP-005': ProfilePolicyGenericError, - 'PP-006': ProfilePolicyCreationUpdateError, + 'PP-0001': ProfilePolicyPermissionsError, + 'PP-0002': ProfilePolicyInvalidTokenError, + 'PP-0003': ProfilePolicyCreationError, + 'PP-0004': ProfilePolicyUpdateError, + 'PP-0005': ProfilePolicyGenericError, + 'PP-0006': ProfilePolicyCreationUpdateError, # Profile request related 'PR-0001': ProfileRequestError, # Access Broker related diff --git a/src/britive/helpers/utils.py b/src/britive/helpers/utils.py index e7a9167..a40240d 100644 --- a/src/britive/helpers/utils.py +++ b/src/britive/helpers/utils.py @@ -6,7 +6,7 @@ from britive.exceptions import BritiveException, InvalidFederationProvider, allowed_exceptions from britive.exceptions.badrequest import bad_request_code_map from britive.exceptions.generic import generic_code_map -from britive.exceptions.unauthorized import unauthorized_code_map +from britive.exceptions.unauthorized import InvalidTenantError, unauthorized_code_map from britive.federation_providers import ( AwsFederationProvider, AzureSystemAssignedManagedIdentityFederationProvider, @@ -69,7 +69,7 @@ def parse_tenant(tenant: str) -> str: socket.getaddrinfo(host=resolved_domain, port=443) # validate the hostname is real return resolved_domain # and if so set the tenant accordingly except socket.gaierror as e: - raise Exception(f'Invalid tenant provided: {tenant}. DNS resolution failed.') from e + raise InvalidTenantError(f'Invalid tenant provided: {tenant}. DNS resolution failed.') from e def response_has_no_content(response) -> bool: diff --git a/src/britive/my_access.py b/src/britive/my_access.py index 51c0853..c325024 100644 --- a/src/britive/my_access.py +++ b/src/britive/my_access.py @@ -53,14 +53,14 @@ def __init__(self, britive) -> None: self.withdraw_approval_request = __my_requests.withdraw_approval_request self.withdraw_approval_request_by_name = __my_requests.withdraw_approval_request_by_name - def list(self, filter_text: str = None, search_text: str = None, size: int = None) -> list: + def list(self, filter_text: str = None, search_text: str = None, size: int = None) -> dict: """ List the access details for the current user. :param filter_text: filter details by key, using eq|co|sw operators, e.g. `filter_text='key co text'` :param search_text: filter details by search text. :param size: reduce the size of the response to the specified limit. - :return: List of profiles. + :return: Dict of access details. """ params = {'type': 'sdk'} diff --git a/src/britive/my_resources.py b/src/britive/my_resources.py index d41fb58..331629c 100644 --- a/src/britive/my_resources.py +++ b/src/britive/my_resources.py @@ -51,7 +51,7 @@ def __init__(self, britive) -> None: self.withdraw_approval_request_by_name = __my_requests.withdraw_approval_request_by_name # Let's just mimic my_access.list functionality for now. - def list(self, filter_text: str = None, list_type: str = None, search_text: str = None, size: int = None) -> list: + def list(self, filter_text: str = None, list_type: str = None, search_text: str = None, size: int = None) -> dict: """ List the resource details for the current user. @@ -59,7 +59,7 @@ def list(self, filter_text: str = None, list_type: str = None, search_text: str :param list_type: filter resources by type, e.g. `list_type='frequently-used'` :param search_text: filter resources by search text. :param size: reduce the size of the response to the specified limit. - :return: List of profiles. + :return: Dict of resource details. """ params = {}