Proyectos de Subversion LeadersLinked - Services

Rev

Rev 86 | Rev 88 | 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;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
7
use Laminas\ModuleManager\ModuleEvent;
8
use Laminas\ModuleManager\ModuleManager;
9
use Laminas\Mvc\MvcEvent;
10
use Laminas\Config\Reader\Ini;
11
use Laminas\Permissions\Acl\Acl;
12
use Laminas\Permissions\Acl\Role\GenericRole;
13
use LeadersLinked\Plugin\CurrentUserPlugin;
14
use LeadersLinked\Mapper\UserMapper;
15
use LeadersLinked\Authentication\AuthTokenAdapter;
16
use Laminas\Authentication\AuthenticationService;
17
use Laminas\Permissions\Acl\Resource\GenericResource;
18
use LeadersLinked\Model\UserType;
19
use LeadersLinked\Plugin\CurrentNetworkPlugin;
20
use LeadersLinked\Model\Network;
21
use LeadersLinked\Model\User;
22
use LeadersLinked\Mapper\CompanyUserMapper;
23
use LeadersLinked\Model\CompanyUser;
24
use LeadersLinked\Mapper\CompanyMapper;
25
use LeadersLinked\Mapper\CompanyServiceMapper;
26
use LeadersLinked\Model\Service;
27
 
28
use LeadersLinked\Library\Functions;
29
use LeadersLinked\Mapper\DailyPulseMapper;
30
use LeadersLinked\Model\DailyPulse;
31
use LeadersLinked\Mapper\OrganizationPositionMapper;
32
use LeadersLinked\Mapper\KnowledgeAreaCategoryJobDescriptionMapper;
33
use LeadersLinked\Mapper\MyCoachCategoryJobDescriptionMapper;
34
use LeadersLinked\Mapper\KnowledgeAreaCategoryUserMapper;
35
use LeadersLinked\Mapper\MyCoachCategoryUserMapper;
23 efrain 36
use Firebase\JWT\JWT;
37
use Firebase\JWT\Key;
38
use LeadersLinked\Mapper\JwtTokenMapper;
39
use LeadersLinked\Authentication\AuthUserIdAdapter;
1 efrain 40
 
41
class Module
42
{
43
    /**
44
     *
45
     * @var Acl
46
     */
47
    private $acl;
48
 
49
    /**
50
     *
51
     * @var AdapterInterface
52
     */
53
    private $adapter;
54
 
55
    /**
56
     *
57
     * @var CurrentUserPlugin
58
     */
59
    private $currentUserPlugin;
60
 
61
    /**
62
     *
63
     * @var CurrentNetworkPlugin
64
     */
65
    private $currentNetworkPlugin;
66
 
67
    /**
68
     *
69
     * @var array
70
     */
71
    private $routesAuthorized = [];
72
 
73
    /**
74
     *
75
     * @var boolean
76
     */
23 efrain 77
    private $authByOTP = false;
1 efrain 78
 
23 efrain 79
    /**
80
     *
81
     * @var boolean
82
     */
83
    private $authByJWT = false;
1 efrain 84
 
23 efrain 85
 
1 efrain 86
    /**
87
     *
88
     * @var array
89
     */
90
    private $config;
91
 
92
 
93
 
94
    public function init(ModuleManager $moduleManager)
95
    {
96
        $events = $moduleManager->getEventManager();
97
        $events->attach(ModuleEvent::EVENT_MERGE_CONFIG, array($this, 'onMergeConfig'));
98
    }
99
 
100
    public function onMergeConfig(ModuleEvent $event)
101
    {
102
        $configListener = $event->getConfigListener();
103
        $this->config   = $configListener->getMergedConfig(false);
104
 
105
        $reader = new Ini();
106
        $data = $reader->fromFile('config/leaderslinked.ini');
107
 
108
        $prefix = 'leaderslinked';
109
        foreach($data as $section => $pairs)
110
        {
111
            foreach($pairs as $key => $value)
112
            {
113
                $this->config[$prefix . '.' . $section . '.' . $key] = $value;
114
            }
115
        }
116
        $configListener->setMergedConfig($this->config);
117
    }
118
 
119
 
120
    public function getConfig() : array
121
    {
122
        return include __DIR__ . '/../config/module.config.php';
123
    }
124
 
125
    public function onBootstrap(MvcEvent $event)
126
    {
86 efrain 127
 
68 efrain 128
        $serviceManager = $event->getApplication()->getServiceManager();
55 efrain 129
 
130
 
68 efrain 131
        $eventManager = $event->getApplication()->getEventManager();
132
        $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this,'onDispatchError'], 0);
