Proyectos de Subversion LeadersLinked - Backend

Rev

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