2018-12-12 03:40:43 +03:00
#!/usr/bin/env python3
2007-12-28 08:31:54 +03:00
# -*- coding: utf-8 -*-
2007-12-24 04:19:41 +03:00
# This is a port of the original in testprogs/ejs/ldap.js
2014-11-02 07:31:18 +03:00
# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008-2011
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2007-12-28 08:31:54 +03:00
import optparse
2007-12-24 04:19:41 +03:00
import sys
2008-06-30 05:27:55 +04:00
import time
2009-09-08 17:00:24 +04:00
import base64
2009-11-18 05:27:50 +03:00
import os
2007-12-24 04:19:41 +03:00
2011-02-01 06:43:34 +03:00
sys . path . insert ( 0 , " bin/python " )
2010-06-30 12:57:37 +04:00
import samba
2014-11-02 07:31:18 +03:00
from samba . tests . subunitrun import SubunitOptions , TestProgram
2007-12-28 08:31:54 +03:00
import samba . getopt as options
2008-05-22 01:59:34 +04:00
from samba . auth import system_session
2008-12-19 23:47:31 +03:00
from ldb import SCOPE_SUBTREE , SCOPE_ONELEVEL , SCOPE_BASE , LdbError
2008-12-21 09:34:27 +03:00
from ldb import ERR_NO_SUCH_OBJECT , ERR_ATTRIBUTE_OR_VALUE_EXISTS
from ldb import ERR_ENTRY_ALREADY_EXISTS , ERR_UNWILLING_TO_PERFORM
from ldb import ERR_NOT_ALLOWED_ON_NON_LEAF , ERR_OTHER , ERR_INVALID_DN_SYNTAX
2010-10-26 21:09:44 +04:00
from ldb import ERR_NO_SUCH_ATTRIBUTE , ERR_INVALID_ATTRIBUTE_SYNTAX
2009-10-02 20:31:38 +04:00
from ldb import ERR_OBJECT_CLASS_VIOLATION , ERR_NOT_ALLOWED_ON_RDN
2009-10-06 19:18:04 +04:00
from ldb import ERR_NAMING_VIOLATION , ERR_CONSTRAINT_VIOLATION
from ldb import Message , MessageElement , Dn
from ldb import FLAG_MOD_ADD , FLAG_MOD_REPLACE , FLAG_MOD_DELETE
2010-11-07 22:10:48 +03:00
from ldb import timestring
2010-01-17 02:26:53 +03:00
from samba import Ldb
2010-11-18 18:06:46 +03:00
from samba . samdb import SamDB
2010-11-03 19:53:19 +03:00
from samba . dsdb import ( UF_NORMAL_ACCOUNT ,
2018-07-30 09:16:12 +03:00
UF_WORKSTATION_TRUST_ACCOUNT ,
UF_PASSWD_NOTREQD , UF_ACCOUNTDISABLE , ATYPE_NORMAL_ACCOUNT ,
ATYPE_WORKSTATION_TRUST , SYSTEM_FLAG_DOMAIN_DISALLOW_MOVE ,
SYSTEM_FLAG_CONFIG_ALLOW_RENAME , SYSTEM_FLAG_CONFIG_ALLOW_MOVE ,
SYSTEM_FLAG_CONFIG_ALLOW_LIMITED_MOVE )
2021-10-21 05:42:46 +03:00
from samba . dcerpc . security import DOMAIN_RID_DOMAIN_MEMBERS
2009-10-02 20:31:38 +04:00
2009-09-08 17:00:24 +04:00
from samba . ndr import ndr_pack , ndr_unpack
2011-01-17 15:52:00 +03:00
from samba . dcerpc import security , lsa
2010-11-25 02:12:18 +03:00
from samba . tests import delete_force
2020-09-11 23:29:46 +03:00
from samba . common import get_string
2009-09-08 17:00:24 +04:00
2010-10-07 11:42:07 +04:00
parser = optparse . OptionParser ( " ldap.py [options] <host> " )
2008-01-24 01:33:36 +03:00
sambaopts = options . SambaOptions ( parser )
parser . add_option_group ( sambaopts )
2007-12-28 08:31:54 +03:00
parser . add_option_group ( options . VersionOptions ( parser ) )
# use command line creds if available
credopts = options . CredentialsOptions ( parser )
parser . add_option_group ( credopts )
2014-11-02 07:31:18 +03:00
subunitopts = SubunitOptions ( parser )
parser . add_option_group ( subunitopts )
2007-12-28 08:31:54 +03:00
opts , args = parser . parse_args ( )
if len ( args ) < 1 :
parser . print_usage ( )
2007-12-24 04:19:41 +03:00
sys . exit ( 1 )
2007-12-28 08:31:54 +03:00
host = args [ 0 ]
2007-12-24 04:19:41 +03:00
2008-01-24 01:33:36 +03:00
lp = sambaopts . get_loadparm ( )
2008-03-28 13:57:15 +03:00
creds = credopts . get_credentials ( lp )
2007-12-28 08:32:05 +03:00
2018-07-30 09:20:39 +03:00
2011-11-09 06:28:02 +04:00
class BasicTests ( samba . tests . TestCase ) :
2010-03-29 17:43:43 +04:00
2008-02-09 21:04:14 +03:00
def setUp ( self ) :
2010-06-19 20:58:18 +04:00
super ( BasicTests , self ) . setUp ( )
2008-02-09 21:04:14 +03:00
self . ldb = ldb
self . gc_ldb = gc_ldb
2010-11-18 18:06:46 +03:00
self . base_dn = ldb . domain_dn ( )
2010-11-19 11:07:53 +03:00
self . configuration_dn = ldb . get_config_basedn ( ) . get_linearized ( )
self . schema_dn = ldb . get_schema_basedn ( ) . get_linearized ( )
2010-11-27 14:32:22 +03:00
self . domain_sid = security . dom_sid ( ldb . get_domain_sid ( ) )
2008-02-09 21:04:14 +03:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=posixuser,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser2,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser3,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser4,cn=ldaptestcontainer, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser4,cn=ldaptestcontainer2, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser5,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestgroup2,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestcomputer,cn=computers, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptest2computer,cn=computers, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestcomputer3,cn=computers, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestutf8user èùéìòà,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestutf8user2 èùéìòà,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestcontainer, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestcontainer2, " + self . base_dn )
delete_force ( self . ldb , " cn=parentguidtest,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=parentguidtest,cn=testotherusers, " + self . base_dn )
delete_force ( self . ldb , " cn=testotherusers, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestobject, " + self . base_dn )
delete_force ( self . ldb , " description=xyz,cn=users, " + self . base_dn )
delete_force ( self . ldb , " ou=testou,cn=users, " + self . base_dn )
2011-01-17 15:52:00 +03:00
delete_force ( self . ldb , " cn=Test Secret,cn=system, " + self . base_dn )
2015-01-09 10:56:59 +03:00
delete_force ( self . ldb , " cn=testtimevaluesuser1,cn=users, " + self . base_dn )
2009-10-03 12:57:14 +04:00
2010-06-03 22:58:43 +04:00
def test_objectclasses ( self ) :
""" Test objectClass behaviour """
2010-11-01 17:23:48 +03:00
# Invalid objectclass specified
try :
self . ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : [ ] } )
2010-11-01 17:23:48 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2010-11-01 17:23:48 +03:00
2010-06-03 22:58:43 +04:00
# Invalid objectclass specified
try :
self . ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : " X " } )
2010-06-03 22:58:43 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_ATTRIBUTE )
2010-06-03 22:58:43 +04:00
2010-08-07 13:07:03 +04:00
# Invalid objectCategory specified
try :
self . ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
" objectClass " : " person " ,
2018-07-30 09:17:02 +03:00
" objectCategory " : self . base_dn } )
2010-08-07 13:07:03 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-08-07 13:07:03 +04:00
2010-08-07 13:59:57 +04:00
# Multi-valued "systemFlags"
try :
self . ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
" objectClass " : " person " ,
2018-07-30 09:17:02 +03:00
" systemFlags " : [ " 0 " , str ( SYSTEM_FLAG_DOMAIN_DISALLOW_MOVE ) ] } )
2010-08-07 13:59:57 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2010-08-07 13:59:57 +04:00
2023-08-02 11:44:32 +03:00
# We cannot instantiate from an abstract object class ("connectionPoint"
2011-10-12 10:53:17 +04:00
# or "leaf"). In the first case we use "connectionPoint" (subclass of
# "leaf") to prevent a naming violation - this returns us a
# "ERR_UNWILLING_TO_PERFORM" since it is not structural. In the second
# case however we get "ERR_OBJECT_CLASS_VIOLATION" since an abstract
# class is also not allowed to be auxiliary.
2010-06-03 22:58:43 +04:00
try :
self . ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : " connectionPoint " } )
2010-06-03 22:58:43 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2011-10-12 10:53:17 +04:00
try :
self . ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : [ " person " , " leaf " ] } )
2011-10-12 10:53:17 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2011-10-12 10:53:17 +04:00
2023-08-02 11:44:32 +03:00
# Objects instantiated using "satisfied" abstract classes (concrete
2011-10-12 10:53:17 +04:00
# subclasses) are allowed
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : [ " top " , " leaf " , " connectionPoint " , " serviceConnectionPoint " ] } )
2011-10-12 10:53:17 +04:00
delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
# Two disjoint top-most structural object classes aren't allowed
try :
self . ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : [ " person " , " container " ] } )
2011-10-12 10:53:17 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-03 22:58:43 +04:00
2010-09-29 21:49:57 +04:00
# Test allowed system flags
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
" objectClass " : " person " ,
2018-07-30 09:17:02 +03:00
" systemFlags " : str ( ~ ( SYSTEM_FLAG_CONFIG_ALLOW_RENAME | SYSTEM_FLAG_CONFIG_ALLOW_MOVE | SYSTEM_FLAG_CONFIG_ALLOW_LIMITED_MOVE ) ) } )
2010-09-29 21:49:57 +04:00
res = ldb . search ( " cn=ldaptestuser,cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " systemFlags " ] )
self . assertTrue ( len ( res ) == 1 )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] [ " systemFlags " ] [ 0 ] ) , " 0 " )
2010-09-29 21:49:57 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
2010-09-29 21:49:57 +04:00
2010-06-03 22:58:43 +04:00
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : " person " } )
2010-06-03 22:58:43 +04:00
# We can remove derivation classes of the structural objectclass
2023-08-02 11:44:32 +03:00
# but they're going to be re-added afterwards
2010-06-03 22:58:43 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " top " , FLAG_MOD_DELETE ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
ldb . modify ( m )
res = ldb . search ( " cn=ldaptestuser,cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " objectClass " ] )
self . assertTrue ( len ( res ) == 1 )
2018-11-19 14:20:29 +03:00
self . assertTrue ( b " top " in res [ 0 ] [ " objectClass " ] )
2010-06-03 22:58:43 +04:00
# The top-most structural class cannot be deleted since there are
# attributes of it in use
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " person " , FLAG_MOD_DELETE ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-03 22:58:43 +04:00
# We cannot delete classes which weren't specified
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " computer " , FLAG_MOD_DELETE ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_ATTRIBUTE )
2010-06-03 22:58:43 +04:00
# An invalid class cannot be added
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " X " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_ATTRIBUTE )
2010-06-03 22:58:43 +04:00
2023-08-29 05:24:00 +03:00
# We cannot add a new top-most structural class "user" here since
2011-10-12 10:53:17 +04:00
# we are missing at least one new mandatory attribute (in this case
# "sAMAccountName")
2010-06-03 22:58:43 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " user " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-03 22:58:43 +04:00
# An already specified objectclass cannot be added another time
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " person " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_ATTRIBUTE_OR_VALUE_EXISTS )
2010-06-03 22:58:43 +04:00
# Auxiliary classes can always be added
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " bootableDevice " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
ldb . modify ( m )
2011-10-12 10:53:17 +04:00
# This does not work since object class "leaf" is not auxiliary nor it
# stands in direct relation to "person" (and it is abstract too!)
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " leaf " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2011-10-12 10:53:17 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2011-10-12 10:53:17 +04:00
# Objectclass replace operations can be performed as well
2010-06-03 22:58:43 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( [ " top " , " person " , " bootableDevice " ] ,
2018-07-30 09:16:12 +03:00
FLAG_MOD_REPLACE , " objectClass " )
2010-06-03 22:58:43 +04:00
ldb . modify ( m )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( [ " person " , " bootableDevice " ] ,
2018-07-30 09:16:12 +03:00
FLAG_MOD_REPLACE , " objectClass " )
2010-06-03 22:58:43 +04:00
ldb . modify ( m )
2011-10-12 10:53:17 +04:00
# This does not work since object class "leaf" is not auxiliary nor it
# stands in direct relation to "person" (and it is abstract too!)
2010-06-03 22:58:43 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( [ " top " , " person " , " bootableDevice " ,
2018-07-30 09:16:12 +03:00
" leaf " ] , FLAG_MOD_REPLACE , " objectClass " )
2010-06-03 22:58:43 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-03 22:58:43 +04:00
2010-11-13 14:25:40 +03:00
# More than one change operation is allowed
2010-12-22 13:57:31 +03:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m . add ( MessageElement ( " bootableDevice " , FLAG_MOD_DELETE , " objectClass " ) )
m . add ( MessageElement ( " bootableDevice " , FLAG_MOD_ADD , " objectClass " ) )
ldb . modify ( m )
2010-11-12 21:49:47 +03:00
2010-11-01 17:23:48 +03:00
# We cannot remove all object classes by an empty replace
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( [ ] , FLAG_MOD_REPLACE , " objectClass " )
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-11-01 17:23:48 +03:00
2010-06-03 22:58:43 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( [ " top " , " computer " ] , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-03 22:58:43 +04:00
# Classes can be removed unless attributes of them are used.
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " bootableDevice " , FLAG_MOD_DELETE ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
ldb . modify ( m )
res = ldb . search ( " cn=ldaptestuser,cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " objectClass " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertFalse ( " bootableDevice " in res [ 0 ] [ " objectClass " ] )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " bootableDevice " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
ldb . modify ( m )
# Add an attribute specific to the "bootableDevice" class
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " bootParameter " ] = MessageElement ( " test " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" bootParameter " )
2010-06-03 22:58:43 +04:00
ldb . modify ( m )
# Classes can be removed unless attributes of them are used. Now there
# exist such attributes on the entry.
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " bootableDevice " , FLAG_MOD_DELETE ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-03 22:58:43 +04:00
# Remove the previously specified attribute
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " bootParameter " ] = MessageElement ( " test " , FLAG_MOD_DELETE ,
2018-07-30 09:16:12 +03:00
" bootParameter " )
2010-06-03 22:58:43 +04:00
ldb . modify ( m )
# Classes can be removed unless attributes of them are used.
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " bootableDevice " , FLAG_MOD_DELETE ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2010-06-03 22:58:43 +04:00
ldb . modify ( m )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
2010-06-03 22:58:43 +04:00
2011-10-12 10:53:17 +04:00
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : " user " } )
2011-10-12 10:53:17 +04:00
# Add a new top-most structural class "container". This does not work
# since it stands in no direct relation to the current one.
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " container " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2011-10-12 10:53:17 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2011-10-12 10:53:17 +04:00
2021-10-29 02:20:49 +03:00
# Try to add a new top-most structural class "inetOrgPerson"
2011-10-12 10:53:17 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " inetOrgPerson " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2021-10-29 02:20:49 +03:00
try :
ldb . modify ( m )
self . fail ( )
except LdbError as e :
( num , _ ) = e . args
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2011-10-12 10:53:17 +04:00
2021-10-29 02:20:49 +03:00
# Try to remove the structural class "user"
2011-10-12 10:53:17 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
2021-10-29 02:20:49 +03:00
m [ " objectClass " ] = MessageElement ( " user " , FLAG_MOD_DELETE ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2021-10-29 02:20:49 +03:00
try :
ldb . modify ( m )
self . fail ( )
except LdbError as e :
( num , _ ) = e . args
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2011-10-12 10:53:17 +04:00
2021-10-29 02:20:49 +03:00
# Try to replace top-most structural class to "inetOrgPerson"
2011-10-12 10:53:17 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " inetOrgPerson " , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2021-10-29 02:20:49 +03:00
try :
ldb . modify ( m )
self . fail ( )
except LdbError as e :
( num , _ ) = e . args
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2011-10-12 10:53:17 +04:00
2012-03-26 01:35:23 +04:00
# Add a new auxiliary object class "posixAccount" to "ldaptestuser"
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " posixAccount " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" objectClass " )
2012-03-26 01:35:23 +04:00
ldb . modify ( m )
# Be sure that "top" is the first and the (most) structural object class
# the last value of the "objectClass" attribute - MS-ADTS 3.1.1.1.4
res = ldb . search ( " cn=ldaptestuser,cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " objectClass " ] )
self . assertTrue ( len ( res ) == 1 )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] [ " objectClass " ] [ 0 ] ) , " top " )
self . assertEqual ( str ( res [ 0 ] [ " objectClass " ] [ len ( res [ 0 ] [ " objectClass " ] ) - 1 ] ) , " user " )
2012-03-26 01:35:23 +04:00
2011-10-12 10:53:17 +04:00
delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
2009-10-03 12:57:14 +04:00
def test_system_only ( self ) :
""" Test systemOnly objects """
try :
self . ldb . add ( {
" dn " : " cn=ldaptestobject, " + self . base_dn ,
" objectclass " : " configuration " } )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2009-10-03 12:57:14 +04:00
2010-09-29 21:39:17 +04:00
try :
self . ldb . add ( {
2011-01-17 15:52:00 +03:00
" dn " : " cn=Test Secret,cn=system, " + self . base_dn ,
2010-09-29 21:39:17 +04:00
" objectclass " : " secret " } )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-09-29 21:39:17 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestobject, " + self . base_dn )
2011-01-17 15:52:00 +03:00
delete_force ( self . ldb , " cn=Test Secret,cn=system, " + self . base_dn )
# Create secret over LSA and try to change it
lsa_conn = lsa . lsarpc ( " ncacn_np: %s " % args [ 0 ] , lp , creds )
lsa_handle = lsa_conn . OpenPolicy2 ( system_name = " \\ " ,
attr = lsa . ObjectAttribute ( ) ,
access_mask = security . SEC_FLAG_MAXIMUM_ALLOWED )
secret_name = lsa . String ( )
secret_name . string = " G$Test "
sec_handle = lsa_conn . CreateSecret ( handle = lsa_handle ,
name = secret_name ,
access_mask = security . SEC_FLAG_MAXIMUM_ALLOWED )
lsa_conn . Close ( lsa_handle )
m = Message ( )
m . dn = Dn ( ldb , " cn=Test Secret,cn=system, " + self . base_dn )
m [ " description " ] = MessageElement ( " desc " , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" description " )
2011-01-17 15:52:00 +03:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2011-01-17 15:52:00 +03:00
delete_force ( self . ldb , " cn=Test Secret,cn=system, " + self . base_dn )
2009-07-03 16:24:52 +04:00
2010-10-06 21:40:42 +04:00
try :
self . ldb . add ( {
" dn " : " cn=ldaptestcontainer, " + self . base_dn ,
" objectclass " : " container " ,
" isCriticalSystemObject " : " TRUE " } )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-10-06 21:40:42 +04:00
self . ldb . add ( {
" dn " : " cn=ldaptestcontainer, " + self . base_dn ,
" objectclass " : " container " } )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestcontainer, " + self . base_dn )
m [ " isCriticalSystemObject " ] = MessageElement ( " TRUE " , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" isCriticalSystemObject " )
2010-10-06 21:40:42 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-10-06 21:40:42 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestcontainer, " + self . base_dn )
2010-10-06 21:40:42 +04:00
# Proof if DC SAM object has "isCriticalSystemObject" set
res = self . ldb . search ( " " , scope = SCOPE_BASE , attrs = [ " serverName " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " serverName " in res [ 0 ] )
res = self . ldb . search ( res [ 0 ] [ " serverName " ] [ 0 ] , scope = SCOPE_BASE ,
attrs = [ " serverReference " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " serverReference " in res [ 0 ] )
res = self . ldb . search ( res [ 0 ] [ " serverReference " ] [ 0 ] , scope = SCOPE_BASE ,
attrs = [ " isCriticalSystemObject " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " isCriticalSystemObject " in res [ 0 ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] [ " isCriticalSystemObject " ] [ 0 ] ) , " TRUE " )
2010-10-06 21:40:42 +04:00
2009-10-03 13:37:30 +04:00
def test_invalid_parent ( self ) :
""" Test adding an object with invalid parent """
try :
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=thisdoesnotexist123, "
2018-07-30 09:16:26 +03:00
+ self . base_dn ,
2009-10-03 13:37:30 +04:00
" objectclass " : " group " } )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_OBJECT )
2009-10-03 13:37:30 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestgroup,cn=thisdoesnotexist123, "
2018-07-30 09:16:12 +03:00
+ self . base_dn )
2009-10-03 13:37:30 +04:00
try :
self . ldb . add ( {
" dn " : " ou=testou,cn=users, " + self . base_dn ,
" objectclass " : " organizationalUnit " } )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NAMING_VIOLATION )
2009-10-03 13:37:30 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " ou=testou,cn=users, " + self . base_dn )
2009-10-03 13:37:30 +04:00
2009-10-02 20:31:38 +04:00
def test_invalid_attribute ( self ) :
2010-06-07 01:09:28 +04:00
""" Test invalid attributes on schema/objectclasses """
# attributes not in schema test
# add operation
2009-10-02 20:31:38 +04:00
2008-02-09 21:04:14 +03:00
try :
self . ldb . add ( {
2009-10-02 20:31:38 +04:00
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
2008-02-09 21:16:44 +03:00
" objectclass " : " group " ,
2009-10-02 20:31:38 +04:00
" thisdoesnotexist " : " x " } )
2008-02-09 21:16:44 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_ATTRIBUTE )
2009-10-02 20:31:38 +04:00
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
2009-10-02 20:31:38 +04:00
2010-06-07 01:09:28 +04:00
# modify operation
2009-10-02 20:31:38 +04:00
m = Message ( )
2009-10-03 12:57:14 +04:00
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
m [ " thisdoesnotexist " ] = MessageElement ( " x " , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" thisdoesnotexist " )
2009-10-02 20:31:38 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_ATTRIBUTE )
2009-10-02 20:31:38 +04:00
2018-08-03 06:51:28 +03:00
#
# When searching the unknown attribute should be ignored
expr = " (|(cn=ldaptestgroup)(thisdoesnotexist=x)) "
res = ldb . search ( base = self . base_dn ,
expression = expr ,
scope = SCOPE_SUBTREE )
self . assertTrue ( len ( res ) == 1 ,
" Search including unknown attribute failed " )
2018-09-14 05:06:30 +03:00
# likewise, if we specifically request an unknown attribute
res = ldb . search ( base = self . base_dn ,
expression = " (cn=ldaptestgroup) " ,
scope = SCOPE_SUBTREE ,
attrs = [ " thisdoesnotexist " ] )
self . assertTrue ( len ( res ) == 1 ,
" Search requesting unknown attribute failed " )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
2010-06-07 01:09:28 +04:00
# attributes not in objectclasses and mandatory attributes missing test
# Use here a non-SAM entry since it doesn't have special triggers
# associated which have an impact on the error results.
# add operations
# mandatory attribute missing
try :
self . ldb . add ( {
" dn " : " cn=ldaptestobject, " + self . base_dn ,
" objectclass " : " ipProtocol " } )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-07 01:09:28 +04:00
# inadequate but schema-valid attribute specified
try :
self . ldb . add ( {
" dn " : " cn=ldaptestobject, " + self . base_dn ,
" objectclass " : " ipProtocol " ,
" ipProtocolNumber " : " 1 " ,
2018-07-30 09:17:14 +03:00
" uid " : " 0 " } )
2010-06-07 01:09:28 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-07 01:09:28 +04:00
self . ldb . add ( {
" dn " : " cn=ldaptestobject, " + self . base_dn ,
" objectclass " : " ipProtocol " ,
" ipProtocolNumber " : " 1 " } )
# modify operations
# inadequate but schema-valid attribute add trial
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestobject, " + self . base_dn )
m [ " uid " ] = MessageElement ( " 0 " , FLAG_MOD_ADD , " uid " )
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-07 01:09:28 +04:00
# mandatory attribute delete trial
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestobject, " + self . base_dn )
m [ " ipProtocolNumber " ] = MessageElement ( [ ] , FLAG_MOD_DELETE ,
2018-07-30 09:16:12 +03:00
" ipProtocolNumber " )
2010-06-07 01:09:28 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-07 01:09:28 +04:00
# mandatory attribute delete trial
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestobject, " + self . base_dn )
m [ " ipProtocolNumber " ] = MessageElement ( [ ] , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" ipProtocolNumber " )
2010-06-07 01:09:28 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2010-06-07 01:09:28 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestobject, " + self . base_dn )
2010-06-07 01:09:28 +04:00
2009-10-06 19:18:04 +04:00
def test_single_valued_attributes ( self ) :
""" Test single-valued attributes """
try :
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " ,
" sAMAccountName " : [ " nam1 " , " nam2 " ] } )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2009-10-06 19:18:04 +04:00
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
2009-10-06 19:18:04 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2018-07-30 09:19:05 +03:00
m [ " sAMAccountName " ] = MessageElement ( [ " nam1 " , " nam2 " ] , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" sAMAccountName " )
2009-10-06 19:18:04 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_ATTRIBUTE_OR_VALUE_EXISTS )
2009-10-06 19:18:04 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-15 09:11:30 +04:00
m [ " sAMAccountName " ] = MessageElement ( " testgroupXX " , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" sAMAccountName " )
2009-10-06 19:18:04 +04:00
ldb . modify ( m )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-15 09:11:30 +04:00
m [ " sAMAccountName " ] = MessageElement ( " testgroupXX2 " , FLAG_MOD_ADD ,
2018-07-30 09:16:12 +03:00
" sAMAccountName " )
2009-10-06 19:18:04 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_ATTRIBUTE_OR_VALUE_EXISTS )
2009-10-06 19:18:04 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-06 19:18:04 +04:00
2017-06-01 03:20:15 +03:00
def test_single_valued_linked_attributes ( self ) :
""" Test managedBy, a single-valued linked attribute.
( The single - valuedness of this is enforced differently , in
repl_meta_data . c )
"""
ou = ' OU=svla, %s ' % ( self . base_dn )
delete_force ( self . ldb , ou , controls = [ ' tree_delete:1 ' ] )
self . ldb . add ( { ' objectclass ' : ' organizationalUnit ' ,
' dn ' : ou } )
managers = [ ]
for x in range ( 3 ) :
m = " cn=manager %d , %s " % ( x , ou )
self . ldb . add ( {
" dn " : m ,
" objectclass " : " user " } )
managers . append ( m )
try :
self . ldb . add ( {
" dn " : " cn=group1, " + ou ,
" objectclass " : " group " ,
" managedBy " : managers
} )
self . fail ( " failed to fail to add multiple managedBy attributes " )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2017-06-01 03:20:15 +03:00
managee = " cn=group2, " + ou
self . ldb . add ( {
" dn " : managee ,
" objectclass " : " group " ,
" managedBy " : [ managers [ 0 ] ] } )
m = Message ( )
m . dn = Dn ( ldb , managee )
m [ " managedBy " ] = MessageElement ( managers , FLAG_MOD_REPLACE ,
" managedBy " )
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2017-06-01 03:20:15 +03:00
m = Message ( )
m . dn = Dn ( ldb , managee )
m [ " managedBy " ] = MessageElement ( managers [ 1 ] , FLAG_MOD_REPLACE ,
" managedBy " )
ldb . modify ( m )
m = Message ( )
m . dn = Dn ( ldb , managee )
m [ " managedBy " ] = MessageElement ( managers [ 2 ] , FLAG_MOD_ADD ,
" managedBy " )
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_ATTRIBUTE_OR_VALUE_EXISTS )
2017-06-01 03:20:15 +03:00
self . ldb . delete ( ou , [ ' tree_delete:1 ' ] )
2017-05-26 06:41:34 +03:00
def test_multivalued_attributes ( self ) :
""" Test multi-valued attributes """
ou = ' OU=mvattr, %s ' % ( self . base_dn )
delete_force ( self . ldb , ou , controls = [ ' tree_delete:1 ' ] )
self . ldb . add ( { ' objectclass ' : ' organizationalUnit ' ,
' dn ' : ou } )
# beyond 1210, Win2012r2 gives LDAP_ADMIN_LIMIT_EXCEEDED
ranges = ( 3 , 30 , 300 , 1210 )
for n in ranges :
self . ldb . add ( {
" dn " : " cn=ldaptestuser %d , %s " % ( n , ou ) ,
" objectclass " : " user " ,
" carLicense " : [ " car %d " % x for x in range ( n ) ] } )
# add some more
for n in ranges :
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser %d , %s " % ( n , ou ) )
m [ " carLicense " ] = MessageElement ( [ " another " ] ,
FLAG_MOD_ADD ,
" carLicense " )
ldb . modify ( m )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser %d , %s " % ( n , ou ) )
m [ " carLicense " ] = MessageElement ( [ " foo %d " % x for x in range ( 4 ) ] ,
FLAG_MOD_ADD ,
" carLicense " )
ldb . modify ( m )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser %d , %s " % ( n , ou ) )
m [ " carLicense " ] = MessageElement ( [ " bar %d " % x for x in range ( 40 ) ] ,
FLAG_MOD_ADD ,
" carLicense " )
ldb . modify ( m )
for n in ranges :
m = Message ( )
dn = " cn=ldaptestuser %d , %s " % ( n , ou )
m . dn = Dn ( ldb , dn )
m [ " carLicense " ] = MessageElement ( [ " replacement " ] ,
FLAG_MOD_REPLACE ,
" carLicense " )
ldb . modify ( m )
m = Message ( )
m . dn = Dn ( ldb , dn )
m [ " carLicense " ] = MessageElement ( [ " replacement %d " % x for x in range ( n ) ] ,
FLAG_MOD_REPLACE ,
" carLicense " )
ldb . modify ( m )
m = Message ( )
m . dn = Dn ( ldb , dn )
m [ " carLicense " ] = MessageElement ( [ " again %d " % x for x in range ( n ) ] ,
FLAG_MOD_REPLACE ,
" carLicense " )
ldb . modify ( m )
m = Message ( )
m . dn = Dn ( ldb , dn )
m [ " carLicense " ] = MessageElement ( [ " andagain %d " % x for x in range ( n ) ] ,
FLAG_MOD_REPLACE ,
" carLicense " )
ldb . modify ( m )
self . ldb . delete ( ou , [ ' tree_delete:1 ' ] )
2010-10-26 21:09:44 +04:00
def test_attribute_ranges ( self ) :
""" Test attribute ranges """
# Too short (min. 1)
try :
ldb . add ( {
2018-07-30 09:14:13 +03:00
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:16:26 +03:00
" objectClass " : " person " ,
2018-07-30 09:17:02 +03:00
" sn " : " " } )
2010-10-26 21:09:44 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_ATTRIBUTE_SYNTAX )
2010-10-26 21:09:44 +04:00
ldb . add ( {
2018-07-30 09:14:13 +03:00
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : " person " } )
2010-10-26 21:09:44 +04:00
# Too short (min. 1)
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " sn " ] = MessageElement ( " " , FLAG_MOD_REPLACE , " sn " )
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 07:09:55 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_ATTRIBUTE_SYNTAX )
2010-10-26 21:09:44 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " sn " ] = MessageElement ( " x " , FLAG_MOD_REPLACE , " sn " )
ldb . modify ( m )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
2010-10-26 21:09:44 +04:00
2019-04-12 07:09:55 +03:00
def test_attribute_ranges_too_long ( self ) :
""" Test attribute ranges """
# This is knownfail with the wrong error
# (INVALID_ATTRIBUTE_SYNTAX vs CONSTRAINT_VIOLATION per Windows)
# Too long (max. 64)
try :
ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
" objectClass " : " person " ,
" sn " : " x " * 65 } )
self . fail ( )
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2019-04-12 07:09:55 +03:00
ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
" objectClass " : " person " } )
# Too long (max. 64)
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " sn " ] = MessageElement ( " x " * 66 , FLAG_MOD_REPLACE , " sn " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError as e :
2020-02-07 01:02:38 +03:00
self . assertEqual ( e . args [ 0 ] , ERR_CONSTRAINT_VIOLATION )
2019-04-12 07:09:55 +03:00
2009-10-06 19:18:04 +04:00
def test_empty_messages ( self ) :
""" Test empty messages """
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
try :
ldb . add ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OBJECT_CLASS_VIOLATION )
2009-10-06 19:18:04 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2009-10-06 19:18:04 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-06 19:18:04 +04:00
def test_empty_attributes ( self ) :
""" Test empty attributes """
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " group " , FLAG_MOD_ADD , " objectClass " )
m [ " description " ] = MessageElement ( [ ] , FLAG_MOD_ADD , " description " )
try :
ldb . add ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2009-10-06 19:18:04 +04:00
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " description " ] = MessageElement ( [ ] , FLAG_MOD_ADD , " description " )
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2009-10-06 19:18:04 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " description " ] = MessageElement ( [ ] , FLAG_MOD_REPLACE , " description " )
ldb . modify ( m )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " description " ] = MessageElement ( [ ] , FLAG_MOD_DELETE , " description " )
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_ATTRIBUTE )
2009-10-06 19:18:04 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-06 19:18:04 +04:00
2010-06-10 12:52:31 +04:00
def test_instanceType ( self ) :
""" Tests the ' instanceType ' attribute """
2010-08-01 23:12:50 +04:00
# The instance type is single-valued
2010-06-19 21:33:16 +04:00
try :
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " ,
" instanceType " : [ " 0 " , " 1 " ] } )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-06-19 21:33:16 +04:00
2010-08-01 23:12:50 +04:00
# The head NC flag cannot be set without the write flag
try :
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " ,
2018-07-30 09:17:02 +03:00
" instanceType " : " 1 " } )
2010-08-01 23:12:50 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-08-01 23:12:50 +04:00
# We cannot manipulate NCs without the head NC flag
try :
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " ,
2018-07-30 09:17:02 +03:00
" instanceType " : " 32 " } )
2010-08-01 23:12:50 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-08-01 23:12:50 +04:00
2010-06-10 12:52:31 +04:00
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
2010-06-10 12:52:31 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " instanceType " ] = MessageElement ( " 0 " , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" instanceType " )
2010-06-10 12:52:31 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2010-06-10 12:52:31 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " instanceType " ] = MessageElement ( [ ] , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" instanceType " )
2010-06-10 12:52:31 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2010-06-10 12:52:31 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " instanceType " ] = MessageElement ( [ ] , FLAG_MOD_DELETE , " instanceType " )
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2010-06-10 12:52:31 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2010-06-10 12:52:31 +04:00
2018-07-30 09:19:49 +03:00
# only write is allowed with NC_HEAD for originating updates
2013-10-29 20:17:27 +04:00
try :
self . ldb . add ( {
" dn " : " cn=ldaptestuser2,cn=users, " + self . base_dn ,
" objectclass " : " user " ,
2018-07-30 09:17:02 +03:00
" instanceType " : " 3 " } )
2013-10-29 20:17:27 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2013-10-29 20:17:27 +04:00
delete_force ( self . ldb , " cn=ldaptestuser2,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
def test_distinguished_name ( self ) :
""" Tests the ' distinguishedName ' attribute """
2010-11-06 22:47:51 +03:00
# The "dn" shortcut isn't supported
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " objectClass " ] = MessageElement ( " group " , 0 , " objectClass " )
m [ " dn " ] = MessageElement ( " cn=ldaptestgroup,cn=users, " + self . base_dn , 0 ,
2018-07-30 09:16:12 +03:00
" dn " )
2010-11-06 22:47:51 +03:00
try :
ldb . add ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_ATTRIBUTE )
2010-11-06 22:47:51 +03:00
2010-06-11 11:19:02 +04:00
# a wrong "distinguishedName" attribute is obviously tolerated
2009-10-02 20:31:38 +04:00
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " ,
" distinguishedName " : " cn=ldaptest,cn=users, " + self . base_dn } )
2010-06-11 11:19:02 +04:00
# proof if the DN has been set correctly
res = ldb . search ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " distinguishedName " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " distinguishedName " in res [ 0 ] )
2018-11-19 14:20:29 +03:00
self . assertTrue ( Dn ( ldb , str ( res [ 0 ] [ " distinguishedName " ] [ 0 ] ) )
2018-07-30 09:16:12 +03:00
== Dn ( ldb , " cn=ldaptestgroup, cn=users, " + self . base_dn ) )
2009-10-02 20:31:38 +04:00
2010-11-06 22:47:51 +03:00
# The "dn" shortcut isn't supported
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " dn " ] = MessageElement (
2018-07-30 09:14:13 +03:00
" cn=ldaptestgroup,cn=users, " + self . base_dn , FLAG_MOD_REPLACE ,
2018-07-30 09:16:26 +03:00
" dn " )
2010-11-06 22:47:51 +03:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_ATTRIBUTE )
2010-11-06 22:47:51 +03:00
2009-10-06 19:18:04 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " distinguishedName " ] = MessageElement (
2018-07-30 09:14:13 +03:00
" cn=ldaptestuser,cn=users, " + self . base_dn , FLAG_MOD_ADD ,
2018-07-30 09:16:26 +03:00
" distinguishedName " )
2009-10-06 19:18:04 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2009-10-06 19:18:04 +04:00
2009-10-02 20:31:38 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " distinguishedName " ] = MessageElement (
2018-07-30 09:14:13 +03:00
" cn=ldaptestuser,cn=users, " + self . base_dn , FLAG_MOD_REPLACE ,
2018-07-30 09:16:26 +03:00
" distinguishedName " )
2009-10-02 20:31:38 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2009-10-06 19:18:04 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " distinguishedName " ] = MessageElement (
2018-07-30 09:14:13 +03:00
" cn=ldaptestuser,cn=users, " + self . base_dn , FLAG_MOD_DELETE ,
2018-07-30 09:16:26 +03:00
" distinguishedName " )
2009-10-06 19:18:04 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2009-10-02 20:31:38 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
def test_rdn_name ( self ) :
""" Tests the RDN """
2011-03-04 11:27:51 +03:00
# Search
# empty RDN
try :
self . ldb . search ( " =,cn=users, " + self . base_dn , scope = SCOPE_BASE )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2011-03-04 11:27:51 +03:00
# empty RDN name
try :
self . ldb . search ( " cn=,cn=users, " + self . base_dn , scope = SCOPE_BASE )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2011-03-04 11:27:51 +03:00
try :
self . ldb . search ( " =ldaptestgroup,cn=users, " + self . base_dn , scope = SCOPE_BASE )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2011-03-04 11:27:51 +03:00
# Add
2010-11-11 11:12:17 +03:00
# empty RDN
try :
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " =,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
2010-11-11 11:12:17 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2010-11-11 11:12:17 +03:00
# empty RDN name
try :
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " =ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
2010-11-11 11:12:17 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2010-11-11 11:12:17 +03:00
# empty RDN value
try :
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
2010-11-11 11:12:17 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2010-11-11 11:12:17 +03:00
# a wrong RDN candidate
2009-10-03 13:37:30 +04:00
try :
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " description=xyz,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
2009-10-03 13:37:30 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NAMING_VIOLATION )
2009-12-30 23:46:32 +03:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " description=xyz,cn=users, " + self . base_dn )
2009-10-03 13:37:30 +04:00
2010-06-03 20:05:52 +04:00
# a wrong "name" attribute is obviously tolerated
2009-10-02 20:31:38 +04:00
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " ,
" name " : " ldaptestgroupx " } )
2009-10-02 20:31:38 +04:00
2010-06-11 11:17:08 +04:00
# proof if the name has been set correctly
res = ldb . search ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " name " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " name " in res [ 0 ] )
2018-11-19 14:20:29 +03:00
self . assertTrue ( str ( res [ 0 ] [ " name " ] [ 0 ] ) == " ldaptestgroup " )
2010-06-11 11:17:08 +04:00
2011-03-04 11:27:51 +03:00
# Modify
# empty RDN value
m = Message ( )
m . dn = Dn ( ldb , " cn=,cn=users, " + self . base_dn )
m [ " description " ] = " test "
try :
self . ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2011-03-04 11:27:51 +03:00
# Delete
# empty RDN value
try :
self . ldb . delete ( " cn=,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2011-03-04 11:27:51 +03:00
# Rename
2010-11-11 11:12:17 +03:00
# new empty RDN
try :
self . ldb . rename ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" =,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2010-11-11 11:12:17 +03:00
# new empty RDN name
try :
self . ldb . rename ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" =ldaptestgroup,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2010-11-11 11:12:17 +03:00
# new empty RDN value
try :
self . ldb . rename ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" cn=,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NAMING_VIOLATION )
2010-11-11 11:12:17 +03:00
2011-03-04 11:27:51 +03:00
# new wrong RDN candidate
try :
self . ldb . rename ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" description=xyz,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2011-03-04 11:27:51 +03:00
delete_force ( self . ldb , " description=xyz,cn=users, " + self . base_dn )
# old empty RDN value
try :
self . ldb . rename ( " cn=,cn=users, " + self . base_dn ,
" cn=ldaptestgroup,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2011-03-04 11:27:51 +03:00
# names
2009-10-02 20:31:38 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " name " ] = MessageElement ( " cn=ldaptestuser " , FLAG_MOD_REPLACE ,
2018-07-30 09:16:12 +03:00
" name " )
2009-10-02 20:31:38 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NOT_ALLOWED_ON_RDN )
2009-10-02 20:31:38 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " cn " ] = MessageElement ( " ldaptestuser " ,
2018-07-30 09:16:12 +03:00
FLAG_MOD_REPLACE , " cn " )
2009-10-02 20:31:38 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NOT_ALLOWED_ON_RDN )
2009-10-02 20:31:38 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-02 23:26:35 +04:00
2009-11-09 14:19:52 +03:00
# this test needs to be disabled until we really understand
# what the rDN length constraints are
2018-07-30 09:19:59 +03:00
2009-11-09 14:19:52 +03:00
def DISABLED_test_largeRDN ( self ) :
2009-10-15 08:54:40 +04:00
""" Testing large rDN (limit 64 characters) """
2014-11-16 05:34:22 +03:00
rdn = " CN=a012345678901234567890123456789012345678901234567890123456789012 "
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " %s , %s " % ( rdn , self . base_dn ) )
2009-10-15 08:54:40 +04:00
ldif = """
2018-07-30 09:19:05 +03:00
dn : % s , % s """ % (rdn, self.base_dn) + """
2009-10-15 08:54:40 +04:00
objectClass : container
"""
self . ldb . add_ldif ( ldif )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " %s , %s " % ( rdn , self . base_dn ) )
2009-10-15 08:54:40 +04:00
2014-11-16 05:34:22 +03:00
rdn = " CN=a0123456789012345678901234567890123456789012345678901234567890120 "
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " %s , %s " % ( rdn , self . base_dn ) )
2009-10-15 08:54:40 +04:00
try :
ldif = """
2018-07-30 09:19:05 +03:00
dn : % s , % s """ % (rdn, self.base_dn) + """
2009-10-15 08:54:40 +04:00
objectClass : container
"""
self . ldb . add_ldif ( ldif )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " %s , %s " % ( rdn , self . base_dn ) )
2009-10-15 08:54:40 +04:00
2009-10-02 23:26:35 +04:00
def test_rename ( self ) :
""" Tests the rename operation """
2010-06-03 00:06:39 +04:00
try :
# cannot rename to be a child of itself
ldb . rename ( self . base_dn , " dc=test, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-06-03 00:06:39 +04:00
try :
# inexistent object
ldb . rename ( " cn=ldaptestuser2,cn=users, " + self . base_dn , " cn=ldaptestuser2,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_OBJECT )
2010-06-03 00:06:39 +04:00
2009-10-02 23:26:35 +04:00
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestuser2,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectclass " : " user " } )
2009-10-02 23:26:35 +04:00
ldb . rename ( " cn=ldaptestuser2,cn=users, " + self . base_dn , " cn=ldaptestuser2,cn=users, " + self . base_dn )
ldb . rename ( " cn=ldaptestuser2,cn=users, " + self . base_dn , " cn=ldaptestuser3,cn=users, " + self . base_dn )
ldb . rename ( " cn=ldaptestuser3,cn=users, " + self . base_dn , " cn=ldaptestUSER3,cn=users, " + self . base_dn )
2010-06-03 00:06:39 +04:00
2009-10-02 23:26:35 +04:00
try :
2010-06-03 00:06:39 +04:00
# containment problem: a user entry cannot contain user entries
ldb . rename ( " cn=ldaptestuser3,cn=users, " + self . base_dn , " cn=ldaptestuser4,cn=ldaptestuser3,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NAMING_VIOLATION )
2010-06-03 00:06:39 +04:00
try :
# invalid parent
ldb . rename ( " cn=ldaptestuser3,cn=users, " + self . base_dn , " cn=ldaptestuser3,cn=people,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OTHER )
2010-06-03 00:06:39 +04:00
try :
# invalid target DN syntax
2009-10-02 23:26:35 +04:00
ldb . rename ( " cn=ldaptestuser3,cn=users, " + self . base_dn , " ,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2009-10-02 23:26:35 +04:00
2010-06-03 00:06:39 +04:00
try :
# invalid RDN name
ldb . rename ( " cn=ldaptestuser3,cn=users, " + self . base_dn , " ou=ldaptestuser3,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-06-03 00:06:39 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestuser3,cn=users, " + self . base_dn )
2007-12-24 04:19:41 +03:00
2010-07-09 21:22:01 +04:00
# Performs some "systemFlags" testing
# Move failing since no "SYSTEM_FLAG_CONFIG_ALLOW_MOVE"
try :
ldb . rename ( " CN=DisplaySpecifiers, " + self . configuration_dn , " CN=DisplaySpecifiers,CN=Services, " + self . configuration_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-07-09 21:22:01 +04:00
# Limited move failing since no "SYSTEM_FLAG_CONFIG_ALLOW_LIMITED_MOVE"
try :
ldb . rename ( " CN=Directory Service,CN=Windows NT,CN=Services, " + self . configuration_dn , " CN=Directory Service,CN=RRAS,CN=Services, " + self . configuration_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-07-09 21:22:01 +04:00
# Rename failing since no "SYSTEM_FLAG_CONFIG_ALLOW_RENAME"
try :
ldb . rename ( " CN=DisplaySpecifiers, " + self . configuration_dn , " CN=DisplaySpecifiers2, " + self . configuration_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-07-09 21:22:01 +04:00
# It's not really possible to test moves on the schema partition since
# there don't exist subcontainers on it.
# Rename failing since "SYSTEM_FLAG_SCHEMA_BASE_OBJECT"
try :
ldb . rename ( " CN=Top, " + self . schema_dn , " CN=Top2, " + self . schema_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-07-09 21:22:01 +04:00
# Move failing since "SYSTEM_FLAG_DOMAIN_DISALLOW_MOVE"
try :
ldb . rename ( " CN=Users, " + self . base_dn , " CN=Users,CN=Computers, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-07-09 21:22:01 +04:00
# Rename failing since "SYSTEM_FLAG_DOMAIN_DISALLOW_RENAME"
try :
ldb . rename ( " CN=Users, " + self . base_dn , " CN=Users2, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-07-09 21:22:01 +04:00
2010-08-01 13:26:08 +04:00
# Performs some other constraints testing
try :
ldb . rename ( " CN=Policies,CN=System, " + self . base_dn , " CN=Users2, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_OTHER )
2010-08-01 13:26:08 +04:00
2009-11-20 03:47:54 +03:00
def test_rename_twice ( self ) :
""" Tests the rename operation twice - this corresponds to a past bug """
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestuser5,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectclass " : " user " } )
2009-11-20 03:47:54 +03:00
ldb . rename ( " cn=ldaptestuser5,cn=users, " + self . base_dn , " cn=ldaptestUSER5,cn=users, " + self . base_dn )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestuser5,cn=users, " + self . base_dn )
2009-11-20 03:47:54 +03:00
self . ldb . add ( {
2018-07-30 09:16:26 +03:00
" dn " : " cn=ldaptestuser5,cn=users, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectclass " : " user " } )
2009-11-20 03:47:54 +03:00
ldb . rename ( " cn=ldaptestuser5,cn=Users, " + self . base_dn , " cn=ldaptestUSER5,cn=users, " + self . base_dn )
res = ldb . search ( expression = " cn=ldaptestuser5 " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Wrong number of hits for cn=ldaptestuser5 " )
2009-11-20 03:47:54 +03:00
res = ldb . search ( expression = " (&(cn=ldaptestuser5)(objectclass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Wrong number of hits for (&(cn=ldaptestuser5)(objectclass=user)) " )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestuser5,cn=users, " + self . base_dn )
2009-11-20 03:47:54 +03:00
2010-11-07 22:10:48 +03:00
def test_objectGUID ( self ) :
""" Test objectGUID behaviour """
# The objectGUID cannot directly be set
try :
self . ldb . add_ldif ( """
dn : cn = ldaptestcontainer , """ + self.base_dn + """
objectClass : container
objectGUID : bd3480c9 - 58 af - 4 cd8 - 92 df - bc4a18b6e44d
""" )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-11-07 22:10:48 +03:00
self . ldb . add ( {
" dn " : " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : " container " } )
2010-11-07 22:10:48 +03:00
2010-11-08 12:16:45 +03:00
# The objectGUID cannot directly be changed
try :
self . ldb . modify_ldif ( """
dn : cn = ldaptestcontainer , """ + self.base_dn + """
changetype : modify
replace : objectGUID
objectGUID : bd3480c9 - 58 af - 4 cd8 - 92 df - bc4a18b6e44d
""" )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2010-11-08 12:16:45 +03:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestcontainer, " + self . base_dn )
2010-11-07 22:10:48 +03:00
2009-03-17 06:18:53 +03:00
def test_parentGUID ( self ) :
""" Test parentGUID behaviour """
self . ldb . add ( {
" dn " : " cn=parentguidtest,cn=users, " + self . base_dn ,
2018-07-30 09:19:05 +03:00
" objectclass " : " user " ,
" samaccountname " : " parentguidtest " } )
2009-03-17 06:18:53 +03:00
res1 = ldb . search ( base = " cn=parentguidtest,cn=users, " + self . base_dn , scope = SCOPE_BASE ,
2014-11-16 05:34:22 +03:00
attrs = [ " parentGUID " , " samaccountname " ] )
2018-07-30 09:19:05 +03:00
res2 = ldb . search ( base = " cn=users, " + self . base_dn , scope = SCOPE_BASE ,
2014-11-16 05:34:22 +03:00
attrs = [ " objectGUID " ] )
2009-11-27 17:25:18 +03:00
res3 = ldb . search ( base = self . base_dn , scope = SCOPE_BASE ,
2014-11-16 05:34:22 +03:00
attrs = [ " parentGUID " ] )
2010-09-21 20:10:54 +04:00
res4 = ldb . search ( base = self . configuration_dn , scope = SCOPE_BASE ,
2014-11-16 05:34:22 +03:00
attrs = [ " parentGUID " ] )
2010-09-21 20:10:54 +04:00
res5 = ldb . search ( base = self . schema_dn , scope = SCOPE_BASE ,
2014-11-16 05:34:22 +03:00
attrs = [ " parentGUID " ] )
2009-11-27 17:25:18 +03:00
""" Check if the parentGUID is valid """
2020-02-07 01:02:38 +03:00
self . assertEqual ( res1 [ 0 ] [ " parentGUID " ] , res2 [ 0 ] [ " objectGUID " ] )
2009-03-17 06:18:53 +03:00
2010-09-21 20:10:54 +04:00
""" Check if it returns nothing when there is no parent object - default NC """
2009-11-27 17:25:18 +03:00
has_parentGUID = False
for key in res3 [ 0 ] . keys ( ) :
if key == " parentGUID " :
has_parentGUID = True
break
2014-11-16 05:34:22 +03:00
self . assertFalse ( has_parentGUID )
2009-11-27 17:25:18 +03:00
2010-09-21 20:10:54 +04:00
""" Check if it returns nothing when there is no parent object - configuration NC """
has_parentGUID = False
for key in res4 [ 0 ] . keys ( ) :
if key == " parentGUID " :
has_parentGUID = True
break
2014-11-16 05:34:22 +03:00
self . assertFalse ( has_parentGUID )
2010-09-21 20:10:54 +04:00
""" Check if it returns nothing when there is no parent object - schema NC """
has_parentGUID = False
for key in res5 [ 0 ] . keys ( ) :
if key == " parentGUID " :
has_parentGUID = True
break
2014-11-16 05:34:22 +03:00
self . assertFalse ( has_parentGUID )
2010-09-21 20:10:54 +04:00
2009-11-27 17:25:18 +03:00
""" Ensures that if you look for another object attribute after the constructed
parentGUID , it will return correctly """
has_another_attribute = False
for key in res1 [ 0 ] . keys ( ) :
if key == " sAMAccountName " :
has_another_attribute = True
break
self . assertTrue ( has_another_attribute )
self . assertTrue ( len ( res1 [ 0 ] [ " samaccountname " ] ) == 1 )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res1 [ 0 ] [ " samaccountname " ] [ 0 ] ) , " parentguidtest " )
2009-11-27 17:25:18 +03:00
2014-11-02 06:07:02 +03:00
# Testing parentGUID behaviour on rename\
2009-03-17 06:18:53 +03:00
self . ldb . add ( {
" dn " : " cn=testotherusers, " + self . base_dn ,
2018-07-30 09:19:05 +03:00
" objectclass " : " container " } )
res1 = ldb . search ( base = " cn=testotherusers, " + self . base_dn , scope = SCOPE_BASE ,
2014-11-16 05:34:22 +03:00
attrs = [ " objectGUID " ] )
2009-03-17 06:18:53 +03:00
ldb . rename ( " cn=parentguidtest,cn=users, " + self . base_dn ,
2014-11-16 05:34:22 +03:00
" cn=parentguidtest,cn=testotherusers, " + self . base_dn )
2009-03-17 06:18:53 +03:00
res2 = ldb . search ( base = " cn=parentguidtest,cn=testotherusers, " + self . base_dn ,
scope = SCOPE_BASE ,
2014-11-16 05:34:22 +03:00
attrs = [ " parentGUID " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( res1 [ 0 ] [ " objectGUID " ] , res2 [ 0 ] [ " parentGUID " ] )
2009-03-17 06:18:53 +03:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=parentguidtest,cn=testotherusers, " + self . base_dn )
delete_force ( self . ldb , " cn=testotherusers, " + self . base_dn )
2009-10-02 20:31:38 +04:00
2013-05-31 08:14:54 +04:00
def test_usnChanged ( self ) :
""" Test usnChanged behaviour """
self . ldb . add ( {
" dn " : " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:17:02 +03:00
" objectClass " : " container " } )
2013-05-31 08:14:54 +04:00
res = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
scope = SCOPE_BASE ,
attrs = [ " objectGUID " , " uSNCreated " , " uSNChanged " , " whenCreated " , " whenChanged " , " description " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertFalse ( " description " in res [ 0 ] )
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " uSNCreated " in res [ 0 ] )
self . assertTrue ( " uSNChanged " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
self . assertTrue ( " whenChanged " in res [ 0 ] )
delete_force ( self . ldb , " cn=ldaptestcontainer, " + self . base_dn )
2023-08-29 05:24:00 +03:00
# All these attributes are specifiable on add operations
2013-05-31 08:14:54 +04:00
self . ldb . add ( {
" dn " : " cn=ldaptestcontainer, " + self . base_dn ,
" objectclass " : " container " ,
2018-07-30 09:17:14 +03:00
" uSNCreated " : " 1 " ,
" uSNChanged " : " 1 " ,
2018-10-04 05:30:21 +03:00
" whenCreated " : timestring ( int ( time . time ( ) ) ) ,
" whenChanged " : timestring ( int ( time . time ( ) ) ) } )
2013-05-31 08:14:54 +04:00
res = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
scope = SCOPE_BASE ,
attrs = [ " objectGUID " , " uSNCreated " , " uSNChanged " , " whenCreated " , " whenChanged " , " description " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertFalse ( " description " in res [ 0 ] )
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " uSNCreated " in res [ 0 ] )
2018-07-30 09:19:33 +03:00
self . assertFalse ( res [ 0 ] [ " uSNCreated " ] [ 0 ] == " 1 " ) # these are corrected
2013-05-31 08:14:54 +04:00
self . assertTrue ( " uSNChanged " in res [ 0 ] )
2018-07-30 09:19:33 +03:00
self . assertFalse ( res [ 0 ] [ " uSNChanged " ] [ 0 ] == " 1 " ) # these are corrected
2013-05-31 08:14:54 +04:00
self . assertTrue ( " whenCreated " in res [ 0 ] )
self . assertTrue ( " whenChanged " in res [ 0 ] )
ldb . modify_ldif ( """
dn : cn = ldaptestcontainer , """ + self.base_dn + """
changetype : modify
replace : description
""" )
res2 = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
scope = SCOPE_BASE ,
attrs = [ " uSNCreated " , " uSNChanged " , " description " ] )
2013-05-31 08:14:54 +04:00
self . assertTrue ( len ( res ) == 1 )
self . assertFalse ( " description " in res2 [ 0 ] )
self . assertEqual ( res [ 0 ] [ " usnCreated " ] , res2 [ 0 ] [ " usnCreated " ] )
self . assertEqual ( res [ 0 ] [ " usnCreated " ] , res2 [ 0 ] [ " usnChanged " ] )
self . assertEqual ( res [ 0 ] [ " usnChanged " ] , res2 [ 0 ] [ " usnChanged " ] )
ldb . modify_ldif ( """
dn : cn = ldaptestcontainer , """ + self.base_dn + """
changetype : modify
replace : description
description : test
""" )
res3 = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
scope = SCOPE_BASE ,
attrs = [ " uSNCreated " , " uSNChanged " , " description " ] )
2013-05-31 08:14:54 +04:00
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " description " in res3 [ 0 ] )
self . assertEqual ( " test " , str ( res3 [ 0 ] [ " description " ] [ 0 ] ) )
self . assertEqual ( res [ 0 ] [ " usnCreated " ] , res3 [ 0 ] [ " usnCreated " ] )
self . assertNotEqual ( res [ 0 ] [ " usnCreated " ] , res3 [ 0 ] [ " usnChanged " ] )
self . assertNotEqual ( res [ 0 ] [ " usnChanged " ] , res3 [ 0 ] [ " usnChanged " ] )
ldb . modify_ldif ( """
dn : cn = ldaptestcontainer , """ + self.base_dn + """
changetype : modify
replace : description
description : test
""" )
res4 = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
scope = SCOPE_BASE ,
attrs = [ " uSNCreated " , " uSNChanged " , " description " ] )
2013-05-31 08:14:54 +04:00
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " description " in res4 [ 0 ] )
self . assertEqual ( " test " , str ( res4 [ 0 ] [ " description " ] [ 0 ] ) )
self . assertEqual ( res [ 0 ] [ " usnCreated " ] , res4 [ 0 ] [ " usnCreated " ] )
self . assertNotEqual ( res3 [ 0 ] [ " usnCreated " ] , res4 [ 0 ] [ " usnChanged " ] )
self . assertEqual ( res3 [ 0 ] [ " usnChanged " ] , res4 [ 0 ] [ " usnChanged " ] )
ldb . modify_ldif ( """
dn : cn = ldaptestcontainer , """ + self.base_dn + """
changetype : modify
replace : description
description : test2
""" )
res5 = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
scope = SCOPE_BASE ,
attrs = [ " uSNCreated " , " uSNChanged " , " description " ] )
2013-05-31 08:14:54 +04:00
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " description " in res5 [ 0 ] )
self . assertEqual ( " test2 " , str ( res5 [ 0 ] [ " description " ] [ 0 ] ) )
self . assertEqual ( res [ 0 ] [ " usnCreated " ] , res5 [ 0 ] [ " usnCreated " ] )
self . assertNotEqual ( res3 [ 0 ] [ " usnChanged " ] , res5 [ 0 ] [ " usnChanged " ] )
ldb . modify_ldif ( """
dn : cn = ldaptestcontainer , """ + self.base_dn + """
changetype : modify
delete : description
description : test2
""" )
res6 = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
scope = SCOPE_BASE ,
attrs = [ " uSNCreated " , " uSNChanged " , " description " ] )
2013-05-31 08:14:54 +04:00
self . assertTrue ( len ( res ) == 1 )
self . assertFalse ( " description " in res6 [ 0 ] )
self . assertEqual ( res [ 0 ] [ " usnCreated " ] , res6 [ 0 ] [ " usnCreated " ] )
self . assertNotEqual ( res5 [ 0 ] [ " usnChanged " ] , res6 [ 0 ] [ " usnChanged " ] )
ldb . modify_ldif ( """
dn : cn = ldaptestcontainer , """ + self.base_dn + """
changetype : modify
add : description
description : test3
""" )
res7 = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
scope = SCOPE_BASE ,
attrs = [ " uSNCreated " , " uSNChanged " , " description " ] )
2013-05-31 08:14:54 +04:00
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " description " in res7 [ 0 ] )
self . assertEqual ( " test3 " , str ( res7 [ 0 ] [ " description " ] [ 0 ] ) )
self . assertEqual ( res [ 0 ] [ " usnCreated " ] , res7 [ 0 ] [ " usnCreated " ] )
self . assertNotEqual ( res6 [ 0 ] [ " usnChanged " ] , res7 [ 0 ] [ " usnChanged " ] )
ldb . modify_ldif ( """
dn : cn = ldaptestcontainer , """ + self.base_dn + """
changetype : modify
delete : description
""" )
res8 = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
scope = SCOPE_BASE ,
attrs = [ " uSNCreated " , " uSNChanged " , " description " ] )
2013-05-31 08:14:54 +04:00
self . assertTrue ( len ( res ) == 1 )
self . assertFalse ( " description " in res8 [ 0 ] )
self . assertEqual ( res [ 0 ] [ " usnCreated " ] , res8 [ 0 ] [ " usnCreated " ] )
self . assertNotEqual ( res7 [ 0 ] [ " usnChanged " ] , res8 [ 0 ] [ " usnChanged " ] )
delete_force ( self . ldb , " cn=ldaptestcontainer, " + self . base_dn )
2009-10-02 20:31:38 +04:00
def test_groupType_int32 ( self ) :
2023-08-29 05:24:00 +03:00
""" Test groupType (int32) behaviour (should appear to be cast to a 32 bit signed integer before comparison) """
2009-09-08 17:00:24 +04:00
2009-06-19 05:29:31 +04:00
res1 = ldb . search ( base = self . base_dn , scope = SCOPE_SUBTREE ,
2014-11-16 05:34:22 +03:00
attrs = [ " groupType " ] , expression = " groupType=2147483653 " )
2009-06-19 05:29:31 +04:00
res2 = ldb . search ( base = self . base_dn , scope = SCOPE_SUBTREE ,
2014-11-16 05:34:22 +03:00
attrs = [ " groupType " ] , expression = " groupType=-2147483643 " )
2009-06-19 05:29:31 +04:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res1 ) , len ( res2 ) )
2009-06-19 05:29:31 +04:00
self . assertTrue ( res1 . count > 0 )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res1 [ 0 ] [ " groupType " ] [ 0 ] ) , " -2147483643 " )
2009-08-11 14:25:13 +04:00
2010-06-16 16:51:05 +04:00
def test_linked_attributes ( self ) :
""" This tests the linked attribute behaviour """
ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
# This should not work since "memberOf" is linked to "member"
try :
ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2010-11-01 00:39:49 +03:00
" objectclass " : " user " ,
2010-06-16 16:51:05 +04:00
" memberOf " : " cn=ldaptestgroup,cn=users, " + self . base_dn } )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-06-16 16:51:05 +04:00
ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
2010-11-01 00:39:49 +03:00
" objectclass " : " user " } )
2010-06-16 16:51:05 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " memberOf " ] = MessageElement ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
FLAG_MOD_ADD , " memberOf " )
2010-06-16 16:51:05 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-06-16 16:51:05 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " member " ] = MessageElement ( " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
FLAG_MOD_ADD , " member " )
2010-06-16 16:51:05 +04:00
ldb . modify ( m )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " memberOf " ] = MessageElement ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
FLAG_MOD_REPLACE , " memberOf " )
2010-06-16 16:51:05 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-06-16 16:51:05 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " memberOf " ] = MessageElement ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
FLAG_MOD_DELETE , " memberOf " )
2010-06-16 16:51:05 +04:00
try :
ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-06-16 16:51:05 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " member " ] = MessageElement ( " cn=ldaptestuser,cn=users, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
FLAG_MOD_DELETE , " member " )
2010-06-16 16:51:05 +04:00
ldb . modify ( m )
# This should yield no results since the member attribute for
# "ldaptestuser" should have been deleted
res1 = ldb . search ( " cn=ldaptestgroup, cn=users, " + self . base_dn ,
scope = SCOPE_BASE ,
expression = " (member=cn=ldaptestuser,cn=users, " + self . base_dn + " ) " ,
attrs = [ ] )
self . assertTrue ( len ( res1 ) == 0 )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2010-06-16 16:51:05 +04:00
ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " ,
" member " : " cn=ldaptestuser,cn=users, " + self . base_dn } )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
2010-06-16 16:51:05 +04:00
# Make sure that the "member" attribute for "ldaptestuser" has been
# removed
res = ldb . search ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
2018-07-30 09:15:34 +03:00
scope = SCOPE_BASE , attrs = [ " member " ] )
2010-06-16 16:51:05 +04:00
self . assertTrue ( len ( res ) == 1 )
self . assertFalse ( " member " in res [ 0 ] )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2010-06-16 16:51:05 +04:00
2009-11-06 09:00:05 +03:00
def test_wkguid ( self ) :
""" Test Well known GUID behaviours (including DN+Binary) """
res = self . ldb . search ( base = ( " <WKGUID=ab1d30f3768811d1aded00c04fd8d5cd, %s > " % self . base_dn ) , scope = SCOPE_BASE , attrs = [ ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2010-11-01 19:51:36 +03:00
2009-11-06 09:00:05 +03:00
res2 = self . ldb . search ( scope = SCOPE_BASE , attrs = [ " wellKnownObjects " ] , expression = ( " wellKnownObjects=B:32:ab1d30f3768811d1aded00c04fd8d5cd: %s " % res [ 0 ] . dn ) )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res2 ) , 1 )
2009-11-06 09:00:05 +03:00
# Prove that the matching rule is over the whole DN+Binary
res2 = self . ldb . search ( scope = SCOPE_BASE , attrs = [ " wellKnownObjects " ] , expression = ( " wellKnownObjects=B:32:ab1d30f3768811d1aded00c04fd8d5cd " ) )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res2 ) , 0 )
2009-11-06 09:00:05 +03:00
# Prove that the matching rule is over the whole DN+Binary
res2 = self . ldb . search ( scope = SCOPE_BASE , attrs = [ " wellKnownObjects " ] , expression = ( " wellKnownObjects= %s " ) % res [ 0 ] . dn )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res2 ) , 0 )
2009-11-06 09:00:05 +03:00
2009-11-24 02:18:33 +03:00
def test_subschemasubentry ( self ) :
""" Test subSchemaSubEntry appears when requested, but not when not requested """
res = self . ldb . search ( base = self . base_dn , scope = SCOPE_BASE , attrs = [ " subSchemaSubEntry " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
self . assertEqual ( str ( res [ 0 ] [ " subSchemaSubEntry " ] [ 0 ] ) , " CN=Aggregate, " + self . schema_dn )
2009-11-24 02:18:33 +03:00
res = self . ldb . search ( base = self . base_dn , scope = SCOPE_BASE , attrs = [ " * " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2009-11-24 02:18:33 +03:00
self . assertTrue ( " subScheamSubEntry " not in res [ 0 ] )
2008-02-09 21:04:14 +03:00
def test_all ( self ) :
""" Basic tests """
2007-12-24 04:19:41 +03:00
2014-11-02 06:07:02 +03:00
# Testing user add
2009-08-26 03:49:00 +04:00
2007-12-28 08:31:54 +03:00
ldb . add ( {
2009-08-11 14:25:13 +04:00
" dn " : " cn=ldaptestuser,cn=uSers, " + self . base_dn ,
2010-11-01 00:39:49 +03:00
" objectclass " : " user " ,
2009-08-11 14:25:13 +04:00
" cN " : " LDAPtestUSER " ,
" givenname " : " ldap " ,
" sn " : " testy " } )
2008-02-09 21:04:14 +03:00
2007-12-28 08:31:54 +03:00
ldb . add ( {
2008-02-09 21:04:14 +03:00
" dn " : " cn=ldaptestgroup,cn=uSers, " + self . base_dn ,
" objectclass " : " group " ,
" member " : " cn=ldaptestuser,cn=useRs, " + self . base_dn } )
2007-12-28 08:31:54 +03:00
ldb . add ( {
2008-02-09 21:04:14 +03:00
" dn " : " cn=ldaptestcomputer,cn=computers, " + self . base_dn ,
" objectclass " : " computer " ,
" cN " : " LDAPtestCOMPUTER " } )
ldb . add ( { " dn " : " cn=ldaptest2computer,cn=computers, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
" objectClass " : " computer " ,
" cn " : " LDAPtest2COMPUTER " ,
" userAccountControl " : str ( UF_WORKSTATION_TRUST_ACCOUNT ) ,
" displayname " : " ldap testy " } )
2007-12-28 08:31:54 +03:00
2008-06-03 17:27:22 +04:00
try :
ldb . add ( { " dn " : " cn=ldaptestcomputer3,cn=computers, " + self . base_dn ,
" objectClass " : " computer " ,
" cn " : " LDAPtest2COMPUTER "
} )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_INVALID_DN_SYNTAX )
2009-07-03 16:24:52 +04:00
2008-06-03 17:27:22 +04:00
try :
ldb . add ( { " dn " : " cn=ldaptestcomputer3,cn=computers, " + self . base_dn ,
" objectClass " : " computer " ,
" cn " : " ldaptestcomputer3 " ,
2009-10-02 20:31:38 +04:00
" sAMAccountType " : str ( ATYPE_NORMAL_ACCOUNT )
2018-07-30 09:14:43 +03:00
} )
2008-06-03 17:27:22 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2009-07-03 16:24:52 +04:00
2008-06-03 17:27:22 +04:00
ldb . add ( { " dn " : " cn=ldaptestcomputer3,cn=computers, " + self . base_dn ,
" objectClass " : " computer " ,
" cn " : " LDAPtestCOMPUTER3 "
} )
2009-07-03 16:24:52 +04:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestcomputer3)(objectClass=user))
2014-11-16 05:34:22 +03:00
res = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestcomputer3)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Found only %d for (&(cn=ldaptestcomputer3)(objectClass=user)) " % len ( res ) )
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestcomputer3,CN=Computers, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] [ 0 ] ) , " ldaptestcomputer3 " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] [ 0 ] ) , " ldaptestcomputer3 " )
self . assertEqual ( str ( res [ 0 ] [ " objectClass " ] [ 0 ] ) , " top " )
self . assertEqual ( str ( res [ 0 ] [ " objectClass " ] [ 1 ] ) , " person " )
self . assertEqual ( str ( res [ 0 ] [ " objectClass " ] [ 2 ] ) , " organizationalPerson " )
self . assertEqual ( str ( res [ 0 ] [ " objectClass " ] [ 3 ] ) , " user " )
self . assertEqual ( str ( res [ 0 ] [ " objectClass " ] [ 4 ] ) , " computer " )
2008-06-03 17:27:22 +04:00
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] [ " objectCategory " ] [ 0 ] ) , ( " CN=Computer, %s " % ldb . get_schema_basedn ( ) ) )
2021-10-21 05:42:46 +03:00
self . assertEqual ( int ( res [ 0 ] [ " primaryGroupID " ] [ 0 ] ) , DOMAIN_RID_DOMAIN_MEMBERS )
self . assertEqual ( int ( res [ 0 ] [ " sAMAccountType " ] [ 0 ] ) , ATYPE_WORKSTATION_TRUST )
self . assertEqual ( int ( res [ 0 ] [ " userAccountControl " ] [ 0 ] ) , UF_WORKSTATION_TRUST_ACCOUNT | UF_PASSWD_NOTREQD | UF_ACCOUNTDISABLE )
2008-06-03 17:27:22 +04:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestcomputer3,cn=computers, " + self . base_dn )
2008-06-03 17:27:22 +04:00
2014-11-02 06:07:02 +03:00
# Testing attribute or value exists behaviour
2008-02-09 21:04:14 +03:00
try :
ldb . modify_ldif ( """
dn : cn = ldaptest2computer , cn = computers , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
replace : servicePrincipalName
servicePrincipalName : host / ldaptest2computer
servicePrincipalName : host / ldaptest2computer
servicePrincipalName : cifs / ldaptest2computer
2007-12-28 08:31:54 +03:00
""" )
2008-06-03 17:27:22 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , msg ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_ATTRIBUTE_OR_VALUE_EXISTS )
2007-12-24 04:19:41 +03:00
2008-06-03 17:27:22 +04:00
ldb . modify_ldif ( """
2008-02-09 21:04:14 +03:00
dn : cn = ldaptest2computer , cn = computers , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
replace : servicePrincipalName
servicePrincipalName : host / ldaptest2computer
servicePrincipalName : cifs / ldaptest2computer
2007-12-28 08:31:54 +03:00
""" )
2008-06-03 17:27:22 +04:00
try :
ldb . modify_ldif ( """
2008-02-09 21:04:14 +03:00
dn : cn = ldaptest2computer , cn = computers , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
add : servicePrincipalName
servicePrincipalName : host / ldaptest2computer
2007-12-28 08:31:54 +03:00
""" )
2008-06-03 17:27:22 +04:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , msg ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_ATTRIBUTE_OR_VALUE_EXISTS )
2008-06-03 17:27:22 +04:00
2014-11-02 06:07:02 +03:00
# Testing ranged results
2008-06-03 17:27:22 +04:00
ldb . modify_ldif ( """
2008-02-09 21:04:14 +03:00
dn : cn = ldaptest2computer , cn = computers , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
replace : servicePrincipalName
2007-12-28 08:31:54 +03:00
""" )
2009-07-03 16:24:52 +04:00
2008-06-03 17:27:22 +04:00
ldb . modify_ldif ( """
2008-02-09 21:04:14 +03:00
dn : cn = ldaptest2computer , cn = computers , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
add : servicePrincipalName
servicePrincipalName : host / ldaptest2computer0
servicePrincipalName : host / ldaptest2computer1
servicePrincipalName : host / ldaptest2computer2
servicePrincipalName : host / ldaptest2computer3
servicePrincipalName : host / ldaptest2computer4
servicePrincipalName : host / ldaptest2computer5
servicePrincipalName : host / ldaptest2computer6
servicePrincipalName : host / ldaptest2computer7
servicePrincipalName : host / ldaptest2computer8
servicePrincipalName : host / ldaptest2computer9
servicePrincipalName : host / ldaptest2computer10
servicePrincipalName : host / ldaptest2computer11
servicePrincipalName : host / ldaptest2computer12
servicePrincipalName : host / ldaptest2computer13
servicePrincipalName : host / ldaptest2computer14
servicePrincipalName : host / ldaptest2computer15
servicePrincipalName : host / ldaptest2computer16
servicePrincipalName : host / ldaptest2computer17
servicePrincipalName : host / ldaptest2computer18
servicePrincipalName : host / ldaptest2computer19
servicePrincipalName : host / ldaptest2computer20
servicePrincipalName : host / ldaptest2computer21
servicePrincipalName : host / ldaptest2computer22
servicePrincipalName : host / ldaptest2computer23
servicePrincipalName : host / ldaptest2computer24
servicePrincipalName : host / ldaptest2computer25
servicePrincipalName : host / ldaptest2computer26
servicePrincipalName : host / ldaptest2computer27
servicePrincipalName : host / ldaptest2computer28
servicePrincipalName : host / ldaptest2computer29
2007-12-28 08:31:54 +03:00
""" )
2009-07-03 16:24:52 +04:00
res = ldb . search ( self . base_dn , expression = " (cn=ldaptest2computer)) " , scope = SCOPE_SUBTREE ,
2008-06-03 17:27:22 +04:00
attrs = [ " servicePrincipalName;range=0-* " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEqual ( len ( res [ 0 ] [ " servicePrincipalName;range=0-* " ] ) , 30 )
2008-02-09 21:04:14 +03:00
2008-06-03 17:27:22 +04:00
res = ldb . search ( self . base_dn , expression = " (cn=ldaptest2computer)) " , scope = SCOPE_SUBTREE , attrs = [ " servicePrincipalName;range=0-19 " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEqual ( len ( res [ 0 ] [ " servicePrincipalName;range=0-19 " ] ) , 20 )
2008-02-09 21:04:14 +03:00
2008-06-03 17:27:22 +04:00
res = ldb . search ( self . base_dn , expression = " (cn=ldaptest2computer)) " , scope = SCOPE_SUBTREE , attrs = [ " servicePrincipalName;range=0-30 " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEqual ( len ( res [ 0 ] [ " servicePrincipalName;range=0-* " ] ) , 30 )
2008-02-09 21:04:14 +03:00
2008-06-03 17:27:22 +04:00
res = ldb . search ( self . base_dn , expression = " (cn=ldaptest2computer)) " , scope = SCOPE_SUBTREE , attrs = [ " servicePrincipalName;range=0-40 " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEqual ( len ( res [ 0 ] [ " servicePrincipalName;range=0-* " ] ) , 30 )
2008-02-09 21:04:14 +03:00
2008-06-03 17:27:22 +04:00
res = ldb . search ( self . base_dn , expression = " (cn=ldaptest2computer)) " , scope = SCOPE_SUBTREE , attrs = [ " servicePrincipalName;range=30-40 " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEqual ( len ( res [ 0 ] [ " servicePrincipalName;range=30-* " ] ) , 0 )
2008-02-09 21:04:14 +03:00
2008-06-03 17:27:22 +04:00
res = ldb . search ( self . base_dn , expression = " (cn=ldaptest2computer)) " , scope = SCOPE_SUBTREE , attrs = [ " servicePrincipalName;range=10-40 " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEqual ( len ( res [ 0 ] [ " servicePrincipalName;range=10-* " ] ) , 20 )
2008-06-03 17:27:22 +04:00
# pos_11 = res[0]["servicePrincipalName;range=10-*"][18]
res = ldb . search ( self . base_dn , expression = " (cn=ldaptest2computer)) " , scope = SCOPE_SUBTREE , attrs = [ " servicePrincipalName;range=11-40 " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEqual ( len ( res [ 0 ] [ " servicePrincipalName;range=11-* " ] ) , 19 )
# self.assertEqual((res[0]["servicePrincipalName;range=11-*"][18]), pos_11)
2008-02-09 21:04:14 +03:00
2008-06-03 17:27:22 +04:00
res = ldb . search ( self . base_dn , expression = " (cn=ldaptest2computer)) " , scope = SCOPE_SUBTREE , attrs = [ " servicePrincipalName;range=11-15 " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEqual ( len ( res [ 0 ] [ " servicePrincipalName;range=11-15 " ] ) , 5 )
# self.assertEqual(res[0]["servicePrincipalName;range=11-15"][4], pos_11)
2008-02-09 21:04:14 +03:00
2008-06-03 17:27:22 +04:00
res = ldb . search ( self . base_dn , expression = " (cn=ldaptest2computer)) " , scope = SCOPE_SUBTREE , attrs = [ " servicePrincipalName " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEqual ( len ( res [ 0 ] [ " servicePrincipalName " ] ) , 30 )
# self.assertEqual(res[0]["servicePrincipalName"][18], pos_11)
2008-02-09 21:04:14 +03:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=ldaptestuser2,cn=users, " + self . base_dn )
2007-12-28 08:31:54 +03:00
ldb . add ( {
2008-02-09 21:04:14 +03:00
" dn " : " cn=ldaptestuser2,cn=useRs, " + self . base_dn ,
2010-11-01 19:23:34 +03:00
" objectClass " : " user " ,
2008-02-09 21:04:14 +03:00
" cn " : " LDAPtestUSER2 " ,
" givenname " : " testy " ,
" sn " : " ldap user2 " } )
2023-08-02 11:44:32 +03:00
# Testing Ambiguous Name Resolution
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr=ldap testy)(objectClass=user))
res = ldb . search ( expression = " (&(anr=ldap testy)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 3 , " Found only %d of 3 for (&(anr=ldap testy)(objectClass=user)) " % len ( res ) )
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr=testy ldap)(objectClass=user))
res = ldb . search ( expression = " (&(anr=testy ldap)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 2 , " Found only %d of 2 for (&(anr=testy ldap)(objectClass=user)) " % len ( res ) )
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr=ldap)(objectClass=user))
res = ldb . search ( expression = " (&(anr=ldap)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 4 , " Found only %d of 4 for (&(anr=ldap)(objectClass=user)) " % len ( res ) )
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr==ldap)(objectClass=user))
res = ldb . search ( expression = " (&(anr==ldap)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(anr==ldap)(objectClass=user)). Found only %d for (&(anr=ldap)(objectClass=user)) " % len ( res ) )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] [ 0 ] ) , " ldaptestuser " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestuser " )
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr=testy)(objectClass=user))
res = ldb . search ( expression = " (&(anr=testy)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 2 , " Found only %d for (&(anr=testy)(objectClass=user)) " % len ( res ) )
2008-02-09 21:04:14 +03:00
2008-08-21 06:51:55 +04:00
# Testing ldb.search for (&(anr=testy ldap)(objectClass=user))
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (&(anr=testy ldap)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 2 , " Found only %d for (&(anr=testy ldap)(objectClass=user)) " % len ( res ) )
2008-02-09 21:04:14 +03:00
2008-08-21 06:51:55 +04:00
# Testing ldb.search for (&(anr==testy ldap)(objectClass=user))
2008-08-22 15:54:21 +04:00
# this test disabled for the moment, as anr with == tests are not understood
# res = ldb.search(expression="(&(anr==testy ldap)(objectClass=user))")
2020-02-07 01:02:38 +03:00
# self.assertEqual(len(res), 1, "Found only %d for (&(anr==testy ldap)(objectClass=user))" % len(res))
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
# self.assertEqual(str(res[0].dn), ("CN=ldaptestuser,CN=Users," + self.base_dn))
# self.assertEqual(res[0]["cn"][0], "ldaptestuser")
# self.assertEqual(res[0]["name"][0], "ldaptestuser")
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr==testy ldap)(objectClass=user))
2008-08-22 15:54:21 +04:00
# res = ldb.search(expression="(&(anr==testy ldap)(objectClass=user))")
2020-02-07 01:02:38 +03:00
# self.assertEqual(len(res), 1, "Could not find (&(anr==testy ldap)(objectClass=user))")
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
# self.assertEqual(str(res[0].dn), ("CN=ldaptestuser,CN=Users," + self.base_dn))
# self.assertEqual(res[0]["cn"][0], "ldaptestuser")
# self.assertEqual(res[0]["name"][0], "ldaptestuser")
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr=testy ldap user)(objectClass=user))
res = ldb . search ( expression = " (&(anr=testy ldap user)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(anr=testy ldap user)(objectClass=user)) " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestuser2 " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestuser2 " )
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr==testy ldap user2)(objectClass=user))
2008-08-22 15:54:21 +04:00
# res = ldb.search(expression="(&(anr==testy ldap user2)(objectClass=user))")
2020-02-07 01:02:38 +03:00
# self.assertEqual(len(res), 1, "Could not find (&(anr==testy ldap user2)(objectClass=user))")
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestuser2 " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestuser2 " )
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr==ldap user2)(objectClass=user))
2008-08-22 15:54:21 +04:00
# res = ldb.search(expression="(&(anr==ldap user2)(objectClass=user))")
2020-02-07 01:02:38 +03:00
# self.assertEqual(len(res), 1, "Could not find (&(anr==ldap user2)(objectClass=user))")
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestuser2 " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestuser2 " )
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr==not ldap user2)(objectClass=user))
2008-08-22 15:54:21 +04:00
# res = ldb.search(expression="(&(anr==not ldap user2)(objectClass=user))")
2020-02-07 01:02:38 +03:00
# self.assertEqual(len(res), 0, "Must not find (&(anr==not ldap user2)(objectClass=user))")
2008-02-09 21:04:14 +03:00
# Testing ldb.search for (&(anr=not ldap user2)(objectClass=user))
res = ldb . search ( expression = " (&(anr=not ldap user2)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 0 , " Must not find (&(anr=not ldap user2)(objectClass=user)) " )
2008-02-09 21:04:14 +03:00
2008-06-03 17:27:22 +04:00
# Testing ldb.search for (&(anr="testy ldap")(objectClass=user)) (ie, with quotes)
2008-08-22 15:54:21 +04:00
# res = ldb.search(expression="(&(anr==\"testy ldap\")(objectClass=user))")
2020-02-07 01:02:38 +03:00
# self.assertEqual(len(res), 0, "Found (&(anr==\"testy ldap\")(objectClass=user))")
2008-06-03 17:27:22 +04:00
2014-11-02 06:07:02 +03:00
# Testing Renames
2008-02-09 21:04:14 +03:00
2008-12-16 11:11:11 +03:00
attrs = [ " objectGUID " , " objectSid " ]
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestUSer2)(objectClass=user))
2008-12-16 11:11:11 +03:00
res_user = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestUSer2)(objectClass=user)) " , scope = SCOPE_SUBTREE , attrs = attrs )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res_user ) , 1 , " Could not find (&(cn=ldaptestUSer2)(objectClass=user)) " )
2008-12-16 11:11:11 +03:00
2009-10-02 20:31:38 +04:00
# Check rename works with extended/alternate DN forms
2018-11-19 14:20:29 +03:00
ldb . rename ( " <SID= " + get_string ( ldb . schema_format_value ( " objectSID " , res_user [ 0 ] [ " objectSID " ] [ 0 ] ) ) + " > " , " cn=ldaptestUSER3,cn=users, " + self . base_dn )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestuser3)(objectClass=user))
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (&(cn=ldaptestuser3)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestuser3)(objectClass=user)) " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestUSER3,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestUSER3 " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestUSER3 " )
2008-02-09 21:04:14 +03:00
2018-07-30 09:14:03 +03:00
#"Testing ldb.search for (&(&(cn=ldaptestuser3)(userAccountControl=*))(objectClass=user))"
2010-03-29 17:43:43 +04:00
res = ldb . search ( expression = " (&(&(cn=ldaptestuser3)(userAccountControl=*))(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " (&(&(cn=ldaptestuser3)(userAccountControl=*))(objectClass=user)) " )
2008-06-03 17:27:22 +04:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestUSER3,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestUSER3 " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestUSER3 " )
2008-06-03 17:27:22 +04:00
2018-07-30 09:14:03 +03:00
#"Testing ldb.search for (&(&(cn=ldaptestuser3)(userAccountControl=546))(objectClass=user))"
2010-03-29 17:43:43 +04:00
res = ldb . search ( expression = " (&(&(cn=ldaptestuser3)(userAccountControl=546))(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " (&(&(cn=ldaptestuser3)(userAccountControl=546))(objectClass=user)) " )
2008-06-03 17:27:22 +04:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestUSER3,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestUSER3 " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestUSER3 " )
2008-06-03 17:27:22 +04:00
2018-07-30 09:14:03 +03:00
#"Testing ldb.search for (&(&(cn=ldaptestuser3)(userAccountControl=547))(objectClass=user))"
2010-03-29 17:43:43 +04:00
res = ldb . search ( expression = " (&(&(cn=ldaptestuser3)(userAccountControl=547))(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 0 , " (&(&(cn=ldaptestuser3)(userAccountControl=547))(objectClass=user)) " )
2008-06-03 17:27:22 +04:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (dn=CN=ldaptestUSER3,CN=Users," + self.base_dn + ") - should not work
2011-10-22 14:44:02 +04:00
res = ldb . search ( expression = " (dn=CN=ldaptestUSER3,CN=Users, " + self . base_dn + " ) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 0 , " Could find (dn=CN=ldaptestUSER3,CN=Users, " + self . base_dn + " ) " )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (distinguishedName=CN=ldaptestUSER3,CN=Users," + self.base_dn + ")
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (distinguishedName=CN=ldaptestUSER3,CN=Users, " + self . base_dn + " ) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (distinguishedName=CN=ldaptestUSER3,CN=Users, " + self . base_dn + " ) " )
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestUSER3,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestUSER3 " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestUSER3 " )
2008-02-09 21:04:14 +03:00
# ensure we cannot add it again
try :
ldb . add ( { " dn " : " cn=ldaptestuser3,cn=userS, " + self . base_dn ,
2018-07-30 09:15:34 +03:00
" objectClass " : " user " ,
" cn " : " LDAPtestUSER3 " } )
2008-02-09 21:16:44 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_ENTRY_ALREADY_EXISTS )
2008-02-09 21:04:14 +03:00
# rename back
ldb . rename ( " cn=ldaptestuser3,cn=users, " + self . base_dn , " cn=ldaptestuser2,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
# ensure we cannot rename it twice
2008-02-09 21:04:14 +03:00
try :
2009-07-03 16:24:52 +04:00
ldb . rename ( " cn=ldaptestuser3,cn=users, " + self . base_dn ,
2008-02-09 21:16:44 +03:00
" cn=ldaptestuser2,cn=users, " + self . base_dn )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_OBJECT )
2008-02-09 21:04:14 +03:00
# ensure can now use that name
ldb . add ( { " dn " : " cn=ldaptestuser3,cn=users, " + self . base_dn ,
2018-07-30 09:15:34 +03:00
" objectClass " : " user " ,
" cn " : " LDAPtestUSER3 " } )
2009-07-03 16:24:52 +04:00
2009-10-02 20:31:38 +04:00
# ensure we now cannot rename
2008-02-09 21:04:14 +03:00
try :
ldb . rename ( " cn=ldaptestuser2,cn=users, " + self . base_dn , " cn=ldaptestuser3,cn=users, " + self . base_dn )
2008-02-09 21:16:44 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_ENTRY_ALREADY_EXISTS )
2008-02-09 21:04:14 +03:00
try :
2011-09-16 09:15:35 +04:00
ldb . rename ( " cn=ldaptestuser3,cn=users, %s " % self . base_dn , " cn=ldaptestuser3, %s " % ldb . get_config_basedn ( ) )
2008-02-09 21:16:44 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2008-02-09 21:04:14 +03:00
self . assertTrue ( num in ( 71 , 64 ) )
ldb . rename ( " cn=ldaptestuser3,cn=users, " + self . base_dn , " cn=ldaptestuser5,cn=users, " + self . base_dn )
ldb . delete ( " cn=ldaptestuser5,cn=users, " + self . base_dn )
2010-11-25 02:12:18 +03:00
delete_force ( ldb , " cn=ldaptestgroup2,cn=users, " + self . base_dn )
2008-02-09 21:04:14 +03:00
ldb . rename ( " cn=ldaptestgroup,cn=users, " + self . base_dn , " cn=ldaptestgroup2,cn=users, " + self . base_dn )
2014-11-02 06:07:02 +03:00
# Testing subtree renames
2007-12-28 08:31:54 +03:00
2009-07-03 16:24:52 +04:00
ldb . add ( { " dn " : " cn=ldaptestcontainer, " + self . base_dn ,
2008-02-09 21:04:14 +03:00
" objectClass " : " container " } )
2009-07-03 16:24:52 +04:00
ldb . add ( { " dn " : " CN=ldaptestuser4,CN=ldaptestcontainer, " + self . base_dn ,
2010-11-01 19:23:34 +03:00
" objectClass " : " user " ,
2008-02-09 21:04:14 +03:00
" cn " : " LDAPtestUSER4 " } )
2010-11-12 20:57:57 +03:00
# Here we don't enforce these hard "description" constraints
ldb . modify_ldif ( """
dn : cn = ldaptestcontainer , """ + self.base_dn + """
changetype : modify
replace : description
description : desc1
description : desc2
""" )
2008-02-09 21:04:14 +03:00
ldb . modify_ldif ( """
dn : cn = ldaptestgroup2 , cn = users , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
add : member
2008-02-09 21:04:14 +03:00
member : cn = ldaptestuser4 , cn = ldaptestcontainer , """ + self.base_dn + """
2009-10-02 20:31:38 +04:00
member : cn = ldaptestcomputer , cn = computers , """ + self.base_dn + """
member : cn = ldaptestuser2 , cn = users , """ + self.base_dn + """
2007-12-28 08:31:54 +03:00
""" )
2009-07-03 16:24:52 +04:00
2014-11-02 06:07:02 +03:00
# Testing ldb.rename of cn=ldaptestcontainer," + self.base_dn + " to cn=ldaptestcontainer2," + self.base_dn
2008-02-09 21:04:14 +03:00
ldb . rename ( " CN=ldaptestcontainer, " + self . base_dn , " CN=ldaptestcontainer2, " + self . base_dn )
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user))
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (&(cn=ldaptestuser4)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestuser4)(objectClass=user)) " )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing subtree ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in (just renamed from) cn=ldaptestcontainer," + self.base_dn
2008-02-09 21:04:14 +03:00
try :
2009-07-03 16:24:52 +04:00
res = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
expression = " (&(cn=ldaptestuser4)(objectClass=user)) " ,
scope = SCOPE_SUBTREE )
2008-12-21 09:34:27 +03:00
self . fail ( res )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_OBJECT )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in (just renamed from) cn=ldaptestcontainer," + self.base_dn
2008-02-09 21:04:14 +03:00
try :
2009-07-03 16:24:52 +04:00
res = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
2018-07-30 09:16:12 +03:00
expression = " (&(cn=ldaptestuser4)(objectClass=user)) " , scope = SCOPE_ONELEVEL )
2008-02-09 21:16:44 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NO_SUCH_OBJECT )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in renamed container"
2008-02-09 21:04:14 +03:00
res = ldb . search ( " cn=ldaptestcontainer2, " + self . base_dn , expression = " (&(cn=ldaptestuser4)(objectClass=user)) " , scope = SCOPE_SUBTREE )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestuser4)(objectClass=user)) under cn=ldaptestcontainer2, " + self . base_dn )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " memberOf " ] [ 0 ] ) . upper ( ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) . upper ( ) )
2008-02-09 21:04:14 +03:00
2008-07-21 05:18:54 +04:00
time . sleep ( 4 )
2008-06-30 05:27:55 +04:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(member=CN=ldaptestuser4,CN=ldaptestcontainer2," + self.base_dn + ")(objectclass=group)) to check subtree renames and linked attributes"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " (&(member=CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn + " )(objectclass=group)) " , scope = SCOPE_SUBTREE )
2023-08-02 11:44:32 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(member=CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn + " )(objectclass=group)), perhaps linked attributes are not consistent with subtree renames? " )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.rename (into itself) of cn=ldaptestcontainer2," + self.base_dn + " to cn=ldaptestcontainer,cn=ldaptestcontainer2," + self.base_dn
2008-02-09 21:04:14 +03:00
try :
ldb . rename ( " cn=ldaptestcontainer2, " + self . base_dn , " cn=ldaptestcontainer,cn=ldaptestcontainer2, " + self . base_dn )
2008-02-09 21:16:44 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.rename (into non-existent container) of cn=ldaptestcontainer2," + self.base_dn + " to cn=ldaptestcontainer,cn=ldaptestcontainer3," + self.base_dn
2008-02-09 21:04:14 +03:00
try :
ldb . rename ( " cn=ldaptestcontainer2, " + self . base_dn , " cn=ldaptestcontainer,cn=ldaptestcontainer3, " + self . base_dn )
2008-02-09 21:16:44 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2008-12-21 09:34:27 +03:00
self . assertTrue ( num in ( ERR_UNWILLING_TO_PERFORM , ERR_OTHER ) )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing delete (should fail, not a leaf node) of renamed cn=ldaptestcontainer2," + self.base_dn
2008-02-09 21:04:14 +03:00
try :
ldb . delete ( " cn=ldaptestcontainer2, " + self . base_dn )
2008-02-09 21:16:44 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_NOT_ALLOWED_ON_NON_LEAF )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing base ldb.search for CN=ldaptestuser4,CN=ldaptestcontainer2," + self.base_dn
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (objectclass=*) " , base = ( " CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn ) , scope = SCOPE_BASE )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (cn=ldaptestuser40) " , base = ( " CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn ) , scope = SCOPE_BASE )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 0 )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in cn=ldaptestcontainer2," + self.base_dn
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (&(cn=ldaptestuser4)(objectClass=user)) " , base = ( " cn=ldaptestcontainer2, " + self . base_dn ) , scope = SCOPE_ONELEVEL )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in cn=ldaptestcontainer2," + self.base_dn
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (&(cn=ldaptestuser4)(objectClass=user)) " , base = ( " cn=ldaptestcontainer2, " + self . base_dn ) , scope = SCOPE_SUBTREE )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing delete of subtree renamed "+("CN=ldaptestuser4,CN=ldaptestcontainer2," + self.base_dn)
2008-02-09 21:04:14 +03:00
ldb . delete ( ( " CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn ) )
2014-11-02 06:07:02 +03:00
# Testing delete of renamed cn=ldaptestcontainer2," + self.base_dn
2008-02-09 21:04:14 +03:00
ldb . delete ( " cn=ldaptestcontainer2, " + self . base_dn )
2009-07-03 16:24:52 +04:00
2009-10-03 18:50:34 +04:00
ldb . add ( { " dn " : " cn=ldaptestutf8user èùéìòà,cn=users, " + self . base_dn , " objectClass " : " user " } )
2008-02-09 21:04:14 +03:00
2009-10-03 18:50:34 +04:00
ldb . add ( { " dn " : " cn=ldaptestutf8user2 èùéìòà,cn=users, " + self . base_dn , " objectClass " : " user " } )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestuser)(objectClass=user))"
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (&(cn=ldaptestuser)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestuser)(objectClass=user)) " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestuser " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestuser " )
self . assertEqual ( set ( res [ 0 ] [ " objectClass " ] ) , set ( [ b " top " , b " person " , b " organizationalPerson " , b " user " ] ) )
2008-02-09 21:04:14 +03:00
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] [ " objectCategory " ] ) , ( " CN=Person, %s " % ldb . get_schema_basedn ( ) ) )
self . assertEqual ( int ( res [ 0 ] [ " sAMAccountType " ] [ 0 ] ) , ATYPE_NORMAL_ACCOUNT )
self . assertEqual ( int ( res [ 0 ] [ " userAccountControl " ] [ 0 ] ) , UF_NORMAL_ACCOUNT | UF_PASSWD_NOTREQD | UF_ACCOUNTDISABLE )
self . assertEqual ( str ( res [ 0 ] [ " memberOf " ] [ 0 ] ) . upper ( ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) . upper ( ) )
self . assertEqual ( len ( res [ 0 ] [ " memberOf " ] ) , 1 )
2009-07-03 16:24:52 +04:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=cn=person,%s))" % ldb.get_schema_basedn()
2011-09-16 09:15:35 +04:00
res2 = ldb . search ( expression = " (&(cn=ldaptestuser)(objectCategory=cn=person, %s )) " % ldb . get_schema_basedn ( ) )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res2 ) , 1 , " Could not find (&(cn=ldaptestuser)(objectCategory=cn=person, %s )) " % ldb . get_schema_basedn ( ) )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res2 [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon))"
2008-02-09 21:04:14 +03:00
res3 = ldb . search ( expression = " (&(cn=ldaptestuser)(objectCategory=PerSon)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res3 ) , 1 , " Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): matched %d " % len ( res3 ) )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res3 [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
if gc_ldb is not None :
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog"
2008-02-09 21:04:14 +03:00
res3gc = gc_ldb . search ( expression = " (&(cn=ldaptestuser)(objectCategory=PerSon)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res3gc ) , 1 )
2009-07-03 16:24:52 +04:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res3gc [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in with 'phantom root' control"
2009-07-03 16:24:52 +04:00
2009-11-27 06:20:47 +03:00
if gc_ldb is not None :
res3control = gc_ldb . search ( self . base_dn , expression = " (&(cn=ldaptestuser)(objectCategory=PerSon)) " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] , controls = [ " search_options:1:2 " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res3control ) , 1 , " Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog " )
2009-07-03 16:24:52 +04:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res3control [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
ldb . delete ( res [ 0 ] . dn )
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestcomputer)(objectClass=user))"
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (&(cn=ldaptestcomputer)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestuser)(objectClass=user)) " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestcomputer,CN=Computers, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestcomputer " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestcomputer " )
self . assertEqual ( set ( res [ 0 ] [ " objectClass " ] ) , set ( [ b " top " , b " person " , b " organizationalPerson " , b " user " , b " computer " ] ) )
2008-02-09 21:04:14 +03:00
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] [ " objectCategory " ] ) , ( " CN=Computer, %s " % ldb . get_schema_basedn ( ) ) )
2021-10-21 05:42:46 +03:00
self . assertEqual ( int ( res [ 0 ] [ " primaryGroupID " ] [ 0 ] ) , DOMAIN_RID_DOMAIN_MEMBERS )
self . assertEqual ( int ( res [ 0 ] [ " sAMAccountType " ] [ 0 ] ) , ATYPE_WORKSTATION_TRUST )
self . assertEqual ( int ( res [ 0 ] [ " userAccountControl " ] [ 0 ] ) , UF_WORKSTATION_TRUST_ACCOUNT | UF_PASSWD_NOTREQD | UF_ACCOUNTDISABLE )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] [ " memberOf " ] [ 0 ] ) . upper ( ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) . upper ( ) )
self . assertEqual ( len ( res [ 0 ] [ " memberOf " ] ) , 1 )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,%s))" % ldb.get_schema_basedn()
2011-09-16 09:15:35 +04:00
res2 = ldb . search ( expression = " (&(cn=ldaptestcomputer)(objectCategory=cn=computer, %s )) " % ldb . get_schema_basedn ( ) )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res2 ) , 1 , " Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer, %s )) " % ldb . get_schema_basedn ( ) )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res2 [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
if gc_ldb is not None :
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,%s)) in Global Catalog" % gc_ldb.get_schema_basedn()
2011-09-16 09:15:35 +04:00
res2gc = gc_ldb . search ( expression = " (&(cn=ldaptestcomputer)(objectCategory=cn=computer, %s )) " % gc_ldb . get_schema_basedn ( ) )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res2gc ) , 1 , " Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer, %s )) In Global Catalog " % gc_ldb . get_schema_basedn ( ) )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res2gc [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER))"
2008-02-09 21:04:14 +03:00
res3 = ldb . search ( expression = " (&(cn=ldaptestcomputer)(objectCategory=compuTER)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res3 ) , 1 , " Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res3 [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
if gc_ldb is not None :
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog"
2008-02-09 21:04:14 +03:00
res3gc = gc_ldb . search ( expression = " (&(cn=ldaptestcomputer)(objectCategory=compuTER)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res3gc ) , 1 , " Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res3gc [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestcomp*r)(objectCategory=compuTER))"
2008-02-09 21:04:14 +03:00
res4 = ldb . search ( expression = " (&(cn=ldaptestcomp*r)(objectCategory=compuTER)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res4 ) , 1 , " Could not find (&(cn=ldaptestcomp*r)(objectCategory=compuTER)) " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res4 [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestcomput*)(objectCategory=compuTER))"
2008-02-09 21:04:14 +03:00
res5 = ldb . search ( expression = " (&(cn=ldaptestcomput*)(objectCategory=compuTER)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res5 ) , 1 , " Could not find (&(cn=ldaptestcomput*)(objectCategory=compuTER)) " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res5 [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=*daptestcomputer)(objectCategory=compuTER))"
2008-02-09 21:04:14 +03:00
res6 = ldb . search ( expression = " (&(cn=*daptestcomputer)(objectCategory=compuTER)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res6 ) , 1 , " Could not find (&(cn=*daptestcomputer)(objectCategory=compuTER)) " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] . dn , res6 [ 0 ] . dn )
2009-07-03 16:24:52 +04:00
2018-11-19 14:20:29 +03:00
ldb . delete ( " <GUID= " + get_string ( ldb . schema_format_value ( " objectGUID " , res [ 0 ] [ " objectGUID " ] [ 0 ] ) ) + " > " )
2008-02-09 21:04:14 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptest2computer)(objectClass=user))"
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (&(cn=ldaptest2computer)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptest2computer)(objectClass=user)) " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , " CN=ldaptest2computer,CN=Computers, " + self . base_dn )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptest2computer " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptest2computer " )
self . assertEqual ( list ( res [ 0 ] [ " objectClass " ] ) , [ b " top " , b " person " , b " organizationalPerson " , b " user " , b " computer " ] )
2008-02-09 21:04:14 +03:00
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] [ " objectCategory " ] [ 0 ] ) , " CN=Computer, %s " % ldb . get_schema_basedn ( ) )
self . assertEqual ( int ( res [ 0 ] [ " sAMAccountType " ] [ 0 ] ) , ATYPE_WORKSTATION_TRUST )
self . assertEqual ( int ( res [ 0 ] [ " userAccountControl " ] [ 0 ] ) , UF_WORKSTATION_TRUST_ACCOUNT )
2008-02-09 21:04:14 +03:00
2018-11-19 14:20:29 +03:00
ldb . delete ( " <SID= " + get_string ( ldb . schema_format_value ( " objectSID " , res [ 0 ] [ " objectSID " ] [ 0 ] ) ) + " > " )
2008-02-09 21:04:14 +03:00
2008-12-16 11:11:11 +03:00
attrs = [ " cn " , " name " , " objectClass " , " objectGUID " , " objectSID " , " whenCreated " , " nTSecurityDescriptor " , " memberOf " , " allowedAttributes " , " allowedAttributesEffective " ]
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestUSer2)(objectClass=user))"
2008-12-16 11:11:11 +03:00
res_user = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestUSer2)(objectClass=user)) " , scope = SCOPE_SUBTREE , attrs = attrs )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res_user ) , 1 , " Could not find (&(cn=ldaptestUSer2)(objectClass=user)) " )
2008-12-16 11:11:11 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res_user [ 0 ] . dn ) , ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res_user [ 0 ] [ " cn " ] ) , " ldaptestuser2 " )
self . assertEqual ( str ( res_user [ 0 ] [ " name " ] ) , " ldaptestuser2 " )
self . assertEqual ( list ( res_user [ 0 ] [ " objectClass " ] ) , [ b " top " , b " person " , b " organizationalPerson " , b " user " ] )
2008-12-16 11:11:11 +03:00
self . assertTrue ( " objectSid " in res_user [ 0 ] )
self . assertTrue ( " objectGUID " in res_user [ 0 ] )
self . assertTrue ( " whenCreated " in res_user [ 0 ] )
self . assertTrue ( " nTSecurityDescriptor " in res_user [ 0 ] )
self . assertTrue ( " allowedAttributes " in res_user [ 0 ] )
self . assertTrue ( " allowedAttributesEffective " in res_user [ 0 ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res_user [ 0 ] [ " memberOf " ] [ 0 ] ) . upper ( ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) . upper ( ) )
2008-12-16 11:11:11 +03:00
ldaptestuser2_sid = res_user [ 0 ] [ " objectSid " ] [ 0 ]
ldaptestuser2_guid = res_user [ 0 ] [ " objectGUID " ] [ 0 ]
attrs = [ " cn " , " name " , " objectClass " , " objectGUID " , " objectSID " , " whenCreated " , " nTSecurityDescriptor " , " member " , " allowedAttributes " , " allowedAttributesEffective " ]
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestgroup2)(objectClass=group))"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestgroup2)(objectClass=group)) " , scope = SCOPE_SUBTREE , attrs = attrs )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestgroup2)(objectClass=group)) " )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestgroup2 " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestgroup2 " )
self . assertEqual ( list ( res [ 0 ] [ " objectClass " ] ) , [ b " top " , b " group " ] )
2008-12-16 11:11:11 +03:00
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " objectSid " in res [ 0 ] )
2008-02-09 21:04:14 +03:00
self . assertTrue ( " whenCreated " in res [ 0 ] )
self . assertTrue ( " nTSecurityDescriptor " in res [ 0 ] )
2008-10-16 05:26:03 +04:00
self . assertTrue ( " allowedAttributes " in res [ 0 ] )
self . assertTrue ( " allowedAttributesEffective " in res [ 0 ] )
2008-09-24 09:34:10 +04:00
memberUP = [ ]
for m in res [ 0 ] [ " member " ] :
2018-11-19 14:20:29 +03:00
memberUP . append ( str ( m ) . upper ( ) )
2008-09-24 09:34:10 +04:00
self . assertTrue ( ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) . upper ( ) in memberUP )
2008-02-09 21:04:14 +03:00
2008-12-16 11:11:11 +03:00
res = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestgroup2)(objectClass=group)) " , scope = SCOPE_SUBTREE , attrs = attrs , controls = [ " extended_dn:1:1 " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestgroup2)(objectClass=group)) " )
2008-12-16 11:11:11 +03:00
2018-03-09 16:57:01 +03:00
print ( res [ 0 ] [ " member " ] )
2008-12-16 11:11:11 +03:00
memberUP = [ ]
for m in res [ 0 ] [ " member " ] :
2018-11-19 14:20:29 +03:00
memberUP . append ( str ( m ) . upper ( ) )
print ( ( " <GUID= " + get_string ( ldb . schema_format_value ( " objectGUID " , ldaptestuser2_guid ) ) + " >;<SID= " + get_string ( ldb . schema_format_value ( " objectSid " , ldaptestuser2_sid ) ) + " >;CN=ldaptestuser2,CN=Users, " + self . base_dn ) . upper ( ) )
2008-12-16 11:11:11 +03:00
2018-11-19 14:20:29 +03:00
self . assertTrue ( ( " <GUID= " + get_string ( ldb . schema_format_value ( " objectGUID " , ldaptestuser2_guid ) ) + " >;<SID= " + get_string ( ldb . schema_format_value ( " objectSid " , ldaptestuser2_sid ) ) + " >;CN=ldaptestuser2,CN=Users, " + self . base_dn ) . upper ( ) in memberUP )
2008-12-16 11:11:11 +03:00
2014-11-02 06:07:02 +03:00
# Quicktest for linked attributes"
2008-02-09 21:04:14 +03:00
ldb . modify_ldif ( """
dn : cn = ldaptestgroup2 , cn = users , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
replace : member
2008-02-09 21:04:14 +03:00
member : CN = ldaptestuser2 , CN = Users , """ + self.base_dn + """
member : CN = ldaptestutf8user èùéìòà , CN = Users , """ + self.base_dn + """
2007-12-28 08:31:54 +03:00
""" )
2009-07-03 16:24:52 +04:00
2008-02-09 21:04:14 +03:00
ldb . modify_ldif ( """
2018-11-19 14:20:29 +03:00
dn : < GUID = """ + get_string(ldb.schema_format_value( " objectGUID " , res[0][ " objectGUID " ][0])) + """ >
2008-12-16 11:11:11 +03:00
changetype : modify
replace : member
member : CN = ldaptestutf8user èùéìòà , CN = Users , """ + self.base_dn + """
""" )
2009-07-03 16:24:52 +04:00
2008-12-16 11:11:11 +03:00
ldb . modify_ldif ( """
2018-11-19 14:20:29 +03:00
dn : < SID = """ + get_string(ldb.schema_format_value( " objectSid " , res[0][ " objectSid " ][0])) + """ >
2007-12-24 04:19:41 +03:00
changetype : modify
delete : member
2007-12-28 08:31:54 +03:00
""" )
2008-02-09 21:04:14 +03:00
ldb . modify_ldif ( """
dn : cn = ldaptestgroup2 , cn = users , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
add : member
2018-11-19 14:20:29 +03:00
member : < GUID = """ + get_string(ldb.schema_format_value( " objectGUID " , res[0][ " objectGUID " ][0])) + """ >
2008-02-09 21:04:14 +03:00
member : CN = ldaptestutf8user èùéìòà , CN = Users , """ + self.base_dn + """
2007-12-28 08:31:54 +03:00
""" )
2009-07-03 16:24:52 +04:00
2008-02-09 21:04:14 +03:00
ldb . modify_ldif ( """
dn : cn = ldaptestgroup2 , cn = users , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
replace : member
2007-12-28 08:31:54 +03:00
""" )
2009-07-03 16:24:52 +04:00
2008-02-09 21:04:14 +03:00
ldb . modify_ldif ( """
dn : cn = ldaptestgroup2 , cn = users , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
add : member
2018-11-19 14:20:29 +03:00
member : < SID = """ + get_string(ldb.schema_format_value( " objectSid " , res_user[0][ " objectSid " ][0])) + """ >
2008-02-09 21:04:14 +03:00
member : CN = ldaptestutf8user èùéìòà , CN = Users , """ + self.base_dn + """
2007-12-28 08:31:54 +03:00
""" )
2009-07-03 16:24:52 +04:00
2008-02-09 21:04:14 +03:00
ldb . modify_ldif ( """
dn : cn = ldaptestgroup2 , cn = users , """ + self.base_dn + """
2007-12-24 04:19:41 +03:00
changetype : modify
delete : member
2008-02-09 21:04:14 +03:00
member : CN = ldaptestutf8user èùéìòà , CN = Users , """ + self.base_dn + """
2007-12-28 08:31:54 +03:00
""" )
2009-07-03 16:24:52 +04:00
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestgroup2)(objectClass=group)) " , scope = SCOPE_SUBTREE , attrs = attrs )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestgroup2)(objectClass=group)) " )
2007-12-28 08:31:54 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " member " ] [ 0 ] ) , ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
self . assertEqual ( len ( res [ 0 ] [ " member " ] ) , 1 )
2007-12-28 08:31:54 +03:00
2008-02-09 21:04:14 +03:00
ldb . delete ( ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
2007-12-28 08:31:54 +03:00
2008-07-21 05:18:54 +04:00
time . sleep ( 4 )
2008-07-16 11:06:33 +04:00
2008-02-09 21:04:14 +03:00
attrs = [ " cn " , " name " , " objectClass " , " objectGUID " , " whenCreated " , " nTSecurityDescriptor " , " member " ]
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestgroup2)(objectClass=group)) to check linked delete"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestgroup2)(objectClass=group)) " , scope = SCOPE_SUBTREE , attrs = attrs )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestgroup2)(objectClass=group)) to check linked delete " )
2007-12-28 08:31:54 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) )
2008-02-09 21:04:14 +03:00
self . assertTrue ( " member " not in res [ 0 ] )
2007-12-28 08:31:54 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))"
2011-10-22 15:03:44 +04:00
res = ldb . search ( expression = " (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user)) " )
2009-10-03 18:50:34 +04:00
res = ldb . search ( expression = " (&(cn=ldaptestutf8user èùéìòà)(objectclass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user)) " )
2007-12-28 08:31:54 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestutf8user èùéìòà,CN=Users, " + self . base_dn ) )
self . assertEqual ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestutf8user èùéìòà " )
self . assertEqual ( str ( res [ 0 ] [ " name " ] ) , " ldaptestutf8user èùéìòà " )
self . assertEqual ( list ( res [ 0 ] [ " objectClass " ] ) , [ b " top " , b " person " , b " organizationalPerson " , b " user " ] )
2008-02-09 21:04:14 +03:00
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
2007-12-28 08:31:54 +03:00
2011-10-22 15:03:44 +04:00
# delete "ldaptestutf8user"
2008-02-09 21:04:14 +03:00
ldb . delete ( res [ 0 ] . dn )
2007-12-28 08:31:54 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestutf8user2*)(objectClass=user))"
2008-02-09 21:04:14 +03:00
res = ldb . search ( expression = " (&(cn=ldaptestutf8user2*)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestutf8user2*)(objectClass=user)) " )
2007-12-28 08:31:54 +03:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))"
2011-10-22 15:03:44 +04:00
res = ldb . search ( expression = " (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user)) " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 , " Could not find (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user)) " )
2011-10-22 15:03:44 +04:00
# delete "ldaptestutf8user2 "
2008-02-09 21:04:14 +03:00
ldb . delete ( res [ 0 ] . dn )
2007-12-28 08:31:54 +03:00
2008-02-09 21:04:14 +03:00
ldb . delete ( ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) )
2007-12-28 08:31:54 +03:00
2014-11-02 06:07:02 +03:00
# Testing that we can't get at the configuration DN from the main search base"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " objectClass=crossRef " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 0 )
2007-12-28 08:31:54 +03:00
2014-11-02 06:07:02 +03:00
# Testing that we can get at the configuration DN from the main search base on the LDAP port with the 'phantom root' search_options control"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " objectClass=crossRef " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] , controls = [ " search_options:1:2 " ] )
self . assertTrue ( len ( res ) > 0 )
2007-12-28 08:31:54 +03:00
2008-02-09 21:04:14 +03:00
if gc_ldb is not None :
2014-11-02 06:07:02 +03:00
# Testing that we can get at the configuration DN from the main search base on the GC port with the search_options control == 0"
2009-07-03 16:24:52 +04:00
2008-02-09 21:04:14 +03:00
res = gc_ldb . search ( self . base_dn , expression = " objectClass=crossRef " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] , controls = [ " search_options:1:0 " ] )
self . assertTrue ( len ( res ) > 0 )
2014-11-02 06:07:02 +03:00
# Testing that we do find configuration elements in the global catlog"
2008-02-09 21:04:14 +03:00
res = gc_ldb . search ( self . base_dn , expression = " objectClass=crossRef " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
self . assertTrue ( len ( res ) > 0 )
2009-07-03 16:24:52 +04:00
2014-11-02 06:07:02 +03:00
# Testing that we do find configuration elements and user elements at the same time"
2008-02-09 21:04:14 +03:00
res = gc_ldb . search ( self . base_dn , expression = " (|(objectClass=crossRef)(objectClass=person)) " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
self . assertTrue ( len ( res ) > 0 )
2014-11-02 06:07:02 +03:00
# Testing that we do find configuration elements in the global catlog, with the configuration basedn"
2008-02-09 21:16:44 +03:00
res = gc_ldb . search ( self . configuration_dn , expression = " objectClass=crossRef " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
2008-02-09 21:04:14 +03:00
self . assertTrue ( len ( res ) > 0 )
2014-11-02 06:07:02 +03:00
# Testing that we can get at the configuration DN on the main LDAP port"
2008-02-09 21:16:44 +03:00
res = ldb . search ( self . configuration_dn , expression = " objectClass=crossRef " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
2008-02-09 21:04:14 +03:00
self . assertTrue ( len ( res ) > 0 )
2023-08-29 05:24:00 +03:00
# Testing objectCategory canonicalisation"
2008-02-09 21:16:44 +03:00
res = ldb . search ( self . configuration_dn , expression = " objectCategory=ntDsDSA " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
2008-02-09 21:04:14 +03:00
self . assertTrue ( len ( res ) > 0 , " Didn ' t find any records with objectCategory=ntDsDSA " )
self . assertTrue ( len ( res ) != 0 )
2009-07-03 16:24:52 +04:00
2008-02-09 21:16:44 +03:00
res = ldb . search ( self . configuration_dn , expression = " objectCategory=CN=ntDs-DSA, " + self . schema_dn , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
self . assertTrue ( len ( res ) > 0 , " Didn ' t find any records with objectCategory=CN=ntDs-DSA, " + self . schema_dn )
2008-02-09 21:04:14 +03:00
self . assertTrue ( len ( res ) != 0 )
2009-07-03 16:24:52 +04:00
2014-11-02 06:07:02 +03:00
# Testing objectClass attribute order on "+ self.base_dn
2009-07-03 16:24:52 +04:00
res = ldb . search ( expression = " objectClass=domain " , base = self . base_dn ,
2008-02-09 21:04:14 +03:00
scope = SCOPE_BASE , attrs = [ " objectClass " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2008-02-09 21:04:14 +03:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( list ( res [ 0 ] [ " objectClass " ] ) , [ b " top " , b " domain " , b " domainDNS " ] )
2008-02-09 21:04:14 +03:00
# check enumeration
2014-11-02 06:07:02 +03:00
# Testing ldb.search for objectCategory=person"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " objectCategory=person " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
self . assertTrue ( len ( res ) > 0 )
2014-11-02 06:07:02 +03:00
# Testing ldb.search for objectCategory=person with domain scope control"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " objectCategory=person " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] , controls = [ " domain_scope:1 " ] )
self . assertTrue ( len ( res ) > 0 )
2009-07-03 16:24:52 +04:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for objectCategory=user"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " objectCategory=user " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
self . assertTrue ( len ( res ) > 0 )
2009-07-03 16:24:52 +04:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for objectCategory=user with domain scope control"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " objectCategory=user " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] , controls = [ " domain_scope:1 " ] )
self . assertTrue ( len ( res ) > 0 )
2009-07-03 16:24:52 +04:00
2014-11-02 06:07:02 +03:00
# Testing ldb.search for objectCategory=group"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " objectCategory=group " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
self . assertTrue ( len ( res ) > 0 )
2014-11-02 06:07:02 +03:00
# Testing ldb.search for objectCategory=group with domain scope control"
2008-02-09 21:04:14 +03:00
res = ldb . search ( self . base_dn , expression = " objectCategory=group " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] , controls = [ " domain_scope:1 " ] )
self . assertTrue ( len ( res ) > 0 )
2014-11-02 06:07:02 +03:00
# Testing creating a user with the posixAccount objectClass"
2009-12-15 04:51:10 +03:00
self . ldb . add_ldif ( """ dn: cn=posixuser,CN=Users, %s
objectClass : top
objectClass : person
objectClass : posixAccount
objectClass : user
objectClass : organizationalPerson
cn : posixuser
uid : posixuser
sn : posixuser
uidNumber : 10126
gidNumber : 10126
homeDirectory : / home / posixuser
loginShell : / bin / bash
gecos : Posix User ; ; ;
2018-07-30 09:18:03 +03:00
description : A POSIX user """ % (self.base_dn))
2009-12-15 04:51:10 +03:00
2014-11-02 06:07:02 +03:00
# Testing removing the posixAccount objectClass from an existing user"
2009-12-15 04:51:10 +03:00
self . ldb . modify_ldif ( """ dn: cn=posixuser,CN=Users, %s
changetype : modify
delete : objectClass
2018-07-30 09:18:03 +03:00
objectClass : posixAccount """ % (self.base_dn))
2009-12-15 04:51:10 +03:00
2014-11-02 06:07:02 +03:00
# Testing adding the posixAccount objectClass to an existing user"
2009-12-15 04:51:10 +03:00
self . ldb . modify_ldif ( """ dn: cn=posixuser,CN=Users, %s
changetype : modify
add : objectClass
2018-07-30 09:18:03 +03:00
objectClass : posixAccount """ % (self.base_dn))
2009-12-15 04:51:10 +03:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , " cn=posixuser,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser2,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser3,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser4,cn=ldaptestcontainer, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser4,cn=ldaptestcontainer2, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestuser5,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestgroup2,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestcomputer,cn=computers, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptest2computer,cn=computers, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestcomputer3,cn=computers, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestutf8user èùéìòà,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestutf8user2 èùéìòà,cn=users, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestcontainer, " + self . base_dn )
delete_force ( self . ldb , " cn=ldaptestcontainer2, " + self . base_dn )
2009-10-02 20:31:38 +04:00
2009-09-08 17:00:24 +04:00
def test_security_descriptor_add ( self ) :
""" Testing ldb.add_ldif() for nTSecurityDescriptor """
user_name = " testdescriptoruser1 "
user_dn = " CN= %s ,CN=Users, %s " % ( user_name , self . base_dn )
#
2010-11-01 19:51:36 +03:00
# Test an empty security descriptor (naturally this shouldn't work)
2009-09-08 17:00:24 +04:00
#
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2010-11-01 19:51:36 +03:00
try :
2018-07-30 09:16:43 +03:00
self . ldb . add ( { " dn " : user_dn ,
2018-09-03 16:05:48 +03:00
" objectClass " : " user " ,
" sAMAccountName " : user_name ,
" nTSecurityDescriptor " : [ ] } )
2010-11-01 19:51:36 +03:00
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2010-11-01 19:51:36 +03:00
finally :
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2010-11-01 19:51:36 +03:00
#
# Test add_ldif() with SDDL security descriptor input
#
2009-09-08 17:00:24 +04:00
try :
sddl = " O:DUG:DUD:PAI(A;;RPWP;;;AU)S:PAI "
self . ldb . add_ldif ( """
dn : """ + user_dn + """
objectclass : user
sAMAccountName : """ + user_name + """
nTSecurityDescriptor : """ + sddl)
res = self . ldb . search ( base = user_dn , attrs = [ " nTSecurityDescriptor " ] )
desc = res [ 0 ] [ " nTSecurityDescriptor " ] [ 0 ]
2018-07-30 09:17:02 +03:00
desc = ndr_unpack ( security . descriptor , desc )
desc_sddl = desc . as_sddl ( self . domain_sid )
2009-09-08 17:00:24 +04:00
self . assertEqual ( desc_sddl , sddl )
finally :
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2009-09-08 17:00:24 +04:00
#
# Test add_ldif() with BASE64 security descriptor
#
try :
sddl = " O:DUG:DUD:PAI(A;;RPWP;;;AU)S:PAI "
desc = security . descriptor . from_sddl ( sddl , self . domain_sid )
desc_binary = ndr_pack ( desc )
2018-05-04 17:27:12 +03:00
desc_base64 = base64 . b64encode ( desc_binary ) . decode ( ' utf8 ' )
2009-09-08 17:00:24 +04:00
self . ldb . add_ldif ( """
dn : """ + user_dn + """
objectclass : user
sAMAccountName : """ + user_name + """
nTSecurityDescriptor : : """ + desc_base64)
res = self . ldb . search ( base = user_dn , attrs = [ " nTSecurityDescriptor " ] )
desc = res [ 0 ] [ " nTSecurityDescriptor " ] [ 0 ]
desc = ndr_unpack ( security . descriptor , desc )
desc_sddl = desc . as_sddl ( self . domain_sid )
self . assertEqual ( desc_sddl , sddl )
finally :
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2009-09-08 17:00:24 +04:00
def test_security_descriptor_add_neg ( self ) :
2009-09-09 01:30:21 +04:00
""" Test add_ldif() with BASE64 security descriptor input using WRONG domain SID
2009-09-08 17:00:24 +04:00
Negative test
"""
user_name = " testdescriptoruser1 "
user_dn = " CN= %s ,CN=Users, %s " % ( user_name , self . base_dn )
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2009-09-08 17:00:24 +04:00
try :
2013-10-15 03:06:38 +04:00
sddl = " O:DUG:DUD:AI(A;;RPWP;;;AU)S:PAI "
2009-09-08 17:00:24 +04:00
desc = security . descriptor . from_sddl ( sddl , security . dom_sid ( ' S-1-5-21 ' ) )
2018-07-30 09:17:02 +03:00
desc_base64 = base64 . b64encode ( ndr_pack ( desc ) ) . decode ( ' utf8 ' )
2009-09-08 17:00:24 +04:00
self . ldb . add_ldif ( """
dn : """ + user_dn + """
objectclass : user
sAMAccountName : """ + user_name + """
nTSecurityDescriptor : : """ + desc_base64)
res = self . ldb . search ( base = user_dn , attrs = [ " nTSecurityDescriptor " ] )
2010-01-17 02:35:26 +03:00
self . assertTrue ( " nTSecurityDescriptor " in res [ 0 ] )
2013-10-15 03:06:38 +04:00
desc = res [ 0 ] [ " nTSecurityDescriptor " ] [ 0 ]
desc = ndr_unpack ( security . descriptor , desc )
desc_sddl = desc . as_sddl ( self . domain_sid )
self . assertTrue ( " O:S-1-5-21-513G:S-1-5-21-513D:AI(A;;RPWP;;;AU) " in desc_sddl )
2009-09-08 17:00:24 +04:00
finally :
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2009-09-08 17:00:24 +04:00
def test_security_descriptor_modify ( self ) :
""" Testing ldb.modify_ldif() for nTSecurityDescriptor """
user_name = " testdescriptoruser2 "
user_dn = " CN= %s ,CN=Users, %s " % ( user_name , self . base_dn )
#
2010-11-01 19:51:36 +03:00
# Test an empty security descriptor (naturally this shouldn't work)
#
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2018-07-30 09:16:43 +03:00
self . ldb . add ( { " dn " : user_dn ,
2018-09-03 16:05:48 +03:00
" objectClass " : " user " ,
" sAMAccountName " : user_name } )
2010-11-01 19:51:36 +03:00
m = Message ( )
m . dn = Dn ( ldb , user_dn )
m [ " nTSecurityDescriptor " ] = MessageElement ( [ ] , FLAG_MOD_ADD ,
" nTSecurityDescriptor " )
try :
self . ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2010-11-01 19:51:36 +03:00
m = Message ( )
m . dn = Dn ( ldb , user_dn )
m [ " nTSecurityDescriptor " ] = MessageElement ( [ ] , FLAG_MOD_REPLACE ,
" nTSecurityDescriptor " )
try :
self . ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-11-01 19:51:36 +03:00
m = Message ( )
m . dn = Dn ( ldb , user_dn )
m [ " nTSecurityDescriptor " ] = MessageElement ( [ ] , FLAG_MOD_DELETE ,
" nTSecurityDescriptor " )
try :
self . ldb . modify ( m )
self . fail ( )
2019-04-12 06:51:05 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_UNWILLING_TO_PERFORM )
2010-11-01 19:51:36 +03:00
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2010-11-01 19:51:36 +03:00
#
# Test modify_ldif() with SDDL security descriptor input
2009-09-08 17:00:24 +04:00
# Add ACE to the original descriptor test
#
try :
self . ldb . add_ldif ( """
dn : """ + user_dn + """
objectclass : user
sAMAccountName : """ + user_name)
# Modify descriptor
res = self . ldb . search ( base = user_dn , attrs = [ " nTSecurityDescriptor " ] )
desc = res [ 0 ] [ " nTSecurityDescriptor " ] [ 0 ]
desc = ndr_unpack ( security . descriptor , desc )
desc_sddl = desc . as_sddl ( self . domain_sid )
sddl = desc_sddl [ : desc_sddl . find ( " ( " ) ] + " (A;;RPWP;;;AU) " + desc_sddl [ desc_sddl . find ( " ( " ) : ]
mod = """
dn : """ + user_dn + """
changetype : modify
replace : nTSecurityDescriptor
nTSecurityDescriptor : """ + sddl
self . ldb . modify_ldif ( mod )
# Read modified descriptor
res = self . ldb . search ( base = user_dn , attrs = [ " nTSecurityDescriptor " ] )
desc = res [ 0 ] [ " nTSecurityDescriptor " ] [ 0 ]
desc = ndr_unpack ( security . descriptor , desc )
desc_sddl = desc . as_sddl ( self . domain_sid )
self . assertEqual ( desc_sddl , sddl )
finally :
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2009-09-08 17:00:24 +04:00
#
# Test modify_ldif() with SDDL security descriptor input
2023-08-02 11:44:32 +03:00
# New descriptor test
2009-09-08 17:00:24 +04:00
#
try :
self . ldb . add_ldif ( """
dn : """ + user_dn + """
objectclass : user
sAMAccountName : """ + user_name)
# Modify descriptor
sddl = " O:DUG:DUD:PAI(A;;RPWP;;;AU)S:PAI "
mod = """
dn : """ + user_dn + """
changetype : modify
replace : nTSecurityDescriptor
nTSecurityDescriptor : """ + sddl
self . ldb . modify_ldif ( mod )
# Read modified descriptor
res = self . ldb . search ( base = user_dn , attrs = [ " nTSecurityDescriptor " ] )
desc = res [ 0 ] [ " nTSecurityDescriptor " ] [ 0 ]
desc = ndr_unpack ( security . descriptor , desc )
desc_sddl = desc . as_sddl ( self . domain_sid )
self . assertEqual ( desc_sddl , sddl )
finally :
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2009-09-08 17:00:24 +04:00
#
# Test modify_ldif() with BASE64 security descriptor input
# Add ACE to the original descriptor test
#
try :
self . ldb . add_ldif ( """
dn : """ + user_dn + """
objectclass : user
sAMAccountName : """ + user_name)
# Modify descriptor
res = self . ldb . search ( base = user_dn , attrs = [ " nTSecurityDescriptor " ] )
desc = res [ 0 ] [ " nTSecurityDescriptor " ] [ 0 ]
desc = ndr_unpack ( security . descriptor , desc )
desc_sddl = desc . as_sddl ( self . domain_sid )
sddl = desc_sddl [ : desc_sddl . find ( " ( " ) ] + " (A;;RPWP;;;AU) " + desc_sddl [ desc_sddl . find ( " ( " ) : ]
desc = security . descriptor . from_sddl ( sddl , self . domain_sid )
2018-05-04 17:27:12 +03:00
desc_base64 = base64 . b64encode ( ndr_pack ( desc ) ) . decode ( ' utf8 ' )
2009-09-08 17:00:24 +04:00
mod = """
dn : """ + user_dn + """
changetype : modify
replace : nTSecurityDescriptor
nTSecurityDescriptor : : """ + desc_base64
self . ldb . modify_ldif ( mod )
# Read modified descriptor
res = self . ldb . search ( base = user_dn , attrs = [ " nTSecurityDescriptor " ] )
desc = res [ 0 ] [ " nTSecurityDescriptor " ] [ 0 ]
desc = ndr_unpack ( security . descriptor , desc )
desc_sddl = desc . as_sddl ( self . domain_sid )
self . assertEqual ( desc_sddl , sddl )
finally :
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2009-09-08 17:00:24 +04:00
#
# Test modify_ldif() with BASE64 security descriptor input
# New descriptor test
#
try :
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2009-09-08 17:00:24 +04:00
self . ldb . add_ldif ( """
dn : """ + user_dn + """
objectclass : user
sAMAccountName : """ + user_name)
# Modify descriptor
sddl = " O:DUG:DUD:PAI(A;;RPWP;;;AU)S:PAI "
desc = security . descriptor . from_sddl ( sddl , self . domain_sid )
2018-05-04 17:27:12 +03:00
desc_base64 = base64 . b64encode ( ndr_pack ( desc ) ) . decode ( ' utf8 ' )
2009-09-08 17:00:24 +04:00
mod = """
dn : """ + user_dn + """
changetype : modify
replace : nTSecurityDescriptor
nTSecurityDescriptor : : """ + desc_base64
self . ldb . modify_ldif ( mod )
# Read modified descriptor
res = self . ldb . search ( base = user_dn , attrs = [ " nTSecurityDescriptor " ] )
desc = res [ 0 ] [ " nTSecurityDescriptor " ] [ 0 ]
desc = ndr_unpack ( security . descriptor , desc )
desc_sddl = desc . as_sddl ( self . domain_sid )
self . assertEqual ( desc_sddl , sddl )
finally :
2010-11-25 02:12:18 +03:00
delete_force ( self . ldb , user_dn )
2008-02-09 21:04:14 +03:00
2010-11-03 16:15:02 +03:00
def test_dsheuristics ( self ) :
""" Tests the ' dSHeuristics ' attribute """
2014-11-02 06:07:02 +03:00
# Tests the 'dSHeuristics' attribute"
2010-11-03 16:15:02 +03:00
# Get the current value to restore it later
2010-11-23 12:22:10 +03:00
dsheuristics = self . ldb . get_dsheuristics ( )
2011-10-13 11:51:18 +04:00
# Perform the length checks: for each decade (except the 0th) we need
# the first index to be the number. This goes till the 9th one, beyond
# there does not seem to be another limitation.
try :
dshstr = " "
2018-07-30 09:19:05 +03:00
for i in range ( 1 , 11 ) :
2011-10-13 11:51:18 +04:00
# This is in the range
self . ldb . set_dsheuristics ( dshstr + " x " )
self . ldb . set_dsheuristics ( dshstr + " xxxxx " )
dshstr = dshstr + " xxxxxxxxx "
if i < 10 :
# Not anymore in the range, new decade specifier needed
try :
self . ldb . set_dsheuristics ( dshstr + " x " )
self . fail ( )
2018-02-23 17:34:23 +03:00
except LdbError as e :
( num , _ ) = e . args
2020-02-07 01:02:38 +03:00
self . assertEqual ( num , ERR_CONSTRAINT_VIOLATION )
2011-10-13 11:51:18 +04:00
dshstr = dshstr + str ( i )
else :
# There does not seem to be an upper limit
self . ldb . set_dsheuristics ( dshstr + " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " )
# apart from the above, all char values are accepted
self . ldb . set_dsheuristics ( " 123ABC-+!1asdfg@#^ " )
2020-02-07 01:02:38 +03:00
self . assertEqual ( self . ldb . get_dsheuristics ( ) , b " 123ABC-+!1asdfg@#^ " )
2011-10-13 11:51:18 +04:00
finally :
# restore old value
self . ldb . set_dsheuristics ( dsheuristics )
2010-11-03 16:15:02 +03:00
2011-02-09 12:50:35 +03:00
def test_ldapControlReturn ( self ) :
""" Testing that if we request a control that return a control it
really return something """
res = self . ldb . search ( attrs = [ " cn " ] ,
2011-04-07 03:35:58 +04:00
controls = [ " paged_results:1:10 " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res . controls ) , 1 )
self . assertEqual ( res . controls [ 0 ] . oid , " 1.2.840.113556.1.4.319 " )
2011-10-08 16:34:57 +04:00
s = str ( res . controls [ 0 ] )
2011-02-09 12:50:35 +03:00
2011-03-05 00:49:08 +03:00
def test_operational ( self ) :
""" Tests operational attributes """
2014-11-02 06:07:02 +03:00
# Tests operational attributes"
2011-03-05 00:49:08 +03:00
res = self . ldb . search ( self . base_dn , scope = SCOPE_BASE ,
2011-03-05 01:02:29 +03:00
attrs = [ " createTimeStamp " , " modifyTimeStamp " ,
2011-03-05 00:49:08 +03:00
" structuralObjectClass " , " whenCreated " ,
" whenChanged " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2011-03-05 01:02:29 +03:00
self . assertTrue ( " createTimeStamp " in res [ 0 ] )
self . assertTrue ( " modifyTimeStamp " in res [ 0 ] )
2011-03-05 00:49:08 +03:00
self . assertTrue ( " structuralObjectClass " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
self . assertTrue ( " whenChanged " in res [ 0 ] )
2010-06-19 20:58:18 +04:00
2015-01-09 10:56:59 +03:00
def test_timevalues1 ( self ) :
""" Tests possible syntax of time attributes """
user_name = " testtimevaluesuser1 "
user_dn = " CN= %s ,CN=Users, %s " % ( user_name , self . base_dn )
delete_force ( self . ldb , user_dn )
2018-07-30 09:16:43 +03:00
self . ldb . add ( { " dn " : user_dn ,
2018-09-03 16:05:48 +03:00
" objectClass " : " user " ,
" sAMAccountName " : user_name } )
2015-01-09 10:56:59 +03:00
#
# We check the following values:
#
# 370101000000Z => 20370101000000.0Z
# 20370102000000.*Z => 20370102000000.0Z
#
2018-07-30 09:17:02 +03:00
ext = [ " Z " , " .0Z " , " .Z " , " .000Z " , " .RandomIgnoredCharacters...987654321Z " ]
2015-01-09 10:56:59 +03:00
for i in range ( 0 , len ( ext ) ) :
v_raw = " 203701 %02d 000000 " % ( i + 1 )
if ext [ i ] == " Z " :
v_set = v_raw [ 2 : ] + ext [ i ]
else :
v_set = v_raw + ext [ i ]
v_get = v_raw + " .0Z "
m = Message ( )
m . dn = Dn ( ldb , user_dn )
m [ " msTSExpireDate " ] = MessageElement ( [ v_set ] ,
FLAG_MOD_REPLACE ,
" msTSExpireDate " )
self . ldb . modify ( m )
res = self . ldb . search ( base = user_dn , scope = SCOPE_BASE , attrs = [ " msTSExpireDate " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " msTSExpireDate " in res [ 0 ] )
self . assertTrue ( len ( res [ 0 ] [ " msTSExpireDate " ] ) == 1 )
2020-02-07 01:02:38 +03:00
self . assertEqual ( str ( res [ 0 ] [ " msTSExpireDate " ] [ 0 ] ) , v_get )
2015-01-09 10:56:59 +03:00
2019-03-20 09:17:07 +03:00
def test_ldapSearchNoAttributes ( self ) :
""" Testing ldap search with no attributes """
user_name = " testemptyattributesuser "
user_dn = " CN= %s , %s " % ( user_name , self . base_dn )
delete_force ( self . ldb , user_dn )
self . ldb . add ( { " dn " : user_dn ,
" objectClass " : " user " ,
" sAMAccountName " : user_name } )
res = self . ldb . search ( user_dn , scope = SCOPE_BASE , attrs = [ ] )
delete_force ( self . ldb , user_dn )
self . assertEqual ( len ( res ) , 1 )
self . assertEqual ( len ( res [ 0 ] ) , 0 )
2018-07-30 09:20:39 +03:00
2011-11-09 06:28:02 +04:00
class BaseDnTests ( samba . tests . TestCase ) :
2010-06-19 20:58:18 +04:00
2008-02-09 21:04:14 +03:00
def setUp ( self ) :
2010-06-19 20:58:18 +04:00
super ( BaseDnTests , self ) . setUp ( )
2008-02-09 21:04:14 +03:00
self . ldb = ldb
def test_rootdse_attrs ( self ) :
""" Testing for all rootDSE attributes """
2011-03-05 00:49:46 +03:00
res = self . ldb . search ( " " , scope = SCOPE_BASE , attrs = [ ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2008-02-09 21:04:14 +03:00
def test_highestcommittedusn ( self ) :
""" Testing for highestCommittedUSN """
res = self . ldb . search ( " " , scope = SCOPE_BASE , attrs = [ " highestCommittedUSN " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2008-02-09 21:04:14 +03:00
self . assertTrue ( int ( res [ 0 ] [ " highestCommittedUSN " ] [ 0 ] ) != 0 )
def test_netlogon ( self ) :
""" Testing for netlogon via LDAP """
res = self . ldb . search ( " " , scope = SCOPE_BASE , attrs = [ " netlogon " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 0 )
2008-02-09 21:04:14 +03:00
def test_netlogon_highestcommitted_usn ( self ) :
""" Testing for netlogon and highestCommittedUSN via LDAP """
2009-07-03 16:24:52 +04:00
res = self . ldb . search ( " " , scope = SCOPE_BASE ,
2018-07-30 09:16:12 +03:00
attrs = [ " netlogon " , " highestCommittedUSN " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 0 )
2008-02-09 21:04:14 +03:00
2009-11-30 10:39:58 +03:00
def test_namingContexts ( self ) :
""" Testing for namingContexts in rootDSE """
res = self . ldb . search ( " " , scope = SCOPE_BASE ,
2018-07-30 09:16:12 +03:00
attrs = [ " namingContexts " , " defaultNamingContext " , " schemaNamingContext " , " configurationNamingContext " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2010-11-01 19:51:36 +03:00
2009-11-30 10:39:58 +03:00
ncs = set ( [ ] )
for nc in res [ 0 ] [ " namingContexts " ] :
self . assertTrue ( nc not in ncs )
ncs . add ( nc )
self . assertTrue ( res [ 0 ] [ " defaultNamingContext " ] [ 0 ] in ncs )
self . assertTrue ( res [ 0 ] [ " configurationNamingContext " ] [ 0 ] in ncs )
self . assertTrue ( res [ 0 ] [ " schemaNamingContext " ] [ 0 ] in ncs )
2010-09-17 12:47:08 +04:00
def test_serverPath ( self ) :
""" Testing the server paths in rootDSE """
res = self . ldb . search ( " " , scope = SCOPE_BASE ,
attrs = [ " dsServiceName " , " serverName " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2010-09-17 12:47:08 +04:00
2018-11-19 14:20:29 +03:00
self . assertTrue ( " CN=Servers " in str ( res [ 0 ] [ " dsServiceName " ] [ 0 ] ) )
self . assertTrue ( " CN=Sites " in str ( res [ 0 ] [ " dsServiceName " ] [ 0 ] ) )
self . assertTrue ( " CN=NTDS Settings " in str ( res [ 0 ] [ " dsServiceName " ] [ 0 ] ) )
self . assertTrue ( " CN=Servers " in str ( res [ 0 ] [ " serverName " ] [ 0 ] ) )
self . assertTrue ( " CN=Sites " in str ( res [ 0 ] [ " serverName " ] [ 0 ] ) )
self . assertFalse ( " CN=NTDS Settings " in str ( res [ 0 ] [ " serverName " ] [ 0 ] ) )
2010-09-17 12:47:08 +04:00
2011-02-02 06:51:27 +03:00
def test_functionality ( self ) :
""" Testing the server paths in rootDSE """
res = self . ldb . search ( " " , scope = SCOPE_BASE ,
attrs = [ " forestFunctionality " , " domainFunctionality " , " domainControllerFunctionality " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
self . assertEqual ( len ( res [ 0 ] [ " forestFunctionality " ] ) , 1 )
self . assertEqual ( len ( res [ 0 ] [ " domainFunctionality " ] ) , 1 )
self . assertEqual ( len ( res [ 0 ] [ " domainControllerFunctionality " ] ) , 1 )
2011-02-02 06:51:27 +03:00
self . assertTrue ( int ( res [ 0 ] [ " forestFunctionality " ] [ 0 ] ) < = int ( res [ 0 ] [ " domainFunctionality " ] [ 0 ] ) )
self . assertTrue ( int ( res [ 0 ] [ " domainControllerFunctionality " ] [ 0 ] ) > = int ( res [ 0 ] [ " domainFunctionality " ] [ 0 ] ) )
res2 = self . ldb . search ( " " , scope = SCOPE_BASE ,
2018-07-30 09:16:12 +03:00
attrs = [ " dsServiceName " , " serverName " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res2 ) , 1 )
self . assertEqual ( len ( res2 [ 0 ] [ " dsServiceName " ] ) , 1 )
2011-02-02 06:51:27 +03:00
res3 = self . ldb . search ( res2 [ 0 ] [ " dsServiceName " ] [ 0 ] , scope = SCOPE_BASE , attrs = [ " msDS-Behavior-Version " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res3 ) , 1 )
self . assertEqual ( len ( res3 [ 0 ] [ " msDS-Behavior-Version " ] ) , 1 )
self . assertEqual ( int ( res [ 0 ] [ " domainControllerFunctionality " ] [ 0 ] ) , int ( res3 [ 0 ] [ " msDS-Behavior-Version " ] [ 0 ] ) )
2011-02-02 06:51:27 +03:00
res4 = self . ldb . search ( ldb . domain_dn ( ) , scope = SCOPE_BASE , attrs = [ " msDS-Behavior-Version " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res4 ) , 1 )
self . assertEqual ( len ( res4 [ 0 ] [ " msDS-Behavior-Version " ] ) , 1 )
self . assertEqual ( int ( res [ 0 ] [ " domainFunctionality " ] [ 0 ] ) , int ( res4 [ 0 ] [ " msDS-Behavior-Version " ] [ 0 ] ) )
2011-02-02 06:51:27 +03:00
2011-09-16 09:15:35 +04:00
res5 = self . ldb . search ( " cn=partitions, %s " % ldb . get_config_basedn ( ) , scope = SCOPE_BASE , attrs = [ " msDS-Behavior-Version " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res5 ) , 1 )
self . assertEqual ( len ( res5 [ 0 ] [ " msDS-Behavior-Version " ] ) , 1 )
self . assertEqual ( int ( res [ 0 ] [ " forestFunctionality " ] [ 0 ] ) , int ( res5 [ 0 ] [ " msDS-Behavior-Version " ] [ 0 ] ) )
2011-02-02 06:51:27 +03:00
2010-09-17 12:47:08 +04:00
def test_dnsHostname ( self ) :
""" Testing the DNS hostname in rootDSE """
res = self . ldb . search ( " " , scope = SCOPE_BASE ,
attrs = [ " dnsHostName " , " serverName " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2010-09-17 12:47:08 +04:00
res2 = self . ldb . search ( res [ 0 ] [ " serverName " ] [ 0 ] , scope = SCOPE_BASE ,
attrs = [ " dNSHostName " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res2 ) , 1 )
2010-09-17 12:47:08 +04:00
2020-02-07 01:02:38 +03:00
self . assertEqual ( res [ 0 ] [ " dnsHostName " ] [ 0 ] , res2 [ 0 ] [ " dNSHostName " ] [ 0 ] )
2010-09-17 12:47:08 +04:00
def test_ldapServiceName ( self ) :
""" Testing the ldap service name in rootDSE """
res = self . ldb . search ( " " , scope = SCOPE_BASE ,
2013-09-23 01:40:12 +04:00
attrs = [ " ldapServiceName " , " dnsHostName " ] )
2020-02-07 01:02:38 +03:00
self . assertEqual ( len ( res ) , 1 )
2013-09-23 01:40:12 +04:00
self . assertTrue ( " ldapServiceName " in res [ 0 ] )
self . assertTrue ( " dnsHostName " in res [ 0 ] )
2010-09-17 12:47:08 +04:00
2018-11-19 14:20:29 +03:00
( hostname , _ , dns_domainname ) = str ( res [ 0 ] [ " dnsHostName " ] [ 0 ] ) . partition ( " . " )
2013-09-23 01:40:12 +04:00
2018-11-19 14:20:29 +03:00
given = str ( res [ 0 ] [ " ldapServiceName " ] [ 0 ] )
2013-09-23 01:40:12 +04:00
expected = " %s : %s $@ %s " % ( dns_domainname . lower ( ) , hostname . lower ( ) , dns_domainname . upper ( ) )
2020-02-07 01:02:38 +03:00
self . assertEqual ( given , expected )
2009-07-03 16:24:52 +04:00
2018-07-30 09:21:29 +03:00
2018-07-30 09:22:34 +03:00
if " :// " not in host :
2009-11-18 05:27:50 +03:00
if os . path . isfile ( host ) :
host = " tdb:// %s " % host
else :
host = " ldap:// %s " % host
2007-12-24 04:19:41 +03:00
2010-12-15 16:16:54 +03:00
ldb = SamDB ( host , credentials = creds , session_info = system_session ( lp ) , lp = lp )
2018-07-30 09:22:34 +03:00
if " tdb:// " not in host :
2009-11-27 06:20:47 +03:00
gc_ldb = Ldb ( " %s :3268 " % host , credentials = creds ,
2010-12-15 16:16:54 +03:00
session_info = system_session ( lp ) , lp = lp )
2009-11-27 06:20:47 +03:00
else :
gc_ldb = None
2007-12-24 04:19:41 +03:00
2014-11-02 07:31:18 +03:00
TestProgram ( module = __name__ , opts = subunitopts )