Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7122 | Rev 7134 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
7
use Laminas\ModuleManager\ModuleEvent;
8
use Laminas\ModuleManager\ModuleManager;
9
use Laminas\Mvc\MvcEvent;
10
use Laminas\Config\Reader\Ini;
11
use Laminas\Permissions\Acl\Acl;
12
use Laminas\Permissions\Acl\Role\GenericRole;
13
use LeadersLinked\Plugin\CurrentUserPlugin;
14
use LeadersLinked\Mapper\UserMapper;
15
use LeadersLinked\Authentication\AuthTokenAdapter;
16
use Laminas\Authentication\AuthenticationService;
17
use Laminas\Permissions\Acl\Resource\GenericResource;
18
use LeadersLinked\Model\UserType;
3639 efrain 19
use LeadersLinked\Plugin\CurrentNetworkPlugin;
20
use LeadersLinked\Model\Network;
21
use LeadersLinked\Model\User;
22
use LeadersLinked\Mapper\CompanyUserMapper;
23
use LeadersLinked\Model\CompanyUser;
24
use LeadersLinked\Mapper\CompanyMapper;
5205 efrain 25
use LeadersLinked\Mapper\CompanyServiceMapper;
26
use LeadersLinked\Model\Service;
6849 efrain 27
 
6749 efrain 28
use LeadersLinked\Library\Functions;
7122 efrain 29
use LeadersLinked\Mapper\DailyPulseMapper;
30
use LeadersLinked\Model\DailyPulse;
1 www 31
 