133
        $eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, [$this,'onRenderError'], 0);
134
 
135
 
72 efrain 136
        //$corsRequestListener = $serviceManager->get('corsRequestListener');
137
        //$corsRequestListener->attach($eventManager);
68 efrain 138
 
139
 
1 efrain 140
        $adapter = $serviceManager->get('leaders-linked-db');
141
       // $logger          = $serviceManager->get('Zend\Log\Logger');
142
 
143
 
144
        $session = $serviceManager->get('leaders-linked-session');
145
        $session->start();
146
 
147
 
148
        $translator = $serviceManager->get('MvcTranslator');
149
        $translator->addTranslationFile(
150
            'phpArray',
151
            __DIR__ . '/i18n/validate.php',
152
            'default'
153
            );
154
 
155
        $translator->addTranslationFile(
156
            'phpArray',
157
            __DIR__ . '/i18n/spanish.php',
158
            'default'
159
            );
160
 
86 efrain 161
 
87 efrain 162
 
86 efrain 163
 
164
 
165
 
1 efrain 166
        \Laminas\Validator\AbstractValidator::setDefaultTranslator($translator);
167
 
168
 
169
        $headers  = $event->getRequest()->getHeaders();
170
        if($headers->has('token')) {
171
            $device_uuid = Functions::sanitizeFilterString($headers->get('token')->getFieldValue());
172
        } else {
173
            $device_uuid = '';
174
        }
175
        if($headers->has('secret')) {
176
            $password =  Functions::sanitizeFilterString($headers->get('secret')->getFieldValue());
177
        } else {
178
            $password = '';
179
        }
180
        if($headers->has('rand')) {
181
            $rand =  Functions::sanitizeFilterString($headers->get('rand')->getFieldValue());
182
        } else {
183
            $rand = 0;
184
        }
185
        if($headers->has('created')) {
186
            $timestamp =  Functions::sanitizeFilterString($headers->get('created')->getFieldValue());
187
        } else {
188
            $timestamp = 0;
189
        }
190
 
191
 
4 efrain 192
 
1 efrain 193
        $this->currentNetworkPlugin = new CurrentNetworkPlugin($adapter);
194
        if(!$this->currentNetworkPlugin->hasNetwork()) {
43 efrain 195
 
1 efrain 196
            $response = $event->getResponse();
45 efrain 197
            $code = 200;
198
            $content = json_encode(['success' => false, 'data' => '200 Unauthorized - Private network - not found', 'fatal' => true]);
43 efrain 199
            $this->sendResponse($response, $code, $content);
200
 
1 efrain 201
        }
202
 
203
        if($this->currentNetworkPlugin->getNetwork()->status == Network::STATUS_INACTIVE) {
43 efrain 204
 
1 efrain 205
            $response = $event->getResponse();
45 efrain 206
            $code = 200;
207
            $content = json_encode(['success' => false, 'data' => '200 Unauthorized - Private network - inactive', 'fatal' => true]);
43 efrain 208
            $this->sendResponse($response, $code, $content);
209
 
1 efrain 210
        }
211
 
212
 
23 efrain 213
        $this->authByOTP = false;
1 efrain 214
        if($device_uuid && $password && $rand && $timestamp) {
23 efrain 215
            $this->authByOTP = true;
1 efrain 216
 
217
 
218
            $tokenAuthAdapter = new AuthTokenAdapter($adapter);
219
            $tokenAuthAdapter->setData($device_uuid, $password, $timestamp, $rand);
220
 
221
            $authService = new AuthenticationService();
222
            $result = $authService->authenticate($tokenAuthAdapter);
223
            if($result->getCode() != \Laminas\Authentication\Result::SUCCESS) {
43 efrain 224
 
1 efrain 225
                $response = $event->getResponse();
43 efrain 226
                $code = 200;
227
                $content = json_encode(['success' => false, 'data' => $result->getMessages()[0], 'fatal' => true]);
228
                $this->sendResponse($response, $code, $content);
229
 
1 efrain 230
            }
231
 
232
        }
