Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 958 | Rev 974 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
7
use Laminas\Cache\Storage\Adapter\AbstractAdapter as CacheAdapter;
8
use Laminas\ModuleManager\ModuleEvent;
9
use Laminas\ModuleManager\ModuleManager;
10
use Laminas\Mvc\MvcEvent;
11
use Laminas\Config\Reader\Ini;
12
use Laminas\Permissions\Acl\Acl;
13
use LeadersLinked\Plugin\CurrentUserPlugin;
14
use LeadersLinked\Model\Company;
15
use LeadersLinked\Mapper\UserMapper;
16
use Laminas\Permissions\Acl\Resource\GenericResource;
17
use Laminas\Permissions\Acl\Role\GenericRole;
18
use LeadersLinked\Mapper\CompanyUserMapper;
19
use LeadersLinked\Mapper\CompanyUserRoleMapper;
20
use LeadersLinked\Mapper\RoleMapper;
21
use LeadersLinked\Mapper\CompanyServiceMapper;
22
use LeadersLinked\Model\Service;
23
 
24
class Module
25
{
26
    /**
27
     *
28
     * @var boolean
29
     */
30
    private $isJson;
31
 
32
    /**
33
     *
34
     * @var boolean
35
     */
36
    private $isHtml;
37
 
38
    /**
39
     *
40
     * @var Acl
41
     */
42
    private $acl;
43
 
44
    /**
45
     *
46
     * @var Company
47
     */
48
    private $company;
49
 
50
    /**
51
     *
52
     * @var AdapterInterface
53
     */
54
    private $adapter;
55
 
56
 
57
    /**
58
     *
59
     * @var CacheAdapter
60
     */
61
    private $cache;
62
 
63
    /**
64
     *
65
     * @var CurrentUserPlugin
66
     */
67
    private $currentUser;
68
 
69
 
70
    /**
71
     *
72
     * @var array
73
     */
74
    private $routesAuthorized = [];
75
 
76
    /**
77
     *
78
     * @var boolean
79
     */
80
    private $authByHeaders = false;
81
 
82
    public function init(ModuleManager $moduleManager)
83
    {
84
        $events = $moduleManager->getEventManager();
85
        $events->attach(ModuleEvent::EVENT_MERGE_CONFIG, array($this, 'onMergeConfig'));
86
    }
87
 
88
    public function onMergeConfig(ModuleEvent $event)
89
    {
90
        $configListener = $event->getConfigListener();
91
        $config         = $configListener->getMergedConfig(false);
92
 
93
        $reader = new Ini();
94
        $data = $reader->fromFile('config/leaderslinked.ini');
95
 
96
        $prefix = 'leaderslinked';
97
        foreach($data as $section => $pairs)
98
        {
99
            foreach($pairs as $key => $value)
100
            {
101
                $config[$prefix . '.' . $section . '.' . $key] = $value;
102
            }
103
        }
104
        $configListener->setMergedConfig($config);
105
    }
106
 
107
 
108
    public function getConfig() : array
109
    {
110
        return include __DIR__ . '/../config/module.config.php';
111
    }
112
 
113
    public function onBootstrap(MvcEvent $event)
114
    {
115
        $serviceManager = $event->getApplication()->getServiceManager();
116
        $adapter = $serviceManager->get('leaders-linked-db');
117
       // $logger          = $serviceManager->get('Zend\Log\Logger');
118
 
119
 
120
        $session = $serviceManager->get('leaders-linked-session');
121
        $session->start();
122
 
123
 
124
        $translator = $serviceManager->get('MvcTranslator');
125
        $translator->addTranslationFile(
126
            'phpArray',
127
            __DIR__ . '/i18n/validate.php',
128
            'default'
129
            );
130
 
131
        $translator->addTranslationFile(
132
            'phpArray',
133
            __DIR__ . '/i18n/spanish.php',
134
            'default'
135
            );
136
 
137
        \Laminas\Validator\AbstractValidator::setDefaultTranslator($translator);
138
 
139
 
140
        $this->isHtml = $this->isJson ? false : true;
141
        $this->currentUser = new CurrentUserPlugin($adapter);
142
        $this->initAcl($event);
143
        $eventManager = $event->getApplication()->getEventManager();
144
        $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this,'onDispatchError'], 0);
145
        $eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, [$this,'onRenderError'], 0);
