From d7839fa4a0e7611193da2a32406734b431ba4193 Mon Sep 17 00:00:00 2001 From: Milov Dmitriy Date: Tue, 20 Jan 2026 13:27:50 +0300 Subject: [PATCH 1/4] fix: user addRequest: recreate principal if exists already task_1087 --- app/ldap_protocol/ldap_requests/add.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/ldap_protocol/ldap_requests/add.py b/app/ldap_protocol/ldap_requests/add.py index 6f29fe9af..5d219558c 100644 --- a/app/ldap_protocol/ldap_requests/add.py +++ b/app/ldap_protocol/ldap_requests/add.py @@ -17,6 +17,8 @@ from ldap_protocol.kerberos.exceptions import ( KRBAPIAddPrincipalError, KRBAPIConnectionError, + KRBAPIDeletePrincipalError, + KRBAPIPrincipalNotFoundError, ) from ldap_protocol.ldap_codes import LDAPCodes from ldap_protocol.ldap_responses import INVALID_ACCESS_RESPONSE, AddResponse @@ -453,13 +455,25 @@ async def handle( # noqa: C901 # in case server is not available: raise error and rollback # stub cannot raise error if user: + # NOTE: Delete existing principal if any + try: + await ctx.kadmin.get_principal( + user.sam_account_name, + ) + await ctx.kadmin.del_principal( + user.sam_account_name, + ) + except KRBAPIPrincipalNotFoundError: + pass + pw = ( self.password.get_secret_value() if self.password else None ) await ctx.kadmin.add_principal(user.get_upn_prefix(), pw) - if is_computer: + + elif is_computer: await ctx.kadmin.add_principal( f"{new_dir.host_principal}.{base_dn.name}", None, @@ -468,7 +482,11 @@ async def handle( # noqa: C901 new_dir.host_principal, None, ) - except (KRBAPIAddPrincipalError, KRBAPIConnectionError): + except ( + KRBAPIDeletePrincipalError, + KRBAPIAddPrincipalError, + KRBAPIConnectionError, + ): await ctx.session.rollback() yield AddResponse( result_code=LDAPCodes.UNAVAILABLE, From 1691bf2879d2afbd1faf3017c82acfacecb62cd2 Mon Sep 17 00:00:00 2001 From: Milov Dmitriy Date: Tue, 20 Jan 2026 14:37:28 +0300 Subject: [PATCH 2/4] tests: add async mock get_principal task_1087 --- app/ldap_protocol/ldap_requests/add.py | 3 ++- docker-compose.yml | 4 ++-- interface | 2 +- tests/conftest.py | 1 + 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/ldap_protocol/ldap_requests/add.py b/app/ldap_protocol/ldap_requests/add.py index 5d219558c..a1be2fc59 100644 --- a/app/ldap_protocol/ldap_requests/add.py +++ b/app/ldap_protocol/ldap_requests/add.py @@ -455,8 +455,8 @@ async def handle( # noqa: C901 # in case server is not available: raise error and rollback # stub cannot raise error if user: - # NOTE: Delete existing principal if any try: + # NOTE: Try to delete existing principal if any await ctx.kadmin.get_principal( user.sam_account_name, ) @@ -464,6 +464,7 @@ async def handle( # noqa: C901 user.sam_account_name, ) except KRBAPIPrincipalNotFoundError: + # NOTE: Principal does not exist; nothing to delete. pass pw = ( diff --git a/docker-compose.yml b/docker-compose.yml index 51a0d0fb3..aed5c6eb5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,8 +12,8 @@ services: - "8080:8080" - "389:389" - "389:389/udp" - - "3268:3268" - - "3269:3269" + # - "3268:3268" + # - "3269:3269/udp" - "636:636" - "749:749" - "464:464" diff --git a/interface b/interface index f31962020..95ed5e191 160000 --- a/interface +++ b/interface @@ -1 +1 @@ -Subproject commit f31962020a6689e6a4c61fb3349db5b5c7895f92 +Subproject commit 95ed5e191cdafa07b1dfac96a1659926679ead97 diff --git a/tests/conftest.py b/tests/conftest.py index 6a206ce3e..7786f1c75 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -185,6 +185,7 @@ async def get_kadmin(self) -> AsyncIterator[AsyncMock]: kadmin.setup = AsyncMock() kadmin.ktadd = AsyncMock(return_value=ok_response) kadmin.get_status = AsyncMock(return_value=False) + kadmin.get_principal = AsyncMock(return_value=True) kadmin.add_principal = AsyncMock() kadmin.del_principal = AsyncMock() kadmin.rename_princ = AsyncMock() From 3714e2d54bfb43306fd9c86d618f15cbe20484c0 Mon Sep 17 00:00:00 2001 From: Milov Dmitriy Date: Tue, 20 Jan 2026 14:43:31 +0300 Subject: [PATCH 3/4] refactor: addRequest: delete useless kadmin`s request task_1087 --- app/ldap_protocol/ldap_requests/add.py | 20 +++++--------------- tests/conftest.py | 1 - 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/app/ldap_protocol/ldap_requests/add.py b/app/ldap_protocol/ldap_requests/add.py index a1be2fc59..6dd5db9b5 100644 --- a/app/ldap_protocol/ldap_requests/add.py +++ b/app/ldap_protocol/ldap_requests/add.py @@ -4,6 +4,7 @@ License: https://github.com/MultiDirectoryLab/MultiDirectory/blob/main/LICENSE """ +import contextlib from typing import AsyncGenerator, ClassVar from pydantic import Field, SecretStr @@ -18,7 +19,6 @@ KRBAPIAddPrincipalError, KRBAPIConnectionError, KRBAPIDeletePrincipalError, - KRBAPIPrincipalNotFoundError, ) from ldap_protocol.ldap_codes import LDAPCodes from ldap_protocol.ldap_responses import INVALID_ACCESS_RESPONSE, AddResponse @@ -455,17 +455,11 @@ async def handle( # noqa: C901 # in case server is not available: raise error and rollback # stub cannot raise error if user: - try: - # NOTE: Try to delete existing principal if any - await ctx.kadmin.get_principal( - user.sam_account_name, - ) + # NOTE: Try to delete existing principal if any + with contextlib.suppress(KRBAPIDeletePrincipalError): await ctx.kadmin.del_principal( - user.sam_account_name, + user.get_upn_prefix(), ) - except KRBAPIPrincipalNotFoundError: - # NOTE: Principal does not exist; nothing to delete. - pass pw = ( self.password.get_secret_value() @@ -483,11 +477,7 @@ async def handle( # noqa: C901 new_dir.host_principal, None, ) - except ( - KRBAPIDeletePrincipalError, - KRBAPIAddPrincipalError, - KRBAPIConnectionError, - ): + except (KRBAPIAddPrincipalError, KRBAPIConnectionError): await ctx.session.rollback() yield AddResponse( result_code=LDAPCodes.UNAVAILABLE, diff --git a/tests/conftest.py b/tests/conftest.py index 7786f1c75..6a206ce3e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -185,7 +185,6 @@ async def get_kadmin(self) -> AsyncIterator[AsyncMock]: kadmin.setup = AsyncMock() kadmin.ktadd = AsyncMock(return_value=ok_response) kadmin.get_status = AsyncMock(return_value=False) - kadmin.get_principal = AsyncMock(return_value=True) kadmin.add_principal = AsyncMock() kadmin.del_principal = AsyncMock() kadmin.rename_princ = AsyncMock() From 349e3051881d107ce18fa4af1e7f17e95f05399e Mon Sep 17 00:00:00 2001 From: Milov Dmitriy Date: Tue, 20 Jan 2026 14:48:08 +0300 Subject: [PATCH 4/4] revert: compose ports --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index aed5c6eb5..51a0d0fb3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,8 +12,8 @@ services: - "8080:8080" - "389:389" - "389:389/udp" - # - "3268:3268" - # - "3269:3269/udp" + - "3268:3268" + - "3269:3269" - "636:636" - "749:749" - "464:464"