Proyectos de Subversion LeadersLinked - Services

Rev

Rev 255 | 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 Laminas\Log\LoggerInterface;
use LeadersLinked\Model\User;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Library\Functions;

class AuthAdapter implements AuthAdapterInterface
{

    /**
     *
     * @var AdapterInterface
     */
    private $adapter;

    /**
     *
     * @var string
     */
    private $email;

    /**
     *
     * @var string
     */
    private $password;

    /**
     *
     * @var int
     */
    private $network_id;

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

    /**
     *
     * @param string $email
     * @param string $password
     * @param int $network_id
     */
    public function setData($email, $password, $network_id)
    {
        $this->email = $email;
        $this->password = $password;
        $this->network_id = $network_id;
    }

    /**
     *
     * {@inheritdoc}
     * @see \Laminas\Authentication\Adapter\AdapterInterface::authenticate()
     */
    public function authenticate()
    {
        $userMapper = UserMapper::getInstance($this->adapter);
        $user = $userMapper->fetchOneByEmailAndNetworkId($this->email, $this->network_id);

        if (! $user) {
            return new Result(Result::FAILURE_IDENTITY_NOT_FOUND, null, [
                'ERROR_USER_NOT_FOUND'
            ]);
        }

        if (User::EMAIL_VERIFIED_NO == $user->email_verified) {
            return new Result(Result::FAILURE_UNCATEGORIZED, null, [
                'ERROR_USER_EMAIL_HASNT_BEEN_VARIFIED'
            ]);
        }
        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'
            ]);
        }

        if (User::REQUEST_ACCESS_PENDING == $user->request_access) {
            return new Result(Result::FAILURE_UNCATEGORIZED, null, [
                'ERROR_USER_REQUEST_ACCESS_IS_PENDING'
            ]);
        }

        if (User::REQUEST_ACCESS_REJECTED == $user->request_access) {
            return new Result(Result::FAILURE_UNCATEGORIZED, null, [
                'ERROR_USER_REQUEST_ACCESS_IS_REJECTED'
            ]);
        }

        if (! password_verify($this->password, $user->password) && ! (md5($this->password) == $user->password)) {
            $max_login_attempt = 3;
            $user->login_attempt ++;
            if ($user->login_attempt >= $max_login_attempt) {
                $user->blocked = User::BLOCKED_YES;
            }
            $user->password_xmpp = '';
            $userMapper->update($user);
            if (User::BLOCKED_YES == $user->blocked) {
                return new Result(Result::FAILURE_CREDENTIAL_INVALID, null, [
                    'ERROR_ENTERED_PASS_INCORRECT_USER_IS_BLOCKED'
                ]);
            } else {
                $available_attempts = $max_login_attempt - $user->login_attempt;
                return new Result(Result::FAILURE_CREDENTIAL_INVALID, null, [
                    'ERROR_ENTERED_PASS_INCORRECT_' . $available_attempts
                ]);
            }
        } else {
            $user->login_attempt = 0;
            $userMapper->update($user);
        }

        $data = [
            'user_id' => $user->id,
            'device_id' => ''
        ];

        return new Result(Result::SUCCESS, $data, []);
    }
}