/// <summary> /// Creates an ExtendedResponse packet. /// </summary> /// <param name="context">The user context which contains message ID.</param> /// <param name="resultCode">Result code of previous request, as specified in RFC 2251.</param> /// <param name="matchedDn">Matched DN.</param> /// <param name="errorMessage">Error message for result code. Required.</param> /// <param name="referral">Referral. Optional. Used for LDAP v3 only.</param> /// <returns>The packet that contains the response.</returns> internal override AdtsExtendedResponsePacket CreateExtendedResponse( AdtsLdapContext context, MsLdap.ResultCode resultCode, string matchedDn, string errorMessage, string[] referral) { ExtendedResponse extendedResponse = new ExtendedResponse( new LDAPResult_resultCode((long)resultCode), new LDAPDN(matchedDn ?? string.Empty), new LDAPString(errorMessage ?? string.Empty), CreateReferral(referral)); LDAPMessage_protocolOp operation = new LDAPMessage_protocolOp(); operation.SetData(LDAPMessage_protocolOp.extendedResp, extendedResponse); LDAPMessage message = new LDAPMessage(new MessageID(context.MessageId), operation, null); AdtsExtendedResponsePacket packet = new AdtsExtendedResponsePacket(); packet.ldapMessagev3 = message; packet.messageId = context.MessageId; return(packet); }
public override LdapResultCompleteStatus Handle(SafeHandle handle, Native.Native.LdapResultType resType, IntPtr msg, out DirectoryResponse response) { response = default; switch (resType) { case LdapForNet.Native.Native.LdapResultType.LDAP_RES_EXTENDED: var requestName = IntPtr.Zero; var requestValue = IntPtr.Zero; string name = null; byte[] value = null; var rc = Native.ldap_parse_extended_result(handle, msg, ref requestName, ref requestValue, 0); if (rc == (int)LdapForNet.Native.Native.ResultCode.Success) { if (requestName != IntPtr.Zero) { name = Encoder.Instance.PtrToString(requestName); Native.ldap_memfree(requestName); } if (requestValue != IntPtr.Zero) { var berval = Marshal.PtrToStructure <Native.Native.berval>(requestValue); if (berval.bv_len != 0 && berval.bv_val != IntPtr.Zero) { value = new byte[berval.bv_len]; Marshal.Copy(berval.bv_val, value, 0, berval.bv_len); } Native.ldap_memfree(requestValue); } } response = new ExtendedResponse { ResultCode = (Native.Native.ResultCode)rc, ResponseName = name, ResponseValue = value }; msg = IntPtr.Zero; return(LdapResultCompleteStatus.Complete); default: return(LdapResultCompleteStatus.Unknown); } }
/// <summary> /// Creates an ExtendedResponse packet. /// </summary> /// <param name="context">The user context which contains message ID.</param> /// <param name="resultCode">Result code of previous request, as specified in RFC 2251.</param> /// <param name="matchedDn">Matched DN.</param> /// <param name="errorMessage">Error message for result code. Required.</param> /// <param name="referral">Referral. Optional. Used for LDAP v3 only.</param> /// <returns>The packet that contains the response.</returns> internal override AdtsExtendedResponsePacket CreateExtendedResponse( AdtsLdapContext context, MsLdap.ResultCode resultCode, string matchedDn, string errorMessage, string[] referral) { ExtendedResponse extendedResponse = new ExtendedResponse( new LDAPResult_resultCode((long)resultCode), new LDAPDN(matchedDn ?? string.Empty), new LDAPString(errorMessage ?? string.Empty), CreateReferral(referral)); LDAPMessage_protocolOp operation = new LDAPMessage_protocolOp(); operation.SetData(LDAPMessage_protocolOp.extendedResp, extendedResponse); LDAPMessage message = new LDAPMessage(new MessageID(context.MessageId), operation, null); AdtsExtendedResponsePacket packet = new AdtsExtendedResponsePacket(); packet.ldapMessagev3 = message; packet.messageId = context.MessageId; return packet; }