Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15355 | Rev 15448 | 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\Cache\Storage\Adapter\AbstractAdapter as CacheAdapter;
8
use Laminas\ModuleManager\ModuleEvent;
9
use Laminas\ModuleManager\ModuleManager;
10
use Laminas\Mvc\MvcEvent;
11
use Laminas\Config\Reader\Ini;
12
use Laminas\Permissions\Acl\Acl;
15343 efrain 13
use LeadersLinked\Plugin\CurrentNetworkPlugin;
1 www 14
use LeadersLinked\Plugin\CurrentUserPlugin;
15
use LeadersLinked\Model\Company;
16
use LeadersLinked\Mapper\UserMapper;
17
use Laminas\Permissions\Acl\Resource\GenericResource;
18
use Laminas\Permissions\Acl\Role\GenericRole;
19
use LeadersLinked\Mapper\CompanyUserMapper;
20
use LeadersLinked\Mapper\CompanyUserRoleMapper;
21
use LeadersLinked\Mapper\RoleMapper;
22
use LeadersLinked\Mapper\CompanyServiceMapper;
15343 efrain 23
use LeadersLinked\Model\Network;
1 www 24
use LeadersLinked\Model\Service;
15088 efrain 25
use LeadersLinked\Model\User;
26
use LeadersLinked\Model\UserType;
27
use LeadersLinked\Model\CompanyService;
28
use LeadersLinked\Model\CompanyUser;
15343 efrain 29
use LeadersLinked\Mapper\CompanyMapper;
15355 efrain 30
use LeadersLinked\Mapper\ApplicationVariantMapper;
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 Company
55
     */
56
    private $company;
57
 
58
    /**
59
     *
60
     * @var AdapterInterface
61
     */
62
    private $adapter;
63
 
64
 
65
    /**
66
     *
67
     * @var CacheAdapter
68
     */
69
    private $cache;
70
 
71
    /**
72
     *
73
     * @var CurrentUserPlugin
74
     */
15343 efrain 75
    private $currentUserPlugin;
1 www 76
 
77
 
15343 efrain 78
 
1 www 79
    /**
15343 efrain 80
     *
81
     * @var CurrentNetworkPlugin
82
     */
83
    private $currentNetworkPlugin;
84
 
85
 
86
 
87
 
88
 
89
    /**
1 www 90
     *
91
     * @var array
92
     */
93
    private $routesAuthorized = [];
94
 
95
    /**
96
     *
97
     * @var boolean
98
     */
99
    private $authByHeaders = false;
100
 
101
    public function init(ModuleManager $moduleManager)
102
    {
103
        $events = $moduleManager->getEventManager();
104
        $events->attach(ModuleEvent::EVENT_MERGE_CONFIG, array($this, 'onMergeConfig'));
105
    }
106
 
107
    public function onMergeConfig(ModuleEvent $event)
108
    {
109
        $configListener = $event->getConfigListener();
110
        $config         = $configListener->getMergedConfig(false);
111
 
112
        $reader = new Ini();
113
        $data = $reader->fromFile('config/leaderslinked.ini');
114
 
115
        $prefix = 'leaderslinked';
116
        foreach($data as $section => $pairs)
117
        {
118
            foreach($pairs as $key => $value)
119
            {
120
                $config[$prefix . '.' . $section . '.' . $key] = $value;
121
            }
122
        }
123
        $configListener->setMergedConfig($config);
124
    }
125
 
126
 
127
    public function getConfig() : array
128
    {
129
        return include __DIR__ . '/../config/module.config.php';
130
    }
131
 
132
    public function onBootstrap(MvcEvent $event)
