Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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