Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 14690 | Rev 15092 | 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;
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;
22
use LeadersLinked\Model\Service;
15088 efrain 23
use LeadersLinked\Model\User;
24
use LeadersLinked\Model\UserType;
25
use LeadersLinked\Model\CompanyService;
26
use LeadersLinked\Model\CompanyUser;
1 www 27
 
28
class Module
29
{
30
    /**
31
     *
32
     * @var boolean
33
     */
34
    private $isJson;
35
 
36
    /**
37
     *
38
     * @var boolean
39
     */
40
    private $isHtml;
41
 
42
    /**
43
     *
44
     * @var Acl
45
     */
46
    private $acl;
47
 
48
    /**
49
     *
50
     * @var Company
51
     */
52
    private $company;
53
 
54
    /**
55
     *
56
     * @var AdapterInterface
57
     */
58
    private $adapter;
59
 
60
 
61
    /**
62
     *
63
     * @var CacheAdapter
64
     */
65
    private $cache;
66
 
67
    /**
68
     *
69
     * @var CurrentUserPlugin
70
     */
71
    private $currentUser;
72
 
73
 
74
    /**
75
     *
76
     * @var array
77
     */
78
    private $routesAuthorized = [];
79
 
80
    /**
81
     *
82
     * @var boolean
83
     */
84
    private $authByHeaders = false;
85
 
86
    public function init(ModuleManager $moduleManager)
87
    {
88
        $events = $moduleManager->getEventManager();
89
        $events->attach(ModuleEvent::EVENT_MERGE_CONFIG, array($this, 'onMergeConfig'));
90
    }
91
 
92
    public function onMergeConfig(ModuleEvent $event)
93
    {
94
        $configListener = $event->getConfigListener();
95
        $config         = $configListener->getMergedConfig(false);
96
 
97
        $reader = new Ini();
98
        $data = $reader->fromFile('config/leaderslinked.ini');
99
 
100
        $prefix = 'leaderslinked';
101
        foreach($data as $section => $pairs)
102
        {
103
            foreach($pairs as $key => $value)
104
            {
105
                $config[$prefix . '.' . $section . '.' . $key] = $value;
106
            }
107
        }
108
        $configListener->setMergedConfig($config);
109
    }
110
 
111
 
112
    public function getConfig() : array
113
    {
114
        return include __DIR__ . '/../config/module.config.php';
115
    }
116
 
117
    public function onBootstrap(MvcEvent $event)
118
    {
119
        $serviceManager = $event->getApplication()->getServiceManager();
120
        $adapter = $serviceManager->get('leaders-linked-db');
121
       // $logger          = $serviceManager->get('Zend\Log\Logger');
122
 
123
 
124
        $session = $serviceManager->get('leaders-linked-session');
125
        $session->start();
126
 
127
 
128
        $translator = $serviceManager->get('MvcTranslator');
129
        $translator->addTranslationFile(
130
            'phpArray',
131
            __DIR__ . '/i18n/validate.php',
132
            'default'
133
            );
134
 
135
        $translator->addTranslationFile(
136
            'phpArray',
137
            __DIR__ . '/i18n/spanish.php',
138
            'default'
139
            );
140
 
141
        \Laminas\Validator\AbstractValidator::setDefaultTranslator($translator);
142
 
143
 
144
        $this->isHtml = $this->isJson ? false : true;
145
        $this->currentUser = new CurrentUserPlugin($adapter);
146
        $this->initAcl($event);
147
        $eventManager = $event->getApplication()->getEventManager();
148
        $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this,'onDispatchError'], 0);
149
        $eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, [$this,'onRenderError'], 0);
150
 
151
        $sharedManager = $eventManager->getSharedManager();
152
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPreDispatch'], 100);
153
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPosDispatch'], -100);
154
    }
155
 
156
    public function initAcl(MvcEvent $event)
