Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17002 | 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;
16824 efrain 80
 
15343 efrain 81
    /**
1 www 82
     *
83
     * @var array
84
     */
85
    private $routesAuthorized = [];
86
 
87
    /**
88
     *
89
     * @var boolean
90
     */
91
    private $authByHeaders = false;
92
 
93
    public function init(ModuleManager $moduleManager)
94
    {
95
        $events = $moduleManager->getEventManager();
96
        $events->attach(ModuleEvent::EVENT_MERGE_CONFIG, array($this, 'onMergeConfig'));
97
    }
98
 
99
    public function onMergeConfig(ModuleEvent $event)
100
    {
101
        $configListener = $event->getConfigListener();
102
        $config         = $configListener->getMergedConfig(false);
103
 
104
        $reader = new Ini();
105
        $data = $reader->fromFile('config/leaderslinked.ini');
106
 
107
        $prefix = 'leaderslinked';
108
        foreach($data as $section => $pairs)
109
        {
110
            foreach($pairs as $key => $value)
111
            {
112
                $config[$prefix . '.' . $section . '.' . $key] = $value;
113
            }
114
        }
115
        $configListener->setMergedConfig($config);
116
    }
117
 
118
 
119
    public function getConfig() : array
120
    {
121
        return include __DIR__ . '/../config/module.config.php';
122
    }
123
 
124
    public function onBootstrap(MvcEvent $event)
125
    {
126
        $serviceManager = $event->getApplication()->getServiceManager();
127
        $adapter = $serviceManager->get('leaders-linked-db');
128
       // $logger          = $serviceManager->get('Zend\Log\Logger');
129
 
17002 efrain 130
        $config     = $serviceManager->get('ServiceManager')->get('config');
131
 
132
 
133
        $config = array_filter($config, function($k) {
134
            return strpos($k, 'leaderslinked.') !== false;
135
        }, ARRAY_FILTER_USE_KEY);
136
 
1 www 137
 
16954 efrain 138
       $session = $serviceManager->get('leaders-linked-session');
139
       $session->start();
1 www 140
 
141
 
142
        $translator = $serviceManager->get('MvcTranslator');
143
        $translator->addTranslationFile(
144
            'phpArray',
145
            __DIR__ . '/i18n/validate.php',
146
            'default'
147
            );
148
 
149
        $translator->addTranslationFile(
150
            'phpArray',
151
            __DIR__ . '/i18n/spanish.php',
152
            'default'
153
            );
154
 
155
        \Laminas\Validator\AbstractValidator::setDefaultTranslator($translator);
156
 
15343 efrain 157
 
17002 efrain 158
        $this->currentNetworkPlugin = CurrentNetworkPlugin::getInstance($adapter);
15343 efrain 159
        if(!$this->currentNetworkPlugin->hasNetwork()) {
160
            header("HTTP/1.1 401 Unauthorized - Private network - not found");
161
            exit;
162
        }
163
 
164
        if($this->currentNetworkPlugin->getNetwork()->status == Network::STATUS_INACTIVE) {
165
            header("HTTP/1.1 401 Unauthorized - Private network - inactive");
166
            exit;
167
        }
168
 
169
 
170
 
171
        if(empty($_SERVER['REDIRECT_URL'])) {
172
            if(empty($_SERVER['REQUEST_URI'])) {
173
                $routeName = '';
174
 
175
            } else {
176
                $routeName = $_SERVER['REQUEST_URI'];
177
            }
178
 
179
        } else {
180
            $routeName = $_SERVER['REDIRECT_URL'];
181
 
182
        }
183
 
184
 
185
        $routeName = strtolower(trim($routeName));
186
        if(strlen($routeName) > 0 && substr($routeName, 0, 1) == '/') {
187
            $routeName = substr($routeName, 1);
188
        }
189
 
190
 
191
 
192
        $this->isHtml = $this->isJson ? false : true;
17002 efrain 193
        $this->currentUserPlugin = CurrentUserPlugin::getInstance($config, $adapter);
15343 efrain 194
 
195
 
196
 
197
        if($this->currentUserPlugin->hasIdentity()) {
198
            if(in_array($routeName, ['signout', 'signin-admin', 'signin-company', 'home'])) {
199
                $checkUserForNetwork = false;
200
            } else {
201
                $checkUserForNetwork = true;
202
            }
203
        } else {
204
            $checkUserForNetwork = false;
205
        }
206
 
207
 
208
 
1 www 209
 
15343 efrain 210
 
211
 
212
        if($checkUserForNetwork) {
213
            if($this->currentUserPlugin->getUser()->network_id != $this->currentNetworkPlugin->getNetworkId()) {
214
                header("HTTP/1.1 401 Unauthorized - The user is not part of this private network");
215
                exit;
216
            }
217
        }
218
 
1 www 219
        $this->initAcl($event);
220
        $eventManager = $event->getApplication()->getEventManager();
221
        $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this,'onDispatchError'], 0);
222
        $eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, [$this,'onRenderError'], 0);
223
 
224
        $sharedManager = $eventManager->getSharedManager();
