Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15371 | Rev 16768 | 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
            header("HTTP/1.1 401 Unauthorized - Private network - not found");
162
            exit;
163
        }
164
 
165
        if($this->currentNetworkPlugin->getNetwork()->status == Network::STATUS_INACTIVE) {
166
            header("HTTP/1.1 401 Unauthorized - Private network - inactive");
167
            exit;
168
        }
169
 
170
 
171
 
172
        if(empty($_SERVER['REDIRECT_URL'])) {
173
            if(empty($_SERVER['REQUEST_URI'])) {
174
                $routeName = '';
175
 
176
            } else {
177
                $routeName = $_SERVER['REQUEST_URI'];
178
            }
179
 
180
        } else {
181
            $routeName = $_SERVER['REDIRECT_URL'];
182
 
183
        }
184
 
185
 
186
        $routeName = strtolower(trim($routeName));
187
        if(strlen($routeName) > 0 && substr($routeName, 0, 1) == '/') {
188
            $routeName = substr($routeName, 1);
189
        }
190
 
191
 
192
 
193
        $this->isHtml = $this->isJson ? false : true;
194
        $this->currentUserPlugin = new CurrentUserPlugin($adapter);
195
 
196
 
197
 
198
        if($this->currentUserPlugin->hasIdentity()) {
199
            if(in_array($routeName, ['signout', 'signin-admin', 'signin-company', 'home'])) {
200
                $checkUserForNetwork = false;
201
            } else {
202
                $checkUserForNetwork = true;
203
            }
204
        } else {
205
            $checkUserForNetwork = false;
206
        }
207
 
208
 
209
 
1 www 210
 
15343 efrain 211
 
212
 
213
        if($checkUserForNetwork) {
214
            if($this->currentUserPlugin->getUser()->network_id != $this->currentNetworkPlugin->getNetworkId()) {
215
                header("HTTP/1.1 401 Unauthorized - The user is not part of this private network");
216
                exit;
217
            }
218
        }
219
 
1 www 220
        $this->initAcl($event);
221
        $eventManager = $event->getApplication()->getEventManager();
222
        $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this,'onDispatchError'], 0);
223
        $eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, [$this,'onRenderError'], 0);
224
 
225
        $sharedManager = $eventManager->getSharedManager();
226
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPreDispatch'], 100);
227
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPosDispatch'], -100);
228
    }
229
 
230
    public function initAcl(MvcEvent $event)