32
class Module
33
{
34
    /**
35
     *
36
     * @var boolean
37
     */
38
    private $isJson;
39
 
40
    /**
41
     *
42
     * @var boolean
43
     */
44
    private $isHtml;
45
 
46
    /**
47
     *
48
     * @var Acl
49
     */
50
    private $acl;
51
 
52
    /**
53
     *
54
     * @var AdapterInterface
55
     */
56
    private $adapter;
57
 
58
    /**
59
     *
60
     * @var CurrentUserPlugin
61
     */
3639 efrain 62
    private $currentUserPlugin;
1 www 63
 
64
    /**
3639 efrain 65
     *
66
     * @var CurrentNetworkPlugin
67
     */
68
    private $currentNetworkPlugin;
69
 
70
    /**
1 www 71
     *
72
     * @var array
73
     */
74
    private $routesAuthorized = [];
75
 
76
    /**
77
     *
78
     * @var boolean
79
     */
80
    private $authByHeaders = false;
81
 
82
    public function init(ModuleManager $moduleManager)
83
    {
84
        $events = $moduleManager->getEventManager();
85
        $events->attach(ModuleEvent::EVENT_MERGE_CONFIG, array($this, 'onMergeConfig'));
86
    }
87
 
88
    public function onMergeConfig(ModuleEvent $event)
89
    {
90
        $configListener = $event->getConfigListener();
91
        $config         = $configListener->getMergedConfig(false);
92
 
93
        $reader = new Ini();
94
        $data = $reader->fromFile('config/leaderslinked.ini');
95
 
96
        $prefix = 'leaderslinked';
97
        foreach($data as $section => $pairs)
98
        {
99
            foreach($pairs as $key => $value)
100
            {
101
                $config[$prefix . '.' . $section . '.' . $key] = $value;
102
            }
103
        }
104
        $configListener->setMergedConfig($config);
105
    }
106
 
107
 
108
    public function getConfig() : array
109
    {
110
        return include __DIR__ . '/../config/module.config.php';
111
    }
112
 
113
    public function onBootstrap(MvcEvent $event)
114
    {
115
        $serviceManager = $event->getApplication()->getServiceManager();
116
        $adapter = $serviceManager->get('leaders-linked-db');
117
       // $logger          = $serviceManager->get('Zend\Log\Logger');
118
 
119
 
120
        $session = $serviceManager->get('leaders-linked-session');
121
        $session->start();
122
 
123
 
124
        $translator = $serviceManager->get('MvcTranslator');
125
        $translator->addTranslationFile(
126
            'phpArray',
127
            __DIR__ . '/i18n/validate.php',
128
            'default'
129
            );
130
 
131
        $translator->addTranslationFile(
132
            'phpArray',
133
            __DIR__ . '/i18n/spanish.php',
134
            'default'
135
            );
136
 
137
        \Laminas\Validator\AbstractValidator::setDefaultTranslator($translator);
138
 
139
 
140
        $headers  = $event->getRequest()->getHeaders();
141
        if($headers->has('Accept')) {
142
            $accept = $headers->get('Accept');
143
            $prioritized = $accept->getPrioritized();
144
 
145
            foreach($prioritized as $key => $value) {
146
                $raw = trim($value->getRaw());
147
 
148
                if(!$this->isJson) {
149
                    $this->isJson = strpos($raw, 'json');
150
                }
151
 
152
            }
153
        } else {
154
            $accept = '';
155
        }
156
        if($headers->has('token')) {
6749 efrain 157
            $device_uuid = Functions::sanitizeFilterString($headers->get('token')->getFieldValue());
1 www 158
        } else {
159
            $device_uuid = '';
160
        }
161
        if($headers->has('secret')) {
6749 efrain 162
            $password =  Functions::sanitizeFilterString($headers->get('secret')->getFieldValue());
1 www 163
        } else {
164
            $password = '';
165
        }
166
        if($headers->has('rand')) {
6749 efrain 167
            $rand =  Functions::sanitizeFilterString($headers->get('rand')->getFieldValue());
1 www 168
        } else {
169
            $rand = 0;
170
        }
171
        if($headers->has('created')) {
6749 efrain 172
            $timestamp =  Functions::sanitizeFilterString($headers->get('created')->getFieldValue());
1 www 173
        } else {
174
            $timestamp = 0;
175
        }
176
 
177
 
3639 efrain 178
 
179
 
180
        $this->currentNetworkPlugin = new CurrentNetworkPlugin($adapter);
181
        if(!$this->currentNetworkPlugin->hasNetwork()) {
3790 efrain 182
            $this->isJson = true;
183
            $response = $event->getResponse();
184
            $this->sendResponse($response, ['success' => false, 'data' => '401 Unauthorized - Private network - not found', 'fatal' => true]);
3639 efrain 185
        }
186
 
187
        if($this->currentNetworkPlugin->getNetwork()->status == Network::STATUS_INACTIVE) {
3790 efrain 188
            $this->isJson = true;
189
            $response = $event->getResponse();
190
            $this->sendResponse($response, ['success' => false, 'data' => '401 Unauthorized - Private network - inactive', 'fatal' => true]);
191
 
3639 efrain 192
        }
193
 
194
 
1 www 195
        $this->authByHeaders = false;
196
        if($device_uuid && $password && $rand && $timestamp) {
197
            $this->authByHeaders = true;
198
 
199
 
200
            $this->isJson = true;
201
 
202
            $tokenAuthAdapter = new AuthTokenAdapter($adapter);
203
            $tokenAuthAdapter->setData($device_uuid, $password, $timestamp, $rand);
204
 
205
            $authService = new AuthenticationService();
206
            $result = $authService->authenticate($tokenAuthAdapter);
207
            if($result->getCode() != \Laminas\Authentication\Result::SUCCESS) {
208
                $response = $event->getResponse();
209
 
210
                $this->sendResponse($response, ['success' => false, 'data' => $result->getMessages()[0], 'fatal' => true]);
211
            }
210 efrain 212
 
213
 
214
 
215
 
216
 
1 www 217
        }
3639 efrain 218
 
1 www 219
 
3639 efrain 220
 
221
        if(empty($_SERVER['REDIRECT_URL'])) {
222
            if(empty($_SERVER['REQUEST_URI'])) {
223
                $routeName = '';
224
 
225
            } else {
226
                $routeName = $_SERVER['REQUEST_URI'];
227
            }
228
 
229
        } else {
230
            $routeName = $_SERVER['REDIRECT_URL'];
231
 
232
        }
233
 
210 efrain 234
 
3639 efrain 235
        $routeName = strtolower(trim($routeName));
236
        if(strlen($routeName) > 0 && substr($routeName, 0, 1) == '/') {
237
            $routeName = substr($routeName, 1);
238
        }
1 www 239
 
3639 efrain 240
        $this->isHtml = $this->isJson ? false : true;
241
        $this->currentUserPlugin = new CurrentUserPlugin($adapter);
1 www 242
 
210 efrain 243
 
3639 efrain 244
        if($this->authByHeaders && substr($routeName, 0, 8) == 'services') {
245
            $checkUserForNetwork = false;
246
        } else {
247
            if($this->currentUserPlugin->hasIdentity()) {
248
 
249
                $checkUserForNetwork = true;
250
            } else {
251
                $checkUserForNetwork = false;
252
            }
253
        }
254
 
255
        if($checkUserForNetwork) {
256
            if(!$routeName || in_array($routeName, ['signout', 'signin', 'home'])) {
257
                $checkUserForNetwork = false;
258
            }
259
        }
260
 
261
        if($checkUserForNetwork) {
262
 
263
 
264
 
265
            if($this->currentUserPlugin->getUser()->network_id != $this->currentNetworkPlugin->getNetworkId()) {
3790 efrain 266
 
267
                $this->isJson = true;
268
                $response = $event->getResponse();
269
                $this->sendResponse($response, ['success' => false, 'data' => '401 Unauthorized - The user is not part of this private network', 'fatal' => true]);
270
 
3639 efrain 271
            }
272
        }
273
 
274
 
275
 
1 www 276
        $this->initAcl($event);
277
        $eventManager = $event->getApplication()->getEventManager();
278
        $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this,'onDispatchError'], 0);