23 efrain 233
 
234
        $this->authByJWT = false;
235
        $headers = getallheaders();
34 efrain 236
 
237
        if(!empty($headers['authorization']) || !empty($headers['Authorization'])) {
23 efrain 238
 
34 efrain 239
            $token = trim(empty($headers['authorization']) ? $headers['Authorization'] : $headers['authorization']);
240
 
241
 
23 efrain 242
            if (substr($token, 0, 6 ) == 'Bearer') {
43 efrain 243
 
23 efrain 244
 
245
                $token = trim(substr($token, 7));
246
 
247
                if(!empty($this->config['leaderslinked.jwt.key'])) {
248
                    $key = $this->config['leaderslinked.jwt.key'];
249
 
250
 
251
                    try {
252
                        $payload = JWT::decode($token, new Key($key, 'HS256'));
253
 
254
 
255
                        if(empty($payload->iss) || $payload->iss != $_SERVER['HTTP_HOST']) {
43 efrain 256
 
23 efrain 257
                            $response = $event->getResponse();
45 efrain 258
                            $code = 200;
43 efrain 259
                            $content = json_encode(['success' => false, 'data' => 'Unauthorized - JWT - Wrong server', 'fatal' => true]);
260
                            $this->sendResponse($response, $code, $content);
23 efrain 261
 
43 efrain 262
 
263
 
23 efrain 264
                        }
265
 
266
                        $uuid = empty($payload->uuid) ? '' : $payload->uuid;
267
                        if($uuid) {
268
                            $jwtTokenMapper = JwtTokenMapper::getInstance($adapter);
269
                            $jwtToken = $jwtTokenMapper->fetchOneByUuid($uuid);
270
                            if($jwtToken) {
271
 
272
                                $_SESSION['aes'] = $jwtToken->aes;
273
 
274
                                if($jwtToken->user_id) {
275
                                    $authByUserId = new AuthUserIdAdapter($adapter);
276
                                    $authByUserId->setData($jwtToken->user_id);
277
 
278
                                    $authService = new AuthenticationService();
279
                                    $result = $authService->authenticate($authByUserId);
280
                                    if($result->getCode() != \Laminas\Authentication\Result::SUCCESS) {
43 efrain 281
 
23 efrain 282
                                        $response = $event->getResponse();
45 efrain 283
                                        $code = 200;
43 efrain 284
                                        $content = json_encode(['success' => false, 'data' => $result->getMessages()[0], 'fatal' => true]);
285
                                        $this->sendResponse($response, $code, $content);
23 efrain 286
 
287
                                    }
24 efrain 288
 
289
                                    $this->authByJWT = true;
23 efrain 290
                                }
291
 
292
 
293
                            } else {
294
                                $response = $event->getResponse();
45 efrain 295
                                $code = 200;
43 efrain 296
                                $content = json_encode(['success' => false, 'data' => 'Unauthorized - JWT - Expired', 'fatal' => true]);
297
                                $this->sendResponse($response, $code, $content);
298
 
23 efrain 299
                            }
300
 
301
                        }
302
                    } catch(\Exception $e) {
43 efrain 303
 
23 efrain 304
                        $response = $event->getResponse();
45 efrain 305
                        $code = 200;
43 efrain 306
                        $content = json_encode(['success' => false, 'data' => 'Unauthorized - JWT - Wrong key', 'fatal' => true]);
307
                        $this->sendResponse($response, $code, $content);
308
 
23 efrain 309
                    }
310
                }
311
            }
312
        }
1 efrain 313
 
314
 
315
 
316
        if(empty($_SERVER['REDIRECT_URL'])) {
317
            if(empty($_SERVER['REQUEST_URI'])) {
318
                $routeName = '';
319
 
320
            } else {
321
                $routeName = $_SERVER['REQUEST_URI'];
322
            }
323
 
324
        } else {
325
            $routeName = $_SERVER['REDIRECT_URL'];
326
 
327
        }