231
    {
232
        $serviceManager = $event->getApplication()->getServiceManager();
233
        $adapter = $serviceManager->get('leaders-linked-db');
234
 
235
        require_once   (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'acl.config.php');
236
 
15088 efrain 237
        //header('Content-type: text/plain');
1 www 238
 
239
        $this->acl = new Acl();
240
        $resources = getAclResources();
241
        foreach($resources as $resourceName)
242
        {
15088 efrain 243
           //echo $resourceName . PHP_EOL;
1 www 244
 
245
            $this->acl->addResource(new GenericResource($resourceName));
246
        }
247
 
15088 efrain 248
 
249
 
1 www 250
 
15343 efrain 251
        $rolesForUsertype = getAclRolesForUsertype();
15088 efrain 252
 
1 www 253
 
15088 efrain 254
 
15343 efrain 255
        $user = $this->currentUserPlugin->getUser();
256
        $company = $this->currentUserPlugin->getCompany();
257
        $network = $this->currentNetworkPlugin->getNetwork();
1 www 258
        if($company) {
259
 
15088 efrain 260
            $resources = [];
1 www 261
 
15088 efrain 262
 
1 www 263
            $this->acl->addRole(new GenericRole($user->usertype_id));
264
 
15092 efrain 265
 
15088 efrain 266
            foreach($rolesForUsertype[UserType::USER] as $resourceName)
267
            {
268
                if(!in_array($resourceName, $resources)) {
269
                    array_push($resources, $resourceName);
270
                }
271
            }
272
 
273
 
274
            $servicesActive = [];
275
            $now = date('Y-m-d');
15448 efrain 276
 
15088 efrain 277
            $companyServiceMapper = CompanyServiceMapper::getInstance($adapter);
278
            $companyServices = $companyServiceMapper->fetchAllByCompanyId($company->id);
279
 
280
            foreach($companyServices as $companyService)
281
            {
15448 efrain 282
                if($companyService->status == CompanyService::ACTIVE) {
15088 efrain 283
 
15448 efrain 284
                    $paid_from = trim(substr($companyService->paid_from, 0, 10));
285
                    $paid_to = trim(substr($companyService->paid_to, 0, 10));
286
 
287
                    if($now >= $paid_from   && $now <= $paid_to) {
288
                        if(!in_array($companyService->id, $servicesActive)) {
289
                            array_push($servicesActive, $companyService->service_id);
290
                        }
15088 efrain 291
                    }
15448 efrain 292
                }
15088 efrain 293
            }
294
 
295
            $rolesForCompany = getAclRolesCompany();
1 www 296
            $companyUserMapper = CompanyUserMapper::getInstance($adapter);
297
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);
15088 efrain 298
 
299
            $roleMapper = RoleMapper::getInstance($adapter);
300
            if($companyUser) {
1 www 301
 
15088 efrain 302
                if($companyUser->creator == CompanyUser::CREATOR_YES) {
303
 
15355 efrain 304
 
305
 
306
                    $applicationVariantMapper = ApplicationVariantMapper::getInstance($adapter);
307
                    $total = $applicationVariantMapper->fetchCountActiveByCompanyId($company->id);
308
 
309
                    if($total > 0) {
310
 
311
                        $resourceNames = getAclPermissionPushTemplatesForCustomApps();
312
 
313
                        foreach($resourceNames as $resourceName)
314
                        {
315
                            if(!in_array($resourceName, $resources)) {
316
                                array_push($resources, $resourceName);
317
                            }
318
                        }
319
 
320
                    }
321
 
322
 
15088 efrain 323
                    $roles = $roleMapper->fetchAllForCreator();
324
                    if($roles) {
325
 
326
                        foreach($roles as $role)
1 www 327
                        {
15088 efrain 328
                            if(!empty($rolesForCompany[$role->code])) {
329
                                foreach($rolesForCompany[$role->code] as $resourceName) {
330
 
331
                                    if(!in_array($resourceName, $resources)) {
332
                                        array_push($resources, $resourceName);
333
                                    }
334
                                }
335
                            }
1 www 336
                        }
337
                    }
338
 
15088 efrain 339
 
340
                    foreach ($servicesActive as $service_id) {
341
                        $roles = $roleMapper->fetchAllByServiceId($service_id);
15371 efrain 342
 
343
 
15088 efrain 344
                        foreach($roles as $role) {
345
 
346
 
347
                            if(!empty($rolesForCompany[$role->code])) {
348
                                foreach($rolesForCompany[$role->code] as $resourceName) {
349
 
350
                                    if(!in_array($resourceName, $resources)) {
351
                                        array_push($resources, $resourceName);
352
                                    }
353
                                }
354
                            }
355
 
356
 
357
 
1 www 358
                        }
15088 efrain 359
 
1 www 360
                    }
15088 efrain 361
                } else {
362
                    $companyUserRoleMapper = CompanyUserRoleMapper::getInstance($adapter);
363
                    $companyUserRoles = $companyUserRoleMapper->fetchAllByCompanyIdAndUserId($company->id, $user->id);
364
 
15343 efrain 365
 
366
 
15088 efrain 367
                    foreach($companyUserRoles as $companyUserRole)
368
                    {
959 geraldo 369
 
15088 efrain 370
                         $role = $roleMapper->fetchOne($companyUserRole->role_id);
15343 efrain 371
 
15088 efrain 372
                         if($role) {
373
 
374
                             if($role->service_id) {
375
 
15343 efrain 376
                                 if(!in_array($role->service_id, $servicesActive)) {
377
                                    continue;
378
                                 }
15088 efrain 379
                             }
380
 
15343 efrain 381
                             if(isset($rolesForCompany[ $role->code ] )) {
382
                                 foreach($rolesForCompany[ $role->code ] as $resourceName)
383
                                 {
384
                                     if(!in_array($resourceName, $resources)) {
385
                                        array_push($resources, $resourceName);
386
                                     }
387
 
15088 efrain 388
                                 }
15343 efrain 389
                            }
390
                        }
959 geraldo 391
 
15088 efrain 392
 
959 geraldo 393
                    }
1 www 394
                }
15088 efrain 395
            }
15355 efrain 396
 
15088 efrain 397
 
974 geraldo 398
 
15088 efrain 399
            foreach($resources as $resourceName)
400
            {
401
                $this->acl->allow($user->usertype_id, $resourceName);
1 www 402
            }
403
 
15088 efrain 404
        }   else {
1 www 405
 
15088 efrain 406
 
407
            foreach($rolesForUsertype as $usertype => $resources)
1 www 408
            {
409
                $this->acl->addRole(new GenericRole($usertype));
410
                foreach ($resources as $resourceName)
411
                {
15088 efrain 412
                    // echo $resourceName . PHP_EOL;
1 www 413
                    $this->acl->allow($usertype, $resourceName);
414
                }
415
            }
15343 efrain 416
 
417
 
418
            if($this->currentUserPlugin->hasIdentity()) {
419
                $user = $this->currentUserPlugin->getUser();
420
 
421
                if($user->is_super_user == User::IS_SUPER_USER_YES) {
422
                    $resources = getAclPermissionSuperAdmin();
423
                    foreach ($resources as $resourceName)
424
                    {
425
                        $this->acl->allow(UserType::ADMIN, $resourceName);
426
                    }
427
                }
428
            }
429
 
430
            if($this->company == null) {
431
 
432
                if($network->default == Network::DEFAULT_YES) {
433
                    $resources = getAclPermissionAdminForDefaultNetwork();
434
                    foreach ($resources as $resourceName)
435
                    {
436
                        $this->acl->allow(UserType::ADMIN, $resourceName);
437
                    }
438
                } else {
439
 
440
                    $companyMapper = CompanyMapper::getInstance($adapter);
441
                    $company = $companyMapper->fetchDefaultForNetworkByNetworkId($network->id);
442
                    if($company) {
15346 efrain 443
                        $companyUserMapper = CompanyUserMapper::getInstance($adapter);
15343 efrain 444
                        $companyUser = $companyUserMapper->fetchCreatorByCompanyId($company->id);
445
                        if($companyUser && $companyUser->user_id == $this->currentUserPlugin->getUserId()) {
446
 
447
                            $resources = getAclPermissionAdminForNonDefaultNetwork();
448
                            foreach ($resources as $resourceName)
449
                            {
450
                                $this->acl->allow(UserType::ADMIN, $resourceName);
451
                            }
452
 
453
                        }
454
                    }
455
 
456
 
457
                }
458
            }
1 www 459
        }
