Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15348 | Rev 15371 | 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);
365
                        foreach($roles as $role) {
366
 
367
 
368
                            if(!empty($rolesForCompany[$role->code])) {
369
                                foreach($rolesForCompany[$role->code] as $resourceName) {
370
 
371
                                    if(!in_array($resourceName, $resources)) {
372
                                        array_push($resources, $resourceName);
373
                                    }
374
                                }
375
                            }
376
 
377
 
378
 
1 www 379
                        }
15088 efrain 380
 
1 www 381
                    }
15088 efrain 382
                } else {
383
                    $companyUserRoleMapper = CompanyUserRoleMapper::getInstance($adapter);
384
                    $companyUserRoles = $companyUserRoleMapper->fetchAllByCompanyIdAndUserId($company->id, $user->id);
385
 
15343 efrain 386
 
387
 
15088 efrain 388
                    foreach($companyUserRoles as $companyUserRole)
389
                    {
959 geraldo 390
 
15088 efrain 391
                         $role = $roleMapper->fetchOne($companyUserRole->role_id);
15343 efrain 392
 
15088 efrain 393
                         if($role) {
394
 
395
                             if($role->service_id) {
396
 
15343 efrain 397
                                 if(!in_array($role->service_id, $servicesActive)) {
398
                                    continue;
399
                                 }
15088 efrain 400
                             }
401
 
15343 efrain 402
                             if(isset($rolesForCompany[ $role->code ] )) {
403
                                 foreach($rolesForCompany[ $role->code ] as $resourceName)
404
                                 {
405
                                     if(!in_array($resourceName, $resources)) {
406
                                        array_push($resources, $resourceName);
407
                                     }
408
 
15088 efrain 409
                                 }
15343 efrain 410
                            }
411
                        }
959 geraldo 412
 
15088 efrain 413
 
959 geraldo 414
                    }
1 www 415
                }
15088 efrain 416
            }
15355 efrain 417
 
15088 efrain 418
 
974 geraldo 419
 
15088 efrain 420
            foreach($resources as $resourceName)
421
            {
422
                $this->acl->allow($user->usertype_id, $resourceName);
1 www 423
            }
424
 
15088 efrain 425
        }   else {
1 www 426
 
15088 efrain 427
 
428
            foreach($rolesForUsertype as $usertype => $resources)
1 www 429
            {
430
                $this->acl->addRole(new GenericRole($usertype));
431
                foreach ($resources as $resourceName)
432
                {
15088 efrain 433
                    // echo $resourceName . PHP_EOL;
1 www 434
                    $this->acl->allow($usertype, $resourceName);
435
                }
436
            }
15343 efrain 437
 
438
 
439
            if($this->currentUserPlugin->hasIdentity()) {
440
                $user = $this->currentUserPlugin->getUser();
441
 
442
                if($user->is_super_user == User::IS_SUPER_USER_YES) {
443
                    $resources = getAclPermissionSuperAdmin();
444
                    foreach ($resources as $resourceName)
445
                    {
446
                        $this->acl->allow(UserType::ADMIN, $resourceName);
447
                    }
448
                }
449
            }
450
 
451
            if($this->company == null) {
452
 
453
                if($network->default == Network::DEFAULT_YES) {
454
                    $resources = getAclPermissionAdminForDefaultNetwork();
455
                    foreach ($resources as $resourceName)
456
                    {
457
                        $this->acl->allow(UserType::ADMIN, $resourceName);
458
                    }
459
                } else {
460
 
461
                    $companyMapper = CompanyMapper::getInstance($adapter);
462
                    $company = $companyMapper->fetchDefaultForNetworkByNetworkId($network->id);
463
                    if($company) {
15346 efrain 464
                        $companyUserMapper = CompanyUserMapper::getInstance($adapter);
15343 efrain 465
                        $companyUser = $companyUserMapper->fetchCreatorByCompanyId($company->id);
466
                        if($companyUser && $companyUser->user_id == $this->currentUserPlugin->getUserId()) {
467
 
468
                            $resources = getAclPermissionAdminForNonDefaultNetwork();
469
                            foreach ($resources as $resourceName)
470
                            {
471
                                $this->acl->allow(UserType::ADMIN, $resourceName);
472
                            }
473
 
474
                        }
475
                    }
476
 
477
 
478
                }
479
            }
1 www 480
        }
481
        $event->getViewModel()->setVariable('acl', $this->acl);
482
    }
483
 
484
    public function onDispatchError(MvcEvent $event)