328
 
329
 
330
        $routeName = strtolower(trim($routeName));
331
        if(strlen($routeName) > 0 && substr($routeName, 0, 1) == '/') {
332
            $routeName = substr($routeName, 1);
333
        }
334
 
335
        $this->currentUserPlugin = new CurrentUserPlugin($adapter);
336
 
337
 
23 efrain 338
        if($this->authByOTP && substr($routeName, 0, 8) == 'services') {
1 efrain 339
            $checkUserForNetwork = false;
340
        } else {
341
            if($this->currentUserPlugin->hasIdentity()) {
342
 
343
                $checkUserForNetwork = true;
344
            } else {
345
                $checkUserForNetwork = false;
346
            }
347
        }
348
 
349
        if($checkUserForNetwork) {
350
            if(!$routeName || in_array($routeName, ['signout', 'signin', 'home'])) {
351
                $checkUserForNetwork = false;
352
            }
353
        }
354
 
355
        if($checkUserForNetwork) {
356
 
357
 
358
 
359
            if($this->currentUserPlugin->getUser()->network_id != $this->currentNetworkPlugin->getNetworkId()) {
360
                $response = $event->getResponse();
45 efrain 361
                $this->sendResponse($response, ['success' => false, 'data' => '200 Unauthorized - The user is not part of this private network', 'fatal' => true]);
1 efrain 362
                exit;
363
            }
364
        }
365
 
366
 
367
 
368
        $this->initAcl($event);
68 efrain 369
 
1 efrain 370
 
87 efrain 371
        $redirect_url = empty($_SERVER['REDIRECT_URL']) ? $_SERVER['REQUEST_URI'] : $_SERVER['REDIRECT_URL'];
372
 
373
        error_log('redirect_url = ' . $redirect_url);
374
        if(str_contains($redirect_url, 'send')) {
375
            $response = $event->getResponse();
376
 
377
            Functions::sendResponseJson($response, 'aqui1');
378
 
379
 
380
        }
381
 
1 efrain 382
        $sharedManager = $eventManager->getSharedManager();
383
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPreDispatch'], 100);
384
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPosDispatch'], -100);
385
    }
386
 
387
    public function initAcl(MvcEvent $event)
388
    {
389
 
390
        $serviceManager = $event->getApplication()->getServiceManager();
391
        $adapter = $serviceManager->get('leaders-linked-db');
392
 
393
 
394
        require_once   (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'acl.config.php');
395
 
396
 
397
        $this->acl = new Acl();
398
        $resources = getAclResources();
399
 
400
        foreach($resources as $resourceName)
401
        {
402
            $this->acl->addResource(new GenericResource($resourceName));
403
        }
404
 
405
        $usertypes = getAclUsertype();
406
        foreach($usertypes as $usertype => $resources)
407
        {
408
            $this->acl->addRole(new GenericRole($usertype));
409
            foreach ($resources as $resourceName)
410
            {
411
                $this->acl->allow($usertype, $resourceName);
412
            }
413
        }
414
 
415
 
416
 
417
        if($this->currentUserPlugin->hasIdentity() && $this->currentUserPlugin->getUser()->is_super_user == User::IS_SUPER_USER_YES) {
418
 
419
            $resources =  getAclSuperAdmin();
420
            foreach($resources as $resourceName)
421
            {
422
                $this->acl->allow(UserType::ADMIN, $resourceName);
423
            }
424
        }
425
 
426
 
427
 
428
        $allowMyCoach = false;
429
        $allowKnowledgeArea = false;
430
        $allowDailyPulse = false;
431
 
432
 
433
 
434
        $companyMapper = CompanyMapper::getInstance($adapter);
435
        $company = $companyMapper->fetchDefaultForNetworkByNetworkId($this->currentNetworkPlugin->getNetwork()->id);
436
 
437
 
438
        if($company) {
439
 
440
            $companyServiceMapper = CompanyServiceMapper::getInstance($adapter);
441
            $companyService = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::DAILY_PULSE);
442
 
443
 
444
            $companyUserMapper = CompanyUserMapper::getInstance($adapter);
445
            $companyUser = $companyUserMapper->fetchOneAcceptedByCompanyIdAndUserId($company->id,  $this->currentUserPlugin->getUserId());
446
 
447
 
448
 
449
 
450
            if($companyService) {
451
 
452
                $dailyPulseMapper = DailyPulseMapper::getInstance($adapter);
453
                $dailyPulse = $dailyPulseMapper->fetchOneByCompanyId($company->id);
454
 
455
                if($dailyPulse) {
456
                    $privacy = $dailyPulse->privacy;
457
 
458
                } else {
459
                    $privacy = DailyPulse::PRIVACY_COMPANY;
460
                }
461
 
462
                if($privacy ==  DailyPulse::PRIVACY_PUBLIC) {
463
                    $allowDailyPulse = true;
464
                } else {
465
                    $allowDailyPulse = !empty($companyUser);
466
                }
467
 
468
 
469
            }
470
 
471
            $job_description_ids = [];
472
 
473
            $organizationPositionMapper = OrganizationPositionMapper::getInstance($adapter);
474
            $records = $organizationPositionMapper->fetchAllByCompanyIdAndEmployeeId($company->id,  $this->currentUserPlugin->getUserId());
475
            foreach($records as $record)
476
            {
477
                array_push($job_description_ids, $record->job_description_id);
478
            }
479
 
480
 
481
            $companyService = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::KNOWLEDGE_AREA);