460
        $event->getViewModel()->setVariable('acl', $this->acl);
461
    }
462
 
463
    public function onDispatchError(MvcEvent $event)
464
    {
465
        $this->processError($event);
466
    }
467
 
468
    public function onRenderError(MvcEvent $event)
469
    {
470
        $this->processError($event);
471
    }
472
 
473
    public function sendResponse(\Laminas\Http\Response $response, $data)
474
    {
475
 
476
 
477
        if($this->isJson) {
478
            $headers = $response->getHeaders();
479
            $headers->clearHeaders();
480
            $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
481
 
482
            $response->setStatusCode(200);
483
            $response->setContent(json_encode($data));
484
            $response->send();
485
 
486
 
487
        } else {
15348 efrain 488
           // print_r($data); exit;
489
 
1 www 490
            throw new \Exception($data['data']);
491
        }
492
        exit;
493
    }
494
 
495
    public function processError(MvcEvent $event)
496
    {
497
 
498
 
499
        $request =  $event->getRequest();
500
        if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
501
 
502
            $error = $event->getError();
503
            if (!$error) {
504
                return;
505
            }
506
 
507
            $response = $event->getResponse();
508
 
509
            if('error-exception' == $error) {
510
                $exception = $event->getParam('exception');
511
                error_log($exception->getCode() . ' ' . $exception->getMessage());
512
                //error_log($exception->getTraceAsString());
513
 
514
 
515
                $data = [
516
                    'success' => false,
517
                    'data' => 'An error occurred during execution; please try again later.'
518
                ];
519
 
520
            } else if('error-router-no-match' == $error) {
521
                $data = [
522
                    'success' => false,
523
                    'data' => 'Resource not found.'
524
 
525
                ];
526
            } else if(' error-controller-not-found' == $error) {
527
                $data = [
528
                    'success' => false,
529
                    'data' => 'Controller not found.'
530
 
531
                ];
532
            } else {
533
                $data = [
534
                    'success' => false,
535
                    'data' => 'Unknow error.' , 'error' => $error
536
 
537
                ];
538
            }
539
 
540
 
541
 
542
            $this->sendResponse($response, $data);
543
        }
