Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 1 | Rev 958 | 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);
176
 
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
                    }
957 geraldo 210
 
211
                    if($companyServiceAutoEvaluation) {
212
                        foreach($roles['creator-perfomance-evaluation'] as $resourceName)
213
                        {
214
                            $this->acl->allow($user->usertype_id, $resourceName);
215
                        }
216
                    }
1 www 217
 
218
                }
219
 
220
            } else {
221
 
222
                $companyUserRoleMapper = CompanyUserRoleMapper::getInstance($this->adapter);
223
                $companyUserRoles = $companyUserRoleMapper->fetchAllByCompanyIdAndUserId($company->id, $user->id);
224
 
225
                $roleMapper = RoleMapper::getInstance($this->adapter);
226
 
227
 
228
                foreach($companyUserRoles as $companyUserRole)
229
                {
230
                    $role = $roleMapper->fetchOne($companyUserRole->role_id);
231
                    if($role) {
232
                        if($role->service_id == Service::SELF_EVALUATION && !$companyServiceAutoEvaluation) {
233
                            continue;
234
                        }
235
 
236
                        if($role->service_id == Service::MICRO_LEARNING && !$companyServiceMicrolearning) {
237
                            continue;
238
                        }
239
 
240
                        if(isset($roles[ $role->code ] )) {
241
 
242
 
243
                            foreach($roles[ $role->code ] as $resourceName)
244
                            {
245
                                $this->acl->allow($user->usertype_id, $resourceName);
246
                            }
247
                        }
248
                    }
249
                }
250
 
251
            }
252
 
253
 
254
 
255
 
256
        }  else {
257
            $usertypes = getAclUsertype();
258
            foreach($usertypes as $usertype => $resources)
259
            {
260
                $this->acl->addRole(new GenericRole($usertype));
261
                foreach ($resources as $resourceName)
262
                {
263
                    $this->acl->allow($usertype, $resourceName);
264
                }
265
            }
266
 
267
        }
268
 
269
 
270
        $event->getViewModel()->setVariable('acl', $this->acl);
271
    }
272
 
273
    public function onDispatchError(MvcEvent $event)
274
    {
275
        $this->processError($event);
276
    }
277
 
278
    public function onRenderError(MvcEvent $event)
279
    {
280
        $this->processError($event);
281
    }
282
 
283
    public function sendResponse(\Laminas\Http\Response $response, $data)
284
    {
285
 
286
 
287
        if($this->isJson) {
288
            $headers = $response->getHeaders();
289
            $headers->clearHeaders();
290
            $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
291
 
292
            $response->setStatusCode(200);
293
            $response->setContent(json_encode($data));
294
            $response->send();
295
 
296
 
297
        } else {
298
            throw new \Exception($data['data']);
299
        }
300
        exit;
301
    }
302
 
303
    public function processError(MvcEvent $event)
304
    {
305
 
306
 
307
        $request =  $event->getRequest();
308
        if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
309
 
310
            $error = $event->getError();
311
            if (!$error) {
312
                return;
313
            }
314
 
315
            $response = $event->getResponse();
316
 
317
            if('error-exception' == $error) {
318
                $exception = $event->getParam('exception');
319
                error_log($exception->getCode() . ' ' . $exception->getMessage());
320
                //error_log($exception->getTraceAsString());
321
 
322
 
323
                $data = [
324
                    'success' => false,
325
                    'data' => 'An error occurred during execution; please try again later.'
326
                ];
327
 
328
            } else if('error-router-no-match' == $error) {
329
                $data = [
330
                    'success' => false,
331
                    'data' => 'Resource not found.'
332
 
333
                ];
334
            } else if(' error-controller-not-found' == $error) {
335
                $data = [
336
                    'success' => false,
337
                    'data' => 'Controller not found.'
338
 
339
                ];
340
            } else {
341
                $data = [
342
                    'success' => false,
343
                    'data' => 'Unknow error.' , 'error' => $error
344
 
345
                ];
346
            }
347
 
348
 
349
 
350
            $this->sendResponse($response, $data);
351
        }
352
 
353
        $this->initAcl($event);
354
    }
355
 
356
 
357
    public function authPreDispatch(MvcEvent $event)
358
    {
359
        $serviceManager = $event->getApplication()->getServiceManager();
360
        $adapter = $serviceManager->get('leaders-linked-db');
361
 
362
        $userTypeId = $this->currentUser->getUserTypeId();
363
 
364
 
365
 
366
 
367
        $routeName = $event->getRouteMatch()->getMatchedRouteName();
368
 
369
 
370
 
371
        if($this->acl->isAllowed($userTypeId, $routeName)) {
372
            $user = $this->currentUser->getUser();
373
 
374
 
375
 
376
            /*if($user && !in_array($routeName, ['check-session', 'dashboard'])) {
377
 
378
 
379
            }*/
380
 
381
            if($user) {
382
                $userMapper = UserMapper::getInstance($adapter);
383
                $userMapper->updateLastActivity($user->id);
384
            }
385
 
386
        } else {
387
 
388
 
389
            /*
390
            if($this->authByHeaders) {
391
                $response = $event->getResponse();
392
                $headers = $response->getHeaders();
393
                $headers->clearHeaders();
394
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
395
 
396
                $response->setStatusCode(401);
397
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
398
                $response->send();
399
                exit;
400
 
401
            }*/
402
 
403
 
404
            //print_r($this->routesAuthorized);
405
           // echo 'sin permiso'; exit;
406
 
407
 
408
            $this->currentUser->clearIdentity();
409
 
410
 
411
            if($this->isJson) {
412
                $response = $event->getResponse();
413
                $headers = $response->getHeaders();
414
                $headers->clearHeaders();
415
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
416
 
417
                $response->setStatusCode(200);
418
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
419
                $response->send();
420
            } else {
421
                $url = $event->getRouter()->assemble([], ['name' => 'signout']);
422
 
423
                $response = $event->getResponse();
424
                $headers = $response->getHeaders();
425
                $headers->clearHeaders();
426
                $headers->addHeaderLine('Location', $url);
427
 
428
                $response->setStatusCode(302);
429
                $response->send();
430
            }
431
            exit;
432
        }
433
 
434
 
435
    }
436
 
437
 
438
    public function authPosDispatch(MvcEvent $event)
439
    {
440
 
441
    }
442
 
443
 
444
}