Proyectos de Subversion LeadersLinked - Services

Rev

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