482
            if($companyService) {
483
                if($job_description_ids) {
484
 
485
 
486
                    $knowledgeAreaCategoryJobDescriptionMapper = KnowledgeAreaCategoryJobDescriptionMapper::getInstance($adapter);
487
                    $records = $knowledgeAreaCategoryJobDescriptionMapper->fetchAllByCompanyIdAndJobDescriptionIds($company->id, $job_description_ids);
488
 
489
                    if(!empty($records)) {
490
                        $allowKnowledgeArea = true;
491
                    }
492
 
493
                }
494
 
495
                if($companyUser && !$allowKnowledgeArea) {
496
                    $knowledgeAreaCategoryUserMapper = KnowledgeAreaCategoryUserMapper::getInstance($adapter);
497
                    $records = $knowledgeAreaCategoryUserMapper->fetchAllByUserId($companyUser->user_id);
498
                    if(!empty($records)) {
499
                        $allowKnowledgeArea = true;
500
                    }
501
                }
502
            }
503
 
504
            $companyService = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::MY_COACH);
505
            if($companyService) {
506
 
507
 
508
                if($job_description_ids) {
509
 
510
 
511
                    $myCoachCategoryJobDescriptionMapper = MyCoachCategoryJobDescriptionMapper::getInstance($adapter);
512
                    $records = $myCoachCategoryJobDescriptionMapper->fetchAllByCompanyIdAndJobDescriptionIds($company->id, $job_description_ids);
513
 
514
                    if(!empty($records)) {
515
                        $allowKnowledgeArea = true;
516
                    }
517
 
518
                }
519
 
520
                if($companyUser && !$allowMyCoach) {
521
                    $myCoachCategoryUserMapper = MyCoachCategoryUserMapper::getInstance($adapter);
522
                    $records = $myCoachCategoryUserMapper->fetchAllByUserId($companyUser->user_id);
523
                    if(!empty($records)) {
524
                        $allowMyCoach = true;
525
                    }
526
 
527
 
528
                }
529
            }
530
 
531
        } else {
532
            $companyUser = '';
533
        }
534
 
535
 
536
        $usertype = $this->currentUserPlugin->getUserTypeId();
537
        if($allowDailyPulse) {
538
            $resources = getAclDailyPulse();
539
            foreach($resources as $resourceName)
540
            {
541
                $this->acl->allow($usertype, $resourceName);
542
            }
543
        }
544
 
545
        if($allowKnowledgeArea) {
546
            $resources = getAclKnowledgeArea();
547
            foreach($resources as $resourceName)
548
            {
549
                $this->acl->allow($usertype, $resourceName);
550
            }
551
        }
552
 
