Proyectos de Subversion LeadersLinked - Backend

Rev

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