279
        $eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, [$this,'onRenderError'], 0);
280
 
281
        $sharedManager = $eventManager->getSharedManager();
282
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPreDispatch'], 100);
283
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPosDispatch'], -100);
284
    }
285
 
286
    public function initAcl(MvcEvent $event)
287
    {
288
 
3639 efrain 289
        $serviceManager = $event->getApplication()->getServiceManager();
290
        $adapter = $serviceManager->get('leaders-linked-db');
291
 
292
 
1 www 293
        require_once   (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'acl.config.php');
294
 
295
 
296
        $this->acl = new Acl();
297
        $resources = getAclResources();
1979 efrain 298
 
1 www 299
        foreach($resources as $resourceName)
300
        {
301
            $this->acl->addResource(new GenericResource($resourceName));
302
        }
303
 
304
        $usertypes = getAclUsertype();
305
        foreach($usertypes as $usertype => $resources)
306
        {
307
            $this->acl->addRole(new GenericRole($usertype));
308
            foreach ($resources as $resourceName)
309
            {
310
                $this->acl->allow($usertype, $resourceName);
311
            }
312
        }
5205 efrain 313
 
1 www 314
 
3639 efrain 315
 
316
        if($this->currentUserPlugin->hasIdentity() && $this->currentUserPlugin->getUser()->is_super_user == User::IS_SUPER_USER_YES) {
317
 
318
            $resources =  getAclSuperAdmin();
319
            foreach($resources as $resourceName)
320
            {
321
                $this->acl->allow(UserType::ADMIN, $resourceName);
322
            }
323
        }
324
 
325
 
6388 efrain 326
 
327
        $allowMyCoach = false;
5951 efrain 328
        $allowKnowledgeArea = false;
5205 efrain 329
        $allowDailyPulse = false;
330
 
7122 efrain 331
 
332
 
5205 efrain 333
        $companyMapper = CompanyMapper::getInstance($adapter);
334
        $company = $companyMapper->fetchDefaultForNetworkByNetworkId($this->currentNetworkPlugin->getNetwork()->id);
7122 efrain 335
 
336
 
5205 efrain 337
        if($company) {
7122 efrain 338
 
339
            $companyServiceMapper = CompanyServiceMapper::getInstance($adapter);
340
            $companyService = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::DAILY_PULSE);
341
 
342
 
5205 efrain 343
            $companyUserMapper = CompanyUserMapper::getInstance($adapter);
344
            $companyUser = $companyUserMapper->fetchOneAcceptedByCompanyIdAndUserId($company->id,  $this->currentUserPlugin->getUserId());
345
 
346
 
347
 
348
 
7122 efrain 349
            if($companyService) {
350
 
7124 efrain 351
                $dailyPulseMapper = DailyPulseMapper::getInstance($adapter);
7122 efrain 352
                $dailyPulse = $dailyPulseMapper->fetchOneByCompanyId($company->id);
353
 
354
                if($dailyPulse) {
355
                    $privacy = $dailyPulse->privacy;
356
 
357
                } else {
358
                    $privacy = DailyPulse::PRIVACY_COMPANY;
359
                }
360
 
361
                if($privacy ==  DailyPulse::PRIVACY_PUBLIC) {
362
                    $allowDailyPulse = true;
363
                } else {
364
                    $allowDailyPulse = !empty($companyUser);
365
                }
366
 
367
 
5205 efrain 368
            }
7122 efrain 369
 
5951 efrain 370
 
371
            $companyService = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::KNOWLEDGE_AREA);
372
            if($companyService && $companyUser) {
373
                $allowKnowledgeArea = true;
374
            }
375
 
6388 efrain 376
            $companyService = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::MY_COACH);
377
            if($companyService && $companyUser) {
378
                $allowMyCoach = true;
379
            }
380
 
5205 efrain 381
        } else {
382
            $companyUser = '';
383
        }
384
 
6388 efrain 385
 
386
        $usertype = $this->currentUserPlugin->getUserTypeId();