157
    {
158
        $serviceManager = $event->getApplication()->getServiceManager();
159
        $adapter = $serviceManager->get('leaders-linked-db');
160
 
161
        require_once   (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'acl.config.php');
162
 
15088 efrain 163
        //header('Content-type: text/plain');
1 www 164
 
165
        $this->acl = new Acl();
166
        $resources = getAclResources();
167
        foreach($resources as $resourceName)
168
        {
15088 efrain 169
           //echo $resourceName . PHP_EOL;
1 www 170
 
171
            $this->acl->addResource(new GenericResource($resourceName));
172
        }
173
 
15088 efrain 174
 
175
 
1 www 176
 
177
 
15088 efrain 178
 
1 www 179
 
15088 efrain 180
 
181
        $user = $this->currentUser->getUser();
1 www 182
        $company = $this->currentUser->getCompany();
183
        if($company) {
184
 
15088 efrain 185
            $resources = [];
1 www 186
 
15088 efrain 187
 
1 www 188
            $this->acl->addRole(new GenericRole($user->usertype_id));
189
 
15088 efrain 190
            $rolesForUsertype = getAclUsertype();
191
            foreach($rolesForUsertype[UserType::USER] as $resourceName)
192
            {
193
                if(!in_array($resourceName, $resources)) {
194
                    array_push($resources, $resourceName);
195
                }
196
            }
197
 
198
 
199
 
200
 
201
 
202
 
203
 
204
 
205
 
206
 
207
 
208
 
209
            $servicesActive = [];
210
 
211
 
212
            $now = date('Y-m-d');
213
            $companyServiceMapper = CompanyServiceMapper::getInstance($adapter);
214
            $companyServices = $companyServiceMapper->fetchAllByCompanyId($company->id);
215
 
216
            foreach($companyServices as $companyService)
217
            {
218
                if($companyService->status == CompanyService::ACTIVE &&
219
                    $companyService->paid_from >= $now &&
220
                    $companyService->paid_to <= $now) {
221
 
222
                    if(!in_array($companyService->id, $servicesActive)) {
223
                        array_push($servicesActive, $companyService->id);
224
                    }
225
                }
226
 
227
 
228
                array_push($servicesActive, $companyService->service_id);
229
            }
230
 
231
 
232
            $rolesForCompany = getAclRolesCompany();
233
 
234
 
235
 
236
 
1 www 237
            $companyUserMapper = CompanyUserMapper::getInstance($adapter);
238
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);
15088 efrain 239
 
240
            $roleMapper = RoleMapper::getInstance($adapter);
241
 
242
 
1 www 243
 
15088 efrain 244
            if($companyUser) {
1 www 245
 
15088 efrain 246
                if($companyUser->creator == CompanyUser::CREATOR_YES) {
247
 
248
                    $roles = $roleMapper->fetchAllForCreator();
249
                    if($roles) {
250
 
251
                        foreach($roles as $role)
1 www 252
                        {
15088 efrain 253
                            if(!empty($rolesForCompany[$role->code])) {
254
                                foreach($rolesForCompany[$role->code] as $resourceName) {
255
 
256
                                    if(!in_array($resourceName, $resources)) {
257
                                        array_push($resources, $resourceName);
258
                                    }
259
                                }
260
                            }
1 www 261
                        }
262
                    }
263
 
15088 efrain 264
 
265
                    foreach ($servicesActive as $service_id) {
266
                        $roles = $roleMapper->fetchAllByServiceId($service_id);
267
                        foreach($roles as $role) {
268
 
269
 
270
                            if(!empty($rolesForCompany[$role->code])) {
271
                                foreach($rolesForCompany[$role->code] as $resourceName) {
272
 
273
                                    if(!in_array($resourceName, $resources)) {
274
                                        array_push($resources, $resourceName);
275
                                    }
276
                                }
277
                            }
278
 
279
 
280
 
1 www 281
                        }
15088 efrain 282
 
1 www 283
                    }
15088 efrain 284
                } else {
285
                    $companyUserRoleMapper = CompanyUserRoleMapper::getInstance($adapter);
286
                    $companyUserRoles = $companyUserRoleMapper->fetchAllByCompanyIdAndUserId($company->id, $user->id);
287
 
288
                    foreach($companyUserRoles as $companyUserRole)
289
                    {
959 geraldo 290
 
15088 efrain 291
                         $role = $roleMapper->fetchOne($companyUserRole->role_id);
292
                         if($role) {
293
 
294
                             if($role->service_id) {
295
 
296
                             if(!in_array($role->service_id, $servicesActive)) {
297
                                continue;
298
                             }
299
                         }
300
 
301
                         if(isset($roles[ $role->code ] )) {
302
                             foreach($roles[ $role->code ] as $resourceName)
303
                             {
304
                                 if(!in_array($resourceName, $resources)) {
305
                                    array_push($resources, $resourceName);
306
                                 }
307
 
308
                             }
309
                         }
310
                         }
959 geraldo 311
 
15088 efrain 312
 
959 geraldo 313
                    }
1 www 314
                }
15088 efrain 315
            }
316
 
974 geraldo 317
 
15088 efrain 318
            foreach($resources as $resourceName)
319
            {
320
                $this->acl->allow($user->usertype_id, $resourceName);
1 www 321
            }
322
 
15088 efrain 323
        }   else {
1 www 324
 
15088 efrain 325
 
326
            foreach($rolesForUsertype as $usertype => $resources)
1 www 327
            {
328
                $this->acl->addRole(new GenericRole($usertype));
329
                foreach ($resources as $resourceName)
330
                {
15088 efrain 331
                    // echo $resourceName . PHP_EOL;
1 www 332
                    $this->acl->allow($usertype, $resourceName);
333
                }
334
            }
335
        }