485
    {
486
        $this->processError($event);
487
    }
488
 
489
    public function onRenderError(MvcEvent $event)
490
    {
491
        $this->processError($event);
492
    }
493
 
494
    public function sendResponse(\Laminas\Http\Response $response, $data)
495
    {
496
 
497
 
498
        if($this->isJson) {
499
            $headers = $response->getHeaders();
500
            $headers->clearHeaders();
501
            $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
502
 
503
            $response->setStatusCode(200);
504
            $response->setContent(json_encode($data));
505
            $response->send();
506
 
507
 
508
        } else {
15348 efrain 509
           // print_r($data); exit;
510
 
1 www 511
            throw new \Exception($data['data']);
512
        }
513
        exit;
514
    }
515
 
516
    public function processError(MvcEvent $event)
517
    {
518
 
519
 
520
        $request =  $event->getRequest();
521
        if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
522
 
523
            $error = $event->getError();
524
            if (!$error) {
525
                return;
526
            }
527
 
528
            $response = $event->getResponse();
529
 
530
            if('error-exception' == $error) {
531
                $exception = $event->getParam('exception');
532
                error_log($exception->getCode() . ' ' . $exception->getMessage());
533
                //error_log($exception->getTraceAsString());
534
 
535
 
536
                $data = [
537
                    'success' => false,
538
                    'data' => 'An error occurred during execution; please try again later.'
539
                ];
540
 
541
            } else if('error-router-no-match' == $error) {
542
                $data = [
543
                    'success' => false,
544
                    'data' => 'Resource not found.'
545
 
546
                ];
547
            } else if(' error-controller-not-found' == $error) {
548
                $data = [
549
                    'success' => false,
550
                    'data' => 'Controller not found.'
551
 
552
                ];
553
            } else {
554
                $data = [
555
                    'success' => false,
556
                    'data' => 'Unknow error.' , 'error' => $error
557
 
558
                ];
559
            }
560
 
561
 
562
 
563
            $this->sendResponse($response, $data);
564
        }
565
 
566
        $this->initAcl($event);
567
    }
568
 
569
 
570
    public function authPreDispatch(MvcEvent $event)
571
    {
572
        $serviceManager = $event->getApplication()->getServiceManager();
573
        $adapter = $serviceManager->get('leaders-linked-db');
574
 
15343 efrain 575
        $userTypeId = $this->currentUserPlugin->getUserTypeId();
1 www 576
 
577
 
578
 
579
 
580
        $routeName = $event->getRouteMatch()->getMatchedRouteName();
581
 
582
 
583
 
584
        if($this->acl->isAllowed($userTypeId, $routeName)) {
15343 efrain 585
            $user = $this->currentUserPlugin->getUser();
1 www 586
 
14689 efrain 587
            if($user) {
588
 
589
 
590
                $updateLastActivity = true;
591
                if ('chat' == substr($routeName, 0, 4)) {
592
                    $updateLastActivity = false;
593
                }
594
                if ('inmail' == substr($routeName, 0, 6)) {
595
                    $updateLastActivity = false;
596
                }
597
                if ('check-session' == $routeName) {
598
                    $updateLastActivity = false;
599
                }
600
 
601
 
602
                if($updateLastActivity) {
603
                    $userMapper = UserMapper::getInstance($adapter);
604
                    $userMapper->updateLastActivity($user->id);
605
                }
14628 efrain 606
            }
1 www 607
 
608
        } else {
14690 efrain 609
 
610
 
611
            echo "userTypeId = $userTypeId routeName = $routeName";
612
            exit;
1 www 613
 
15343 efrain 614
            $this->currentUserPlugin->clearIdentity();
1 www 615
 
616
 
617
            if($this->isJson) {
618
                $response = $event->getResponse();
619
                $headers = $response->getHeaders();
620
                $headers->clearHeaders();
621
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
622
 
623
                $response->setStatusCode(200);
624
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
625
                $response->send();
626
            } else {
627
                $url = $event->getRouter()->assemble([], ['name' => 'signout']);
628
 
629
                $response = $event->getResponse();
630
                $headers = $response->getHeaders();
631
                $headers->clearHeaders();
632
                $headers->addHeaderLine('Location', $url);
633
 
634
                $response->setStatusCode(302);
635
                $response->send();
636
            }
637
            exit;
638
        }
639
 
640
 
641
    }
642
 
643
 
644
    public function authPosDispatch(MvcEvent $event)
645
    {
646
 
647
    }
648
 
649
 
650
}