146
 
147
        $sharedManager = $eventManager->getSharedManager();
148
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPreDispatch'], 100);
149
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPosDispatch'], -100);
150
    }
151
 
152
    public function initAcl(MvcEvent $event)
153
    {
154
        $serviceManager = $event->getApplication()->getServiceManager();
155
        $adapter = $serviceManager->get('leaders-linked-db');
156
 
157
        require_once   (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'acl.config.php');
158
 
159
 
160
        $this->acl = new Acl();
161
        $resources = getAclResources();
162
        foreach($resources as $resourceName)
163
        {
164
           // echo $resourceName . PHP_EOL;
165
 
166
            $this->acl->addResource(new GenericResource($resourceName));
167
        }
168
 
169
 
170
 
171
 
172
        $company = $this->currentUser->getCompany();
173
        if($company) {
174
            $companyServiceMapper = CompanyServiceMapper::getInstance($adapter);
175
            $companyServiceMicrolearning = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::MICRO_LEARNING);
959 geraldo 176
            $companyServicePerformance = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::PERFORMANCE_EVALUATION);
1 www 177
            $companyServiceAutoEvaluation = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::SELF_EVALUATION);
178
            $roles = getAclRolesCompany();
179
 
180
 
181
            $user = $this->currentUser->getUser();
182
 
183
            $this->acl->addRole(new GenericRole($user->usertype_id));
184
 
185
            $companyUserMapper = CompanyUserMapper::getInstance($adapter);
186
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);
187
 
188
            if($companyUser && $companyUser->creator) {
189
                if(isset($roles['creator'])) {
190
 
191
                    foreach($roles['creator'] as $resourceName)
192
                    {
193
                        $this->acl->allow($user->usertype_id, $resourceName);
194
                    }
195
 
196
 
197
                    if($companyServiceMicrolearning) {
198
                        foreach($roles['creator-microlearning'] as $resourceName)
199
                        {
200
                            $this->acl->allow($user->usertype_id, $resourceName);
201
                        }
202
                    }
203
 
204
                    if($companyServiceAutoEvaluation) {
205
                        foreach($roles['creator-self-evaluation'] as $resourceName)
206
                        {
207
                            $this->acl->allow($user->usertype_id, $resourceName);
208
                        }
209
                    }
959 geraldo 210
 
211
 
212
                    if($companyServicePerformance) {
213
                        foreach($roles['creator-performance-evaluation'] as $resourceName)
214
                        {
215
                            $this->acl->allow($user->usertype_id, $resourceName);
216
                        }
217
                    }
1 www 218
 
219
                }
220
 
221
            } else {
222
 
223
                $companyUserRoleMapper = CompanyUserRoleMapper::getInstance($this->adapter);
224
                $companyUserRoles = $companyUserRoleMapper->fetchAllByCompanyIdAndUserId($company->id, $user->id);
225
 
226
                $roleMapper = RoleMapper::getInstance($this->adapter);
227
 
228
 
229
                foreach($companyUserRoles as $companyUserRole)
230
                {
231
                    $role = $roleMapper->fetchOne($companyUserRole->role_id);
232
                    if($role) {
233
                        if($role->service_id == Service::SELF_EVALUATION && !$companyServiceAutoEvaluation) {
234
                            continue;
235
                        }
236
 
237
                        if($role->service_id == Service::MICRO_LEARNING && !$companyServiceMicrolearning) {
238
                            continue;
239
                        }
240
 
241
                        if(isset($roles[ $role->code ] )) {
242
 
243
 
244
                            foreach($roles[ $role->code ] as $resourceName)
245
                            {
246
                                $this->acl->allow($user->usertype_id, $resourceName);
247
                            }
248
                        }
249
                    }
250
                }
251
 
252
            }
253
 
254
 
255
 
256
 
257
        }  else {
258
            $usertypes = getAclUsertype();
259
            foreach($usertypes as $usertype => $resources)
260
            {
261
                $this->acl->addRole(new GenericRole($usertype));
262
                foreach ($resources as $resourceName)
263
                {
264
                    $this->acl->allow($usertype, $resourceName);
265
                }
266
            }
267
 
268
        }
269
 
270
 
271
        $event->getViewModel()->setVariable('acl', $this->acl);
272
    }
273
 
