Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 1 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php

declare(strict_types=1);

namespace LeadersLinked\Authentication;

use Laminas\Authentication\Adapter\AdapterInterface as AuthAdapterInterface; 
use Laminas\Authentication\Result;
use Laminas\Db\Adapter\AdapterInterface;
use LeadersLinked\Model\User;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Model\UserType;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Model\Company;
use LeadersLinked\Mapper\CompanyUserMapper;
use LeadersLinked\Model\CompanyUser;


class AuthOneTimePasswordAdapter implements AuthAdapterInterface
{
    /**
     *
     * @var AdapterInterface
     */
    private $adapter;
    
    /**
     * 
     * @var array
     */
    private $config;

    /**
     * 
     * @var string
     */
    private $user_uuid;
    
    /**
     *
     * @var string
     */
    private $password;
    
    /**
     * 
     * @var string
     */
    private $timestamp;
    
    
    /**
     * 
     * @var int
     */
    private $rand;
    
    
    /**
     * 
     * @var string
     */
    private $company_uuid;
    
    
    /**
     * 
     * @var int
     */
    private $usertype_id;

    /**
     * 
     * @param AdapterInterface $adapter
     * @param array $config
     */
    public function __construct(AdapterInterface $adapter, $config)
    {
        $this->adapter = $adapter; 
        $this->config = $config;
    }

    /**
     * 
     * @param string $user_uuid
     * @param string $token
     * @param string $timestamp
     * @param int $rand
     */
    public function setDataAdmin($user_uuid, $password, $timestamp, $rand)
    {
        $this->user_uuid    = $user_uuid;
        $this->password     = $password;
        $this->timestamp    = $timestamp;
        $this->rand         = $rand;
        $this->usertype_id  = UserType::ADMIN;
    }
    
    /**
     *
     * @param string $user_uuid
     * @param string $token
     * @param string $timestamp
     * @param int $rand
     * @param string company_uuid
     */
    public function setDataCompany($user_uuid, $password, $timestamp, $rand, $company_uuid)
    {
        $this->user_uuid    = $user_uuid;
        $this->password     = $password;
        $this->timestamp    = $timestamp;
        $this->rand         = $rand;
        $this->usertype_id  = UserType::COMPANY;
        $this->company_uuid = $company_uuid;
    }
    
    
    
    /**
     * 
     * {@inheritDoc}
     * @see \Laminas\Authentication\Adapter\AdapterInterface::authenticate()
     */
    public function authenticate()
    {
        $userMapper = UserMapper::getInstance($this->adapter);
        $user = $userMapper->fetchOneByUuid($this->user_uuid);
        
        if(!$user) {
            return new Result(Result::FAILURE_UNCATEGORIZED, null, ['ERROR_USER_NOT_FOUND']);
        }

        if(User::BLOCKED_YES == $user->blocked) {
            return new Result(Result::FAILURE_UNCATEGORIZED, null, ['ERROR_USER_IS_BLOCKED']);
        }
        
        if(User::STATUS_INACTIVE == $user->status) {
            return new Result(Result::FAILURE_UNCATEGORIZED, null, ['ERROR_USER_IS_INACTIVE']);
        } 
        
        $company = null;
        if($this->usertype_id == UserType::COMPANY) {
            
            
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOneByUuid($this->company_uuid);
            
            if(!$company) {
                return new Result(Result::FAILURE_UNCATEGORIZED, null, ['ERROR_COMPANY_NOT_FOUND']);
            }
            
            if($company->status != Company::STATUS_PENDING && $company->status != Company::STATUS_ACTIVE) {
                return new Result(Result::FAILURE_UNCATEGORIZED, null, ['ERROR_COMPANY_IS_INACTIVE']);
            }
            
            
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);
            
            
            if(!$companyUser || !in_array($companyUser->status, [CompanyUser::STATUS_ACCEPTED, CompanyUser::STATUS_ADMIN_WILL_ADD]) || !$companyUser->backend) {
                return new Result(Result::FAILURE_UNCATEGORIZED, null, ['ERROR_UNAUTHORIZED']);
            }
            
        }
        

        $dt = \DateTimeImmutable::createFromFormat('Y-m-d\TH:i:s',gmdate('Y-m-d\TH:i:s'));
        $t1 = $dt->sub(new \DateInterval('PT5M'));
        $t1 = $t1->getTimestamp();
        
        $t2 = $dt->add(new \DateInterval('PT5M'));
        $t2 = $t2->getTimestamp();


        if($this->timestamp < $t1 || $this->timestamp > $t2) {
            return new Result(Result::FAILURE_UNCATEGORIZED, null, ['ERROR_WEBSERVICE_TIMESTAMP']);
        }
        
        $sandbox = $this->config['leaderslinked.runmode.sandbox'];
        if($sandbox) {
            $salt = $this->config['leaderslinked.backend.sandbox_salt'];
        } else {
            $salt = $this->config['leaderslinked.backend.production_salt'];
        }

        
        $passworVerification = md5($user->one_time_password . '-' . $this->rand . '-' . $this->timestamp . '-' . $salt);
        if($this->password != $passworVerification) 
        {
            return new Result(Result::FAILURE_UNCATEGORIZED, null, ['ERROR_WEBSERVICE_PASSWORD']);
        } else {
            $userMapper->update($user);
        }
                        
        $data = [
            'user_id' => $user->id,
            'company_id' => $company ? $company->id : 0,
        ];
                        
        return new Result(Result::SUCCESS, $data, []);
    }
}