225
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPreDispatch'], 100);
226
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPosDispatch'], -100);
227
    }
228
 
229
    public function initAcl(MvcEvent $event)
230
    {
231
        $serviceManager = $event->getApplication()->getServiceManager();
232
        $adapter = $serviceManager->get('leaders-linked-db');
233
 
234
        require_once   (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'acl.config.php');
235
 
15088 efrain 236
        //header('Content-type: text/plain');
1 www 237
 
238
        $this->acl = new Acl();
239
        $resources = getAclResources();
240
        foreach($resources as $resourceName)
241
        {
15088 efrain 242
           //echo $resourceName . PHP_EOL;
1 www 243
 
244
            $this->acl->addResource(new GenericResource($resourceName));
245
        }
246
 
15088 efrain 247
 
248
 
1 www 249
 
15343 efrain 250
        $rolesForUsertype = getAclRolesForUsertype();
15088 efrain 251
 
1 www 252
 
15088 efrain 253
 
15343 efrain 254
        $user = $this->currentUserPlugin->getUser();
255
        $company = $this->currentUserPlugin->getCompany();
256
        $network = $this->currentNetworkPlugin->getNetwork();
1 www 257
        if($company) {
258
 
15088 efrain 259
            $resources = [];
1 www 260
 
15088 efrain 261
 
1 www 262
            $this->acl->addRole(new GenericRole($user->usertype_id));
263
 
15092 efrain 264
 
15088 efrain 265
            foreach($rolesForUsertype[UserType::USER] as $resourceName)
266
            {
267
                if(!in_array($resourceName, $resources)) {
268
                    array_push($resources, $resourceName);
269
                }
270
            }
271
 
272
 
273
            $servicesActive = [];
274
            $now = date('Y-m-d');
15448 efrain 275
 
15088 efrain 276
            $companyServiceMapper = CompanyServiceMapper::getInstance($adapter);
277
            $companyServices = $companyServiceMapper->fetchAllByCompanyId($company->id);
278
 
279
            foreach($companyServices as $companyService)
280
            {
15448 efrain 281
                if($companyService->status == CompanyService::ACTIVE) {
15088 efrain 282
 
15448 efrain 283
                    $paid_from = trim(substr($companyService->paid_from, 0, 10));
284
                    $paid_to = trim(substr($companyService->paid_to, 0, 10));
285
 
286
                    if($now >= $paid_from   && $now <= $paid_to) {
287
                        if(!in_array($companyService->id, $servicesActive)) {
288
                            array_push($servicesActive, $companyService->service_id);
289
                        }
15088 efrain 290
                    }
15448 efrain 291
                }
15088 efrain 292
            }
293
 
294
            $rolesForCompany = getAclRolesCompany();
1 www 295
            $companyUserMapper = CompanyUserMapper::getInstance($adapter);
296
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);
15088 efrain 297
 
298
            $roleMapper = RoleMapper::getInstance($adapter);
299
            if($companyUser) {
1 www 300
 
15088 efrain 301
                if($companyUser->creator == CompanyUser::CREATOR_YES) {
302
 
15355 efrain 303
 
304
 
305
                    $applicationVariantMapper = ApplicationVariantMapper::getInstance($adapter);
306
                    $total = $applicationVariantMapper->fetchCountActiveByCompanyId($company->id);
307
 
308
                    if($total > 0) {
309
 
310
                        $resourceNames = getAclPermissionPushTemplatesForCustomApps();
311
 
312
                        foreach($resourceNames as $resourceName)
313
                        {
314
                            if(!in_array($resourceName, $resources)) {
315
                                array_push($resources, $resourceName);
316
                            }
317
                        }
318
 
319
                    }
320
 
321
 
15088 efrain 322
                    $roles = $roleMapper->fetchAllForCreator();
323
                    if($roles) {
324
 
325
                        foreach($roles as $role)
1 www 326
                        {
15088 efrain 327
                            if(!empty($rolesForCompany[$role->code])) {
328
                                foreach($rolesForCompany[$role->code] as $resourceName) {
329
 
330
                                    if(!in_array($resourceName, $resources)) {
331
                                        array_push($resources, $resourceName);
332
                                    }
333
                                }
334
                            }
1 www 335
                        }
336
                    }
337
 
15088 efrain 338
 
339
                    foreach ($servicesActive as $service_id) {
340
                        $roles = $roleMapper->fetchAllByServiceId($service_id);
15371 efrain 341
 
342
 
15088 efrain 343
                        foreach($roles as $role) {
344
 
345
 
346
                            if(!empty($rolesForCompany[$role->code])) {
347
                                foreach($rolesForCompany[$role->code] as $resourceName) {
348
 
349
                                    if(!in_array($resourceName, $resources)) {
350
                                        array_push($resources, $resourceName);
351
                                    }
352
                                }
353
                            }
354
 
355
 
356
 
1 www 357
                        }
15088 efrain 358
 
1 www 359
                    }
15088 efrain 360
                } else {
361
                    $companyUserRoleMapper = CompanyUserRoleMapper::getInstance($adapter);
362
                    $companyUserRoles = $companyUserRoleMapper->fetchAllByCompanyIdAndUserId($company->id, $user->id);
363
 
15343 efrain 364
 
365
 
15088 efrain 366
                    foreach($companyUserRoles as $companyUserRole)
367
                    {
959 geraldo 368
 
15088 efrain 369
                         $role = $roleMapper->fetchOne($companyUserRole->role_id);
15343 efrain 370
 
15088 efrain 371
                         if($role) {
372
 
373
                             if($role->service_id) {
374
 
15343 efrain 375
                                 if(!in_array($role->service_id, $servicesActive)) {
376
                                    continue;
377
                                 }
15088 efrain 378
                             }
379
 
15343 efrain 380
                             if(isset($rolesForCompany[ $role->code ] )) {
381
                                 foreach($rolesForCompany[ $role->code ] as $resourceName)
382
                                 {
383
                                     if(!in_array($resourceName, $resources)) {
384
                                        array_push($resources, $resourceName);
385
                                     }
386
 
15088 efrain 387
                                 }
15343 efrain 388
                            }
389
                        }
959 geraldo 390
 
15088 efrain 391
 
959 geraldo 392
                    }
1 www 393
                }
15088 efrain 394
            }
15355 efrain 395
 
15088 efrain 396
 
974 geraldo 397
 
15088 efrain 398
            foreach($resources as $resourceName)
399
            {
400
                $this->acl->allow($user->usertype_id, $resourceName);
1 www 401
            }
402
 
15088 efrain 403
        }   else {
1 www 404
 
15088 efrain 405
 
406
            foreach($rolesForUsertype as $usertype => $resources)
1 www 407
            {
408
                $this->acl->addRole(new GenericRole($usertype));
409
                foreach ($resources as $resourceName)
410
                {
15088 efrain 411
                    // echo $resourceName . PHP_EOL;
1 www 412
                    $this->acl->allow($usertype, $resourceName);
413
                }
414
            }
15343 efrain 415
 
416
 
417
            if($this->currentUserPlugin->hasIdentity()) {
418
                $user = $this->currentUserPlugin->getUser();
419
 
420
                if($user->is_super_user == User::IS_SUPER_USER_YES) {
421
                    $resources = getAclPermissionSuperAdmin();
422
                    foreach ($resources as $resourceName)
423
                    {
424
                        $this->acl->allow(UserType::ADMIN, $resourceName);
425
                    }
426
                }
427
            }
428
 
429
            if($this->company == null) {
430
 
431
                if($network->default == Network::DEFAULT_YES) {
432
                    $resources = getAclPermissionAdminForDefaultNetwork();
433
                    foreach ($resources as $resourceName)
434
                    {
435
                        $this->acl->allow(UserType::ADMIN, $resourceName);
436
                    }
437
                } else {
438
 
439
                    $companyMapper = CompanyMapper::getInstance($adapter);
440
                    $company = $companyMapper->fetchDefaultForNetworkByNetworkId($network->id);
441
                    if($company) {
15346 efrain 442
                        $companyUserMapper = CompanyUserMapper::getInstance($adapter);
15343 efrain 443
                        $companyUser = $companyUserMapper->fetchCreatorByCompanyId($company->id);
444
                        if($companyUser && $companyUser->user_id == $this->currentUserPlugin->getUserId()) {
445
 
446
                            $resources = getAclPermissionAdminForNonDefaultNetwork();
447
                            foreach ($resources as $resourceName)
448
                            {
449
                                $this->acl->allow(UserType::ADMIN, $resourceName);
450
                            }
451
 
452
                        }
453
                    }
454
 
455
 
456
                }
457
            }
1 www 458
        }
