Proyectos de Subversion LeadersLinked - Backend

Rev

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