Proyectos de Subversion LeadersLinked - Backend

Rev

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