Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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;
        }