Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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