5205 efrain 387
        if($allowDailyPulse) {
388
            $resources = getAclDailyPulse();
389
            foreach($resources as $resourceName)
390
            {
391
                $this->acl->allow($usertype, $resourceName);
392
            }
393
        }
394
 
5951 efrain 395
        if($allowKnowledgeArea) {
396
            $resources = getAclKnowledgeArea();
397
            foreach($resources as $resourceName)
398
            {
399
                $this->acl->allow($usertype, $resourceName);
400
            }
401
        }
5205 efrain 402
 
6388 efrain 403
        if($allowMyCoach) {
404
            $resources = getAclMyCoach();
6481 efrain 405
 
406
 
6388 efrain 407
            foreach($resources as $resourceName)
408
            {
409
                $this->acl->allow($usertype, $resourceName);
410
            }
411
 
412
        }
5951 efrain 413
 
414
 
6388 efrain 415
 
3639 efrain 416
        if($this->currentNetworkPlugin->getNetwork()->default == Network::DEFAULT_YES) {
417
 
418
            $usertypes = getAclUsertypeDefaultNetwork();
419
            foreach($usertypes as $usertype => $resources)
420
            {
5205 efrain 421
 
3639 efrain 422
 
5205 efrain 423
 
3639 efrain 424
                foreach ($resources as $resourceName)
425
                {
426
                    $this->acl->allow($usertype, $resourceName);
427
                }
428
            }
429
 
430
 
431
        } else {
3647 efrain 432
 
3645 efrain 433
            if($this->currentUserPlugin->hasIdentity()) {
3639 efrain 434
 
5205 efrain 435
 
3645 efrain 436
                if($company) {
3639 efrain 437
 
5205 efrain 438
 
3645 efrain 439
                    if($companyUser) {
440
                        $usertype = $this->currentUserPlugin->getUserTypeId();
3639 efrain 441
 
3645 efrain 442
                        if($companyUser->creator == CompanyUser::CREATOR_YES) {
443
 
444
                            $resources =  getAclUsertypeOtherNetworkCreator();
445
                            foreach($resources as $resourceName)
446
                            {
447
                                $this->acl->allow($usertype, $resourceName);
448
                            }
449
 
3639 efrain 450
                        }
3645 efrain 451
                        if($companyUser->creator == CompanyUser::CREATOR_NO) {
452
                            $resources =  getAclUsertypeOtherNetworkNonCreator();
453
                            foreach($resources as $resourceName)
454
                            {
455
                                $this->acl->allow($usertype, $resourceName);
456
                            }
3639 efrain 457
                        }
458
                    }
459
                }
3647 efrain 460
            }
3639 efrain 461
        }
462
 
463
 
1 www 464
        $event->getViewModel()->setVariable('acl', $this->acl);
465
 
466
    }
467
 
468
    public function onDispatchError(MvcEvent $event)
469
    {
470
        $this->processError($event);
471
    }
472
 
473
    public function onRenderError(MvcEvent $event)
474
    {
475
        $this->processError($event);
476
    }
477
 
478
    public function sendResponse(\Laminas\Http\Response $response, $data)
479
    {
480
 
481
 
482
        if($this->isJson) {
483
            $headers = $response->getHeaders();
484
            $headers->clearHeaders();
485
            $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
486
 
487
            $response->setStatusCode(200);
488
            $response->setContent(json_encode($data));
489
            $response->send();
490
 
491
        } else {
492
            throw new \Exception($data['data']);
493
        }
494
        exit;
495
    }
496
 
497
    public function processError(MvcEvent $event)
498
    {
499
 
500
        $request =  $event->getRequest();
501
        if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
502
 
503
            $error = $event->getError();
504
            if (!$error) {
505
                return;
506
            }
507
 
508
            $response = $event->getResponse();
509
 
510
            if('error-exception' == $error) {
511
                $exception = $event->getParam('exception');
512
                error_log($exception->getCode() . ' ' . $exception->getMessage());
513
                error_log($exception->getTraceAsString());
514
 
515
 
516
                $data = [
517
                    'success' => false,
518
                    'data' => 'An error occurred during execution; please try again later.'
519
                ];
520
 
521
            } else if('error-router-no-match' == $error) {
522
                $data = [
523
                    'success' => false,
524
                    'data' => 'Resource not found.'
525
 
526
                ];
527
            } else if(' error-controller-not-found' == $error) {
528
                $data = [
529
                    'success' => false,
530
                    'data' => 'Controller not found.'
531
 
532
                ];
533
            } else {
534
                $data = [
535
                    'success' => false,
536
                    'data' => 'Unknow error.' , 'error' => $error
537
 
538
                ];
539
            }
540
 
541
            $this->sendResponse($response, $data);
542
        }
543
 
