Proyectos de Subversion LeadersLinked - Services

Rev

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