def sasl_bind(client, host): sasl_client = SASLClient(host, service='ldap', mechanism='GSSAPI') sasl_credentials = SaslCredentials() sasl_credentials.setComponentByName("mechanism", LDAPString("gssapi")) sasl_credentials.setComponentByName("credentials", sasl_client.process(None)) authentication_choice = AuthenticationChoice() authentication_choice.setComponentByName('sasl', sasl_credentials) bind_request = BindRequest() bind_request.setComponentByName('version', Version(3)) bind_request.setComponentByName('name', LDAPDN('')) bind_request.setComponentByName('authentication', authentication_choice) protocol_op = ProtocolOp() protocol_op.setComponentByName("bindRequest", bind_request) ber_encode(authentication_choice) ber_encode(sasl_credentials) print(bind_request.prettyPrint()) ber_encode(bind_request) ber_encode(protocol_op) response = yield from client.request(protocol_op) print(response)
from pyasn1.codec.ber.encoder import encode as ber_encode from pyasn1.codec.ber.decoder import decode as ber_decode import pyasn1.type.univ from ldap3.protocol.rfc4511 import ExtendedRequest, LDAPMessage, MessageID, ProtocolOp,\ ResultCode from pyasn1.error import SubstrateUnderrunError from pyasn1.type.univ import Integer LDAP_URL_RE = re.compile(r'^(?P<scheme>ldap|ldaps)://(?P<host>[a-z0-9\-.]{1,253})(?::(?P<port>[0-9]+))?(?:/|$)') DEFAULT_LDAP_PORT = 389 START_TLS_REQUEST = ExtendedRequest() START_TLS_REQUEST.setComponentByName("requestName", "1.3.6.1.4.1.1466.20037") START_TLS_PROTOCOL_OP = ProtocolOp() START_TLS_PROTOCOL_OP.setComponentByName('extendedReq', START_TLS_REQUEST) class LDAPClient(asyncio.Protocol): def __init__(self, loop): self._loop = loop self._next_message_id = 0 self._pending_messages = {} self._buffer = b'' self._connection_made = asyncio.Future(loop=loop) def connection_made(self, transport): self._transport = transport self._connection_made.set_result(None) def data_received(self, data): self._buffer += data