/// <summary> Constructs an LdapSearchConstraints object initialized with values
        /// from an existing constraints object (LdapConstraints
        /// or LdapSearchConstraints).
        /// </summary>
        public LdapSearchConstraints(LdapConstraints cons) : base(cons.TimeLimit, cons.ReferralFollowing, cons.getReferralHandler(), cons.HopLimit)
        {
            InitBlock();
            LdapControl[] lsc = cons.getControls();
            if (lsc != null)
            {
                LdapControl[] generated_var = new LdapControl[lsc.Length];
                lsc.CopyTo(generated_var, 0);
                setControls(generated_var);
            }
            System.Collections.Hashtable lp = cons.Properties;
            if (lp != null)
            {
                Properties = (System.Collections.Hashtable)lp.Clone();
            }

            if (cons is LdapSearchConstraints)
            {
                LdapSearchConstraints scons = (LdapSearchConstraints)cons;
                serverTimeLimit = scons.ServerTimeLimit;
                dereference     = scons.Dereference;
                maxResults      = scons.MaxResults;
                batchSize       = scons.BatchSize;
            }
            // Get a unique connection name for debug
        }
        public static LdapWhoAmIResponse WhoAmI(this LdapConnection conn, LdapConstraints cons = null)
        {
            var result = conn.ExtendedOperation(new LdapWhoAmIOperation(), cons);

            if (result is LdapWhoAmIResponse whoami)
            {
                return(whoami);
            }
            return(new LdapWhoAmIResponse(result.Message));
        }
        public ILdapConnection GetConnection()
        {
            if (!HasConnectionInfo())
            {
                return(null);
            }
            var constraints = new LdapConstraints {
                ReferralFollowing = true
            };
            var connection = new LdapConnection()
            {
                SecureSocketLayer = _ldapSettings.UseSsl, Constraints = constraints
            };

            connection.Connect(_ldapSettings.Server, _ldapSettings.Port);
            connection.Bind(_ldapSettings.Username, _ldapSettings.Password);
            return(connection);
        }
    public static void Main(String[] args)
    {
        if (args.Length != 6)
        {
            Console.Error.WriteLine("Usage:   mono SimplePassword <host Name> "
                                    + "<port number> <login dn> <password> <user dn>"
                                    + " <new user password>");
            Console.Error.WriteLine("\n Example: mono SimplePassword Acme.com 389"
                                    + " \"cn=Admin,o=Acme\" secret\n"
                                    + "         \"cn=JSmith,ou=sales,o=Acme\" userPWD");
            Environment.Exit(1);
        }

        int    ldapVersion = LdapConnection.Ldap_V3;
        String ldapHost    = args[0];
        int    ldapPort    = int.Parse(args[1]);
        String loginDN     = args[2];
        String password    = args[3];
        String userDN      = args[4];
        String userPWD     = args[5];


        /* Simple Password control.  There is no value  associated with this control,
         * just an OID and criticality. Setting the criticality to TRUE means the
         * server will return an error if it does not recognize or is unable to
         * perform the control.
         */

        LdapControl cont = new LdapControl(simplePassOID,
                                           true,
                                           null);
        LdapConstraints lcons = new LdapConstraints();

        lcons.setControls(cont);

        LdapConnection lc = new LdapConnection();

        try
        {
            // connect to the server
            lc.Connect(ldapHost, ldapPort);
            // bind to the server
            lc.Bind(ldapVersion, loginDN, password);

            //  Modify the 'userpassword' attribute, with the Simple
            // Password control.
            LdapModification[] modifications = new LdapModification[1];
            LdapAttribute      sPassword     = new LdapAttribute("userPassword", userPWD);
            modifications[0] =
                new LdapModification(LdapModification.REPLACE, sPassword);

            lc.Modify(userDN, modifications, lcons);

            Console.WriteLine("Your Simple password has been modified.");

            lc.Disconnect();
        }
        catch (LdapException e)
        {
            Console.Error.WriteLine("SimplePassword example failed");
            Console.Error.WriteLine("Error: " + e.ToString());
            Environment.Exit(1);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.ToString());
        }
        Environment.Exit(0);
    }