Proyectos de Subversion LeadersLinked - Services

Rev

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

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
345 www 2
declare(strict_types = 1);
1 efrain 3
namespace LeadersLinked\Authentication;
4
 
345 www 5
use Laminas\Authentication\Adapter\AdapterInterface as AuthAdapterInterface;
1 efrain 6
use Laminas\Authentication\Result;
7
use Laminas\Db\Adapter\AdapterInterface;
8
use Laminas\Log\LoggerInterface;
9
use LeadersLinked\Model\User;
10
use LeadersLinked\Mapper\UserMapper;
11
use LeadersLinked\Library\Functions;
12
use LeadersLinked\Mapper\DeviceMapper;
13
use LeadersLinked\Mapper\DeviceHistoryMapper;
14
use LeadersLinked\Model\DeviceHistory;
15
use LeadersLinked\Model\UserType;
16
use LeadersLinked\Mapper\CompanyMapper;
17
use LeadersLinked\Model\Company;
18
use LeadersLinked\Mapper\CompanyUserMapper;
19
use LeadersLinked\Model\CompanyUser;
20
 
21
class AuthImpersonateAdapter implements AuthAdapterInterface
22
{
345 www 23
 
1 efrain 24
    /**
25
     *
26
     * @var AdapterInterface
27
     */
28
    private $adapter;
345 www 29
 
1 efrain 30
    /**
345 www 31
     *
1 efrain 32
     * @var array
33
     */
34
    private $config;
35
 
36
    /**
345 www 37
     *
1 efrain 38
     * @var string
39
     */
40
    private $user_uuid;
345 www 41
 
1 efrain 42
    /**
43
     *
44
     * @var string
45
     */
46
    private $password;
345 www 47
 
1 efrain 48
    /**
345 www 49
     *
1 efrain 50
     * @var string
51
     */
52
    private $timestamp;
345 www 53
 
1 efrain 54
    /**
345 www 55
     *
1 efrain 56
     * @var int
57
     */
58
    private $rand;
345 www 59
 
1 efrain 60
    /**
345 www 61
     *
1 efrain 62
     * @var string
63
     */
64
    private $company_uuid;
345 www 65
 
1 efrain 66
    /**
345 www 67
     *
1 efrain 68
     * @var int
69
     */
70
    private $usertype_id;
71
 
72
    /**
345 www 73
     *
1 efrain 74
     * @param AdapterInterface $adapter
75
     * @param array $config
76
     */
77
    public function __construct(AdapterInterface $adapter, $config)
78
    {
345 www 79
        $this->adapter = $adapter;
1 efrain 80
        $this->config = $config;
81
    }
82
 
83
    /**
345 www 84
     *
1 efrain 85
     * @param string $user_uuid
86
     * @param string $token
87
     * @param string $timestamp
88
     * @param int $rand
89
     */
90
    public function setDataAdmin($user_uuid, $password, $timestamp, $rand)
91
    {
345 www 92
        $this->user_uuid = $user_uuid;
93
        $this->password = $password;
94
        $this->timestamp = $timestamp;
95
        $this->rand = $rand;
96
        $this->usertype_id = UserType::ADMIN;
1 efrain 97
    }
345 www 98
 
1 efrain 99
    /**
100
     *
101
     * @param string $user_uuid
102
     * @param string $token
103
     * @param string $timestamp
104
     * @param int $rand
345 www 105
     * @param
106
     *            string company_uuid
1 efrain 107
     */
108
    public function setDataCompany($user_uuid, $password, $timestamp, $rand, $company_uuid)
109
    {
345 www 110
        $this->user_uuid = $user_uuid;
111
        $this->password = $password;
112
        $this->timestamp = $timestamp;
113
        $this->rand = $rand;
114
        $this->usertype_id = UserType::COMPANY;
1 efrain 115
        $this->company_uuid = $company_uuid;
116
    }
345 www 117
 
1 efrain 118
    /**
345 www 119
     *
120
     * {@inheritdoc}
1 efrain 121
     * @see \Laminas\Authentication\Adapter\AdapterInterface::authenticate()
122
     */
123
    public function authenticate()
124
    {
125
        $userMapper = UserMapper::getInstance($this->adapter);
126
        $user = $userMapper->fetchOneByUuid($this->user_uuid);
345 www 127
 
128
        if (! $user) {
129
            return new Result(Result::FAILURE_UNCATEGORIZED, null, [
130
                'ERROR_USER_NOT_FOUND'
131
            ]);
1 efrain 132
        }
133
 
345 www 134
        if (User::BLOCKED_YES == $user->blocked) {
135
            return new Result(Result::FAILURE_UNCATEGORIZED, null, [
136
                'ERROR_USER_IS_BLOCKED'
137
            ]);
1 efrain 138
        }
345 www 139
 
140
        if (User::STATUS_INACTIVE == $user->status) {
141
            return new Result(Result::FAILURE_UNCATEGORIZED, null, [
142
                'ERROR_USER_IS_INACTIVE'
143
            ]);
1 efrain 144
        }
145
 
345 www 146
        if ($user->is_super_user == User::IS_SUPER_USER_NO) {
147
            return new Result(Result::FAILURE_UNCATEGORIZED, null, [
148
                'ERROR_CANNOT_IMPERSONATE_YOU_ARE_NOT_SUPER_ADMIN'
149
            ]);
150
        }
151
 
152
        $dt = \DateTimeImmutable::createFromFormat('Y-m-d\TH:i:s', gmdate('Y-m-d\TH:i:s'));
1 efrain 153
        $t1 = $dt->sub(new \DateInterval('PT5M'));
154
        $t1 = $t1->getTimestamp();
345 www 155
 
1 efrain 156
        $t2 = $dt->add(new \DateInterval('PT5M'));
157
        $t2 = $t2->getTimestamp();
158
 
345 www 159
        if ($this->timestamp < $t1 || $this->timestamp > $t2) {
160
            return new Result(Result::FAILURE_UNCATEGORIZED, null, [
161
                'ERROR_WEBSERVICE_TIMESTAMP'
162
            ]);
163
        }
1 efrain 164
 
165
        $sandbox = $this->config['leaderslinked.runmode.sandbox'];
345 www 166
        if ($sandbox) {
1 efrain 167
            $salt = $this->config['leaderslinked.backend.sandbox_salt'];
168
        } else {
169
            $salt = $this->config['leaderslinked.backend.production_salt'];
170
        }
171
 
172
        $passworVerification = md5($user->one_time_password . '-' . $this->rand . '-' . $this->timestamp . '-' . $salt);
345 www 173
        if ($this->password != $passworVerification) {
174
            return new Result(Result::FAILURE_UNCATEGORIZED, null, [
175
                'ERROR_WEBSERVICE_PASSWORD'
176
            ]);
1 efrain 177
        } else {
178
            $userMapper->update($user);
179
        }
345 www 180
 
1 efrain 181
        $data = [
345 www 182
            'user_id' => $user->id
1 efrain 183
        ];
345 www 184
 
1 efrain 185
        return new Result(Result::SUCCESS, $data, []);
186
    }
187
}