Proyectos de Subversion LeadersLinked - Services

Rev

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