Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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