Proyectos de Subversion LeadersLinked - Services

Rev

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