274
    public function onDispatchError(MvcEvent $event)
275
    {
276
        $this->processError($event);
277
    }
278
 
279
    public function onRenderError(MvcEvent $event)
280
    {
281
        $this->processError($event);
282
    }
283
 
284
    public function sendResponse(\Laminas\Http\Response $response, $data)
285
    {
286
 
287
 
288
        if($this->isJson) {
289
            $headers = $response->getHeaders();
290
            $headers->clearHeaders();
291
            $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
292
 
293
            $response->setStatusCode(200);
294
            $response->setContent(json_encode($data));
295
            $response->send();
296
 
297
 
298
        } else {
299
            throw new \Exception($data['data']);
300
        }
301
        exit;
302
    }
303
 
304
    public function processError(MvcEvent $event)
305
    {
306
 
307
 
308
        $request =  $event->getRequest();
309
        if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
310
 
311
            $error = $event->getError();
312
            if (!$error) {
313
                return;
314
            }
315
 
316
            $response = $event->getResponse();
317
 
318
            if('error-exception' == $error) {
319
                $exception = $event->getParam('exception');
320
                error_log($exception->getCode() . ' ' . $exception->getMessage());
321
                //error_log($exception->getTraceAsString());
322
 
323
 
324
                $data = [
325
                    'success' => false,
326
                    'data' => 'An error occurred during execution; please try again later.'
327
                ];
328
 
329
            } else if('error-router-no-match' == $error) {
330
                $data = [
331
                    'success' => false,
332
                    'data' => 'Resource not found.'
333
 
334
                ];
335
            } else if(' error-controller-not-found' == $error) {
336
                $data = [
337
                    'success' => false,
338
                    'data' => 'Controller not found.'
339
 
340
                ];
341
            } else {
342
                $data = [
343
                    'success' => false,
344
                    'data' => 'Unknow error.' , 'error' => $error
345
 
346
                ];
347
            }
348
 
349
 
350
 
351
            $this->sendResponse($response, $data);
352
        }
353
 
354
        $this->initAcl($event);
355
    }
356
 
357
 
358
    public function authPreDispatch(MvcEvent $event)
359
    {
360
        $serviceManager = $event->getApplication()->getServiceManager();
361
        $adapter = $serviceManager->get('leaders-linked-db');
362
 
363
        $userTypeId = $this->currentUser->getUserTypeId();
364
 
365
 
366
 
367
 
368
        $routeName = $event->getRouteMatch()->getMatchedRouteName();
369
 
370
 
371
 
372
        if($this->acl->isAllowed($userTypeId, $routeName)) {
373
            $user = $this->currentUser->getUser();
374
 
375
 
376
 
377
            /*if($user && !in_array($routeName, ['check-session', 'dashboard'])) {
378
 
379
 
380
            }*/
381
 
382
            if($user) {
383
                $userMapper = UserMapper::getInstance($adapter);
384
                $userMapper->updateLastActivity($user->id);
385
            }
386
 
387
        } else {
388
 
389
 
390
            /*
391
            if($this->authByHeaders) {
392
                $response = $event->getResponse();
393
                $headers = $response->getHeaders();
394
                $headers->clearHeaders();
395
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
396
 
397
                $response->setStatusCode(401);
398
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
399
                $response->send();
400
                exit;
401
 
402
            }*/
403
 
404
 
405
            //print_r($this->routesAuthorized);
406
           // echo 'sin permiso'; exit;
407
 
408
 
409
            $this->currentUser->clearIdentity();
410
 
411
 
412
            if($this->isJson) {
413
                $response = $event->getResponse();
414
                $headers = $response->getHeaders();
415
                $headers->clearHeaders();
416
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
417
 
418
                $response->setStatusCode(200);
419
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
420
                $response->send();
421
            } else {
422
                $url = $event->getRouter()->assemble([], ['name' => 'signout']);
423
 
424
                $response = $event->getResponse();
425
                $headers = $response->getHeaders();
426
                $headers->clearHeaders();
427
                $headers->addHeaderLine('Location', $url);
428
 
429
                $response->setStatusCode(302);
430
                $response->send();
431
            }
432
            exit;
433
        }
434
 
435
 
436
    }
437
 
438
 
439
    public function authPosDispatch(MvcEvent $event)
440
    {
441
 
442
    }
443
 
444
 
445
}