544
 
545
        $this->initAcl($event);
546
    }
547
 
548
 
549
    public function authPreDispatch(MvcEvent $event)
550
    {
551
        $serviceManager = $event->getApplication()->getServiceManager();
552
        $adapter = $serviceManager->get('leaders-linked-db');
553
 
15343 efrain 554
        $userTypeId = $this->currentUserPlugin->getUserTypeId();
1 www 555
 
556
 
557
 
558
 
559
        $routeName = $event->getRouteMatch()->getMatchedRouteName();
560
 
561
 
562
 
563
        if($this->acl->isAllowed($userTypeId, $routeName)) {
15343 efrain 564
            $user = $this->currentUserPlugin->getUser();
1 www 565
 
14689 efrain 566
            if($user) {
567
 
568
 
569
                $updateLastActivity = true;
570
                if ('chat' == substr($routeName, 0, 4)) {
571
                    $updateLastActivity = false;
572
                }
573
                if ('inmail' == substr($routeName, 0, 6)) {
574
                    $updateLastActivity = false;
575
                }
576
                if ('check-session' == $routeName) {
577
                    $updateLastActivity = false;
578
                }
579
 
580
 
581
                if($updateLastActivity) {
582
                    $userMapper = UserMapper::getInstance($adapter);
583
                    $userMapper->updateLastActivity($user->id);
584
                }
14628 efrain 585
            }
1 www 586
 
587
        } else {
14690 efrain 588
 
589
 
590
            echo "userTypeId = $userTypeId routeName = $routeName";
591
            exit;
1 www 592
 
15343 efrain 593
            $this->currentUserPlugin->clearIdentity();
1 www 594
 
595
 
596
            if($this->isJson) {
597
                $response = $event->getResponse();
598
                $headers = $response->getHeaders();
599
                $headers->clearHeaders();
600
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
601
 
602
                $response->setStatusCode(200);
603
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
604
                $response->send();
605
            } else {
606
                $url = $event->getRouter()->assemble([], ['name' => 'signout']);
607
 
608
                $response = $event->getResponse();
609
                $headers = $response->getHeaders();
610
                $headers->clearHeaders();
611
                $headers->addHeaderLine('Location', $url);
612
 
613
                $response->setStatusCode(302);
614
                $response->send();
615
            }
616
            exit;
617
        }
618
 
619
 
620
    }
621
 
622
 
623
    public function authPosDispatch(MvcEvent $event)
624
    {
625
 
626
    }
627
 
628
 
629
}