459
        $event->getViewModel()->setVariable('acl', $this->acl);
460
    }
461
 
462
    public function onDispatchError(MvcEvent $event)
463
    {
464
        $this->processError($event);
465
    }
466
 
467
    public function onRenderError(MvcEvent $event)
468
    {
469
        $this->processError($event);
470
    }
471
 
472
    public function sendResponse(\Laminas\Http\Response $response, $data)
473
    {
474
 
475
 
476
        if($this->isJson) {
477
            $headers = $response->getHeaders();
478
            $headers->clearHeaders();
479
            $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
480
 
481
            $response->setStatusCode(200);
482
            $response->setContent(json_encode($data));
483
            $response->send();
484
 
485
 
486
        } else {
487
            throw new \Exception($data['data']);
488
        }
489
        exit;
490
    }
491
 
492
    public function processError(MvcEvent $event)
493
    {
494
 
495
 
496
        $request =  $event->getRequest();
497
        if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
498
 
16785 efrain 499
 
500
 
1 www 501
            $error = $event->getError();
502
            if (!$error) {
503
                return;
504
            }
16785 efrain 505
 
1 www 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
 
16954 efrain 589
 
590
            echo 'salio $userTypeId = ' .  $userTypeId . ' $routeName = ' . $routeName;
591
            exit;
16927 efrain 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
}