def test_modify(self): self.server.dataReceived( pureldap.LDAPMessage( pureldap.LDAPModifyRequest( self.stuff.dn.getText(), modification=[ delta.Add("foo", ["bar"]).asLDAP(), ], ), id=2, ).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage( pureldap.LDAPModifyResponse( resultCode=ldaperrors.Success.resultCode), id=2, ).toWire(), ) # tree changed self.assertEqual( self.stuff, inmemory.ReadOnlyInMemoryLDAPEntry( "ou=stuff,dc=example,dc=com", { b"objectClass": [b"a", b"b"], b"ou": [b"stuff"], b"foo": [b"bar"] }, ), )
def test_modifyDN_rdnOnly_deleteOldRDN_success(self): newrdn = "cn=thingamagic" self.server.dataReceived( pureldap.LDAPMessage( pureldap.LDAPModifyDNRequest(entry=self.thingie.dn.getText(), newrdn=newrdn, deleteoldrdn=True), id=2, ).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage( pureldap.LDAPModifyDNResponse( resultCode=ldaperrors.Success.resultCode), id=2, ).toWire(), ) # tree changed d = self.stuff.children() d.addCallback(lambda actual: self.assertCountEqual( actual, [ inmemory.ReadOnlyInMemoryLDAPEntry( "%s,ou=stuff,dc=example,dc=com" % newrdn, { "objectClass": ["a", "b"], "cn": ["thingamagic"] }, ), self.another, ], )) return d
def test_bind_noMatchingServicesFound_fallback_success(self): server = self.createServer( services=['svc1', 'svc2', 'svc3', ], fallback=True, responses=[ [ pureldap.LDAPSearchResultDone(ldaperrors.Success.resultCode) ], [ pureldap.LDAPSearchResultDone(ldaperrors.Success.resultCode) ], [ pureldap.LDAPSearchResultDone(ldaperrors.Success.resultCode) ], [ pureldap.LDAPBindResponse(resultCode=ldaperrors.Success.resultCode) ], ]) server.dataReceived(str(pureldap.LDAPMessage(pureldap.LDAPBindRequest(dn='cn=jack,dc=example,dc=com', auth='s3krit'), id=4))) reactor.iterate() #TODO client = server.client client.assertSent( pureldap.LDAPSearchRequest(baseObject='dc=example,dc=com', derefAliases=0, sizeLimit=0, timeLimit=0, typesOnly=0, filter=ldapfilter.parseFilter('(&' +'(objectClass=serviceSecurityObject)' +'(owner=cn=jack,dc=example,dc=com)' +'(cn=svc1)' +('(|(!(validFrom=*))(validFrom<=%s))' % server.now) +('(|(!(validUntil=*))(validUntil>=%s))' % server.now) +')'), attributes=('1.1',)), pureldap.LDAPSearchRequest(baseObject='dc=example,dc=com', derefAliases=0, sizeLimit=0, timeLimit=0, typesOnly=0, filter=ldapfilter.parseFilter('(&' +'(objectClass=serviceSecurityObject)' +'(owner=cn=jack,dc=example,dc=com)' +'(cn=svc2)' +('(|(!(validFrom=*))(validFrom<=%s))' % server.now) +('(|(!(validUntil=*))(validUntil>=%s))' % server.now) +')'), attributes=('1.1',)), pureldap.LDAPSearchRequest(baseObject='dc=example,dc=com', derefAliases=0, sizeLimit=0, timeLimit=0, typesOnly=0, filter=ldapfilter.parseFilter('(&' +'(objectClass=serviceSecurityObject)' +'(owner=cn=jack,dc=example,dc=com)' +'(cn=svc3)' +('(|(!(validFrom=*))(validFrom<=%s))' % server.now) +('(|(!(validUntil=*))(validUntil>=%s))' % server.now) +')'), attributes=('1.1',)), pureldap.LDAPBindRequest(dn='cn=jack,dc=example,dc=com', auth='s3krit')) self.assertEquals(server.transport.value(), str(pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=ldaperrors.Success.resultCode), id=4)))
def test_unbind_clientUnbinds(self): server = self.createServer( [ pureldap.LDAPBindResponse(resultCode=0), ], [], ) server.dataReceived( pureldap.LDAPMessage(pureldap.LDAPBindRequest(), id=2).toWire()) reactor.iterate() # TODO client = server.client client.assertSent(pureldap.LDAPBindRequest()) self.assertEqual( server.transport.value(), pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=2).toWire(), ) server.dataReceived( pureldap.LDAPMessage(pureldap.LDAPUnbindRequest(), id=3).toWire()) server.connectionLost(error.ConnectionDone) reactor.iterate() # TODO client.assertSent(pureldap.LDAPBindRequest(), pureldap.LDAPUnbindRequest()) self.assertEqual( server.transport.value(), pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=2).toWire(), )
def test_rootDSE(self): self.server.dataReceived( str( pureldap.LDAPMessage(pureldap.LDAPSearchRequest( baseObject='', scope=pureldap.LDAP_SCOPE_baseObject, filter=pureldap.LDAPFilter_present('objectClass'), ), id=2))) self.assertEquals( self.server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( objectName='', attributes=[ ('supportedLDAPVersion', ['3']), ('namingContexts', ['dc=example,dc=com']), ('supportedExtension', [ pureldap.LDAPPasswordModifyRequest.oid, ]), ]), id=2)) + str( pureldap.LDAPMessage(pureldap.LDAPSearchResultDone( resultCode=ldaperrors.Success.resultCode), id=2)), )
def test_search_scope_oneLevel(self): self.server.dataReceived( str( pureldap.LDAPMessage(pureldap.LDAPSearchRequest( baseObject='ou=stuff,dc=example,dc=com', scope=pureldap.LDAP_SCOPE_singleLevel, ), id=2))) self.assertEquals( self.server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( objectName='cn=thingie,ou=stuff,dc=example,dc=com', attributes=[ ('objectClass', ['a', 'b']), ('cn', ['thingie']), ]), id=2)) + str( pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( objectName='cn=another,ou=stuff,dc=example,dc=com', attributes=[ ('objectClass', ['a', 'b']), ('cn', ['another']), ]), id=2)) + str( pureldap.LDAPMessage( pureldap.LDAPSearchResultDone(resultCode=0), id=2)), )
def test_bind(self): self.server.dataReceived( pureldap.LDAPMessage(pureldap.LDAPBindRequest(), id=4).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=4).toWire())
def test_send_multiResponse_with_handler(self): client, transport = self.create_test_client() client.debug = True op = self.create_test_search_req() results = [] def collect_result_(result): results.append(result) if isinstance(result, pureldap.LDAPSearchResultDone): return True return False client.send_multiResponse(op, collect_result_) expected_value = pureldap.LDAPMessage(op) expected_value.id -= 1 expected_bytestring = expected_value.toWire() self.assertEqual(transport.value(), expected_bytestring) response = pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( "cn=foo,ou=baz,dc=example,dc=net", {}), id=expected_value.id) resp_bytestring = response.toWire() client.dataReceived(resp_bytestring) response = pureldap.LDAPMessage(pureldap.LDAPSearchResultDone(0), id=expected_value.id) resp_bytestring = response.toWire() client.dataReceived(resp_bytestring) self.assertEqual(response.value, results[1])
def test_add_fail_existsAlready(self): self.server.dataReceived( pureldap.LDAPMessage( pureldap.LDAPAddRequest( entry=self.thingie.dn.getText(), attributes=[ ( pureldap.LDAPAttributeDescription("objectClass"), pureber.BERSet( value=[ pureldap.LDAPAttributeValue('something'), ]) ) ]), id=2).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage( pureldap.LDAPAddResponse( resultCode=ldaperrors.LDAPEntryAlreadyExists.resultCode, errorMessage=self.thingie.dn.getText()), id=2).toWire()) # tree did not change d = self.stuff.children() d.addCallback(lambda actual: six.assertCountEqual( self, actual, [self.thingie, self.another])) return d
def test_unbind_clientEOF(self): server = self.createServer( [ pureldap.LDAPBindResponse(resultCode=0), ], [], ) server.dataReceived( str(pureldap.LDAPMessage(pureldap.LDAPBindRequest(), id=2))) reactor.iterate() #TODO client = server.client client.assertSent(pureldap.LDAPBindRequest()) self.assertEquals( server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=2))) server.connectionLost(error.ConnectionDone) reactor.iterate() #TODO client.assertSent(pureldap.LDAPBindRequest(), 'fake-unbind-by-LDAPClientTestDriver') self.assertEquals( server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=2)))
def test_search_scope_wholeSubtree(self): self.server.dataReceived( str( pureldap.LDAPMessage(pureldap.LDAPSearchRequest( baseObject='ou=stuff,dc=example,dc=com', scope=pureldap.LDAP_SCOPE_wholeSubtree), id=2))) self.assertItemsEqual( self._makeResultList(self.server.transport.value()), [ str( pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( objectName='ou=stuff,dc=example,dc=com', attributes=[('objectClass', ['a', 'b']), ('ou', ['stuff'])]), id=2)), str( pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( objectName='cn=another,ou=stuff,dc=example,dc=com', attributes=[('objectClass', ['a', 'b']), ('cn', ['another'])]), id=2)), str( pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( objectName='cn=thingie,ou=stuff,dc=example,dc=com', attributes=[('objectClass', ['a', 'b']), ('cn', ['thingie'])]), id=2)), str( pureldap.LDAPMessage( pureldap.LDAPSearchResultDone(resultCode=0), id=2)) ])
def test_add_success(self): dn = 'cn=new,ou=stuff,dc=example,dc=com' self.server.dataReceived( str( pureldap.LDAPMessage(pureldap.LDAPAddRequest( entry=dn, attributes=[ (pureldap.LDAPAttributeDescription("objectClass"), pureber.BERSet( value=[pureldap.LDAPAttributeValue('something')])) ]), id=2))) self.assertEquals( self.server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPAddResponse( resultCode=ldaperrors.Success.resultCode), id=2))) # tree changed d = self.stuff.children() d.addCallback(self.assertItemsEqual, [ self.thingie, self.another, inmemory.ReadOnlyInMemoryLDAPEntry( 'cn=new,ou=stuff,dc=example,dc=com', {'objectClass': ['something']}) ]) return d
def test_unbind_clientEOF(self): """ The server disconects correctly when the client terminates the connection without sending an unbind request. """ server = self.createServer([pureldap.LDAPBindResponse(resultCode=0)]) server.dataReceived( str(pureldap.LDAPMessage(pureldap.LDAPBindRequest(), id=2))) server.reactor.advance(1) client = server.client client.assertSent(pureldap.LDAPBindRequest()) self.assertEqual( server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=2))) server.connectionLost(error.ConnectionDone) server.reactor.advance(1) client.assertSent(pureldap.LDAPBindRequest(), 'fake-unbind-by-LDAPClientTestDriver') self.assertEqual( server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=2)))
def test_unbind_clientUnbinds(self): """ The server disconnects from the client gracefully when the client signals its intent to unbind. """ server = self.createServer( [pureldap.LDAPBindResponse(resultCode=0)], [], ) server.dataReceived( str(pureldap.LDAPMessage(pureldap.LDAPBindRequest(), id=2))) server.reactor.advance(1) client = server.client client.assertSent(pureldap.LDAPBindRequest()) self.assertEqual( server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=2))) server.dataReceived( str(pureldap.LDAPMessage(pureldap.LDAPUnbindRequest(), id=3))) server.connectionLost(error.ConnectionDone) server.reactor.advance(1) client.assertSent(pureldap.LDAPBindRequest(), pureldap.LDAPUnbindRequest()) self.assertEqual( server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=2)))
def test_modify(self): self.server.dataReceived( pureldap.LDAPMessage( pureldap.LDAPModifyRequest( self.stuff.dn.getText(), modification=[ delta.Add('foo', ['bar']).asLDAP(), ]), id=2).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage( pureldap.LDAPModifyResponse( resultCode=ldaperrors.Success.resultCode), id=2).toWire()) # tree changed self.assertEqual( self.stuff, inmemory.ReadOnlyInMemoryLDAPEntry( 'ou=stuff,dc=example,dc=com', { b'objectClass': [b'a', b'b'], b'ou': [b'stuff'], b'foo': [b'bar'] }))
def test_search_matchAll_manyResults(self): self.server.dataReceived( str( pureldap.LDAPMessage(pureldap.LDAPSearchRequest( baseObject='ou=stuff,dc=example,dc=com'), id=2))) six.assertCountEqual( self, [ str( pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( objectName='ou=stuff,dc=example,dc=com', attributes=[('objectClass', ['a', 'b']), ('ou', ['stuff'])]), id=2)), str( pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( objectName='cn=another,ou=stuff,dc=example,dc=com', attributes=[('objectClass', ['a', 'b']), ('cn', ['another'])]), id=2)), str( pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( objectName='cn=thingie,ou=stuff,dc=example,dc=com', attributes=[('objectClass', ['a', 'b']), ('cn', ['thingie'])]), id=2)), str( pureldap.LDAPMessage( pureldap.LDAPSearchResultDone(resultCode=0), id=2)) ], self._makeResultList(self.server.transport.value()))
def test_modifyDN_rdnOnly_deleteOldRDN_success(self): newrdn = 'cn=thingamagic' self.server.dataReceived( pureldap.LDAPMessage( pureldap.LDAPModifyDNRequest( entry=self.thingie.dn.getText(), newrdn=newrdn, deleteoldrdn=True), id=2).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage( pureldap.LDAPModifyDNResponse( resultCode=ldaperrors.Success.resultCode), id=2).toWire()) # tree changed d = self.stuff.children() d.addCallback(lambda actual: six.assertCountEqual( self, actual, [ inmemory.ReadOnlyInMemoryLDAPEntry( '%s,ou=stuff,dc=example,dc=com' % newrdn, { 'objectClass': ['a', 'b'], 'cn': ['thingamagic'] }), self.another, ])) return d
def test_add_success(self): dn = "cn=new,ou=stuff,dc=example,dc=com" self.server.dataReceived( pureldap.LDAPMessage( pureldap.LDAPAddRequest( entry=dn, attributes=[( pureldap.LDAPAttributeDescription("objectClass"), pureber.BERSet( value=[pureldap.LDAPAttributeValue("something")]), )], ), id=2, ).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage(pureldap.LDAPAddResponse( resultCode=ldaperrors.Success.resultCode), id=2).toWire(), ) # tree changed d = self.stuff.children() d.addCallback(lambda actual: self.assertCountEqual( actual, [ self.thingie, self.another, inmemory.ReadOnlyInMemoryLDAPEntry( b"cn=new,ou=stuff,dc=example,dc=com", {b"objectClass": [b"something"]}, ), ], )) return d
def assertSearchResults(self, results=None, resultCode=0): """ Shortcut for checking results returned by test server on LDAPSearchRequest. Results must be prepared as a list of dictionaries with 'objectName' and 'attributes' keys """ if results is None: results = [] messages = [] for result in results: message = pureldap.LDAPMessage( pureldap.LDAPSearchResultEntry( objectName=result['objectName'], attributes=result['attributes'] ), id=2 ) messages.append(message) messages.append( pureldap.LDAPMessage( pureldap.LDAPSearchResultDone(resultCode=resultCode), id=2 ) ) six.assertCountEqual( self, self._makeResultList(self.server.transport.value()), [msg.toWire() for msg in messages] )
def test_bind(self): server = self.createServer([ pureldap.LDAPBindResponse(resultCode=0), ]) server.dataReceived(str(pureldap.LDAPMessage(pureldap.LDAPBindRequest(), id=4))) reactor.iterate() #TODO self.assertEqual(server.transport.value(), str(pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=4)))
def test_intercepted_search_request(self): """ When performing an LDAP search against the server; the requests are intercepted and custom responses are written to the transport. """ server = self.createServer([pureldap.LDAPBindResponse(resultCode=0)], [ pureldap.LDAPSearchResultEntry('cn=foo,dc=example,dc=com', [('a', ['b'])]), pureldap.LDAPSearchResultEntry('cn=bar,dc=example,dc=com', [('b', ['c'])]), pureldap.LDAPSearchResultDone(ldaperrors.Success.resultCode), ], protocol=RequestInterceptingProxy) server.responses = [ pureldap.LDAPSearchResultEntry('cn=xyzzy,dc=example,dc=com', [('frobnitz', ['zork'])]), pureldap.LDAPSearchResultDone(ldaperrors.Success.resultCode) ] server.dataReceived( str(pureldap.LDAPMessage(pureldap.LDAPSearchRequest(), id=1))) server.reactor.advance(1) self.assertEqual(len(server.clientTestDriver.sent), 0) self.assertEqual( server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPSearchResultEntry( 'cn=xyzzy,dc=example,dc=com', [('frobnitz', ['zork'])]), id=1)) + str( pureldap.LDAPMessage(pureldap.LDAPSearchResultDone( ldaperrors.Success.resultCode), id=1)))
def test_modifyDN_rdnOnly_noDeleteOldRDN_success(self): newrdn = 'cn=thingamagic' self.server.dataReceived( str( pureldap.LDAPMessage(pureldap.LDAPModifyDNRequest( entry=self.thingie.dn, newrdn=newrdn, deleteoldrdn=False), id=2))) self.assertEquals( self.server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPModifyDNResponse( resultCode=ldaperrors.Success.resultCode), id=2))) # tree changed d = self.stuff.children() d.addCallback( self.assertItemsEqual, { self.another, inmemory.ReadOnlyInMemoryLDAPEntry( '%s,ou=stuff,dc=example,dc=com' % newrdn, { 'objectClass': ['a', 'b'], 'cn': ['thingamagic', 'thingie'] }) }) return d
def test_bind_invalidCredentials_nonExisting(self): self.server.dataReceived( pureldap.LDAPMessage(pureldap.LDAPBindRequest( dn='cn=non-existing,dc=example,dc=com', auth=b'invalid'), id=78).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage(pureldap.LDAPBindResponse( resultCode=ldaperrors.LDAPInvalidCredentials.resultCode), id=78).toWire())
def test_bind_badVersion_4_anonymous(self): self.server.dataReceived( pureldap.LDAPMessage(pureldap.LDAPBindRequest(version=4), id=32).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage(pureldap.LDAPBindResponse( resultCode=ldaperrors.LDAPProtocolError.resultCode, errorMessage='Version 4 not supported'), id=32).toWire())
def test_bind(self): """ When binding to the server an `LDAPBindResponse` with a successful result code.is written to the transport. """ server = self.createServer([pureldap.LDAPBindResponse(resultCode=0)]) server.dataReceived(str(pureldap.LDAPMessage(pureldap.LDAPBindRequest(), id=4))) server.reactor.advance(1) self.assertEqual(server.transport.value(), str(pureldap.LDAPMessage(pureldap.LDAPBindResponse(resultCode=0), id=4)))
def test_bind_invalidCredentials_badPassword(self): self.server.dataReceived( pureldap.LDAPMessage(pureldap.LDAPBindRequest( dn='cn=thingie,ou=stuff,dc=example,dc=com', auth=b'invalid'), id=734).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage(pureldap.LDAPBindResponse( resultCode=ldaperrors.LDAPInvalidCredentials.resultCode), id=734).toWire())
def test_extendedRequest_unknown(self): self.server.dataReceived( pureldap.LDAPMessage(pureldap.LDAPExtendedRequest( requestName='42.42.42', requestValue='foo'), id=2).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage(pureldap.LDAPExtendedResponse( resultCode=ldaperrors.LDAPProtocolError.resultCode, errorMessage='Unknown extended request: 42.42.42'), id=2).toWire())
def test_control_unknown_critical(self): self.server.dataReceived(pureldap.LDAPMessage( pureldap.LDAPBindRequest(), id=2, controls=[('42.42.42.42', True, None), ]).toWire()) self.assertEqual( self.server.transport.value(), pureldap.LDAPMessage( pureldap.LDAPBindResponse( resultCode=ldaperrors.LDAPUnavailableCriticalExtension.resultCode, errorMessage='Unknown control 42.42.42.42'), id=2).toWire())
def test_search_outOfTree(self): self.server.dataReceived( str( pureldap.LDAPMessage( pureldap.LDAPSearchRequest(baseObject='dc=invalid'), id=2))) self.assertEquals( self.server.transport.value(), str( pureldap.LDAPMessage(pureldap.LDAPSearchResultDone( resultCode=ldaperrors.LDAPNoSuchObject.resultCode), id=2)))
def test_search_matchAll_oneResult_filteredNoAttribsRemaining(self): self.server.dataReceived( str( pureldap.LDAPMessage(pureldap.LDAPSearchRequest( baseObject='cn=thingie,ou=stuff,dc=example,dc=com', attributes=['xyzzy']), id=2))) self.assertEquals( self.server.transport.value(), str( pureldap.LDAPMessage( pureldap.LDAPSearchResultDone(resultCode=0), id=2)))