Proyectos de Subversion LeadersLinked - Services

Rev

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

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Authentication\AuthenticationService;
7
use Laminas\Db\Adapter\AdapterInterface;
8
 
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\ViewModel;
12
use Laminas\View\Model\JsonModel;
13
use LeadersLinked\Library\Functions;
14
use LeadersLinked\Mapper\QueryMapper;
15
use LeadersLinked\Mapper\UserMapper;
16
use LeadersLinked\Model\UserExperience;
17
use LeadersLinked\Mapper\UserExperienceMapper;
18
use Laminas\Db\Sql\Select;
19
use LeadersLinked\Mapper\CompanyMapper;
20
use LeadersLinked\Model\User;
21
use LeadersLinked\Mapper\LocationMapper;
22
use LeadersLinked\Mapper\CompanySizeMapper;
23
use LeadersLinked\Mapper\GroupMapper;
24
use LeadersLinked\Mapper\GroupMemberMapper;
25
use LeadersLinked\Mapper\IndustryMapper;
26
use Laminas\Paginator\Adapter\DbSelect;
27
use Laminas\Paginator\Paginator;
28
use LeadersLinked\Mapper\UserSkillMapper;
29
use LeadersLinked\Mapper\SkillMapper;
30
use LeadersLinked\Model\Job;
31
use LeadersLinked\Mapper\ConnectionMapper;
32
use LeadersLinked\Mapper\UserProfileMapper;
33
use LeadersLinked\Model\UserProfile;
34
use Laminas\Db\Sql\Expression;
35
use LeadersLinked\Mapper\GroupTypeMapper;
36
use LeadersLinked\Mapper\JobMapper;
37
use LeadersLinked\Mapper\ProfileVisitMapper;
38
use LeadersLinked\Mapper\CompanyLocationMapper;
39
use LeadersLinked\Mapper\CompanyFollowerMapper;
40
use LeadersLinked\Mapper\JobApplicationMapper;
41
use LeadersLinked\Model\UserType;
42
use LeadersLinked\Mapper\UserBlockedMapper;
43
use LeadersLinked\Mapper\CompanyUserMapper;
44
use LeadersLinked\Model\CompanyUser;
45
use LeadersLinked\Model\Company;
46
use LeadersLinked\Model\Group;
47
use LeadersLinked\Mapper\NetworkMapper;
48
use LeadersLinked\Model\Network;
283 www 49
use LeadersLinked\Library\Storage;
1 efrain 50
 