553
        if($allowMyCoach) {
554
            $resources = getAclMyCoach();
555
 
556
 
557
 
558
            foreach($resources as $resourceName)
559
            {
560
                $this->acl->allow($usertype, $resourceName);
561
            }
562
 
563
        }
564
 
565
 
566
 
567
        if($this->currentNetworkPlugin->getNetwork()->default == Network::DEFAULT_YES) {
568
 
569
            $usertypes = getAclUsertypeDefaultNetwork();
570
            foreach($usertypes as $usertype => $resources)
571
            {
572
 
573
 
574
 
575
                foreach ($resources as $resourceName)
576
                {
577
                    $this->acl->allow($usertype, $resourceName);
578
                }
579
            }
580
 
581
 
582
        } else {
583
 
584
            if($this->currentUserPlugin->hasIdentity()) {
585
 
586
 
587
                if($company) {
588
 
589
 
590
                    if($companyUser) {
591
                        $usertype = $this->currentUserPlugin->getUserTypeId();
592
 
593
                        if($companyUser->creator == CompanyUser::CREATOR_YES) {
594
 
595
                            $resources =  getAclUsertypeOtherNetworkCreator();
596
                            foreach($resources as $resourceName)
597
                            {
598
                                $this->acl->allow($usertype, $resourceName);
599
                            }
600
 
601
                        }
602
                        if($companyUser->creator == CompanyUser::CREATOR_NO) {
603
                            $resources =  getAclUsertypeOtherNetworkNonCreator();
604
                            foreach($resources as $resourceName)
605
                            {
606
                                $this->acl->allow($usertype, $resourceName);
607
                            }
608
                        }
609
                    }
610
                }
611
            }
612
        }
613
 
614
 
615
        $event->getViewModel()->setVariable('acl', $this->acl);
616
 
617
    }
618
 
619
    public function onDispatchError(MvcEvent $event)
620
    {
621
        $this->processError($event);
622
    }
623
 
624
    public function onRenderError(MvcEvent $event)
625
    {
626
        $this->processError($event);
627
    }
628
 
43 efrain 629
    /**
630
     *
631
     * @param \Laminas\Http\Response $response
632
     * @param int $code
633
     * @param string $content
634
     */
635
    public function sendResponse($response, $code, $content)
1 efrain 636
    {
44 efrain 637
        error_log($content);
43 efrain 638
 
44 efrain 639
 
1 efrain 640
        $headers = $response->getHeaders();
641
        $headers->clearHeaders();
642
        $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
643
 
43 efrain 644
        Functions::addCrossSiteToResponse($response);
645
 
646
        $response->setStatusCode($code);
647
        $response->setContent($content); //json_encode($data));
1 efrain 648
        $response->send();
649
        exit;
650
    }
651
 
652
    public function processError(MvcEvent $event)
653
    {
654
        $error = $event->getError();
655
        if (!$error) {
656
            return;
657
        }
658
 
659
        $response = $event->getResponse();
660
        if('error-exception' == $error) {
661
            $exception = $event->getParam('exception');
662
            error_log($exception->getCode() . ' ' . $exception->getMessage());
663
            error_log($exception->getTraceAsString());
43 efrain 664
 
1 efrain 665
            $response = $event->getResponse();
45 efrain 666
            $code = 200;
43 efrain 667
            $content = json_encode(['success' => false, 'data' => $exception->getCode() . ' ' . $exception->getMessage(), 'fatal' => true]);
668
            $this->sendResponse($response, $code, $content);
1 efrain 669
 
670
        } else if('error-router-no-match' == $error) {
43 efrain 671
 
1 efrain 672
            $response = $event->getResponse();
43 efrain 673
            $code = 404;
674
            $content = json_encode(['success' => false, 'data' => 'error-router-no-match', 'fatal' => true]);
675
            $this->sendResponse($response, $code, $content);
1 efrain 676
 
677
 
678
 
679
        } else if(' error-controller-not-found' == $error) {
43 efrain 680
 
1 efrain 681
            $response = $event->getResponse();
43 efrain 682
            $code = 404;
683
            $content = json_encode(['success' => false, 'data' => 'error-controller-not-found', 'fatal' => true]);
684
            $this->sendResponse($response, $code, $content);
1 efrain 685
 
43 efrain 686
 
1 efrain 687
        } else {
688
            $response = $event->getResponse();
45 efrain 689
            $code = 200;
43 efrain 690
            $content = json_encode(['success' => false, 'data' => $error, 'fatal' => true]);
691
            $this->sendResponse($response, $code, $content);
1 efrain 692
 
43 efrain 693
 
1 efrain 694
        }
695
 
696
        exit;
697
 
698
    }
