123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- """
- """
-
- # Created on 2014.04.28
- #
- # Author: Giovanni Cannata
- #
- # Copyright 2014 - 2018 Giovanni Cannata
- #
- # This file is part of ldap3.
- #
- # ldap3 is free software: you can redistribute it and/or modify
- # it under the terms of the GNU Lesser General Public License as published
- # by the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # ldap3 is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU Lesser General Public License for more details.
- #
- # You should have received a copy of the GNU Lesser General Public License
- # along with ldap3 in the COPYING and COPYING.LESSER files.
- # If not, see <http://www.gnu.org/licenses/>.
-
- from os import linesep
-
- from .. import SUBTREE, DEREF_ALWAYS, ALL_ATTRIBUTES, DEREF_NEVER
- from .microsoft.dirSync import DirSync
- from .microsoft.modifyPassword import ad_modify_password
- from .microsoft.unlockAccount import ad_unlock_account
- from .microsoft.addMembersToGroups import ad_add_members_to_groups
- from .microsoft.removeMembersFromGroups import ad_remove_members_from_groups
- from .novell.partition_entry_count import PartitionEntryCount
- from .novell.replicaInfo import ReplicaInfo
- from .novell.listReplicas import ListReplicas
- from .novell.getBindDn import GetBindDn
- from .novell.nmasGetUniversalPassword import NmasGetUniversalPassword
- from .novell.nmasSetUniversalPassword import NmasSetUniversalPassword
- from .novell.startTransaction import StartTransaction
- from .novell.endTransaction import EndTransaction
- from .novell.addMembersToGroups import edir_add_members_to_groups
- from .novell.removeMembersFromGroups import edir_remove_members_from_groups
- from .novell.checkGroupsMemberships import edir_check_groups_memberships
- from .standard.whoAmI import WhoAmI
- from .standard.modifyPassword import ModifyPassword
- from .standard.PagedSearch import paged_search_generator, paged_search_accumulator
- from .standard.PersistentSearch import PersistentSearch
-
-
- class ExtendedOperationContainer(object):
- def __init__(self, connection):
- self._connection = connection
-
- def __repr__(self):
- return linesep.join([' ' + element for element in dir(self) if element[0] != '_'])
-
- def __str__(self):
- return self.__repr__()
-
-
- class StandardExtendedOperations(ExtendedOperationContainer):
- def who_am_i(self, controls=None):
- return WhoAmI(self._connection,
- controls).send()
-
- def modify_password(self,
- user=None,
- old_password=None,
- new_password=None,
- hash_algorithm=None,
- salt=None,
- controls=None):
-
- return ModifyPassword(self._connection,
- user,
- old_password,
- new_password,
- hash_algorithm,
- salt,
- controls).send()
-
- def paged_search(self,
- search_base,
- search_filter,
- search_scope=SUBTREE,
- dereference_aliases=DEREF_ALWAYS,
- attributes=None,
- size_limit=0,
- time_limit=0,
- types_only=False,
- get_operational_attributes=False,
- controls=None,
- paged_size=100,
- paged_criticality=False,
- generator=True):
-
- if generator:
- return paged_search_generator(self._connection,
- search_base,
- search_filter,
- search_scope,
- dereference_aliases,
- attributes,
- size_limit,
- time_limit,
- types_only,
- get_operational_attributes,
- controls,
- paged_size,
- paged_criticality)
- else:
- return paged_search_accumulator(self._connection,
- search_base,
- search_filter,
- search_scope,
- dereference_aliases,
- attributes,
- size_limit,
- time_limit,
- types_only,
- get_operational_attributes,
- controls,
- paged_size,
- paged_criticality)
-
- def persistent_search(self,
- search_base='',
- search_filter='(objectclass=*)',
- search_scope=SUBTREE,
- dereference_aliases=DEREF_NEVER,
- attributes=ALL_ATTRIBUTES,
- size_limit=0,
- time_limit=0,
- controls=None,
- changes_only=True,
- show_additions=True,
- show_deletions=True,
- show_modifications=True,
- show_dn_modifications=True,
- notifications=True,
- streaming=True,
- callback=None
- ):
- events_type = 0
- if show_additions:
- events_type += 1
- if show_deletions:
- events_type += 2
- if show_modifications:
- events_type += 4
- if show_dn_modifications:
- events_type += 8
-
- if callback:
- streaming = False
- return PersistentSearch(self._connection,
- search_base,
- search_filter,
- search_scope,
- dereference_aliases,
- attributes,
- size_limit,
- time_limit,
- controls,
- changes_only,
- events_type,
- notifications,
- streaming,
- callback)
-
-
- class NovellExtendedOperations(ExtendedOperationContainer):
- def get_bind_dn(self, controls=None):
- return GetBindDn(self._connection,
- controls).send()
-
- def get_universal_password(self, user, controls=None):
- return NmasGetUniversalPassword(self._connection,
- user,
- controls).send()
-
- def set_universal_password(self, user, new_password=None, controls=None):
- return NmasSetUniversalPassword(self._connection,
- user,
- new_password,
- controls).send()
-
- def list_replicas(self, server_dn, controls=None):
- return ListReplicas(self._connection,
- server_dn,
- controls).send()
-
- def partition_entry_count(self, partition_dn, controls=None):
- return PartitionEntryCount(self._connection,
- partition_dn,
- controls).send()
-
- def replica_info(self, server_dn, partition_dn, controls=None):
- return ReplicaInfo(self._connection,
- server_dn,
- partition_dn,
- controls).send()
-
- def start_transaction(self, controls=None):
- return StartTransaction(self._connection,
- controls).send()
-
- def end_transaction(self, commit=True, controls=None): # attach the groupingControl to commit, None to abort transaction
- return EndTransaction(self._connection,
- commit,
- controls).send()
-
- def add_members_to_groups(self, members, groups, fix=True, transaction=True):
- return edir_add_members_to_groups(self._connection,
- members_dn=members,
- groups_dn=groups,
- fix=fix,
- transaction=transaction)
-
- def remove_members_from_groups(self, members, groups, fix=True, transaction=True):
- return edir_remove_members_from_groups(self._connection,
- members_dn=members,
- groups_dn=groups,
- fix=fix,
- transaction=transaction)
-
- def check_groups_memberships(self, members, groups, fix=False, transaction=True):
- return edir_check_groups_memberships(self._connection,
- members_dn=members,
- groups_dn=groups,
- fix=fix,
- transaction=transaction)
-
-
- class MicrosoftExtendedOperations(ExtendedOperationContainer):
- def dir_sync(self,
- sync_base,
- sync_filter='(objectclass=*)',
- attributes=ALL_ATTRIBUTES,
- cookie=None,
- object_security=False,
- ancestors_first=True,
- public_data_only=False,
- incremental_values=True,
- max_length=2147483647,
- hex_guid=False):
- return DirSync(self._connection,
- sync_base=sync_base,
- sync_filter=sync_filter,
- attributes=attributes,
- cookie=cookie,
- object_security=object_security,
- ancestors_first=ancestors_first,
- public_data_only=public_data_only,
- incremental_values=incremental_values,
- max_length=max_length,
- hex_guid=hex_guid)
-
- def modify_password(self, user, new_password, old_password=None, controls=None):
- return ad_modify_password(self._connection,
- user,
- new_password,
- old_password,
- controls)
-
- def unlock_account(self, user):
- return ad_unlock_account(self._connection,
- user)
-
- def add_members_to_groups(self, members, groups, fix=True):
- return ad_add_members_to_groups(self._connection,
- members_dn=members,
- groups_dn=groups,
- fix=fix)
-
- def remove_members_from_groups(self, members, groups, fix=True):
- return ad_remove_members_from_groups(self._connection,
- members_dn=members,
- groups_dn=groups,
- fix=fix)
-
-
- class ExtendedOperationsRoot(ExtendedOperationContainer):
- def __init__(self, connection):
- ExtendedOperationContainer.__init__(self, connection) # calls super
- self.standard = StandardExtendedOperations(self._connection)
- self.novell = NovellExtendedOperations(self._connection)
- self.microsoft = MicrosoftExtendedOperations(self._connection)
|