133
    {
134
        $serviceManager = $event->getApplication()->getServiceManager();
135
        $adapter = $serviceManager->get('leaders-linked-db');
136
       // $logger          = $serviceManager->get('Zend\Log\Logger');
137
 
138
 
139
        $session = $serviceManager->get('leaders-linked-session');
140
        $session->start();
141
 
142
 
143
        $translator = $serviceManager->get('MvcTranslator');
144
        $translator->addTranslationFile(
145
            'phpArray',
146
            __DIR__ . '/i18n/validate.php',
147
            'default'
148
            );
149
 
150
        $translator->addTranslationFile(
151
            'phpArray',
152
            __DIR__ . '/i18n/spanish.php',
153
            'default'
154
            );
155
 
156
        \Laminas\Validator\AbstractValidator::setDefaultTranslator($translator);
157
 
15343 efrain 158
 
159
        $this->currentNetworkPlugin = new CurrentNetworkPlugin($adapter);
160
        if(!$this->currentNetworkPlugin->hasNetwork()) {
161
            echo '2';
162
            exit;
163
            header("HTTP/1.1 401 Unauthorized - Private network - not found");
164
            exit;
165
        }
166
 
167
        if($this->currentNetworkPlugin->getNetwork()->status == Network::STATUS_INACTIVE) {
168
            echo '3';
169
            exit;
170
            header("HTTP/1.1 401 Unauthorized - Private network - inactive");
171
            exit;
172
        }
173
 
174
 
175
 
176
        if(empty($_SERVER['REDIRECT_URL'])) {
177
            if(empty($_SERVER['REQUEST_URI'])) {
178
                $routeName = '';
179
 
180
            } else {
181
                $routeName = $_SERVER['REQUEST_URI'];
182
            }
183
 
184
        } else {
185
            $routeName = $_SERVER['REDIRECT_URL'];
186
 
187
        }
188
 
189
 
190
        $routeName = strtolower(trim($routeName));
191
        if(strlen($routeName) > 0 && substr($routeName, 0, 1) == '/') {
192
            $routeName = substr($routeName, 1);
193
        }
194
 
195
 
196
 
197
        $this->isHtml = $this->isJson ? false : true;
198
        $this->currentUserPlugin = new CurrentUserPlugin($adapter);
199
 
200
 
201
 
202
        if($this->currentUserPlugin->hasIdentity()) {
203
            if(in_array($routeName, ['signout', 'signin-admin', 'signin-company', 'home'])) {
204
                $checkUserForNetwork = false;
205
            } else {
206
                $checkUserForNetwork = true;
207
            }
208
        } else {
209
            $checkUserForNetwork = false;
210
        }
211
 
212
 
213
 
1 www 214
 
15343 efrain 215
 
216
 
217
        if($checkUserForNetwork) {
218
            if($this->currentUserPlugin->getUser()->network_id != $this->currentNetworkPlugin->getNetworkId()) {
219
                header("HTTP/1.1 401 Unauthorized - The user is not part of this private network");
220
                exit;
221
            }
222
        }
223
 
1 www 224
        $this->initAcl($event);
225
        $eventManager = $event->getApplication()->getEventManager();
226
        $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this,'onDispatchError'], 0);
227
        $eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, [$this,'onRenderError'], 0);
228
 
229
        $sharedManager = $eventManager->getSharedManager();
230
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPreDispatch'], 100);
231
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPosDispatch'], -100);
232
    }
233
 
234
    public function initAcl(MvcEvent $event)
