Proyectos de Subversion LeadersLinked - Services

Rev

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