Esempio n. 1
0
        public override int SendRequest(SafeHandle handle, DirectoryRequest request, ref int messageId)
        {
            if (request is ModifyRequest modifyRequest)
            {
                if (string.IsNullOrWhiteSpace(modifyRequest.DistinguishedName))
                {
                    throw new ArgumentNullException(nameof(modifyRequest.DistinguishedName));
                }

                var attrs = modifyRequest.Attributes.Select(ToLdapMod).ToList();

                var ptr = Marshal.AllocHGlobal(IntPtr.Size *
                                               (attrs.Count + 1)); // alloc memory for list with last element null
                MarshalUtils.StructureArrayToPtr(attrs, ptr, true);

                var result = Native.ldap_modify_ext(handle,
                                                    modifyRequest.DistinguishedName,
                                                    ptr,
                                                    IntPtr.Zero,
                                                    IntPtr.Zero,
                                                    ref messageId
                                                    );
                attrs.ForEach(_ =>
                {
                    MarshalUtils.BerValuesFree(_.mod_vals_u.modv_bvals);
                    Marshal.FreeHGlobal(_.mod_vals_u.modv_bvals);
                    Marshal.FreeHGlobal(_.mod_type);
                });
                Marshal.FreeHGlobal(ptr);

                return(result);
            }

            return(0);
        }
Esempio n. 2
0
        protected override int SendRequest(SafeHandle handle, DirectoryRequest request, IntPtr serverControlArray, IntPtr clientControlArray, ref int messageId)
        {
            if (request is AddRequest addRequest)
            {
                if (string.IsNullOrWhiteSpace(addRequest.DistinguishedName))
                {
                    throw new ArgumentNullException(nameof(addRequest.DistinguishedName));
                }

                var attrs = addRequest.Attributes.Select(ToLdapMod).ToList();

                var ptr = MarshalUtils.AllocHGlobalIntPtrArray(addRequest.Attributes.Count + 1);
                MarshalUtils.StructureArrayToPtr(attrs, ptr, true);

                var result = Native.ldap_add_ext(handle,
                                                 addRequest.DistinguishedName,
                                                 ptr,
                                                 serverControlArray,
                                                 clientControlArray,
                                                 ref messageId
                                                 );

                attrs.ForEach(_ =>
                {
                    MarshalUtils.BerValuesFree(_.mod_vals_u.modv_bvals);
                    Marshal.FreeHGlobal(_.mod_vals_u.modv_bvals);
                    Marshal.FreeHGlobal(_.mod_type);
                });
                Marshal.FreeHGlobal(ptr);

                return(result);
            }

            return(0);
        }
Esempio n. 3
0
        public override int SendRequest(SafeHandle handle, DirectoryRequest request, ref int messageId)
        {
            if (request is AddRequest addRequest)
            {
                var entry = addRequest.LdapEntry;
                if (string.IsNullOrWhiteSpace(entry.Dn))
                {
                    throw new ArgumentNullException(nameof(entry.Dn));
                }

                if (entry.Attributes == null)
                {
                    entry.Attributes = new Dictionary <string, List <string> >();
                }

                var attrs = entry.Attributes.Select(ToLdapMod).ToList();

                var ptr = MarshalUtils.AllocHGlobalIntPtrArray(entry.Attributes.Count + 1);
                MarshalUtils.StructureArrayToPtr(attrs, ptr, true);

                var result = Native.ldap_add_ext(handle,
                                                 addRequest.LdapEntry.Dn,
                                                 ptr,
                                                 IntPtr.Zero,
                                                 IntPtr.Zero,
                                                 ref messageId
                                                 );

                attrs.ForEach(_ =>
                {
                    MarshalUtils.BerValuesFree(_.mod_vals_u.modv_bvals);
                    Marshal.FreeHGlobal(_.mod_vals_u.modv_bvals);
                    Marshal.FreeHGlobal(_.mod_type);
                });
                Marshal.FreeHGlobal(ptr);

                return(result);
            }

            return(0);
        }