Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16954 | | 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 {
17002 efrain 487
 
1 www 488
            throw new \Exception($data['data']);
489
        }
490
        exit;
491
    }
492
 
493
    public function processError(MvcEvent $event)
494
    {
495
 
496
 
497
        $request =  $event->getRequest();
498
        if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
499
 
16785 efrain 500
 
501
 
1 www 502
            $error = $event->getError();
503
            if (!$error) {
504
                return;
505
            }
16785 efrain 506
 
1 www 507
 
508
            $response = $event->getResponse();
509
 
510
            if('error-exception' == $error) {
511
                $exception = $event->getParam('exception');
512
                error_log($exception->getCode() . ' ' . $exception->getMessage());
513
                //error_log($exception->getTraceAsString());
514
 
515
 
516
                $data = [
517
                    'success' => false,
518
                    'data' => 'An error occurred during execution; please try again later.'
519
                ];
520
 
521
            } else if('error-router-no-match' == $error) {
522
                $data = [
523
                    'success' => false,
524
                    'data' => 'Resource not found.'
525
 
526
                ];
527
            } else if(' error-controller-not-found' == $error) {
528
                $data = [
529
                    'success' => false,
530
                    'data' => 'Controller not found.'
531
 
532
                ];
533
            } else {
534
                $data = [
535
                    'success' => false,
536
                    'data' => 'Unknow error.' , 'error' => $error
537
 
538
                ];
539
            }
540
 
541
 
542
 
543
            $this->sendResponse($response, $data);
544
        }
545
 
546
        $this->initAcl($event);
547
    }
548
 
549
 
550
    public function authPreDispatch(MvcEvent $event)
551
    {
552
        $serviceManager = $event->getApplication()->getServiceManager();
553
        $adapter = $serviceManager->get('leaders-linked-db');
554
 
15343 efrain 555
        $userTypeId = $this->currentUserPlugin->getUserTypeId();
1 www 556
 
557
 
558
 
559
 
560
        $routeName = $event->getRouteMatch()->getMatchedRouteName();
561
 
562
 
563
 
564
        if($this->acl->isAllowed($userTypeId, $routeName)) {
15343 efrain 565
            $user = $this->currentUserPlugin->getUser();
1 www 566
 
14689 efrain 567
            if($user) {
568
 
569
 
570
                $updateLastActivity = true;
571
                if ('chat' == substr($routeName, 0, 4)) {
572
                    $updateLastActivity = false;
573
                }
574
                if ('inmail' == substr($routeName, 0, 6)) {
575
                    $updateLastActivity = false;
576
                }
577
                if ('check-session' == $routeName) {
578
                    $updateLastActivity = false;
579
                }
580
 
581
 
582
                if($updateLastActivity) {
583
                    $userMapper = UserMapper::getInstance($adapter);
584
                    $userMapper->updateLastActivity($user->id);
585
                }
14628 efrain 586
            }
1 www 587
 
588
        } else {
14690 efrain 589
 
16954 efrain 590
 
591
            echo 'salio $userTypeId = ' .  $userTypeId . ' $routeName = ' . $routeName;
592
            exit;
16927 efrain 593
 
15343 efrain 594
            $this->currentUserPlugin->clearIdentity();
1 www 595
 
596
 
597
            if($this->isJson) {
598
                $response = $event->getResponse();
599
                $headers = $response->getHeaders();
600
                $headers->clearHeaders();
601
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
602
 
603
                $response->setStatusCode(200);
604
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
605
                $response->send();
606
            } else {
607
                $url = $event->getRouter()->assemble([], ['name' => 'signout']);
608
 
609
                $response = $event->getResponse();
610
                $headers = $response->getHeaders();
611
                $headers->clearHeaders();
612
                $headers->addHeaderLine('Location', $url);
613
 
614
                $response->setStatusCode(302);
615
                $response->send();
616
            }
617
            exit;
618
        }
619
 
620
 
621
    }
622
 
623
 
624
    public function authPosDispatch(MvcEvent $event)
625
    {
626
 
627
    }
628
 
629
 
630
}