Exemple #1
0
        internal override async Task <IntPtr> BindKerberosAsync(SafeHandle ld)
        {
            var task = Task.Factory.StartNew(() =>
            {
                var rc           = 0;
                var msgid        = 0;
                var result       = IntPtr.Zero;
                var rmech        = IntPtr.Zero;
                var saslDefaults = GetSaslDefaults(ld);
                var ptr          = Marshal.AllocHGlobal(Marshal.SizeOf(saslDefaults));
                Marshal.StructureToPtr(saslDefaults, ptr, false);
                do
                {
                    rc = NativeMethodsOsx.ldap_sasl_interactive_bind(ld, null, Native.LdapAuthMechanism.GSSAPI, IntPtr.Zero, IntPtr.Zero,
                                                                     (uint)Native.LdapInteractionFlags.LDAP_SASL_QUIET,
                                                                     SaslInteractProc, ptr, result, ref rmech,
                                                                     ref msgid);
                    if (rc != (int)Native.ResultCode.SaslBindInProgress)
                    {
                        break;
                    }
                    NativeMethodsOsx.ldap_msgfree(result);

                    if (NativeMethodsOsx.ldap_result(ld, msgid, 0, IntPtr.Zero, ref result) == Native.LdapResultType.LDAP_ERROR)
                    {
                        ThrowIfError(rc, nameof(NativeMethodsOsx.ldap_sasl_interactive_bind));
                    }

                    if (result == IntPtr.Zero)
                    {
                        throw new LdapException("Result is not initialized", nameof(NativeMethodsOsx.ldap_sasl_interactive_bind), 1);
                    }
                } while (rc == (int)Native.ResultCode.SaslBindInProgress);

                ThrowIfError(ld, rc, nameof(NativeMethodsOsx.ldap_sasl_interactive_bind), new Dictionary <string, string>
                {
                    [nameof(saslDefaults)] = saslDefaults.ToString()
                });
                return(result);
            });

            return(await task.ConfigureAwait(false));
        }
Exemple #2
0
 internal override void ldap_msgfree(IntPtr message) => NativeMethodsOsx.ldap_msgfree(message);