Proyectos de Subversion LeadersLinked - Services

Rev

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