699
 
700
 
701
    public function authPreDispatch(MvcEvent $event)
702
    {
703
 
704
 
705
 
706
 
707
        $serviceManager = $event->getApplication()->getServiceManager();
708
        $adapter = $serviceManager->get('leaders-linked-db');
709
 
710
        $routeName = $event->getRouteMatch()->getMatchedRouteName();
711
 
712
 
713
        $requestMethod = isset($_SERVER['REQUEST_METHOD']) ? trim(strtoupper($_SERVER['REQUEST_METHOD'])) : '';
714
 
715
        if($requestMethod == 'POST' || $requestMethod == 'PUT' || $requestMethod == 'DELETE') {
716
 
717
 
23 efrain 718
            if($this->authByOTP && substr($routeName, 0, 8) == 'services') {
1 efrain 719
                $exclude = true;
720
            } else {
721
                $exclude = false;
722
 
723
                $usertypes = getAclUsertype();
724
 
725
 
726
                foreach($usertypes[UserType::GUEST] as $resourceName)
727
                {
728
                   if($routeName == $resourceName) {
729
                      $exclude = true;
730
                      break;
731
                    }
732
                }
733
            }
734
 
17 efrain 735
            //$exclude = true;
1 efrain 736
 
737
            if(!$exclude) {
738
                $httpToken = isset($_SERVER['HTTP_X_CSRF_TOKEN']) ? $_SERVER['HTTP_X_CSRF_TOKEN'] : '';
739
                $sessionToken = isset($_SESSION['token']) ? $_SESSION['token'] : uniqid();
740
 
741
                unset($_SESSION['token']);
742
                if ( $httpToken != $sessionToken) {
743
                    $response = $event->getResponse();
744
                    $headers = $response->getHeaders();
745
                    $headers->clearHeaders();
746
                    $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
747
 
45 efrain 748
                    $response->setStatusCode(200);
1 efrain 749
                    $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
750
                    $response->send();
751
                    exit;
752
                }
753
 
754
            }
755
        }
756
 
757
 
758
 
759
        if($this->currentUserPlugin->hasIdentity())  {
760
            $user = $this->currentUserPlugin->getUser();
761
            $userTypeId = $user->usertype_id;
762
 
763
 
764
        }  else {
765
 
766
            $userTypeId = UserType::GUEST;
767
        }
768
 
769
 
770
        if($this->acl->isAllowed($userTypeId, $routeName)) {
771
            $user = $this->currentUserPlugin->getUser();
772
 
773
 
774
            if($user) {
775
 
776
                $updateLastActivity = true;
777
                if ('chat' == substr($routeName, 0, 4)) {
778
                    $updateLastActivity = false;
779
                }
780
                if ('inmail' == substr($routeName, 0, 6)) {
781
                    $updateLastActivity = false;
782
                }
783
                if ('check-session' == $routeName) {
784
                    $updateLastActivity = false;
785
                }
786
 
787
 
788
                if($updateLastActivity) {
789
                    $userMapper = UserMapper::getInstance($adapter);
790
                    $userMapper->updateLastActivity($user->id);
791
                }
792
            }
793
 
794
 
795
 
796
        } else {
797
            $response = $event->getResponse();
54 efrain 798
 
45 efrain 799
            $response->setStatusCode(200);
1 efrain 800
            $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
801
            $response->send();
802
            exit;
803
 
804
 
805
 
806
        }
807
 
808
 
809
    }
810
 
811
 
812
    public function authPosDispatch(MvcEvent $event)
813
    {
54 efrain 814
        $response = $event->getResponse();
815
        Functions::addCrossSiteToResponse($response);
1 efrain 816
    }
817
 
818
 
819
 
820
 
821
}