235
    {
236
        $serviceManager = $event->getApplication()->getServiceManager();
237
        $adapter = $serviceManager->get('leaders-linked-db');
238
 
239
        require_once   (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'acl.config.php');
240
 
15088 efrain 241
        //header('Content-type: text/plain');
1 www 242
 
243
        $this->acl = new Acl();
244
        $resources = getAclResources();
245
        foreach($resources as $resourceName)
246
        {
15088 efrain 247
           //echo $resourceName . PHP_EOL;
1 www 248
 
249
            $this->acl->addResource(new GenericResource($resourceName));
250
        }
251
 
15088 efrain 252
 
253
 
1 www 254
 
15343 efrain 255
        $rolesForUsertype = getAclRolesForUsertype();
15088 efrain 256
 
1 www 257
 
15088 efrain 258
 
15343 efrain 259
        $user = $this->currentUserPlugin->getUser();
260
        $company = $this->currentUserPlugin->getCompany();
261
        $network = $this->currentNetworkPlugin->getNetwork();
1 www 262
        if($company) {
263
 
15088 efrain 264
            $resources = [];
1 www 265
 
15088 efrain 266
 
1 www 267
            $this->acl->addRole(new GenericRole($user->usertype_id));
268
 
15092 efrain 269
 
15088 efrain 270
            foreach($rolesForUsertype[UserType::USER] as $resourceName)
271
            {
272
                if(!in_array($resourceName, $resources)) {
273
                    array_push($resources, $resourceName);
274
                }
275
            }
276
 
277
 
278
 
279
 
280
 
281
 
282
 
283
 
284
 
285
 
286
 
287
 
288
            $servicesActive = [];
289
 
290
 
291
            $now = date('Y-m-d');
292
            $companyServiceMapper = CompanyServiceMapper::getInstance($adapter);
293
            $companyServices = $companyServiceMapper->fetchAllByCompanyId($company->id);
294
 
295
            foreach($companyServices as $companyService)
296
            {
297
                if($companyService->status == CompanyService::ACTIVE &&
298
                    $companyService->paid_from >= $now &&
299
                    $companyService->paid_to <= $now) {
300
 
301
                    if(!in_array($companyService->id, $servicesActive)) {
302
                        array_push($servicesActive, $companyService->id);
303
                    }
304
                }
305
 
306
 
307
                array_push($servicesActive, $companyService->service_id);
308
            }
309
 
310
 
311
            $rolesForCompany = getAclRolesCompany();
312
 
313
 
314
 
315
 
1 www 316
            $companyUserMapper = CompanyUserMapper::getInstance($adapter);
317
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);
15088 efrain 318
 
319
            $roleMapper = RoleMapper::getInstance($adapter);
320
 
321
 
1 www 322
 
15088 efrain 323
            if($companyUser) {
1 www 324
 
15088 efrain 325
                if($companyUser->creator == CompanyUser::CREATOR_YES) {
326
 
15355 efrain 327
 
328
 
329
                    $applicationVariantMapper = ApplicationVariantMapper::getInstance($adapter);
330
                    $total = $applicationVariantMapper->fetchCountActiveByCompanyId($company->id);
331
 
332
                    if($total > 0) {
333
 
334
                        $resourceNames = getAclPermissionPushTemplatesForCustomApps();
335
 
336
                        foreach($resourceNames as $resourceName)
337
                        {
338
                            if(!in_array($resourceName, $resources)) {
339
                                array_push($resources, $resourceName);
340
                            }
341
                        }
342
 
343
                    }
344
 
345
 
15088 efrain 346
                    $roles = $roleMapper->fetchAllForCreator();
347
                    if($roles) {
348
 
349
                        foreach($roles as $role)
1 www 350
                        {
15088 efrain 351
                            if(!empty($rolesForCompany[$role->code])) {
352
                                foreach($rolesForCompany[$role->code] as $resourceName) {
353
 
354
                                    if(!in_array($resourceName, $resources)) {
355
                                        array_push($resources, $resourceName);
356
                                    }
357
                                }
358
                            }
1 www 359
                        }
360
                    }
361
 
15088 efrain 362
 
363
                    foreach ($servicesActive as $service_id) {
364
                        $roles = $roleMapper->fetchAllByServiceId($service_id);
15371 efrain 365
 
366
 
15088 efrain 367
                        foreach($roles as $role) {
368
 
369
 
370
                            if(!empty($rolesForCompany[$role->code])) {
371
                                foreach($rolesForCompany[$role->code] as $resourceName) {
372
 
373
                                    if(!in_array($resourceName, $resources)) {
374
                                        array_push($resources, $resourceName);
375
                                    }
376
                                }
377
                            }
378
 
379
 
380
 
1 www 381
                        }
15088 efrain 382
 
1 www 383
                    }
15088 efrain 384
                } else {
385
                    $companyUserRoleMapper = CompanyUserRoleMapper::getInstance($adapter);
386
                    $companyUserRoles = $companyUserRoleMapper->fetchAllByCompanyIdAndUserId($company->id, $user->id);
387
 
15343 efrain 388
 
389
 
15088 efrain 390
                    foreach($companyUserRoles as $companyUserRole)
391
                    {
959 geraldo 392
 
15088 efrain 393
                         $role = $roleMapper->fetchOne($companyUserRole->role_id);
15343 efrain 394
 
15088 efrain 395
                         if($role) {
396
 
397
                             if($role->service_id) {
398
 
15343 efrain 399
                                 if(!in_array($role->service_id, $servicesActive)) {
400
                                    continue;
401
                                 }
15088 efrain 402
                             }
403
 
15343 efrain 404
                             if(isset($rolesForCompany[ $role->code ] )) {
405
                                 foreach($rolesForCompany[ $role->code ] as $resourceName)
406
                                 {
407
                                     if(!in_array($resourceName, $resources)) {
408
                                        array_push($resources, $resourceName);
409
                                     }
410
 
15088 efrain 411
                                 }
15343 efrain 412
                            }
413
                        }
959 geraldo 414
 
15088 efrain 415
 
959 geraldo 416
                    }
1 www 417
                }
15088 efrain 418
            }
15355 efrain 419
 
15088 efrain 420
 
974 geraldo 421
 
15088 efrain 422
            foreach($resources as $resourceName)
423
            {
424
                $this->acl->allow($user->usertype_id, $resourceName);
1 www 425
            }
426
 
15088 efrain 427
        }   else {
1 www 428
 
15088 efrain 429
 
430
            foreach($rolesForUsertype as $usertype => $resources)
1 www 431
            {
432
                $this->acl->addRole(new GenericRole($usertype));
433
                foreach ($resources as $resourceName)
434
                {
15088 efrain 435
                    // echo $resourceName . PHP_EOL;
1 www 436
                    $this->acl->allow($usertype, $resourceName);
437
                }
438
            }
15343 efrain 439
 
440
 
441
            if($this->currentUserPlugin->hasIdentity()) {
442
                $user = $this->currentUserPlugin->getUser();
443
 
444
                if($user->is_super_user == User::IS_SUPER_USER_YES) {
445
                    $resources = getAclPermissionSuperAdmin();
446
                    foreach ($resources as $resourceName)
447
                    {
448
                        $this->acl->allow(UserType::ADMIN, $resourceName);
449
                    }
450
                }
451
            }
452
 
453
            if($this->company == null) {
454
 
455
                if($network->default == Network::DEFAULT_YES) {
456
                    $resources = getAclPermissionAdminForDefaultNetwork();
457
                    foreach ($resources as $resourceName)
458
                    {
459
                        $this->acl->allow(UserType::ADMIN, $resourceName);
460
                    }
461
                } else {
462
 
463
                    $companyMapper = CompanyMapper::getInstance($adapter);
464
                    $company = $companyMapper->fetchDefaultForNetworkByNetworkId($network->id);
465
                    if($company) {
15346 efrain 466
                        $companyUserMapper = CompanyUserMapper::getInstance($adapter);
15343 efrain 467
                        $companyUser = $companyUserMapper->fetchCreatorByCompanyId($company->id);
468
                        if($companyUser && $companyUser->user_id == $this->currentUserPlugin->getUserId()) {
469
 
470
                            $resources = getAclPermissionAdminForNonDefaultNetwork();
471
                            foreach ($resources as $resourceName)
472
                            {
473
                                $this->acl->allow(UserType::ADMIN, $resourceName);
474
                            }
475
 
476
                        }
477
                    }
478
 
479
 
480
                }
481
            }
1 www 482
        }