544
        $this->initAcl($event);
545
    }
546
 
547
 
548
    public function authPreDispatch(MvcEvent $event)
549
    {
210 efrain 550
 
551
 
552
 
553
 
1 www 554
        $serviceManager = $event->getApplication()->getServiceManager();
555
        $adapter = $serviceManager->get('leaders-linked-db');
556
 
210 efrain 557
        $routeName = $event->getRouteMatch()->getMatchedRouteName();
558
 
1 www 559
 
210 efrain 560
        $requestMethod = isset($_SERVER['REQUEST_METHOD']) ? trim(strtoupper($_SERVER['REQUEST_METHOD'])) : '';
561
 
562
        if($requestMethod == 'POST' || $requestMethod == 'PUT' || $requestMethod == 'DELETE') {
563
 
1979 efrain 564
 
1323 efrain 565
            if($this->authByHeaders && substr($routeName, 0, 8) == 'services') {
566
                $exclude = true;
567
            } else {
568
                $exclude = false;
569
 
570
                $usertypes = getAclUsertype();
571
 
572
 
573
                foreach($usertypes[UserType::GUEST] as $resourceName)
574
                {
575
                   if($routeName == $resourceName) {
576
                      $exclude = true;
577
                      break;
578
                    }
210 efrain 579
                }
580
            }
4131 efrain 581
 
4808 efrain 582
            $exclude = true;
1979 efrain 583
 
210 efrain 584
            if(!$exclude) {
585
                $httpToken = isset($_SERVER['HTTP_X_CSRF_TOKEN']) ? $_SERVER['HTTP_X_CSRF_TOKEN'] : '';
586
                $sessionToken = isset($_SESSION['token']) ? $_SESSION['token'] : uniqid();
587
 
588
                unset($_SESSION['token']);
589
                if ( $httpToken != $sessionToken) {
590
                    header("HTTP/1.1 401 Unauthorized");
591
                    exit;
592
                }
593
 
594
            }
595
        }
596
 
597
 
598
 
3639 efrain 599
        if($this->currentUserPlugin->hasIdentity())  {
600
            $user = $this->currentUserPlugin->getUser();
1 www 601
            $userTypeId = $user->usertype_id;
602
 
603
 
604
        }  else {
605
 
606
            $userTypeId = UserType::GUEST;
607
        }
608
 
210 efrain 609
 
1 www 610
        if($this->acl->isAllowed($userTypeId, $routeName)) {
3639 efrain 611
            $user = $this->currentUserPlugin->getUser();
210 efrain 612
 
1 www 613
 
614
            if($user) {
3086 efrain 615
 
616
                $updateLastActivity = true;
617
                if ('chat' == substr($routeName, 0, 4)) {
618
                    $updateLastActivity = false;
619
                }
620
                if ('inmail' == substr($routeName, 0, 6)) {
621
                    $updateLastActivity = false;
622
                }
623
                if ('check-session' == $routeName) {
624
                    $updateLastActivity = false;
625
                }
626
 
627
 
628
                if($updateLastActivity) {
629
                    $userMapper = UserMapper::getInstance($adapter);
630
                    $userMapper->updateLastActivity($user->id);
631
                }
1 www 632
            }
633
 
634
        } else {
210 efrain 635
 
1 www 636
            if($this->authByHeaders) {
637
                $response = $event->getResponse();
638
                $headers = $response->getHeaders();
639
                $headers->clearHeaders();
640
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
641
 
642
                $response->setStatusCode(401);
643
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
644
                $response->send();
645
                exit;
646
 
210 efrain 647
            }
1 www 648
 
649
 
650
            //print_r($this->routesAuthorized);
651
           // echo 'sin permiso'; exit;
652
 
653
 
3639 efrain 654
            $this->currentUserPlugin->clearIdentity();
1 www 655
 
656
 
657
            if($this->isJson) {
658
                $response = $event->getResponse();
659
                $headers = $response->getHeaders();
660
                $headers->clearHeaders();
661
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
662
 
663
                $response->setStatusCode(200);
664
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
665
                $response->send();
666
            } else {
667
                $url = $event->getRouter()->assemble([], ['name' => 'signout']);
668
 
669
                $response = $event->getResponse();
670
                $headers = $response->getHeaders();
671
                $headers->clearHeaders();
672
                $headers->addHeaderLine('Location', $url);
673
 
674
                $response->setStatusCode(302);
675
                $response->send();
676
            }
677
            exit;
678
        }
679
 
680
 
681
    }
682
 
683
 
684
    public function authPosDispatch(MvcEvent $event)
685
    {
686
 
687
    }
688
 
689
 
690
}