<?php

/**
 * Copyright 2005-2017 de Solis Soluções Livres Ltda.
 *
 * Este arquivo é parte do programa Gnuteca.
 *
 * O Gnuteca é um software de propriedade da SOLIS, sendo desenvolvido
 * e mantido exclusivamente por esta empresa.
 *
 * A licença de uso está disponível mediante aquisição exclusiva junto à
 * SOLIS. A licença é concedida sem caráter de exclusividade ao licenciado.
 * Os direitos de uso são perpétuos.
 *
 * Embora os códigos fontes sejam fornecidos, o software é de propriedade
 * da SOLIS, não sendo permitido ao adquirente da licença a sua revenda,
 * empréstimo ou cessão (onerosa ou não) à terceiros. Também não é permitido,
 * a qualquer título e tempo, promover no software qualquer tipo de alienação,
 * reprodução, distribuição, divulgação, registro, licenciamento, transferência
 * ou qualquer outro ato que prejudique ou comprometa os direitos de propriedade
 * de software, o nome e a imagem da sua proprietária e do próprio software,
 * além de configurar concorrência à SOLIS.
 *
 * O licenciado, com o acesso ao código fonte do software, terá o direito de
 * promover mudanças no respectivo código. No entanto, nas situações em que ele
 * contar com o suporte oficial prestado pela SOLIS, não poderá promover mudanças
 * no código fonte, sob pena de perda do referido suporte.
 *
 * Para conhecer em detalhes o Termo de Licenciamento do Software Gnuteca
 * leia o arquivo “LICENCA.txt” disponível junto ao código deste software.
 * 
 * 
 * Class GDate
 *
 *
 *
 *
 *
 **/

//$MIOLO = MIOLO::getInstance();
//$MIOLO->uses('security/mauthldap.class.php');
class gAuthMutipleLdap extends MAuth
{
    private $baseId;
    
	public function __construct($baseId = null) 
    {
        $this->baseId = $baseId;
        parent::__construct();
    }
    
    /**
     * Método privado para autenticar na base Ldap
     * @return (object) conexão 
     */
    private function connect()
    {
        try
        {
            if ( $this->manager->getConf("login.ldap.{$this->baseId}.host") ) //verifica se existe um host configurada para a base
            {
                $conn = ldap_connect($this->manager->getConf("login.ldap.{$this->baseId}.host"), $this->manager->getConf("login.ldap.{$this->baseId}.port")); //conecta na base ldap
                ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3); //seta a versão do protocolo
                ldap_set_option($conn, LDAP_OPT_REFERRALS, 0);
                
                $loginBind = $this->manager->getConf("login.ldap.{$this->baseId}.user");
                $pwdBind = $this->manager->getConf("login.ldap.{$this->baseId}.password");
                
                if ( (strlen($loginBind) > 0) && (strlen($pwdBind) > 0) )
                {
                    ldap_bind($conn, $loginBind, $pwdBind); //autentica no ldap para poder fazer a pesquisa
                }
                elseif ( strlen($loginBind) > 0 )
                {
                    ldap_bind($conn, $loginBind); //autentica no ldap para poder fazer a pesquisa
                }

                return $conn;
            }
            else
            {
                return false;
            }
        }
        catch ( Exception $e )
        {
            return false;
        }
    }
    
    /**
     * Obtém dados do Ldap
     * @param (String) $login
     * @param (object) $conn
     * @return (array) de dados 
     */
    public function searchData($login, $conn = null)
    {
        if (!$login )
        {
            return false;
        }
        
        try
        {
            if ( !$conn )
            {
                $conn = $this->connect(); //conecta na base
            }
            
            if ( $conn )
            {
                $vars   = array(
                        'AND('      =>'&(',
                        'OR('       =>'|(',
                    );

                $search = strtr(str_replace("%login%", $login, $this->manager->getConf("login.ldap.{$this->baseId}.filter")), $vars);
                $ldapData = ldap_get_entries($conn, @ldap_search($conn, $this->manager->getConf("login.ldap.{$this->baseId}.base"), $search));

                return $ldapData;
            }
            else
            {
                return false;
            }
        }
        catch ( Exception $e )
        {
            return false;
        }
    }
    
    /**
     * Método de autenticação do Ldap
     * 
     * @param (String) $login
     * @param (String) $password
     * @return boolean, true se autenticou 
     */
    public function authenticate($login, $password=null)
    {
        try
        {
            if ( $this->manager->getConf("login.ldap.{$this->baseId}.host") )
            {
                if (!$login )
            	{
            		return false;
            	}

                $conn = $this->connect(); //conecta na base
                $ldapData = $this->searchData($login); //obtém dados do login

                if ( $conn && is_array($ldapData) ) //conectou e achou usuário na base ldap
                {

                    if ( ldap_bind($conn, $ldapData[0]['dn'], $password) ) //autenticou usuário e senha
                    {
                        return true;
                    }
                }
                else
                {
                	return false;
                }
            }

        }
        catch ( Exception $e )
        {
            return false;
        }
    }
}
?>