483
        $event->getViewModel()->setVariable('acl', $this->acl);
484
    }
485
 
486
    public function onDispatchError(MvcEvent $event)
487
    {
488
        $this->processError($event);
489
    }
490
 
491
    public function onRenderError(MvcEvent $event)
492
    {
493
        $this->processError($event);
494
    }
495
 
496
    public function sendResponse(\Laminas\Http\Response $response, $data)
497
    {
498
 
499
 
500
        if($this->isJson) {
501
            $headers = $response->getHeaders();
502
            $headers->clearHeaders();
503
            $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
504
 
505
            $response->setStatusCode(200);
506
            $response->setContent(json_encode($data));
507
            $response->send();
508
 
509
 
510
        } else {
15348 efrain 511
           // print_r($data); exit;
512
 
1 www 513
            throw new \Exception($data['data']);
514
        }
515
        exit;
516
    }
517
 
518
    public function processError(MvcEvent $event)
519
    {
520
 
521
 
522
        $request =  $event->getRequest();
523
        if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
524
 
525
            $error = $event->getError();
526
            if (!$error) {
527
                return;
528
            }
529
 
530
            $response = $event->getResponse();
531
 
532
            if('error-exception' == $error) {
533
                $exception = $event->getParam('exception');
534
                error_log($exception->getCode() . ' ' . $exception->getMessage());
535
                //error_log($exception->getTraceAsString());
536
 
537
 
538
                $data = [
539
                    'success' => false,
540
                    'data' => 'An error occurred during execution; please try again later.'
541
                ];
542
 
543
            } else if('error-router-no-match' == $error) {
544
                $data = [
545
                    'success' => false,
546
                    'data' => 'Resource not found.'
547
 
548
                ];
549
            } else if(' error-controller-not-found' == $error) {
550
                $data = [
551
                    'success' => false,
552
                    'data' => 'Controller not found.'
553
 
554
                ];
555
            } else {
556
                $data = [
557
                    'success' => false,
558
                    'data' => 'Unknow error.' , 'error' => $error
559
 
560
                ];
561
            }
562
 
563
 
564
 
565
            $this->sendResponse($response, $data);
566
        }
