Proyectos de Subversion LeadersLinked - Backend

Rev

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