Proyectos de Subversion LeadersLinked - Services

Rev

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