From 47bb5a1387a18f631b13c103102d70e1795ace3e Mon Sep 17 00:00:00 2001 From: Milov Dmitriy Date: Tue, 10 Mar 2026 11:17:08 +0300 Subject: [PATCH 1/4] add: migration add_samaccountname_to_computers task_1364 --- ...7898910_add_samaccountname_to_computers.py | 95 +++++++++++++++++++ interface | 2 +- 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 app/alembic/versions/df4287898910_add_samaccountname_to_computers.py diff --git a/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py b/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py new file mode 100644 index 000000000..c35b63136 --- /dev/null +++ b/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py @@ -0,0 +1,95 @@ +"""Add sAMAccountName attribute to Computer directories. + +Revision ID: df4287898910 +Revises: 19d86e660cf2 +Create Date: 2026-03-10 07:33:43.493288 + +""" + +from alembic import op +from dishka import AsyncContainer, Scope +from sqlalchemy import exists, select +from sqlalchemy.ext.asyncio import AsyncConnection, AsyncSession +from sqlalchemy.orm import selectinload + +from entities import Attribute, Directory, EntityType +from enums import EntityTypeNames +from repo.pg.tables import queryable_attr as qa + +# revision identifiers, used by Alembic. +revision: None | str = "df4287898910" +down_revision: None | str = "19d86e660cf2" +branch_labels: None | list[str] = None +depends_on: None | list[str] = None + + +def upgrade(container: AsyncContainer) -> None: + """Upgrade.""" + + async def _add_samaccountname_attr_to_computers( + connection: AsyncConnection, # noqa: ARG001 + ) -> None: + async with container(scope=Scope.REQUEST) as cnt: + session = await cnt.get(AsyncSession) + + computer_dirs = await session.scalars( + select(Directory) + .join(qa(Directory.entity_type)) + .options( + selectinload(qa(Directory.attributes)), + selectinload(qa(Directory.entity_type)), + ) + .where( + qa(EntityType.name) == EntityTypeNames.COMPUTER, + ~exists( + select(qa(Attribute.id)) + .where( + qa(Attribute.directory_id) == qa(Directory.id), + qa(Attribute.name) == "sAMAccountName", + ), + ), + ), + ) # fmt: skip + + for directory in computer_dirs: + session.add( + Attribute( + name="sAMAccountName", + value=directory.name, + directory_id=directory.id, + ), + ) + + await session.commit() + + op.run_async(_add_samaccountname_attr_to_computers) + + +def downgrade(container: AsyncContainer) -> None: + """Downgrade.""" + + async def _remove_samaccountname_attr_from_computers( + connection: AsyncConnection, # noqa: ARG001 + ) -> None: + async with container(scope=Scope.REQUEST) as cnt: + session = await cnt.get(AsyncSession) + + computer_dirs = await session.scalars( + select(Directory) + .join(qa(Directory.entity_type)) + .options( + selectinload(qa(Directory.attributes)), + selectinload(qa(Directory.entity_type)), + ) + .where(qa(EntityType.name) == EntityTypeNames.COMPUTER), + ) + + for directory in computer_dirs: + for attr in directory.attributes: + if attr.name == "sAMAccountName": + await session.delete(attr) + break + + await session.commit() + + op.run_async(_remove_samaccountname_attr_from_computers) diff --git a/interface b/interface index 3732b6958..5d5a80ee7 160000 --- a/interface +++ b/interface @@ -1 +1 @@ -Subproject commit 3732b695844e95e1692ae83e1b2e1de70e68b380 +Subproject commit 5d5a80ee7e9ea073338cac26a57be5f91a8d47f7 From 3728002fa532c890ac6b2b10152a11dad63a4a2d Mon Sep 17 00:00:00 2001 From: Milov Dmitriy Date: Tue, 10 Mar 2026 11:49:50 +0300 Subject: [PATCH 2/4] copilot: fixes task_1364 --- ...87898910_add_samaccountname_to_computers.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py b/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py index c35b63136..3bc0b481d 100644 --- a/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py +++ b/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py @@ -22,6 +22,8 @@ branch_labels: None | list[str] = None depends_on: None | list[str] = None +_ATTR_NAME_SAMACCOUNTNAME = "sAMAccountName" + def upgrade(container: AsyncContainer) -> None: """Upgrade.""" @@ -35,17 +37,14 @@ async def _add_samaccountname_attr_to_computers( computer_dirs = await session.scalars( select(Directory) .join(qa(Directory.entity_type)) - .options( - selectinload(qa(Directory.attributes)), - selectinload(qa(Directory.entity_type)), - ) + .options(selectinload(qa(Directory.attributes))) .where( qa(EntityType.name) == EntityTypeNames.COMPUTER, ~exists( select(qa(Attribute.id)) .where( qa(Attribute.directory_id) == qa(Directory.id), - qa(Attribute.name) == "sAMAccountName", + qa(Attribute.name) == _ATTR_NAME_SAMACCOUNTNAME, ), ), ), @@ -54,7 +53,7 @@ async def _add_samaccountname_attr_to_computers( for directory in computer_dirs: session.add( Attribute( - name="sAMAccountName", + name=_ATTR_NAME_SAMACCOUNTNAME, value=directory.name, directory_id=directory.id, ), @@ -77,16 +76,13 @@ async def _remove_samaccountname_attr_from_computers( computer_dirs = await session.scalars( select(Directory) .join(qa(Directory.entity_type)) - .options( - selectinload(qa(Directory.attributes)), - selectinload(qa(Directory.entity_type)), - ) + .options(selectinload(qa(Directory.attributes))) .where(qa(EntityType.name) == EntityTypeNames.COMPUTER), ) for directory in computer_dirs: for attr in directory.attributes: - if attr.name == "sAMAccountName": + if attr.name == _ATTR_NAME_SAMACCOUNTNAME: await session.delete(attr) break From 850645c06e1cce779a2aa72a9b51bfd88c2fe2e1 Mon Sep 17 00:00:00 2001 From: Milov Dmitriy Date: Tue, 10 Mar 2026 12:51:03 +0300 Subject: [PATCH 3/4] fix --- ...7898910_add_samaccountname_to_computers.py | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py b/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py index 3bc0b481d..c1635b6c0 100644 --- a/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py +++ b/app/alembic/versions/df4287898910_add_samaccountname_to_computers.py @@ -8,9 +8,8 @@ from alembic import op from dishka import AsyncContainer, Scope -from sqlalchemy import exists, select +from sqlalchemy import delete, exists, select from sqlalchemy.ext.asyncio import AsyncConnection, AsyncSession -from sqlalchemy.orm import selectinload from entities import Attribute, Directory, EntityType from enums import EntityTypeNames @@ -37,7 +36,6 @@ async def _add_samaccountname_attr_to_computers( computer_dirs = await session.scalars( select(Directory) .join(qa(Directory.entity_type)) - .options(selectinload(qa(Directory.attributes))) .where( qa(EntityType.name) == EntityTypeNames.COMPUTER, ~exists( @@ -73,18 +71,17 @@ async def _remove_samaccountname_attr_from_computers( async with container(scope=Scope.REQUEST) as cnt: session = await cnt.get(AsyncSession) - computer_dirs = await session.scalars( - select(Directory) + computer_dir_ids = ( + select(qa(Directory.id)) .join(qa(Directory.entity_type)) - .options(selectinload(qa(Directory.attributes))) - .where(qa(EntityType.name) == EntityTypeNames.COMPUTER), + .where(qa(EntityType.name) == EntityTypeNames.COMPUTER) + ) + await session.execute( + delete(Attribute).where( + qa(Attribute.name) == _ATTR_NAME_SAMACCOUNTNAME, + qa(Attribute.directory_id).in_(computer_dir_ids), + ), ) - - for directory in computer_dirs: - for attr in directory.attributes: - if attr.name == _ATTR_NAME_SAMACCOUNTNAME: - await session.delete(attr) - break await session.commit() From 9335ac4bb5ed2b5ec89b863113ffd78f0dad60a0 Mon Sep 17 00:00:00 2001 From: Milov Dmitriy Date: Tue, 10 Mar 2026 13:45:25 +0300 Subject: [PATCH 4/4] fix: modify_princ task_1364 --- app/ldap_protocol/ldap_requests/modify.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/ldap_protocol/ldap_requests/modify.py b/app/ldap_protocol/ldap_requests/modify.py index 9b1b03edf..ce10596e9 100644 --- a/app/ldap_protocol/ldap_requests/modify.py +++ b/app/ldap_protocol/ldap_requests/modify.py @@ -938,6 +938,8 @@ async def _add( # noqa: C901 await kadmin.modify_princ( directory.user.sam_account_name, new_sam_account_name, + algorithms=None, + password=None, ) directory.user.user_principal_name = new_user_principal_name # noqa: E501 # fmt: skip @@ -1044,10 +1046,14 @@ async def _modify_computer_samaccountname( await kadmin.modify_princ( f"host/{old_sam_account_name}", f"host/{new_sam_account_name}", + algorithms=None, + password=None, ) await kadmin.modify_princ( f"host/{old_sam_account_name}.{base_dir.name}", f"host/{new_sam_account_name}.{base_dir.name}", + algorithms=None, + password=None, ) async def _get_base_dir(