51
class ImpersonateController extends AbstractActionController
52
{
53
    /**
54
     *
55
     * @var \Laminas\Db\Adapter\AdapterInterface
56
     */
57
    private $adapter;
58
 
59
    /**
60
     *
61
     * @var \LeadersLinked\Cache\CacheInterface
62
     */
63
    private $cache;
64
 
65
 
66
    /**
67
     *
68
     * @var \Laminas\Log\LoggerInterface
69
     */
70
    private $logger;
71
 
72
    /**
73
     *
74
     * @var array
75
     */
76
    private $config;
77
 
78
 
79
    /**
80
     *
81
     * @var \Laminas\Mvc\I18n\Translator
82
     */
83
    private $translator;
84
 
85
 
86
    /**
87
     *
88
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
89
     * @param \LeadersLinked\Cache\CacheInterface $cache
90
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
91
     * @param array $config
92
     * @param \Laminas\Mvc\I18n\Translator $translator
93
     */
94
    public function __construct($adapter, $cache, $logger, $config, $translator)
95
    {
96
        $this->adapter      = $adapter;
97
        $this->cache        = $cache;
98
        $this->logger       = $logger;
99
        $this->config       = $config;
100
        $this->translator   = $translator;
101
    }
102
 
103
    public function indexAction()
104
    {
105
        $page       = (int) filter_var($this->params()->fromQuery('page'), FILTER_SANITIZE_NUMBER_INT);
106
        $keyword    = Functions::sanitizeFilterString($this->params()->fromQuery('keyword'));
107
 
108
 
109
        $request = $this->getRequest();
110
        if($request->isGet()) {
111
 
112
 
113
 
114
                $currentUserPlugin = $this->plugin('currentUserPlugin');
115
                $currentUser = $currentUserPlugin->getUser();
116
 
117
                $networkMapper = NetworkMapper::getInstance($this->adapter);
118
                $records = $networkMapper->fetchAllActives();
119
 
120
                $networks = [];
121
                foreach($records as $record)
122
                {
123
                    $networks[$record->id] = $record->name;
124
                }
125
 
126
 
127
 
128
                $queryMapper = QueryMapper::getInstance($this->adapter);
129
                $select = $queryMapper->getSql()->select();
130
                $select->columns(['id', 'uuid', 'network_id', 'user_uuid' => 'uuid', 'first_name','last_name', 'email','image']);
131
                $select->from(['u' => UserMapper::_TABLE]);
132
                $select->where->equalTo('u.status', User::STATUS_ACTIVE);
133
                $select->where->equalTo('u.email_verified', User::EMAIL_VERIFIED_YES);
134
                $select->where->in('u.usertype_id', [UserType::USER, UserType::ADMIN]);
135
                $select->where->equalTo('u.status', User::STATUS_ACTIVE);
136
                $select->where->notEqualTo('u.is_super_user', User::IS_SUPER_USER_YES);
137
 
138
                if($keyword) {
139
                    $select->where->NEST->like('u.email', '%' . $keyword . '%')->or->like('u.first_name', '%' . $keyword . '%')->or->like('u.last_name', '%' . $keyword . '%')->UNNEST;
140
                }
141
 
142
                $dbSelect = new DbSelect($select, $this->adapter);
143
                $paginator = new Paginator($dbSelect);
144
                $paginator->setCurrentPageNumber($page ? $page : 1);
145
                $paginator->setItemCountPerPage(10);
146
 
147
 
333 www 148
                $storage = Storage::getInstance($this->config, $this->adapter);
1 efrain 149
 
150
 
151
                $items = [];
152
                $records = $paginator->getCurrentItems();
153
                foreach($records as $record)
154
                {
155
                    $item = [
156
                        'id' => $record['uuid'],
157
                        'name' => $record['first_name'] . ' ' . $record['last_name'],
158
                        'email' => $record['email'],
159
                        'network' => $networks[$record['network_id']],
283 www 160
                        'image' => $storage->getUserImageForCodeAndFilename($record['user_uuid'], $record['image']),
1 efrain 161
                        'link_impersonate' => $this->url()->fromRoute('impersonate/execute',['id' => $record['user_uuid'] ]),
162
 
163
 
164
                    ];
165
                    array_push($items, $item);
166
 
167
                }
168
 
169
                $response = [
170
                    'success' => true,
171
                    'data' => [
172
                        'total' => [
173
                            'count' => $paginator->getTotalItemCount(),
174
                            'pages' => $paginator->getPages()->pageCount,
175
                        ],
176
                        'current' => [
177
                            'items'    => $items,
178
                            'page'     => $paginator->getCurrentPageNumber(),
179
                            'count'    => $paginator->getCurrentItemCount(),
180
                        ]
181
                    ]
182
                ];
183
 
184
 
185
 
186
                return new JsonModel($response);
187
 
188
        }
189
 
190
        return new JsonModel([
191
            'success' => false,
192
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
193
        ]);
194
 
195
 
196
 
197
 
198
    }
199
 
200
    public function executeAction()
201
    {
202
        $currentUserPlugin = $this->plugin('currentUserPlugin');
203
        $currentUser = $currentUserPlugin->getUser();
204
 
205
        $id = $this->params()->fromRoute('id');
206
        if(!$id) {
207
            return new JsonModel([
208
                'success' => false,
209
                'data' =>  'ERROR_PARAMETERS_ARE_INVALID'
210
            ]);
211
        }
212
 
213
 
214
        $request = $this->getRequest();
215
        if($request->isGet()) {
216
 
217
            $userMapper = UserMapper::getInstance($this->adapter);
218
            $userImpersonate = $userMapper->fetchOneByUuid($id);
219
 
220
            if(!$userImpersonate) {
221
                return new JsonModel([
222
                    'success' => false,
223
                    'data' => 'ERROR_USER_NOT_FOUND'
224
                ]);
225
 
226
 
227
            }
228
 
229
            if($currentUser->id == $userImpersonate->id) {
230
                return new JsonModel([
231
                    'success' => false,
232
                    'data' => 'ERROR_CANNOT_IMPERSONATE_ITSELF',
233
                ]);
234
            }
235
 
236
            if($userImpersonate->is_super_user == User::IS_SUPER_USER_YES) {
237
                return new JsonModel([
238
                    'success' => false,
239
                    'data' =>  'ERROR_CANNOT_IMPERSONATE_A_SUPER_ADMIN',
240
                ]);
241
            }
242
 
243
            if($userImpersonate->status != User::STATUS_ACTIVE || $userImpersonate->email_verified != User::EMAIL_VERIFIED_YES) {
244
                return new JsonModel([
245
                    'success' => false,
246
                    'data' =>  'ERROR_CANNOT_IMPERSONATE_AN_INACTIVE_OR_UNVERIFIED_USER',
247
                ]);
248
            }
249
 
250
            $userMapper->startImpersonate($currentUser->id, $userImpersonate->id);
251
 
252
            $networkMapper = NetworkMapper::getInstance($this->adapter);
253
            $network = $networkMapper->fetchOne($userImpersonate->network_id);
254
 
255
 
256
            if(!$currentUser->one_time_password) {
257
                $one_time_password = Functions::generatePassword(25);
258
 
259
                $currentUser->one_time_password = $one_time_password;
260
 
261
                $userMapper = UserMapper::getInstance($this->adapter);
262
                $userMapper->updateOneTimePassword($currentUser, $one_time_password);
263
            }
264
 
265
 
266
            $sandbox = $this->config['leaderslinked.runmode.sandbox'];
267
            if($sandbox) {
268
                $salt = $this->config['leaderslinked.backend.sandbox_salt'];
269
            } else {
270
                $salt = $this->config['leaderslinked.backend.production_salt'];
271
            }
272
 
273
 
274
 
275
 
276
            $rand = 1000 + mt_rand(1, 999);
277
            $timestamp = time();
278
            $password = md5($currentUser->one_time_password . '-' . $rand . '-' . $timestamp . '-' . $salt);
279
 
280
            $params = [
281
                'user_uuid' => $currentUser->uuid,
282
                'password' => $password,
283
                'rand' => $rand,
284
                'time' => $timestamp,
285
            ];
286
 
287
 
288
            $currentUserPlugin->clearIdentity();
289
            $url = 'https://'. $network->main_hostname . '/signin/impersonate' . '?' . http_build_query($params);
290
 
291
            return new JsonModel([
292
                'success' => true,
293
                'data' => $url,
294
 
295
            ]);
296
 
297
 
298
        }
299
 
300
 
301
        return new JsonModel([
302
            'success' => false,
303
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
304
        ]);
305
 
306
    }
307
 
308
 
309
}