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)
def respond_search_done(message_id): res = SearchResultDone() res['resultCode'] = ResultCode('success') res['matchedDN'] = '' res['diagnosticMessage'] = '' msg = LDAPMessage() msg['messageID'] = MessageID(message_id) msg['protocolOp'] = ProtocolOp().setComponentByName('searchResDone', res) return msg
def respond_bind(message_id): res = BindResponse() res['resultCode'] = ResultCode('success') res['matchedDN'] = '' res['diagnosticMessage'] = '' msg = LDAPMessage() msg['messageID'] = MessageID(message_id) msg['protocolOp'] = ProtocolOp().setComponentByName('bindResponse', res) return msg
def encapsulate_ldap_message(message_id, obj_name, obj, controls=None): ldap_message = LDAPMessage() ldap_message['messageID'] = MessageID(message_id) ldap_message['protocolOp'] = ProtocolOp().setComponentByName(obj_name, obj) msg_controls = build_controls_list(controls) if msg_controls: ldap_message['controls'] = msg_controls return ldap_message
def bind(message_id, name, password): req = BindRequest() req['version'] = Version(3) req['name'] = name req['authentication'] = \ AuthenticationChoice().setComponentByName('simple', Simple(password)) msg = LDAPMessage() msg['messageID'] = MessageID(message_id) msg['protocolOp'] = ProtocolOp().setComponentByName('bindRequest', req) return msg
def respond_search_entry(message_id, name, attributes): res = SearchResultEntry() res['object'] = LDAPDN(name) res['attributes'] = PartialAttributeList() for i, (k, v) in enumerate(attributes.items()): res['attributes'][i] = PartialAttribute() res['attributes'][i]['type'] = AttributeDescription(k) res['attributes'][i]['vals'] = Vals() res['attributes'][i]['vals'][0] = AttributeValue(v) msg = LDAPMessage() msg['messageID'] = MessageID(message_id) msg['protocolOp'] = ProtocolOp().setComponentByName('searchResEntry', res) return msg
def build_ldap_message(message_id, response_type, response, controls=None): # LDAPMessage ::= SEQUENCE { # messageID MessageID, # protocolOp CHOICE { # bindRequest BindRequest, # bindResponse BindResponse, # unbindRequest UnbindRequest, # searchRequest SearchRequest, # searchResEntry SearchResultEntry, # searchResDone SearchResultDone, # searchResRef SearchResultReference, # modifyRequest ModifyRequest, # modifyResponse ModifyResponse, # addRequest AddRequest, # addResponse AddResponse, # delRequest DelRequest, # delResponse DelResponse, # modDNRequest ModifyDNRequest, # modDNResponse ModifyDNResponse, # compareRequest CompareRequest, # compareResponse CompareResponse, # abandonRequest AbandonRequest, # extendedReq ExtendedRequest, # extendedResp ExtendedResponse, # ..., # intermediateResponse IntermediateResponse }, # controls [0] Controls OPTIONAL } ldap_message = LDAPMessage() ldap_message['messageID'] = MessageID(message_id) ldap_message['protocolOp'] = ProtocolOp().setComponentByName( response_type, response) message_controls = build_controls_list(controls) if message_controls is not None: ldap_message['controls'] = message_controls return ldap_message
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):