336
        $event->getViewModel()->setVariable('acl', $this->acl);
337
    }
338
 
339
    public function onDispatchError(MvcEvent $event)
340
    {
341
        $this->processError($event);
342
    }
343
 
344
    public function onRenderError(MvcEvent $event)
345
    {
346
        $this->processError($event);
347
    }
348
 
349
    public function sendResponse(\Laminas\Http\Response $response, $data)
350
    {
351
 
352
 
353
        if($this->isJson) {
354
            $headers = $response->getHeaders();
355
            $headers->clearHeaders();
356
            $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
357
 
358
            $response->setStatusCode(200);
359
            $response->setContent(json_encode($data));
360
            $response->send();
361
 
362
 
363
        } else {
364
            throw new \Exception($data['data']);
365
        }
366
        exit;
367
    }
368
 
369
    public function processError(MvcEvent $event)
370
    {
371
 
372
 
373
        $request =  $event->getRequest();
374
        if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
375
 
376
            $error = $event->getError();
377
            if (!$error) {
378
                return;
379
            }
380
 
381
            $response = $event->getResponse();
382
 
383
            if('error-exception' == $error) {
384
                $exception = $event->getParam('exception');
385
                error_log($exception->getCode() . ' ' . $exception->getMessage());
386
                //error_log($exception->getTraceAsString());
387
 
388
 
389
                $data = [
390
                    'success' => false,
391
                    'data' => 'An error occurred during execution; please try again later.'
392
                ];
393
 
394
            } else if('error-router-no-match' == $error) {
395
                $data = [
396
                    'success' => false,
397
                    'data' => 'Resource not found.'
398
 
399
                ];
400
            } else if(' error-controller-not-found' == $error) {
401
                $data = [
402
                    'success' => false,
403
                    'data' => 'Controller not found.'
404
 
405
                ];
406
            } else {
407
                $data = [
408
                    'success' => false,
409
                    'data' => 'Unknow error.' , 'error' => $error
410
 
411
                ];
412
            }
413
 
414
 
415
 
416
            $this->sendResponse($response, $data);
417
        }
418
 
419
        $this->initAcl($event);
420
    }
421
 
422
 
423
    public function authPreDispatch(MvcEvent $event)
424
    {
425
        $serviceManager = $event->getApplication()->getServiceManager();
426
        $adapter = $serviceManager->get('leaders-linked-db');
427
 
428
        $userTypeId = $this->currentUser->getUserTypeId();
429
 
430
 
431
 
432
 
433
        $routeName = $event->getRouteMatch()->getMatchedRouteName();
434
 
435
 
436
 
437
        if($this->acl->isAllowed($userTypeId, $routeName)) {
438
            $user = $this->currentUser->getUser();
439
 
14689 efrain 440
            if($user) {
441
 
442
 
443
                $updateLastActivity = true;
444
                if ('chat' == substr($routeName, 0, 4)) {
445
                    $updateLastActivity = false;
446
                }
447
                if ('inmail' == substr($routeName, 0, 6)) {
448
                    $updateLastActivity = false;
449
                }
450
                if ('check-session' == $routeName) {
451
                    $updateLastActivity = false;
452
                }
453
 
454
 
455
                if($updateLastActivity) {
456
                    $userMapper = UserMapper::getInstance($adapter);
457
                    $userMapper->updateLastActivity($user->id);
458
                }
14628 efrain 459
            }
1 www 460
 
461
        } else {
14690 efrain 462
 
463
 
464
            echo "userTypeId = $userTypeId routeName = $routeName";
465
            exit;
1 www 466
 
467
            $this->currentUser->clearIdentity();
468
 
469
 
470
            if($this->isJson) {
471
                $response = $event->getResponse();
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(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
478
                $response->send();
479
            } else {
480
                $url = $event->getRouter()->assemble([], ['name' => 'signout']);
481
 
482
                $response = $event->getResponse();
483
                $headers = $response->getHeaders();
484
                $headers->clearHeaders();
485
                $headers->addHeaderLine('Location', $url);
486
 
487
                $response->setStatusCode(302);
488
                $response->send();
489
            }
490
            exit;
491
        }
492
 
493
 
494
    }
495
 
496
 
497
    public function authPosDispatch(MvcEvent $event)
498
    {
499
 
500
    }
501
 
502
 
503
}