Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
3639 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;
6849 efrain 8
 
3639 efrain 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;
49
 
50
class ImpersonateController extends AbstractActionController
51
{
52
    /**
53
     *
6866 efrain 54
     * @var \Laminas\Db\Adapter\AdapterInterface
3639 efrain 55
     */
56
    private $adapter;
57
 
58
    /**
59
     *
6866 efrain 60
     * @var \LeadersLinked\Cache\CacheInterface
3639 efrain 61
     */
6866 efrain 62
    private $cache;
63
 
64
 
65
    /**
66
     *
67
     * @var \Laminas\Log\LoggerInterface
68
     */
3639 efrain 69
    private $logger;
70
 
71
    /**
72
     *
73
     * @var array
74
     */
75
    private $config;
76
 
6866 efrain 77
 
3639 efrain 78
    /**
79
     *
6866 efrain 80
     * @var \Laminas\Mvc\I18n\Translator
81
     */
82
    private $translator;
83
 
84
 
85
    /**
86
     *
87
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
88
     * @param \LeadersLinked\Cache\CacheInterface $cache
89
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
3639 efrain 90
     * @param array $config
6866 efrain 91
     * @param \Laminas\Mvc\I18n\Translator $translator
3639 efrain 92
     */
6866 efrain 93
    public function __construct($adapter, $cache, $logger, $config, $translator)
3639 efrain 94
    {
95
        $this->adapter      = $adapter;
6866 efrain 96
        $this->cache        = $cache;
3639 efrain 97
        $this->logger       = $logger;
98
        $this->config       = $config;
6866 efrain 99
        $this->translator   = $translator;
3639 efrain 100
    }
101
 
102
    public function indexAction()
103
    {
104
        $page       = (int) filter_var($this->params()->fromQuery('page'), FILTER_SANITIZE_NUMBER_INT);
6749 efrain 105
        $keyword    = Functions::sanitizeFilterString($this->params()->fromQuery('keyword'));
3639 efrain 106
 
107
 
108
        $request = $this->getRequest();
109
        if($request->isGet()) {
110
 
111
 
112
            $headers  = $request->getHeaders();
113
 
114
            $isJson = false;
115
            if($headers->has('Accept')) {
116
                $accept = $headers->get('Accept');
117
 
118
                $prioritized = $accept->getPrioritized();
119
 
120
                foreach($prioritized as $key => $value) {
121
                    $raw = trim($value->getRaw());
122
 
123
                    if(!$isJson) {
124
                        $isJson = strpos($raw, 'json');
125
                    }
126
 
127
                }
128
            }
129
 
130
 
131
            if($isJson) {
132
                $currentUserPlugin = $this->plugin('currentUserPlugin');
133
                $currentUser = $currentUserPlugin->getUser();
134
 
135
                $networkMapper = NetworkMapper::getInstance($this->adapter);
136
                $records = $networkMapper->fetchAllActives();
137
 
138
                $networks = [];
139
                foreach($records as $record)
140
                {
141
                    $networks[$record->id] = $record->name;
142
                }
143
 
144
 
145
 
146
                $queryMapper = QueryMapper::getInstance($this->adapter);
147
                $select = $queryMapper->getSql()->select();
148
                $select->columns(['id', 'uuid', 'network_id', 'user_uuid' => 'uuid', 'first_name','last_name', 'email','image']);
149
                $select->from(['u' => UserMapper::_TABLE]);
150
                $select->where->equalTo('u.status', User::STATUS_ACTIVE);
151
                $select->where->equalTo('u.email_verified', User::EMAIL_VERIFIED_YES);
152
                $select->where->in('u.usertype_id', [UserType::USER, UserType::ADMIN]);
153
                $select->where->equalTo('u.status', User::STATUS_ACTIVE);
154
                $select->where->notEqualTo('u.is_super_user', User::IS_SUPER_USER_YES);
155
 
156
                if($keyword) {
157
                    $select->where->NEST->like('u.email', '%' . $keyword . '%')->or->like('u.first_name', '%' . $keyword . '%')->or->like('u.last_name', '%' . $keyword . '%')->UNNEST;
158
                }
159
 
160
                $dbSelect = new DbSelect($select, $this->adapter);
161
                $paginator = new Paginator($dbSelect);
162
                $paginator->setCurrentPageNumber($page ? $page : 1);
163
                $paginator->setItemCountPerPage(10);
164
 
165
 
166
 
167
 
168
 
169
                $items = [];
170
                $records = $paginator->getCurrentItems();
171
                foreach($records as $record)
172
                {
173
                    $item = [
174
                        'id' => $record['uuid'],
175
                        'name' => $record['first_name'] . ' ' . $record['last_name'],
176
                        'email' => $record['email'],
177
                        'network' => $networks[$record['network_id']],
178
                        'image' => $this->url()->fromRoute('storage',['type' => 'user', 'code' =>  $record['user_uuid'], 'filename' => $record['image']]),
179
                        'link_impersonate' => $this->url()->fromRoute('impersonate/execute',['id' => $record['user_uuid'] ]),
180
 
181
 
182
                    ];
183
                    array_push($items, $item);
184
 
185
                }
186
 
187
                $response = [
188
                    'success' => true,
189
                    'data' => [
190
                        'total' => [
191
                            'count' => $paginator->getTotalItemCount(),
192
                            'pages' => $paginator->getPages()->pageCount,
193
                        ],
194
                        'current' => [
195
                            'items'    => $items,
196
                            'page'     => $paginator->getCurrentPageNumber(),
197
                            'count'    => $paginator->getCurrentItemCount(),
198
                        ]
199
                    ]
200
                ];
201
 
202
 
203
 
204
                return new JsonModel($response);
205
            } else {
206
 
207
 
208
                $viewModel = new ViewModel();
209
                $this->layout()->setTemplate('layout/layout.phtml');
210
                $viewModel->setTemplate('leaders-linked/impersonate/index.phtml');
211
 
212
                return $viewModel;
213
            }
214
        }
215
 
216
        return new JsonModel([
217
            'success' => false,
218
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
219
        ]);
220
 
221
 
222
 
223
 
224
    }
225
 
226
    public function executeAction()
227
    {
228
        $currentUserPlugin = $this->plugin('currentUserPlugin');
229
        $currentUser = $currentUserPlugin->getUser();
230
 
231
        $id = $this->params()->fromRoute('id');
232
        if(!$id) {
233
            return new JsonModel([
234
                'success' => false,
235
                'data' =>  'ERROR_PARAMETERS_ARE_INVALID'
236
            ]);
237
        }
238
 
239
 
240
        $request = $this->getRequest();
241
        if($request->isGet()) {
242
 
243
            $userMapper = UserMapper::getInstance($this->adapter);
244
            $userImpersonate = $userMapper->fetchOneByUuid($id);
245
 
246
            if(!$userImpersonate) {
247
                return new JsonModel([
248
                    'success' => false,
249
                    'data' => 'ERROR_USER_NOT_FOUND'
250
                ]);
251
 
252
 
253
            }
254
 
255
            if($currentUser->id == $userImpersonate->id) {
256
                return new JsonModel([
257
                    'success' => false,
258
                    'data' => 'ERROR_CANNOT_IMPERSONATE_ITSELF',
259
                ]);
260
            }
261
 
262
            if($userImpersonate->is_super_user == User::IS_SUPER_USER_YES) {
263
                return new JsonModel([
264
                    'success' => false,
265
                    'data' =>  'ERROR_CANNOT_IMPERSONATE_A_SUPER_ADMIN',
266
                ]);
267
            }
268
 
269
            if($userImpersonate->status != User::STATUS_ACTIVE || $userImpersonate->email_verified != User::EMAIL_VERIFIED_YES) {
270
                return new JsonModel([
271
                    'success' => false,
272
                    'data' =>  'ERROR_CANNOT_IMPERSONATE_AN_INACTIVE_OR_UNVERIFIED_USER',
273
                ]);
274
            }
275
 
276
            $userMapper->startImpersonate($currentUser->id, $userImpersonate->id);
277
 
278
            $networkMapper = NetworkMapper::getInstance($this->adapter);
279
            $network = $networkMapper->fetchOne($userImpersonate->network_id);
280
 
281
 
282
            if(!$currentUser->one_time_password) {
283
                $one_time_password = Functions::generatePassword(25);
284
 
285
                $currentUser->one_time_password = $one_time_password;
286
 
287
                $userMapper = UserMapper::getInstance($this->adapter);
288
                $userMapper->updateOneTimePassword($currentUser, $one_time_password);
289
            }
290
 
291
 
292
            $sandbox = $this->config['leaderslinked.runmode.sandbox'];
293
            if($sandbox) {
294
                $salt = $this->config['leaderslinked.backend.sandbox_salt'];
295
            } else {
296
                $salt = $this->config['leaderslinked.backend.production_salt'];
297
            }
298
 
299
 
300
 
301
 
302
            $rand = 1000 + mt_rand(1, 999);
303
            $timestamp = time();
304
            $password = md5($currentUser->one_time_password . '-' . $rand . '-' . $timestamp . '-' . $salt);
305
 
306
            $params = [
307
                'user_uuid' => $currentUser->uuid,
308
                'password' => $password,
309
                'rand' => $rand,
310
                'time' => $timestamp,
311
            ];
312
 
313
 
3671 efrain 314
            $currentUserPlugin->clearIdentity();
3639 efrain 315
            $url = 'https://'. $network->main_hostname . '/signin/impersonate' . '?' . http_build_query($params);
316
 
317
            return new JsonModel([
318
                'success' => true,
319
                'data' => $url,
320
 
321
            ]);
322
 
323
 
324
        }
325
 
326
 
327
        return new JsonModel([
328
            'success' => false,
329
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
330
        ]);
331
 
332
    }
333
 
334
 
335
}