2007-12-24 04:19:41 +03:00
#!/usr/bin/python
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
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
2008-05-11 07:29:20 +04:00
sys . path . append ( " bin/python " )
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-01-17 02:26:53 +03:00
from ldb import ERR_NO_SUCH_ATTRIBUTE
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
2009-11-26 11:51:56 +03:00
from ldb import ERR_UNDEFINED_ATTRIBUTE_TYPE
2009-10-06 19:18:04 +04:00
from ldb import Message , MessageElement , Dn
from ldb import FLAG_MOD_ADD , FLAG_MOD_REPLACE , FLAG_MOD_DELETE
2010-01-17 02:26:53 +03:00
from samba import Ldb
from samba import UF_NORMAL_ACCOUNT
from samba import UF_WORKSTATION_TRUST_ACCOUNT
2009-10-02 20:31:38 +04:00
from samba import UF_PASSWD_NOTREQD , UF_ACCOUNTDISABLE
from samba import ATYPE_NORMAL_ACCOUNT , ATYPE_WORKSTATION_TRUST
2010-01-08 04:09:20 +03:00
from subunit . run import SubunitTestRunner
2008-02-09 21:04:14 +03:00
import unittest
2007-12-28 08:31:54 +03:00
2009-09-08 17:00:24 +04:00
from samba . ndr import ndr_pack , ndr_unpack
from samba . dcerpc import security
2007-12-28 08:31:54 +03:00
parser = optparse . OptionParser ( " ldap [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 )
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
2008-02-09 21:04:14 +03:00
class BasicTests ( unittest . TestCase ) :
def delete_force ( self , ldb , dn ) :
try :
ldb . delete ( dn )
2009-07-03 16:24:52 +04:00
except LdbError , ( num , _ ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( num , ERR_NO_SUCH_OBJECT )
2008-02-09 21:04:14 +03:00
def find_basedn ( self , ldb ) :
2009-07-03 16:24:52 +04:00
res = ldb . search ( base = " " , expression = " " , scope = SCOPE_BASE ,
2008-02-09 21:04:14 +03:00
attrs = [ " defaultNamingContext " ] )
self . assertEquals ( len ( res ) , 1 )
return res [ 0 ] [ " defaultNamingContext " ] [ 0 ]
def find_configurationdn ( self , ldb ) :
res = ldb . search ( base = " " , expression = " " , scope = SCOPE_BASE , attrs = [ " configurationNamingContext " ] )
self . assertEquals ( len ( res ) , 1 )
return res [ 0 ] [ " configurationNamingContext " ] [ 0 ]
def find_schemadn ( self , ldb ) :
res = ldb . search ( base = " " , expression = " " , scope = SCOPE_BASE , attrs = [ " schemaNamingContext " ] )
self . assertEquals ( len ( res ) , 1 )
return res [ 0 ] [ " schemaNamingContext " ] [ 0 ]
2009-09-08 17:00:24 +04:00
def find_domain_sid ( self ) :
res = self . ldb . search ( base = self . base_dn , expression = " (objectClass=*) " , scope = SCOPE_BASE )
return ndr_unpack ( security . dom_sid , res [ 0 ] [ " objectSid " ] [ 0 ] )
2008-02-09 21:04:14 +03:00
def setUp ( self ) :
self . ldb = ldb
self . gc_ldb = gc_ldb
self . base_dn = self . find_basedn ( ldb )
self . configuration_dn = self . find_configurationdn ( ldb )
self . schema_dn = self . find_schemadn ( ldb )
2009-09-08 17:00:24 +04:00
self . domain_sid = self . find_domain_sid ( )
2008-02-09 21:04:14 +03:00
print " baseDN: %s \n " % self . base_dn
self . delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
2008-12-16 11:11:11 +03:00
self . delete_force ( self . ldb , " cn=ldaptestuser2,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
self . delete_force ( self . ldb , " cn=ldaptestuser3,cn=users, " + self . base_dn )
2009-10-06 19:18:04 +04:00
self . delete_force ( self . ldb , " cn=ldaptestuser4,cn=ldaptestcontainer, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestuser4,cn=ldaptestcontainer2, " + self . base_dn )
2009-11-20 03:47:54 +03:00
self . delete_force ( self . ldb , " cn=ldaptestuser5,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2008-12-16 11:11:11 +03:00
self . delete_force ( self . ldb , " cn=ldaptestgroup2,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
self . delete_force ( self . ldb , " cn=ldaptestcomputer,cn=computers, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptest2computer,cn=computers, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestcomputer3,cn=computers, " + self . base_dn )
2009-10-03 18:50:34 +04:00
self . delete_force ( self . ldb , " cn=ldaptestutf8user èùéìòà,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestutf8user2 èùéìòà,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
self . delete_force ( self . ldb , " cn=ldaptestcontainer, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestcontainer2, " + self . base_dn )
2009-04-14 04:52:33 +04:00
self . delete_force ( self . ldb , " cn=parentguidtest,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " cn=parentguidtest,cn=testotherusers, " + self . base_dn )
self . delete_force ( self . ldb , " cn=testotherusers, " + self . base_dn )
2009-10-03 12:57:14 +04:00
self . delete_force ( self . ldb , " cn=ldaptestobject, " + self . base_dn )
2009-10-03 13:37:30 +04:00
self . delete_force ( self . ldb , " description=xyz,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " ou=testou,cn=users, " + self . base_dn )
2009-10-03 12:57:14 +04:00
def test_system_only ( self ) :
""" Test systemOnly objects """
print " Test systemOnly objects " " "
try :
self . ldb . add ( {
" dn " : " cn=ldaptestobject, " + self . base_dn ,
" objectclass " : " configuration " } )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_UNWILLING_TO_PERFORM )
self . delete_force ( self . ldb , " cn=ldaptestobject, " + self . base_dn )
2009-07-03 16:24:52 +04:00
2009-10-03 13:37:30 +04:00
def test_invalid_parent ( self ) :
""" Test adding an object with invalid parent """
print " Test adding an object with invalid parent " " "
try :
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=thisdoesnotexist123, "
+ self . base_dn ,
" objectclass " : " group " } )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_NO_SUCH_OBJECT )
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=thisdoesnotexist123, "
+ self . base_dn )
try :
self . ldb . add ( {
" dn " : " ou=testou,cn=users, " + self . base_dn ,
" objectclass " : " organizationalUnit " } )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_NAMING_VIOLATION )
self . delete_force ( self . ldb , " ou=testou,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
def test_invalid_attribute ( self ) :
""" Test adding invalid attributes (not in schema) """
print " Test adding invalid attributes (not in schema) " " "
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 ( )
2009-07-03 16:24:52 +04:00
except LdbError , ( num , _ ) :
2009-10-02 20:31:38 +04:00
self . assertEquals ( num , ERR_NO_SUCH_ATTRIBUTE )
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
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 ,
" thisdoesnotexist " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_NO_SUCH_ATTRIBUTE )
2009-10-02 23:26:35 +04:00
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
2009-10-06 19:18:04 +04:00
def test_single_valued_attributes ( self ) :
""" Test single-valued attributes """
print " Test single-valued attributes " " "
try :
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " ,
" sAMAccountName " : [ " nam1 " , " nam2 " ] } )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_CONSTRAINT_VIOLATION )
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 [ " sAMAccountName " ] = MessageElement ( [ " nam1 " , " nam2 " ] , FLAG_MOD_REPLACE ,
" sAMAccountName " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_ATTRIBUTE_OR_VALUE_EXISTS )
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 ,
2009-10-06 19:18:04 +04:00
" sAMAccountName " )
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 ,
2009-10-06 19:18:04 +04:00
" sAMAccountName " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_ATTRIBUTE_OR_VALUE_EXISTS )
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
def test_multi_valued_attributes ( self ) :
""" Test multi-valued attributes """
print " Test multi-valued attributes " " "
# TODO: In this test I added some special tests where I got very unusual
# results back from a real AD. s4 doesn't match them and I've no idea how to
# implement those error cases (maybe there exists a special trigger for
# "description" attributes which handle them)
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" description " : " desc2 " ,
" objectclass " : " group " ,
" description " : " desc1 " } )
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
self . ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " ,
" description " : [ " desc1 " , " desc2 " ] } )
# m = Message()
# m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
# m["description"] = MessageElement(["desc1","desc2"], FLAG_MOD_REPLACE,
# "description")
# try:
# ldb.modify(m)
# self.fail()
# except LdbError, (num, _):
# self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " description " ] = MessageElement ( " desc1 " , FLAG_MOD_REPLACE ,
" description " )
ldb . modify ( m )
# m = Message()
# m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
# m["description"] = MessageElement("desc3", FLAG_MOD_ADD,
# "description")
# try:
# ldb.modify(m)
# self.fail()
# except LdbError, (num, _):
# self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " description " ] = MessageElement ( [ " desc1 " , " desc2 " ] , FLAG_MOD_DELETE ,
" description " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_NO_SUCH_ATTRIBUTE )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " description " ] = MessageElement ( " desc1 " , FLAG_MOD_DELETE ,
" description " )
ldb . modify ( m )
# m = Message()
# m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
# m["description"] = MessageElement(["desc1","desc2"], FLAG_MOD_REPLACE,
# "description")
# try:
# ldb.modify(m)
# self.fail()
# except LdbError, (num, _):
# self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
# m = Message()
# m.dn = Dn(ldb, "cn=ldaptestgroup,cn=users," + self.base_dn)
# m["description"] = MessageElement(["desc3", "desc4"], FLAG_MOD_ADD,
# "description")
# try:
# ldb.modify(m)
# self.fail()
# except LdbError, (num, _):
# self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " description " ] = MessageElement ( " desc3 " , FLAG_MOD_ADD ,
" description " )
ldb . modify ( m )
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
def test_empty_messages ( self ) :
""" Test empty messages """
print " Test empty messages " " "
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
try :
ldb . add ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_OBJECT_CLASS_VIOLATION )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_UNWILLING_TO_PERFORM )
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
def test_empty_attributes ( self ) :
""" Test empty attributes """
print " 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 ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_CONSTRAINT_VIOLATION )
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 ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_CONSTRAINT_VIOLATION )
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 ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_NO_SUCH_ATTRIBUTE )
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
def test_distinguished_name ( self ) :
""" Tests the ' distinguishedName ' attribute """
print " Tests the ' distinguishedName ' attribute " " "
self . ldb . add ( {
" 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 )
m [ " distinguishedName " ] = MessageElement (
" cn=ldaptestuser,cn=users, " + self . base_dn , FLAG_MOD_ADD ,
" distinguishedName " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_CONSTRAINT_VIOLATION )
2009-10-02 20:31:38 +04:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " distinguishedName " ] = MessageElement (
" cn=ldaptestuser,cn=users, " + self . base_dn , FLAG_MOD_REPLACE ,
" distinguishedName " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
2009-10-06 19:18:04 +04:00
self . assertEquals ( num , ERR_CONSTRAINT_VIOLATION )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " distinguishedName " ] = MessageElement (
" cn=ldaptestuser,cn=users, " + self . base_dn , FLAG_MOD_DELETE ,
" distinguishedName " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_CONSTRAINT_VIOLATION )
2009-10-02 20:31:38 +04:00
2009-10-02 23:26:35 +04:00
self . 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 """
print " Tests the RDN " " "
2009-10-03 13:37:30 +04:00
try :
self . ldb . add ( {
" dn " : " description=xyz,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_NAMING_VIOLATION )
2009-12-30 23:46:32 +03:00
2009-10-03 13:37:30 +04:00
self . delete_force ( self . ldb , " description=xyz,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +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 [ " name " ] = MessageElement ( " cn=ldaptestuser " , FLAG_MOD_REPLACE ,
" name " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_NOT_ALLOWED_ON_RDN )
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " cn " ] = MessageElement ( " ldaptestuser " ,
FLAG_MOD_REPLACE , " cn " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_NOT_ALLOWED_ON_RDN )
2009-10-02 23:26:35 +04:00
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-11-09 14:19:52 +03:00
# this test needs to be disabled until we really understand
# what the rDN length constraints are
def DISABLED_test_largeRDN ( self ) :
2009-10-15 08:54:40 +04:00
""" Testing large rDN (limit 64 characters) """
rdn = " CN=a012345678901234567890123456789012345678901234567890123456789012 " ;
self . delete_force ( self . ldb , " %s , %s " % ( rdn , self . base_dn ) )
ldif = """
dn : % s , % s """ % (rdn,self.base_dn) + """
objectClass : container
"""
self . ldb . add_ldif ( ldif )
self . delete_force ( self . ldb , " %s , %s " % ( rdn , self . base_dn ) )
rdn = " CN=a0123456789012345678901234567890123456789012345678901234567890120 " ;
self . delete_force ( self . ldb , " %s , %s " % ( rdn , self . base_dn ) )
try :
ldif = """
dn : % s , % s """ % (rdn,self.base_dn) + """
objectClass : container
"""
self . ldb . add_ldif ( ldif )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_CONSTRAINT_VIOLATION )
self . delete_force ( self . ldb , " %s , %s " % ( rdn , self . base_dn ) )
2009-10-02 23:26:35 +04:00
def test_rename ( self ) :
""" Tests the rename operation """
print " Tests the rename operations " " "
self . ldb . add ( {
" dn " : " cn=ldaptestuser2,cn=users, " + self . base_dn ,
" objectclass " : [ " user " , " person " ] } )
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 )
try :
ldb . rename ( " cn=ldaptestuser3,cn=users, " + self . base_dn , " ,cn=users, " + self . base_dn )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_INVALID_DN_SYNTAX )
self . delete_force ( self . ldb , " cn=ldaptestuser3,cn=users, " + self . base_dn )
2007-12-24 04:19:41 +03: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 """
print " Tests the rename twice operation " " "
self . ldb . add ( {
" dn " : " cn=ldaptestuser5,cn=users, " + self . base_dn ,
" objectclass " : [ " user " , " person " ] } )
ldb . rename ( " cn=ldaptestuser5,cn=users, " + self . base_dn , " cn=ldaptestUSER5,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestuser5,cn=users, " + self . base_dn )
self . ldb . add ( {
" dn " : " cn=ldaptestuser5,cn=users, " + self . base_dn ,
" objectclass " : [ " user " , " person " ] } )
ldb . rename ( " cn=ldaptestuser5,cn=Users, " + self . base_dn , " cn=ldaptestUSER5,cn=users, " + self . base_dn )
res = ldb . search ( expression = " cn=ldaptestuser5 " )
print " Found %u records " % len ( res )
self . assertEquals ( len ( res ) , 1 , " Wrong number of hits for cn=ldaptestuser5 " )
res = ldb . search ( expression = " (&(cn=ldaptestuser5)(objectclass=user)) " )
print " Found %u records " % len ( res )
self . assertEquals ( len ( res ) , 1 , " Wrong number of hits for (&(cn=ldaptestuser5)(objectclass=user)) " )
self . delete_force ( self . ldb , " cn=ldaptestuser5,cn=users, " + self . base_dn )
2009-03-17 06:18:53 +03:00
def test_parentGUID ( self ) :
""" Test parentGUID behaviour """
print " Testing parentGUID behaviour \n "
2009-09-08 17:00:24 +04:00
2009-10-02 20:31:38 +04:00
# TODO: This seems to fail on Windows Server. Hidden attribute?
2009-03-17 06:18:53 +03:00
self . ldb . add ( {
" dn " : " cn=parentguidtest,cn=users, " + self . base_dn ,
" objectclass " : " user " ,
" samaccountname " : " parentguidtest " } ) ;
res1 = ldb . search ( base = " cn=parentguidtest,cn=users, " + self . base_dn , scope = SCOPE_BASE ,
2009-11-27 17:25:18 +03:00
attrs = [ " parentGUID " , " samaccountname " ] ) ;
2009-03-17 06:18:53 +03:00
res2 = ldb . search ( base = " cn=users, " + self . base_dn , scope = SCOPE_BASE ,
attrs = [ " objectGUID " ] ) ;
2009-11-27 17:25:18 +03:00
res3 = ldb . search ( base = self . base_dn , scope = SCOPE_BASE ,
attrs = [ " parentGUID " ] ) ;
""" Check if the parentGUID is valid """
2009-03-17 06:18:53 +03:00
self . assertEquals ( res1 [ 0 ] [ " parentGUID " ] , res2 [ 0 ] [ " objectGUID " ] ) ;
2009-11-27 17:25:18 +03:00
""" Check if it returns nothing when there is no parent object """
has_parentGUID = False
for key in res3 [ 0 ] . keys ( ) :
if key == " parentGUID " :
has_parentGUID = True
break
self . assertFalse ( has_parentGUID ) ;
""" 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 )
self . assertEquals ( res1 [ 0 ] [ " samaccountname " ] [ 0 ] , " parentguidtest " ) ;
2009-03-17 06:18:53 +03:00
print " Testing parentGUID behaviour on rename \n "
self . ldb . add ( {
" dn " : " cn=testotherusers, " + self . base_dn ,
" objectclass " : " container " } ) ;
res1 = ldb . search ( base = " cn=testotherusers, " + self . base_dn , scope = SCOPE_BASE ,
attrs = [ " objectGUID " ] ) ;
ldb . rename ( " cn=parentguidtest,cn=users, " + self . base_dn ,
" cn=parentguidtest,cn=testotherusers, " + self . base_dn ) ;
res2 = ldb . search ( base = " cn=parentguidtest,cn=testotherusers, " + self . base_dn ,
scope = SCOPE_BASE ,
attrs = [ " parentGUID " ] ) ;
self . assertEquals ( res1 [ 0 ] [ " objectGUID " ] , res2 [ 0 ] [ " parentGUID " ] ) ;
2009-10-02 20:31:38 +04:00
self . delete_force ( self . ldb , " cn=parentguidtest,cn=testotherusers, " + self . base_dn )
self . delete_force ( self . ldb , " cn=testotherusers, " + self . base_dn )
def test_groupType_int32 ( self ) :
""" Test groupType (int32) behaviour (should appear to be casted to a 32 bit signed integer before comparsion) """
print " Testing groupType (int32) behaviour \n "
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 ,
2009-08-11 14:25:13 +04:00
attrs = [ " groupType " ] , expression = " groupType=2147483653 " ) ;
2009-06-19 05:29:31 +04:00
res2 = ldb . search ( base = self . base_dn , scope = SCOPE_SUBTREE ,
2009-08-11 14:25:13 +04:00
attrs = [ " groupType " ] , expression = " groupType=-2147483643 " ) ;
2009-06-19 05:29:31 +04:00
self . assertEquals ( len ( res1 ) , len ( res2 ) )
self . assertTrue ( res1 . count > 0 )
2009-08-11 14:25:13 +04:00
self . assertEquals ( res1 [ 0 ] [ " groupType " ] [ 0 ] , " -2147483643 " )
2009-10-02 20:31:38 +04:00
def test_groups ( self ) :
""" This tests the group behaviour (setting, changing) of a user account """
print " Testing group behaviour \n "
2009-08-26 03:49:00 +04:00
ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
ldb . add ( {
" dn " : " cn=ldaptestgroup2,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
res1 = ldb . search ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " objectSID " ] )
self . assertTrue ( len ( res1 ) == 1 )
2009-12-30 23:46:32 +03:00
group_rid_1 = security . dom_sid ( ldb . schema_format_value ( " objectSID " ,
res1 [ 0 ] [ " objectSID " ] [ 0 ] ) ) . split ( ) [ 1 ]
2009-08-26 03:49:00 +04:00
res1 = ldb . search ( " cn=ldaptestgroup2,cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " objectSID " ] )
self . assertTrue ( len ( res1 ) == 1 )
2009-12-30 23:46:32 +03:00
group_rid_2 = security . dom_sid ( ldb . schema_format_value ( " objectSID " ,
res1 [ 0 ] [ " objectSID " ] [ 0 ] ) ) . split ( ) [ 1 ]
2009-08-26 03:49:00 +04:00
2009-10-02 20:31:38 +04:00
# Try to create a user with an invalid primary group
2009-12-30 23:46:32 +03:00
try :
2009-10-02 20:31:38 +04:00
ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
" objectclass " : [ " user " , " person " ] ,
" primaryGroupID " : " 0 " } )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_UNWILLING_TO_PERFORM )
self . delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
# Try to Create a user with a valid primary group
# TODO Some more investigation needed here
# try:
# ldb.add({
# "dn": "cn=ldaptestuser,cn=users," + self.base_dn,
# "objectclass": ["user", "person"],
# "primaryGroupID": str(group_rid_1)})
# self.fail()
# except LdbError, (num, _):
2009-10-06 19:18:04 +04:00
# self.assertEquals(num, ERR_UNWILLING_TO_PERFORM)
2009-10-02 20:31:38 +04:00
# self.delete_force(self.ldb, "cn=ldaptestuser,cn=users," + self.base_dn)
ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
" objectclass " : [ " user " , " person " ] } )
2009-08-26 03:49:00 +04:00
# Try to add invalid primary group
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " primaryGroupID " ] = MessageElement ( " 0 " , FLAG_MOD_REPLACE ,
" primaryGroupID " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_UNWILLING_TO_PERFORM )
# Try to make group 1 primary - should be denied since it is not yet
# secondary
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " primaryGroupID " ] = MessageElement ( str ( group_rid_1 ) ,
FLAG_MOD_REPLACE , " primaryGroupID " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_UNWILLING_TO_PERFORM )
# Make group 1 secondary
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-12-29 03:41:19 +03:00
m [ " member " ] = MessageElement ( " cn=ldaptestuser,cn=users, " + self . base_dn ,
FLAG_MOD_REPLACE , " member " )
2009-08-26 03:49:00 +04:00
ldb . modify ( m )
# Make group 1 primary
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " primaryGroupID " ] = MessageElement ( str ( group_rid_1 ) ,
FLAG_MOD_REPLACE , " primaryGroupID " )
ldb . modify ( m )
# Try to delete group 1 - should be denied
try :
ldb . delete ( " cn=ldaptestgroup,cn=users, " + self . base_dn )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_ENTRY_ALREADY_EXISTS )
# Try to add group 1 also as secondary - should be denied
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-12-30 02:54:03 +03:00
m [ " member " ] = MessageElement ( " cn=ldaptestuser,cn=users, " + self . base_dn ,
FLAG_MOD_ADD , " member " )
2009-08-26 03:49:00 +04:00
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_ENTRY_ALREADY_EXISTS )
2009-10-02 20:31:38 +04:00
# Try to add invalid member to group 1 - should be denied
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " member " ] = MessageElement (
" cn=ldaptestuser3,cn=users, " + self . base_dn ,
FLAG_MOD_ADD , " member " )
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_NO_SUCH_OBJECT )
2009-08-26 03:49:00 +04:00
# Make group 2 secondary
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup2,cn=users, " + self . base_dn )
2009-12-30 02:54:03 +03:00
m [ " member " ] = MessageElement ( " cn=ldaptestuser,cn=users, " + self . base_dn ,
FLAG_MOD_ADD , " member " )
2009-08-26 03:49:00 +04:00
ldb . modify ( m )
# Swap the groups
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
m [ " primaryGroupID " ] = MessageElement ( str ( group_rid_2 ) ,
FLAG_MOD_REPLACE , " primaryGroupID " )
ldb . modify ( m )
# Old primary group should contain a "member" attribute for the user,
# the new shouldn't contain anymore one
res1 = ldb . search ( " cn=ldaptestgroup, cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " member " ] )
self . assertTrue ( len ( res1 ) == 1 )
self . assertTrue ( len ( res1 [ 0 ] [ " member " ] ) == 1 )
self . assertEquals ( res1 [ 0 ] [ " member " ] [ 0 ] . lower ( ) ,
( " cn=ldaptestuser,cn=users, " + self . base_dn ) . lower ( ) )
res1 = ldb . search ( " cn=ldaptestgroup2, cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " member " ] )
self . assertTrue ( len ( res1 ) == 1 )
self . assertFalse ( " member " in res1 [ 0 ] )
# Also this should be denied
try :
ldb . add ( {
" dn " : " cn=ldaptestuser1,cn=users, " + self . base_dn ,
" objectclass " : [ " user " , " person " ] ,
" primaryGroupID " : " 0 " } )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_UNWILLING_TO_PERFORM )
self . delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestgroup2,cn=users, " + self . base_dn )
2010-03-04 19:54:45 +03:00
def test_primary_group_token_constructed ( self ) :
""" Test the primary group token behaviour (hidden-generated-readonly attribute on groups) and some other constructed attributes """
print " Testing primary group token behaviour and other constructed attributes \n "
2009-08-11 14:25:13 +04:00
2009-11-26 11:51:56 +03:00
try :
ldb . add ( {
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " ,
" primaryGroupToken " : " 100 " } )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_UNDEFINED_ATTRIBUTE_TYPE )
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-08-11 14:25:13 +04:00
ldb . add ( {
2009-08-26 03:49:00 +04:00
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
" objectclass " : [ " user " , " person " ] } )
2009-08-11 14:25:13 +04:00
ldb . add ( {
2009-08-26 03:49:00 +04:00
" dn " : " cn=ldaptestgroup,cn=users, " + self . base_dn ,
" objectclass " : " group " } )
2009-08-11 14:25:13 +04:00
2009-12-07 04:44:07 +03:00
# Testing for one invalid, and one valid operational attribute, but also the things they are built from
res1 = ldb . search ( self . base_dn ,
scope = SCOPE_BASE , attrs = [ " primaryGroupToken " , " canonicalName " , " objectClass " , " objectSid " ] )
self . assertTrue ( len ( res1 ) == 1 )
self . assertFalse ( " primaryGroupToken " in res1 [ 0 ] )
self . assertTrue ( " canonicalName " in res1 [ 0 ] )
self . assertTrue ( " objectClass " in res1 [ 0 ] )
self . assertTrue ( " objectSid " in res1 [ 0 ] )
res1 = ldb . search ( self . base_dn ,
scope = SCOPE_BASE , attrs = [ " primaryGroupToken " , " canonicalName " ] )
self . assertTrue ( len ( res1 ) == 1 )
self . assertFalse ( " primaryGroupToken " in res1 [ 0 ] )
self . assertFalse ( " objectSid " in res1 [ 0 ] )
self . assertFalse ( " objectClass " in res1 [ 0 ] )
self . assertTrue ( " canonicalName " in res1 [ 0 ] )
res1 = ldb . search ( " cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " primaryGroupToken " ] )
self . assertTrue ( len ( res1 ) == 1 )
self . assertFalse ( " primaryGroupToken " in res1 [ 0 ] )
2009-08-11 14:25:13 +04:00
res1 = ldb . search ( " cn=ldaptestuser, cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " primaryGroupToken " ] )
self . assertTrue ( len ( res1 ) == 1 )
self . assertFalse ( " primaryGroupToken " in res1 [ 0 ] )
2009-12-30 23:46:32 +03:00
res1 = ldb . search ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
2009-08-11 14:25:13 +04:00
scope = SCOPE_BASE )
self . assertTrue ( len ( res1 ) == 1 )
self . assertFalse ( " primaryGroupToken " in res1 [ 0 ] )
res1 = ldb . search ( " cn=ldaptestgroup,cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " primaryGroupToken " , " objectSID " ] )
self . assertTrue ( len ( res1 ) == 1 )
primary_group_token = int ( res1 [ 0 ] [ " primaryGroupToken " ] [ 0 ] )
2009-12-30 23:46:32 +03:00
rid = security . dom_sid ( ldb . schema_format_value ( " objectSID " , res1 [ 0 ] [ " objectSID " ] [ 0 ] ) ) . split ( ) [ 1 ]
2009-08-11 14:25:13 +04:00
self . assertEquals ( primary_group_token , rid )
2009-11-22 16:59:21 +03:00
m = Message ( )
m . dn = Dn ( ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
m [ " primaryGroupToken " ] = " 100 "
try :
ldb . modify ( m )
self . fail ( )
except LdbError , ( num , _ ) :
self . assertEquals ( num , ERR_CONSTRAINT_VIOLATION )
2009-08-11 14:25:13 +04:00
self . delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
2009-08-26 03:49:00 +04:00
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
2009-06-19 05:29:31 +04:00
2010-03-04 19:51:09 +03:00
def test_tokenGroups ( self ) :
""" Test the tokenGroups behaviour (hidden-generated-readonly attribute on SAM objects) """
print " Testing tokenGroups behaviour \n "
# The domain object shouldn't contain any "tokenGroups" entry
res = ldb . search ( self . base_dn , scope = SCOPE_BASE , attrs = [ " tokenGroups " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertFalse ( " tokenGroups " in res [ 0 ] )
# The domain administrator should contain "tokenGroups" entries
# (the exact number depends on the domain/forest function level and the
# DC software versions)
res = ldb . search ( " cn=Administrator,cn=Users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " tokenGroups " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( " tokenGroups " in res [ 0 ] )
ldb . add ( {
" dn " : " cn=ldaptestuser,cn=users, " + self . base_dn ,
" objectclass " : [ " user " , " person " ] } )
# This testuser should contain at least two "tokenGroups" entries
# (exactly two on an unmodified "Domain Users" and "Users" group)
res = ldb . search ( " cn=ldaptestuser,cn=users, " + self . base_dn ,
scope = SCOPE_BASE , attrs = [ " tokenGroups " ] )
self . assertTrue ( len ( res ) == 1 )
self . assertTrue ( len ( res [ 0 ] [ " tokenGroups " ] ) > = 2 )
# one entry which we need to find should point to domains "Domain Users"
# group and another entry should point to the builtin "Users"group
domain_users_group_found = False
users_group_found = False
for sid in res [ 0 ] [ " tokenGroups " ] :
rid = security . dom_sid ( ldb . schema_format_value ( " objectSID " , sid ) ) . split ( ) [ 1 ]
if rid == 513 :
domain_users_group_found = True
if rid == 545 :
users_group_found = True
self . assertTrue ( domain_users_group_found )
self . assertTrue ( users_group_found )
self . delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
2009-11-06 09:00:05 +03:00
def test_wkguid ( self ) :
""" Test Well known GUID behaviours (including DN+Binary) """
print " Test Well known GUID behaviours (including DN+Binary) " " "
res = self . ldb . search ( base = ( " <WKGUID=ab1d30f3768811d1aded00c04fd8d5cd, %s > " % self . base_dn ) , scope = SCOPE_BASE , attrs = [ ] )
self . assertEquals ( len ( res ) , 1 )
res2 = self . ldb . search ( scope = SCOPE_BASE , attrs = [ " wellKnownObjects " ] , expression = ( " wellKnownObjects=B:32:ab1d30f3768811d1aded00c04fd8d5cd: %s " % res [ 0 ] . dn ) )
self . assertEquals ( len ( res2 ) , 1 )
# 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 " ) )
self . assertEquals ( len ( res2 ) , 0 )
# 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 )
self . assertEquals ( len ( res2 ) , 0 )
2009-11-24 02:18:33 +03:00
def test_subschemasubentry ( self ) :
""" Test subSchemaSubEntry appears when requested, but not when not requested """
print " Test subSchemaSubEntry " " "
res = self . ldb . search ( base = self . base_dn , scope = SCOPE_BASE , attrs = [ " subSchemaSubEntry " ] )
self . assertEquals ( len ( res ) , 1 )
self . assertEquals ( res [ 0 ] [ " subSchemaSubEntry " ] [ 0 ] , " CN=Aggregate, " + self . schema_dn )
res = self . ldb . search ( base = self . base_dn , scope = SCOPE_BASE , attrs = [ " * " ] )
self . assertEquals ( len ( res ) , 1 )
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
2009-08-26 03:49:00 +04:00
print " Testing user add "
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 ,
" objectclass " : [ " user " , " person " ] ,
" 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 ,
2007-12-24 04:19:41 +03:00
" objectClass " : " computer " ,
" cn " : " LDAPtest2COMPUTER " ,
2009-10-02 20:31:38 +04:00
" userAccountControl " : str ( UF_WORKSTATION_TRUST_ACCOUNT ) ,
2007-12-24 04:19:41 +03:00
" 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 ( )
2009-07-03 16:24:52 +04:00
except LdbError , ( num , _ ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( 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 )
2008-06-03 17:27:22 +04:00
} )
self . fail ( )
2009-07-03 16:24:52 +04:00
except LdbError , ( num , _ ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( 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
2008-06-03 17:27:22 +04:00
print " Testing ldb.search for (&(cn=ldaptestcomputer3)(objectClass=user)) " ;
res = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestcomputer3)(objectClass=user)) " ) ;
self . assertEquals ( len ( res ) , 1 , " Found only %d for (&(cn=ldaptestcomputer3)(objectClass=user)) " % len ( res ) )
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestcomputer3,CN=Computers, " + self . base_dn ) ) ;
self . assertEquals ( res [ 0 ] [ " cn " ] [ 0 ] , " ldaptestcomputer3 " ) ;
self . assertEquals ( res [ 0 ] [ " name " ] [ 0 ] , " ldaptestcomputer3 " ) ;
self . assertEquals ( res [ 0 ] [ " objectClass " ] [ 0 ] , " top " ) ;
self . assertEquals ( res [ 0 ] [ " objectClass " ] [ 1 ] , " person " ) ;
self . assertEquals ( res [ 0 ] [ " objectClass " ] [ 2 ] , " organizationalPerson " ) ;
self . assertEquals ( res [ 0 ] [ " objectClass " ] [ 3 ] , " user " ) ;
self . assertEquals ( res [ 0 ] [ " objectClass " ] [ 4 ] , " computer " ) ;
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
self . assertEquals ( res [ 0 ] [ " objectCategory " ] [ 0 ] , ( " CN=Computer,CN=Schema,CN=Configuration, " + self . base_dn ) ) ;
self . assertEquals ( int ( res [ 0 ] [ " primaryGroupID " ] [ 0 ] ) , 513 ) ;
2009-10-02 20:31:38 +04:00
self . assertEquals ( int ( res [ 0 ] [ " sAMAccountType " ] [ 0 ] ) , ATYPE_NORMAL_ACCOUNT ) ;
self . assertEquals ( int ( res [ 0 ] [ " userAccountControl " ] [ 0 ] ) , UF_NORMAL_ACCOUNT | UF_PASSWD_NOTREQD | UF_ACCOUNTDISABLE ) ;
2008-06-03 17:27:22 +04:00
self . delete_force ( self . ldb , " cn=ldaptestcomputer3,cn=computers, " + self . base_dn )
2008-02-09 21:04:14 +03:00
print " Testing attribute or value exists behaviour "
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 ( )
2008-02-09 21:04:14 +03:00
except LdbError , ( num , msg ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( 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 ( )
except LdbError , ( num , msg ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( num , ERR_ATTRIBUTE_OR_VALUE_EXISTS )
2008-06-03 17:27:22 +04:00
print " Testing ranged results "
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-* " ] )
self . assertEquals ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
#print len(res[0]["servicePrincipalName;range=0-*"])
self . assertEquals ( 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 " ] )
self . assertEquals ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
2008-02-09 21:04:14 +03:00
# print res[0]["servicePrincipalName;range=0-19"].length
2008-06-03 17:27:22 +04:00
self . assertEquals ( len ( res [ 0 ] [ " servicePrincipalName;range=0-19 " ] ) , 20 )
2008-02-09 21:04:14 +03:00
2009-07-03 16:24:52 +04: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 " ] )
self . assertEquals ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEquals ( 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 " ] )
self . assertEquals ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEquals ( 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 " ] )
self . assertEquals ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEquals ( len ( res [ 0 ] [ " servicePrincipalName;range=30-* " ] ) , 0 )
2008-02-09 21:04:14 +03:00
2009-07-03 16:24:52 +04: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 " ] )
self . assertEquals ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEquals ( len ( res [ 0 ] [ " servicePrincipalName;range=10-* " ] ) , 20 )
# 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 " ] )
self . assertEquals ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEquals ( len ( res [ 0 ] [ " servicePrincipalName;range=11-* " ] ) , 19 )
2008-02-09 21:04:14 +03:00
# print res[0]["servicePrincipalName;range=11-*"][18]
# print pos_11
# self.assertEquals((res[0]["servicePrincipalName;range=11-*"][18]), pos_11)
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 " ] )
self . assertEquals ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
self . assertEquals ( len ( res [ 0 ] [ " servicePrincipalName;range=11-15 " ] ) , 5 )
2008-02-09 21:04:14 +03:00
# self.assertEquals(res[0]["servicePrincipalName;range=11-15"][4], pos_11)
2008-06-03 17:27:22 +04:00
res = ldb . search ( self . base_dn , expression = " (cn=ldaptest2computer)) " , scope = SCOPE_SUBTREE , attrs = [ " servicePrincipalName " ] )
self . assertEquals ( len ( res ) , 1 , " Could not find (cn=ldaptest2computer) " )
2008-02-09 21:04:14 +03:00
# print res[0]["servicePrincipalName"][18]
# print pos_11
2008-06-03 17:27:22 +04:00
self . assertEquals ( len ( res [ 0 ] [ " servicePrincipalName " ] ) , 30 )
2008-02-09 21:04:14 +03:00
# self.assertEquals(res[0]["servicePrincipalName"][18], pos_11)
self . 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 ,
" objectClass " : [ " person " , " user " ] ,
" cn " : " LDAPtestUSER2 " ,
" givenname " : " testy " ,
" sn " : " ldap user2 " } )
print " Testing Ambigious Name Resolution "
# Testing ldb.search for (&(anr=ldap testy)(objectClass=user))
res = ldb . search ( expression = " (&(anr=ldap testy)(objectClass=user)) " )
2008-08-21 06:51:55 +04:00
self . assertEquals ( 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)) " )
2008-08-21 06:51:55 +04:00
self . assertEquals ( 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)) " )
2008-08-21 06:51:55 +04:00
self . assertEquals ( 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)) " )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(anr==ldap)(objectClass=user)). Found only %d for (&(anr=ldap)(objectClass=user)) " % len ( res ) )
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser,CN=Users, " + self . base_dn ) )
self . assertEquals ( res [ 0 ] [ " cn " ] [ 0 ] , " ldaptestuser " )
2008-12-21 09:34:27 +03:00
self . assertEquals ( 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)) " )
self . assertEquals ( len ( res ) , 2 , " Found only %d for (&(anr=testy)(objectClass=user)) " % len ( res ) )
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)) " )
2008-08-21 06:51:55 +04:00
self . assertEquals ( 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))")
# self.assertEquals(len(res), 1, "Found only %d for (&(anr==testy ldap)(objectClass=user))" % len(res))
2008-02-09 21:04:14 +03:00
2009-11-14 23:56:59 +03:00
# self.assertEquals(str(res[0].dn), ("CN=ldaptestuser,CN=Users," + self.base_dn))
# self.assertEquals(res[0]["cn"][0], "ldaptestuser")
# self.assertEquals(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))")
# self.assertEquals(len(res), 1, "Could not find (&(anr==testy ldap)(objectClass=user))")
2008-02-09 21:04:14 +03:00
2009-11-14 23:56:59 +03:00
# self.assertEquals(str(res[0].dn), ("CN=ldaptestuser,CN=Users," + self.base_dn))
# self.assertEquals(res[0]["cn"][0], "ldaptestuser")
# self.assertEquals(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)) " )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(anr=testy ldap user)(objectClass=user)) " )
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestuser2 " )
self . assertEquals ( 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))")
# self.assertEquals(len(res), 1, "Could not find (&(anr==testy ldap user2)(objectClass=user))")
2008-02-09 21:04:14 +03:00
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestuser2 " )
self . assertEquals ( 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))")
# self.assertEquals(len(res), 1, "Could not find (&(anr==ldap user2)(objectClass=user))")
2008-02-09 21:04:14 +03:00
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestuser2 " )
self . assertEquals ( 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))")
# self.assertEquals(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)) " )
self . assertEquals ( len ( res ) , 0 , " Must not find (&(anr=not ldap user2)(objectClass=user)) " )
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))")
# self.assertEquals(len(res), 0, "Found (&(anr==\"testy ldap\")(objectClass=user))")
2008-06-03 17:27:22 +04:00
2008-02-09 21:04:14 +03:00
print " Testing Renames "
2008-12-16 11:11:11 +03:00
attrs = [ " objectGUID " , " objectSid " ]
print " Testing ldb.search for (&(cn=ldaptestUSer2)(objectClass=user)) "
res_user = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestUSer2)(objectClass=user)) " , scope = SCOPE_SUBTREE , attrs = attrs )
self . assertEquals ( len ( res_user ) , 1 , " Could not find (&(cn=ldaptestUSer2)(objectClass=user)) " )
2009-10-02 20:31:38 +04:00
# Check rename works with extended/alternate DN forms
2009-10-02 23:26:35 +04:00
ldb . rename ( " <SID= " + 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
print " Testing ldb.search for (&(cn=ldaptestuser3)(objectClass=user)) "
res = ldb . search ( expression = " (&(cn=ldaptestuser3)(objectClass=user)) " )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestuser3)(objectClass=user)) " )
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestUSER3,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestUSER3 " )
self . assertEquals ( str ( res [ 0 ] [ " name " ] ) , " ldaptestUSER3 " )
2008-02-09 21:04:14 +03:00
2008-06-03 17:27:22 +04:00
#"Testing ldb.search for (&(&(cn=ldaptestuser3)(userAccountControl=*))(objectClass=user))"
res = ldb . search ( expression = " (&(&(cn=ldaptestuser3)(userAccountControl=*))(objectClass=user)) " )
self . assertEquals ( len ( res ) , 1 , " (&(&(cn=ldaptestuser3)(userAccountControl=*))(objectClass=user)) " )
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestUSER3,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestUSER3 " )
self . assertEquals ( str ( res [ 0 ] [ " name " ] ) , " ldaptestUSER3 " )
2008-06-03 17:27:22 +04:00
#"Testing ldb.search for (&(&(cn=ldaptestuser3)(userAccountControl=546))(objectClass=user))"
res = ldb . search ( expression = " (&(&(cn=ldaptestuser3)(userAccountControl=546))(objectClass=user)) " )
self . assertEquals ( len ( res ) , 1 , " (&(&(cn=ldaptestuser3)(userAccountControl=546))(objectClass=user)) " )
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestUSER3,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestUSER3 " )
self . assertEquals ( str ( res [ 0 ] [ " name " ] ) , " ldaptestUSER3 " )
2008-06-03 17:27:22 +04:00
#"Testing ldb.search for (&(&(cn=ldaptestuser3)(userAccountControl=547))(objectClass=user))"
res = ldb . search ( expression = " (&(&(cn=ldaptestuser3)(userAccountControl=547))(objectClass=user)) " )
self . assertEquals ( len ( res ) , 0 , " (&(&(cn=ldaptestuser3)(userAccountControl=547))(objectClass=user)) " )
2008-02-09 21:04:14 +03:00
# This is a Samba special, and does not exist in real AD
# print "Testing ldb.search for (dn=CN=ldaptestUSER3,CN=Users," + self.base_dn + ")"
# res = ldb.search("(dn=CN=ldaptestUSER3,CN=Users," + self.base_dn + ")")
# if (res.error != 0 || len(res) != 1) {
# print "Could not find (dn=CN=ldaptestUSER3,CN=Users," + self.base_dn + ")"
# self.assertEquals(len(res), 1)
# }
# self.assertEquals(res[0].dn, ("CN=ldaptestUSER3,CN=Users," + self.base_dn))
# self.assertEquals(res[0].cn, "ldaptestUSER3")
# self.assertEquals(res[0].name, "ldaptestUSER3")
print " Testing ldb.search for (distinguishedName=CN=ldaptestUSER3,CN=Users, " + self . base_dn + " ) "
res = ldb . search ( expression = " (distinguishedName=CN=ldaptestUSER3,CN=Users, " + self . base_dn + " ) " )
self . assertEquals ( len ( res ) , 1 , " Could not find (dn=CN=ldaptestUSER3,CN=Users, " + self . base_dn + " ) " )
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestUSER3,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestUSER3 " )
self . assertEquals ( 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 ,
2007-12-24 04:19:41 +03:00
" objectClass " : [ " person " , " user " ] ,
2008-02-09 21:04:14 +03:00
" cn " : " LDAPtestUSER3 " } )
2008-02-09 21:16:44 +03:00
self . fail ( )
2008-02-09 21:04:14 +03:00
except LdbError , ( num , _ ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( 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 ( )
2009-07-03 16:24:52 +04:00
except LdbError , ( num , _ ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( 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 ,
" objectClass " : [ " person " , " 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 ( )
2008-02-09 21:04:14 +03:00
except LdbError , ( num , _ ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( num , ERR_ENTRY_ALREADY_EXISTS )
2008-02-09 21:04:14 +03:00
try :
ldb . rename ( " cn=ldaptestuser3,cn=users, " + self . base_dn , " cn=ldaptestuser3,cn=configuration, " + self . base_dn )
2008-02-09 21:16:44 +03:00
self . fail ( )
2008-02-09 21:04:14 +03:00
except LdbError , ( num , _ ) :
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 )
self . delete_force ( ldb , " cn=ldaptestgroup2,cn=users, " + self . base_dn )
ldb . rename ( " cn=ldaptestgroup,cn=users, " + self . base_dn , " cn=ldaptestgroup2,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
print " 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 ,
2008-02-09 21:04:14 +03:00
" objectClass " : [ " person " , " user " ] ,
" cn " : " LDAPtestUSER4 " } )
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
2008-02-09 21:04:14 +03:00
print " Testing ldb.rename of cn=ldaptestcontainer, " + self . base_dn + " to cn=ldaptestcontainer2, " + self . base_dn
ldb . rename ( " CN=ldaptestcontainer, " + self . base_dn , " CN=ldaptestcontainer2, " + self . base_dn )
print " Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) "
res = ldb . search ( expression = " (&(cn=ldaptestuser4)(objectClass=user)) " )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestuser4)(objectClass=user)) " )
print " Testing subtree ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in (just renamed from) cn=ldaptestcontainer, " + self . base_dn
try :
2009-07-03 16:24:52 +04:00
res = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
expression = " (&(cn=ldaptestuser4)(objectClass=user)) " ,
2008-02-09 21:04:14 +03:00
scope = SCOPE_SUBTREE )
2008-12-21 09:34:27 +03:00
self . fail ( res )
2008-02-09 21:04:14 +03:00
except LdbError , ( num , _ ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( num , ERR_NO_SUCH_OBJECT )
2008-02-09 21:04:14 +03:00
print " Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in (just renamed from) cn=ldaptestcontainer, " + self . base_dn
try :
2009-07-03 16:24:52 +04:00
res = ldb . search ( " cn=ldaptestcontainer, " + self . base_dn ,
2008-02-09 21:04:14 +03:00
expression = " (&(cn=ldaptestuser4)(objectClass=user)) " , scope = SCOPE_ONELEVEL )
2008-02-09 21:16:44 +03:00
self . fail ( )
2008-02-09 21:04:14 +03:00
except LdbError , ( num , _ ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( num , ERR_NO_SUCH_OBJECT )
2008-02-09 21:04:14 +03:00
print " Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in renamed container "
res = ldb . search ( " cn=ldaptestcontainer2, " + self . base_dn , expression = " (&(cn=ldaptestuser4)(objectClass=user)) " , scope = SCOPE_SUBTREE )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestuser4)(objectClass=user)) under cn=ldaptestcontainer2, " + self . base_dn )
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn ) )
self . assertEquals ( res [ 0 ] [ " memberOf " ] [ 0 ] . upper ( ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) . upper ( ) )
2008-07-21 05:18:54 +04:00
time . sleep ( 4 )
2008-06-30 05:27:55 +04:00
2008-02-09 21:04:14 +03:00
print " Testing ldb.search for (&(member=CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn + " )(objectclass=group)) to check subtree renames and linked attributes "
res = ldb . search ( self . base_dn , expression = " (&(member=CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn + " )(objectclass=group)) " , scope = SCOPE_SUBTREE )
2008-12-16 11:11:11 +03:00
self . assertEquals ( len ( res ) , 1 , " Could not find (&(member=CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn + " )(objectclass=group)), perhaps linked attributes are not consistant with subtree renames? " )
2008-02-09 21:04:14 +03:00
print " Testing ldb.rename (into itself) of cn=ldaptestcontainer2, " + self . base_dn + " to cn=ldaptestcontainer,cn=ldaptestcontainer2, " + self . base_dn
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 ( )
2008-02-09 21:04:14 +03:00
except LdbError , ( num , _ ) :
2008-12-21 09:34:27 +03:00
self . assertEquals ( num , ERR_UNWILLING_TO_PERFORM )
2008-02-09 21:04:14 +03:00
print " Testing ldb.rename (into non-existent container) of cn=ldaptestcontainer2, " + self . base_dn + " to cn=ldaptestcontainer,cn=ldaptestcontainer3, " + self . base_dn
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 ( )
2008-02-09 21:04:14 +03:00
except LdbError , ( num , _ ) :
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
print " Testing delete (should fail, not a leaf node) of renamed cn=ldaptestcontainer2, " + self . base_dn
try :
ldb . delete ( " cn=ldaptestcontainer2, " + self . base_dn )
2008-02-09 21:16:44 +03:00
self . fail ( )
2008-02-09 21:04:14 +03:00
except LdbError , ( num , _ ) :
2009-01-07 08:30:05 +03:00
self . assertEquals ( num , ERR_NOT_ALLOWED_ON_NON_LEAF )
2008-02-09 21:04:14 +03:00
print " Testing base ldb.search for CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn
res = ldb . search ( expression = " (objectclass=*) " , base = ( " CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn ) , scope = SCOPE_BASE )
self . assertEquals ( len ( res ) , 1 )
res = ldb . search ( expression = " (cn=ldaptestuser40) " , base = ( " CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn ) , scope = SCOPE_BASE )
self . assertEquals ( len ( res ) , 0 )
print " Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in cn=ldaptestcontainer2, " + self . base_dn
res = ldb . search ( expression = " (&(cn=ldaptestuser4)(objectClass=user)) " , base = ( " cn=ldaptestcontainer2, " + self . base_dn ) , scope = SCOPE_ONELEVEL )
2008-02-09 21:16:44 +03:00
# FIXME: self.assertEquals(len(res), 0)
2008-02-09 21:04:14 +03:00
print " Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in cn=ldaptestcontainer2, " + self . base_dn
res = ldb . search ( expression = " (&(cn=ldaptestuser4)(objectClass=user)) " , base = ( " cn=ldaptestcontainer2, " + self . base_dn ) , scope = SCOPE_SUBTREE )
2008-02-09 21:16:44 +03:00
# FIXME: self.assertEquals(len(res), 0)
2008-02-09 21:04:14 +03:00
print " Testing delete of subtree renamed " + ( " CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn )
ldb . delete ( ( " CN=ldaptestuser4,CN=ldaptestcontainer2, " + self . base_dn ) )
print " Testing delete of renamed cn=ldaptestcontainer2, " + self . base_dn
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
print " Testing ldb.search for (&(cn=ldaptestuser)(objectClass=user)) "
res = ldb . search ( expression = " (&(cn=ldaptestuser)(objectClass=user)) " )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestuser)(objectClass=user)) " )
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestuser,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestuser " )
self . assertEquals ( str ( res [ 0 ] [ " name " ] ) , " ldaptestuser " )
2009-01-07 13:06:00 +03:00
self . assertEquals ( set ( res [ 0 ] [ " objectClass " ] ) , set ( [ " top " , " person " , " organizationalPerson " , " user " ] ) )
2008-02-09 21:04:14 +03:00
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " objectCategory " ] ) , ( " CN=Person,CN=Schema,CN=Configuration, " + self . base_dn ) )
2009-10-02 20:31:38 +04:00
self . assertEquals ( int ( res [ 0 ] [ " sAMAccountType " ] [ 0 ] ) , ATYPE_NORMAL_ACCOUNT )
self . assertEquals ( int ( res [ 0 ] [ " userAccountControl " ] [ 0 ] ) , UF_NORMAL_ACCOUNT | UF_PASSWD_NOTREQD | UF_ACCOUNTDISABLE )
2008-06-30 03:38:52 +04:00
self . assertEquals ( res [ 0 ] [ " memberOf " ] [ 0 ] . upper ( ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) . upper ( ) )
2008-02-09 21:04:14 +03:00
self . assertEquals ( len ( res [ 0 ] [ " memberOf " ] ) , 1 )
2009-07-03 16:24:52 +04:00
2008-02-09 21:04:14 +03:00
print " Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration, " + self . base_dn + " )) "
res2 = ldb . search ( expression = " (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration, " + self . base_dn + " )) " )
self . assertEquals ( len ( res2 ) , 1 , " Could not find (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration, " + self . base_dn + " )) " )
self . assertEquals ( res [ 0 ] . dn , res2 [ 0 ] . dn )
print " Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) "
res3 = ldb . search ( expression = " (&(cn=ldaptestuser)(objectCategory=PerSon)) " )
2008-02-09 21:16:44 +03:00
self . assertEquals ( len ( res3 ) , 1 , " Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): matched %d " % len ( res3 ) )
2008-02-09 21:04:14 +03:00
self . assertEquals ( res [ 0 ] . dn , res3 [ 0 ] . dn )
if gc_ldb is not None :
print " Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog "
res3gc = gc_ldb . search ( expression = " (&(cn=ldaptestuser)(objectCategory=PerSon)) " )
self . assertEquals ( len ( res3gc ) , 1 )
2009-07-03 16:24:52 +04:00
2008-02-09 21:04:14 +03:00
self . assertEquals ( res [ 0 ] . dn , res3gc [ 0 ] . dn )
print " 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 " ] )
self . assertEquals ( len ( res3control ) , 1 , " Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog " )
2009-07-03 16:24:52 +04:00
2009-11-27 06:20:47 +03:00
self . assertEquals ( res [ 0 ] . dn , res3control [ 0 ] . dn )
2008-02-09 21:04:14 +03:00
ldb . delete ( res [ 0 ] . dn )
print " Testing ldb.search for (&(cn=ldaptestcomputer)(objectClass=user)) "
res = ldb . search ( expression = " (&(cn=ldaptestcomputer)(objectClass=user)) " )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestuser)(objectClass=user)) " )
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestcomputer,CN=Computers, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestcomputer " )
self . assertEquals ( str ( res [ 0 ] [ " name " ] ) , " ldaptestcomputer " )
2009-01-07 13:06:00 +03:00
self . assertEquals ( set ( res [ 0 ] [ " objectClass " ] ) , set ( [ " top " , " person " , " organizationalPerson " , " user " , " computer " ] ) )
2008-02-09 21:04:14 +03:00
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
2009-01-07 13:06:00 +03:00
self . assertEquals ( str ( res [ 0 ] [ " objectCategory " ] ) , ( " CN=Computer,CN=Schema,CN=Configuration, " + self . base_dn ) )
2008-02-09 21:04:14 +03:00
self . assertEquals ( int ( res [ 0 ] [ " primaryGroupID " ] [ 0 ] ) , 513 )
2009-10-02 20:31:38 +04:00
self . assertEquals ( int ( res [ 0 ] [ " sAMAccountType " ] [ 0 ] ) , ATYPE_NORMAL_ACCOUNT )
self . assertEquals ( int ( res [ 0 ] [ " userAccountControl " ] [ 0 ] ) , UF_NORMAL_ACCOUNT | UF_PASSWD_NOTREQD | UF_ACCOUNTDISABLE )
2008-06-30 05:27:55 +04:00
self . assertEquals ( res [ 0 ] [ " memberOf " ] [ 0 ] . upper ( ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) . upper ( ) )
2008-02-09 21:04:14 +03:00
self . assertEquals ( len ( res [ 0 ] [ " memberOf " ] ) , 1 )
print " Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration, " + self . base_dn + " )) "
res2 = ldb . search ( expression = " (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration, " + self . base_dn + " )) " )
self . assertEquals ( len ( res2 ) , 1 , " Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration, " + self . base_dn + " )) " )
self . assertEquals ( res [ 0 ] . dn , res2 [ 0 ] . dn )
if gc_ldb is not None :
print " Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration, " + self . base_dn + " )) in Global Catlog "
res2gc = gc_ldb . search ( expression = " (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration, " + self . base_dn + " )) " )
self . assertEquals ( len ( res2gc ) , 1 , " Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration, " + self . base_dn + " )) in Global Catlog " )
self . assertEquals ( res [ 0 ] . dn , res2gc [ 0 ] . dn )
print " Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER)) "
res3 = ldb . search ( expression = " (&(cn=ldaptestcomputer)(objectCategory=compuTER)) " )
self . assertEquals ( len ( res3 ) , 1 , " Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) " )
self . assertEquals ( res [ 0 ] . dn , res3 [ 0 ] . dn )
if gc_ldb is not None :
print " Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog "
res3gc = gc_ldb . search ( expression = " (&(cn=ldaptestcomputer)(objectCategory=compuTER)) " )
self . assertEquals ( len ( res3gc ) , 1 , " Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog " )
self . assertEquals ( res [ 0 ] . dn , res3gc [ 0 ] . dn )
print " Testing ldb.search for (&(cn=ldaptestcomp*r)(objectCategory=compuTER)) "
res4 = ldb . search ( expression = " (&(cn=ldaptestcomp*r)(objectCategory=compuTER)) " )
self . assertEquals ( len ( res4 ) , 1 , " Could not find (&(cn=ldaptestcomp*r)(objectCategory=compuTER)) " )
self . assertEquals ( res [ 0 ] . dn , res4 [ 0 ] . dn )
print " Testing ldb.search for (&(cn=ldaptestcomput*)(objectCategory=compuTER)) "
res5 = ldb . search ( expression = " (&(cn=ldaptestcomput*)(objectCategory=compuTER)) " )
self . assertEquals ( len ( res5 ) , 1 , " Could not find (&(cn=ldaptestcomput*)(objectCategory=compuTER)) " )
self . assertEquals ( res [ 0 ] . dn , res5 [ 0 ] . dn )
print " Testing ldb.search for (&(cn=*daptestcomputer)(objectCategory=compuTER)) "
res6 = ldb . search ( expression = " (&(cn=*daptestcomputer)(objectCategory=compuTER)) " )
self . assertEquals ( len ( res6 ) , 1 , " Could not find (&(cn=*daptestcomputer)(objectCategory=compuTER)) " )
self . assertEquals ( res [ 0 ] . dn , res6 [ 0 ] . dn )
2009-07-03 16:24:52 +04:00
2008-12-16 11:11:11 +03:00
ldb . delete ( " <GUID= " + ldb . schema_format_value ( " objectGUID " , res [ 0 ] [ " objectGUID " ] [ 0 ] ) + " > " )
2008-02-09 21:04:14 +03:00
print " Testing ldb.search for (&(cn=ldaptest2computer)(objectClass=user)) "
res = ldb . search ( expression = " (&(cn=ldaptest2computer)(objectClass=user)) " )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptest2computer)(objectClass=user)) " )
2009-01-07 13:06:00 +03:00
self . assertEquals ( str ( res [ 0 ] . dn ) , " CN=ldaptest2computer,CN=Computers, " + self . base_dn )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptest2computer " )
self . assertEquals ( str ( res [ 0 ] [ " name " ] ) , " ldaptest2computer " )
self . assertEquals ( list ( res [ 0 ] [ " objectClass " ] ) , [ " top " , " person " , " organizationalPerson " , " user " , " computer " ] )
2008-02-09 21:04:14 +03:00
self . assertTrue ( " objectGUID " in res [ 0 ] )
self . assertTrue ( " whenCreated " in res [ 0 ] )
self . assertEquals ( res [ 0 ] [ " objectCategory " ] [ 0 ] , " CN=Computer,CN=Schema,CN=Configuration, " + self . base_dn )
2009-10-02 20:31:38 +04:00
self . assertEquals ( int ( res [ 0 ] [ " sAMAccountType " ] [ 0 ] ) , ATYPE_WORKSTATION_TRUST )
self . assertEquals ( int ( res [ 0 ] [ " userAccountControl " ] [ 0 ] ) , UF_WORKSTATION_TRUST_ACCOUNT )
2008-02-09 21:04:14 +03:00
2008-12-16 11:11:11 +03:00
ldb . delete ( " <SID= " + 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 " ]
2008-02-09 21:04:14 +03:00
print " 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 )
self . assertEquals ( len ( res_user ) , 1 , " Could not find (&(cn=ldaptestUSer2)(objectClass=user)) " )
2009-01-07 13:06:00 +03:00
self . assertEquals ( str ( res_user [ 0 ] . dn ) , ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res_user [ 0 ] [ " cn " ] ) , " ldaptestuser2 " )
self . assertEquals ( str ( res_user [ 0 ] [ " name " ] ) , " ldaptestuser2 " )
self . assertEquals ( list ( res_user [ 0 ] [ " objectClass " ] ) , [ " top " , " person " , " organizationalPerson " , " 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 ] )
self . assertEquals ( res_user [ 0 ] [ " memberOf " ] [ 0 ] . upper ( ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) . upper ( ) )
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 " ]
2008-02-09 21:04:14 +03:00
print " Testing ldb.search for (&(cn=ldaptestgroup2)(objectClass=group)) "
res = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestgroup2)(objectClass=group)) " , scope = SCOPE_SUBTREE , attrs = attrs )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestgroup2)(objectClass=group)) " )
2009-01-07 13:06:00 +03:00
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestgroup2 " )
self . assertEquals ( str ( res [ 0 ] [ " name " ] ) , " ldaptestgroup2 " )
self . assertEquals ( list ( res [ 0 ] [ " objectClass " ] ) , [ " top " , " 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 " ] :
memberUP . append ( m . upper ( ) )
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 " ] )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestgroup2)(objectClass=group)) " )
print res [ 0 ] [ " member " ]
memberUP = [ ]
for m in res [ 0 ] [ " member " ] :
memberUP . append ( m . upper ( ) )
print ( " <GUID= " + ldb . schema_format_value ( " objectGUID " , ldaptestuser2_guid ) + " >;<SID= " + ldb . schema_format_value ( " objectSid " , ldaptestuser2_sid ) + " >;CN=ldaptestuser2,CN=Users, " + self . base_dn ) . upper ( )
self . assertTrue ( ( " <GUID= " + ldb . schema_format_value ( " objectGUID " , ldaptestuser2_guid ) + " >;<SID= " + ldb . schema_format_value ( " objectSid " , ldaptestuser2_sid ) + " >;CN=ldaptestuser2,CN=Users, " + self . base_dn ) . upper ( ) in memberUP )
print " Testing Linked attribute behaviours "
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 ( """
2008-12-16 11:11:11 +03:00
dn : < GUID = """ + ldb.schema_format_value( " objectGUID " , res[0][ " objectGUID " ][0]) + """ >
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 ( """
dn : < SID = """ + 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
2008-12-16 11:11:11 +03:00
member : < GUID = """ + 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
2008-12-16 11:11:11 +03:00
member : < SID = """ + 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 )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestgroup2)(objectClass=group)) " )
2007-12-28 08:31:54 +03:00
2009-01-07 13:06:00 +03:00
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestgroup2,CN=Users, " + self . base_dn ) )
2008-02-09 21:04:14 +03:00
self . assertEquals ( res [ 0 ] [ " member " ] [ 0 ] , ( " CN=ldaptestuser2,CN=Users, " + self . base_dn ) )
self . assertEquals ( 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 " ]
print " Testing ldb.search for (&(cn=ldaptestgroup2)(objectClass=group)) to check linked delete "
res = ldb . search ( self . base_dn , expression = " (&(cn=ldaptestgroup2)(objectClass=group)) " , scope = SCOPE_SUBTREE , attrs = attrs )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestgroup2)(objectClass=group)) to check linked delete " )
2007-12-28 08:31:54 +03:00
2009-01-07 13:06:00 +03:00
self . assertEquals ( 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
2008-02-09 21:04:14 +03:00
print " Testing ldb.search for (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user)) "
2009-10-03 18:50:34 +04:00
# TODO UTF8 users don't seem to work fully anymore
# res = ldb.search(expression="(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))")
res = ldb . search ( expression = " (&(cn=ldaptestutf8user èùéìòà)(objectclass=user)) " )
2008-02-09 21:04:14 +03:00
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user)) " )
2007-12-28 08:31:54 +03:00
2009-01-08 14:51:19 +03:00
self . assertEquals ( str ( res [ 0 ] . dn ) , ( " CN=ldaptestutf8user èùéìòà,CN=Users, " + self . base_dn ) )
2008-12-21 09:34:27 +03:00
self . assertEquals ( str ( res [ 0 ] [ " cn " ] ) , " ldaptestutf8user èùéìòà " )
self . assertEquals ( str ( res [ 0 ] [ " name " ] ) , " ldaptestutf8user èùéìòà " )
self . assertEquals ( list ( res [ 0 ] [ " objectClass " ] ) , [ " top " , " person " , " organizationalPerson " , " 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
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
print " Testing ldb.search for (&(cn=ldaptestutf8user2*)(objectClass=user)) "
res = ldb . search ( expression = " (&(cn=ldaptestutf8user2*)(objectClass=user)) " )
self . assertEquals ( len ( res ) , 1 , " Could not find (&(cn=ldaptestutf8user2*)(objectClass=user)) " )
2007-12-28 08:31:54 +03:00
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
2008-02-09 21:04:14 +03:00
print " Testing ldb.search for (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user)) "
2009-10-03 18:50:34 +04:00
# TODO UTF8 users don't seem to work fully anymore
# res = ldb.search(expression="(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))")
# self.assertEquals(len(res), 1, "Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))")
2007-12-28 08:31:54 +03:00
2008-02-09 21:04:14 +03:00
print " Testing that we can ' t get at the configuration DN from the main search base "
res = ldb . search ( self . base_dn , expression = " objectClass=crossRef " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
self . assertEquals ( len ( res ) , 0 )
2007-12-28 08:31:54 +03:00
2008-02-09 21:04:14 +03:00
print " 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 "
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 :
print " 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 )
print " Testing that we do find configuration elements in the global catlog "
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
2008-02-09 21:04:14 +03:00
print " Testing that we do find configuration elements and user elements at the same time "
res = gc_ldb . search ( self . base_dn , expression = " (|(objectClass=crossRef)(objectClass=person)) " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
self . assertTrue ( len ( res ) > 0 )
print " 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 )
print " 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 )
print " Testing objectCategory canonacolisation "
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
2008-02-09 21:04:14 +03:00
print " 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 " ] )
self . assertEquals ( len ( res ) , 1 )
2008-12-21 09:34:27 +03:00
self . assertEquals ( list ( res [ 0 ] [ " objectClass " ] ) , [ " top " , " domain " , " domainDNS " ] )
2008-02-09 21:04:14 +03:00
# check enumeration
print " Testing ldb.search for objectCategory=person "
res = ldb . search ( self . base_dn , expression = " objectCategory=person " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
self . assertTrue ( len ( res ) > 0 )
print " Testing ldb.search for objectCategory=person with domain scope control "
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
2008-02-09 21:04:14 +03:00
print " Testing ldb.search for objectCategory=user "
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
2008-02-09 21:04:14 +03:00
print " Testing ldb.search for objectCategory=user with domain scope control "
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
2008-02-09 21:04:14 +03:00
print " Testing ldb.search for objectCategory=group "
res = ldb . search ( self . base_dn , expression = " objectCategory=group " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] )
self . assertTrue ( len ( res ) > 0 )
print " Testing ldb.search for objectCategory=group with domain scope control "
res = ldb . search ( self . base_dn , expression = " objectCategory=group " , scope = SCOPE_SUBTREE , attrs = [ " cn " ] , controls = [ " domain_scope:1 " ] )
self . assertTrue ( len ( res ) > 0 )
2009-12-15 04:51:10 +03:00
print " Testing creating a user with the posixAccount objectClass "
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 ; ; ;
description : A POSIX user """ % (self.base_dn))
print " Testing removing the posixAccount objectClass from an existing user "
self . ldb . modify_ldif ( """ dn: cn=posixuser,CN=Users, %s
changetype : modify
delete : objectClass
objectClass : posixAccount """ % (self.base_dn))
print " Testing adding the posixAccount objectClass to an existing user "
self . ldb . modify_ldif ( """ dn: cn=posixuser,CN=Users, %s
changetype : modify
add : objectClass
objectClass : posixAccount """ % (self.base_dn))
self . delete_force ( self . ldb , " cn=posixuser,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
self . delete_force ( self . ldb , " cn=ldaptestuser,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestuser2,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestuser3,cn=users, " + self . base_dn )
2009-10-06 19:18:04 +04:00
self . delete_force ( self . ldb , " cn=ldaptestuser4,cn=ldaptestcontainer, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestuser4,cn=ldaptestcontainer2, " + self . base_dn )
2009-11-20 03:47:54 +03:00
self . delete_force ( self . ldb , " cn=ldaptestuser5,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
self . delete_force ( self . ldb , " cn=ldaptestgroup,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestgroup2,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestcomputer,cn=computers, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptest2computer,cn=computers, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestcomputer3,cn=computers, " + self . base_dn )
2009-10-03 18:50:34 +04:00
self . delete_force ( self . ldb , " cn=ldaptestutf8user èùéìòà,cn=users, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestutf8user2 èùéìòà,cn=users, " + self . base_dn )
2009-10-02 20:31:38 +04:00
self . delete_force ( self . ldb , " cn=ldaptestcontainer, " + self . base_dn )
self . delete_force ( self . ldb , " cn=ldaptestcontainer2, " + self . base_dn )
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 )
#
# Test add_ldif() with SDDL security descriptor input
#
self . delete_force ( self . ldb , user_dn )
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 ]
desc = ndr_unpack ( security . descriptor , desc )
desc_sddl = desc . as_sddl ( self . domain_sid )
self . assertEqual ( desc_sddl , sddl )
finally :
self . delete_force ( self . ldb , user_dn )
#
# 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 )
desc_base64 = base64 . b64encode ( desc_binary )
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 :
self . delete_force ( self . ldb , user_dn )
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 )
self . delete_force ( self . ldb , user_dn )
try :
sddl = " O:DUG:DUD:PAI(A;;RPWP;;;AU)S:PAI "
desc = security . descriptor . from_sddl ( sddl , security . dom_sid ( ' S-1-5-21 ' ) )
desc_base64 = base64 . b64encode ( ndr_pack ( desc ) )
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 ] )
2009-09-08 17:00:24 +04:00
finally :
self . delete_force ( self . ldb , user_dn )
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 )
#
# Delete user object and test modify_ldif() with SDDL security descriptor input
# Add ACE to the original descriptor test
#
try :
self . delete_force ( self . ldb , user_dn )
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 :
self . delete_force ( self . ldb , user_dn )
#
# Test modify_ldif() with SDDL security descriptor input
# New desctiptor test
#
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 :
self . delete_force ( self . ldb , user_dn )
#
# 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 )
desc_base64 = base64 . b64encode ( ndr_pack ( desc ) )
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 :
self . delete_force ( self . ldb , user_dn )
#
# Test modify_ldif() with BASE64 security descriptor input
# New descriptor test
#
try :
self . delete_force ( self . ldb , user_dn )
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 )
desc_base64 = base64 . b64encode ( ndr_pack ( desc ) )
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 :
self . delete_force ( self . ldb , user_dn )
2008-02-09 21:04:14 +03:00
class BaseDnTests ( unittest . TestCase ) :
def setUp ( self ) :
self . ldb = ldb
def test_rootdse_attrs ( self ) :
""" Testing for all rootDSE attributes """
res = self . ldb . search ( scope = SCOPE_BASE , attrs = [ ] )
self . assertEquals ( len ( res ) , 1 )
def test_highestcommittedusn ( self ) :
""" Testing for highestCommittedUSN """
res = self . ldb . search ( " " , scope = SCOPE_BASE , attrs = [ " highestCommittedUSN " ] )
self . assertEquals ( len ( res ) , 1 )
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 " ] )
self . assertEquals ( len ( res ) , 0 )
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 ,
2008-02-09 21:04:14 +03:00
attrs = [ " netlogon " , " highestCommittedUSN " ] )
self . assertEquals ( len ( res ) , 0 )
2009-11-30 10:39:58 +03:00
def test_namingContexts ( self ) :
""" Testing for namingContexts in rootDSE """
res = self . ldb . search ( " " , scope = SCOPE_BASE ,
attrs = [ " namingContexts " , " defaultNamingContext " , " schemaNamingContext " , " configurationNamingContext " ] )
self . assertEquals ( len ( res ) , 1 )
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 )
2009-07-03 16:24:52 +04:00
2007-12-29 01:25:20 +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
2008-01-11 02:32:31 +03:00
ldb = Ldb ( host , credentials = creds , session_info = system_session ( ) , lp = lp )
2009-11-27 06:20:47 +03:00
if not " tdb:// " in host :
gc_ldb = Ldb ( " %s :3268 " % host , credentials = creds ,
session_info = system_session ( ) , lp = lp )
else :
gc_ldb = None
2007-12-24 04:19:41 +03:00
2008-02-09 21:04:14 +03:00
runner = SubunitTestRunner ( )
2008-06-28 17:26:46 +04:00
rc = 0
if not runner . run ( unittest . makeSuite ( BaseDnTests ) ) . wasSuccessful ( ) :
rc = 1
if not runner . run ( unittest . makeSuite ( BasicTests ) ) . wasSuccessful ( ) :
rc = 1
sys . exit ( rc )