567
 
568
        $this->initAcl($event);
569
    }
570
 
571
 
572
    public function authPreDispatch(MvcEvent $event)
573
    {
574
        $serviceManager = $event->getApplication()->getServiceManager();
575
        $adapter = $serviceManager->get('leaders-linked-db');
576
 
15343 efrain 577
        $userTypeId = $this->currentUserPlugin->getUserTypeId();
1 www 578
 
579
 
580
 
581
 
582
        $routeName = $event->getRouteMatch()->getMatchedRouteName();
583
 
584
 
585
 
586
        if($this->acl->isAllowed($userTypeId, $routeName)) {
15343 efrain 587
            $user = $this->currentUserPlugin->getUser();
1 www 588
 
14689 efrain 589
            if($user) {
590
 
591
 
592
                $updateLastActivity = true;
593
                if ('chat' == substr($routeName, 0, 4)) {
594
                    $updateLastActivity = false;
595
                }
596
                if ('inmail' == substr($routeName, 0, 6)) {
597
                    $updateLastActivity = false;
598
                }
599
                if ('check-session' == $routeName) {
600
                    $updateLastActivity = false;
601
                }
602
 
603
 
604
                if($updateLastActivity) {
605
                    $userMapper = UserMapper::getInstance($adapter);
606
                    $userMapper->updateLastActivity($user->id);
607
                }
14628 efrain 608
            }
1 www 609
 
610
        } else {
14690 efrain 611
 
612
 
613
            echo "userTypeId = $userTypeId routeName = $routeName";
614
            exit;
1 www 615
 
15343 efrain 616
            $this->currentUserPlugin->clearIdentity();
1 www 617
 
618
 
619
            if($this->isJson) {
620
                $response = $event->getResponse();
621
                $headers = $response->getHeaders();
622
                $headers->clearHeaders();
623
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
624
 
625
                $response->setStatusCode(200);
626
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
627
                $response->send();
628
            } else {
629
                $url = $event->getRouter()->assemble([], ['name' => 'signout']);
630
 
631
                $response = $event->getResponse();
632
                $headers = $response->getHeaders();
633
                $headers->clearHeaders();
634
                $headers->addHeaderLine('Location', $url);
635
 
636
                $response->setStatusCode(302);
637
                $response->send();
638
            }
639
            exit;
640
        }
641
 
642
 
643
    }
644
 
645
 
646
    public function authPosDispatch(MvcEvent $event)
647
    {
648
 
649
    }
650
 
651
 
652
}