Rev 15088 | Rev 15346 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?php
declare(strict_types=1);
namespace LeadersLinked;
use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Cache\Storage\Adapter\AbstractAdapter as CacheAdapter;
use Laminas\ModuleManager\ModuleEvent;
use Laminas\ModuleManager\ModuleManager;
use Laminas\Mvc\MvcEvent;
use Laminas\Config\Reader\Ini;
use Laminas\Permissions\Acl\Acl;
use LeadersLinked\Plugin\CurrentUserPlugin;
use LeadersLinked\Model\Company;
use LeadersLinked\Mapper\UserMapper;
use Laminas\Permissions\Acl\Resource\GenericResource;
use Laminas\Permissions\Acl\Role\GenericRole;
use LeadersLinked\Mapper\CompanyUserMapper;
use LeadersLinked\Mapper\CompanyUserRoleMapper;
use LeadersLinked\Mapper\RoleMapper;
use LeadersLinked\Mapper\CompanyServiceMapper;
use LeadersLinked\Model\Service;
use LeadersLinked\Model\User;
use LeadersLinked\Model\UserType;
use LeadersLinked\Model\CompanyService;
use LeadersLinked\Model\CompanyUser;
class Module
{
/**
*
* @var boolean
*/
private $isJson;
/**
*
* @var boolean
*/
private $isHtml;
/**
*
* @var Acl
*/
private $acl;
/**
*
* @var Company
*/
private $company;
/**
*
* @var AdapterInterface
*/
private $adapter;
/**
*
* @var CacheAdapter
*/
private $cache;
/**
*
* @var CurrentUserPlugin
*/
private $currentUser;
/**
*
* @var array
*/
private $routesAuthorized = [];
/**
*
* @var boolean
*/
private $authByHeaders = false;
public function init(ModuleManager $moduleManager)
{
$events = $moduleManager->getEventManager();
$events->attach(ModuleEvent::EVENT_MERGE_CONFIG, array($this, 'onMergeConfig'));
}
public function onMergeConfig(ModuleEvent $event)
{
$configListener = $event->getConfigListener();
$config = $configListener->getMergedConfig(false);
$reader = new Ini();
$data = $reader->fromFile('config/leaderslinked.ini');
$prefix = 'leaderslinked';
foreach($data as $section => $pairs)
{
foreach($pairs as $key => $value)
{
$config[$prefix . '.' . $section . '.' . $key] = $value;
}
}
$configListener->setMergedConfig($config);
}
public function getConfig() : array
{
return include __DIR__ . '/../config/module.config.php';
}
public function onBootstrap(MvcEvent $event)
{
$serviceManager = $event->getApplication()->getServiceManager();
$adapter = $serviceManager->get('leaders-linked-db');
// $logger = $serviceManager->get('Zend\Log\Logger');
$session = $serviceManager->get('leaders-linked-session');
$session->start();
$translator = $serviceManager->get('MvcTranslator');
$translator->addTranslationFile(
'phpArray',
__DIR__ . '/i18n/validate.php',
'default'
);
$translator->addTranslationFile(
'phpArray',
__DIR__ . '/i18n/spanish.php',
'default'
);
\Laminas\Validator\AbstractValidator::setDefaultTranslator($translator);
$this->isHtml = $this->isJson ? false : true;
$this->currentUser = new CurrentUserPlugin($adapter);
$this->initAcl($event);
$eventManager = $event->getApplication()->getEventManager();
$eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this,'onDispatchError'], 0);
$eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, [$this,'onRenderError'], 0);
$sharedManager = $eventManager->getSharedManager();
$sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPreDispatch'], 100);
$sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPosDispatch'], -100);
}
public function initAcl(MvcEvent $event)
{
$serviceManager = $event->getApplication()->getServiceManager();
$adapter = $serviceManager->get('leaders-linked-db');
require_once (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'acl.config.php');
//header('Content-type: text/plain');
$this->acl = new Acl();
$resources = getAclResources();
foreach($resources as $resourceName)
{
//echo $resourceName . PHP_EOL;
$this->acl->addResource(new GenericResource($resourceName));
}
$rolesForUsertype = getAclUsertype();
$user = $this->currentUser->getUser();
$company = $this->currentUser->getCompany();
if($company) {
$resources = [];
$this->acl->addRole(new GenericRole($user->usertype_id));
foreach($rolesForUsertype[UserType::USER] as $resourceName)
{
if(!in_array($resourceName, $resources)) {
array_push($resources, $resourceName);
}
}
$servicesActive = [];
$now = date('Y-m-d');
$companyServiceMapper = CompanyServiceMapper::getInstance($adapter);
$companyServices = $companyServiceMapper->fetchAllByCompanyId($company->id);
foreach($companyServices as $companyService)
{
if($companyService->status == CompanyService::ACTIVE &&
$companyService->paid_from >= $now &&
$companyService->paid_to <= $now) {
if(!in_array($companyService->id, $servicesActive)) {
array_push($servicesActive, $companyService->id);
}
}
array_push($servicesActive, $companyService->service_id);
}
$rolesForCompany = getAclRolesCompany();
$companyUserMapper = CompanyUserMapper::getInstance($adapter);
$companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);
$roleMapper = RoleMapper::getInstance($adapter);
if($companyUser) {
if($companyUser->creator == CompanyUser::CREATOR_YES) {
$roles = $roleMapper->fetchAllForCreator();
if($roles) {
foreach($roles as $role)
{
if(!empty($rolesForCompany[$role->code])) {
foreach($rolesForCompany[$role->code] as $resourceName) {
if(!in_array($resourceName, $resources)) {
array_push($resources, $resourceName);
}
}
}
}
}
foreach ($servicesActive as $service_id) {
$roles = $roleMapper->fetchAllByServiceId($service_id);
foreach($roles as $role) {
if(!empty($rolesForCompany[$role->code])) {
foreach($rolesForCompany[$role->code] as $resourceName) {
if(!in_array($resourceName, $resources)) {
array_push($resources, $resourceName);
}
}
}
}
}
} else {
$companyUserRoleMapper = CompanyUserRoleMapper::getInstance($adapter);
$companyUserRoles = $companyUserRoleMapper->fetchAllByCompanyIdAndUserId($company->id, $user->id);
foreach($companyUserRoles as $companyUserRole)
{
$role = $roleMapper->fetchOne($companyUserRole->role_id);
if($role) {
if($role->service_id) {
if(!in_array($role->service_id, $servicesActive)) {
continue;
}
}
if(isset($roles[ $role->code ] )) {
foreach($roles[ $role->code ] as $resourceName)
{
if(!in_array($resourceName, $resources)) {
array_push($resources, $resourceName);
}
}
}
}
}
}
}
foreach($resources as $resourceName)
{
$this->acl->allow($user->usertype_id, $resourceName);
}
} else {
foreach($rolesForUsertype as $usertype => $resources)
{
$this->acl->addRole(new GenericRole($usertype));
foreach ($resources as $resourceName)
{
// echo $resourceName . PHP_EOL;
$this->acl->allow($usertype, $resourceName);
}
}
}
$event->getViewModel()->setVariable('acl', $this->acl);
}
public function onDispatchError(MvcEvent $event)
{
$this->processError($event);
}
public function onRenderError(MvcEvent $event)
{
$this->processError($event);
}
public function sendResponse(\Laminas\Http\Response $response, $data)
{
if($this->isJson) {
$headers = $response->getHeaders();
$headers->clearHeaders();
$headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
$response->setStatusCode(200);
$response->setContent(json_encode($data));
$response->send();
} else {
throw new \Exception($data['data']);
}
exit;
}
public function processError(MvcEvent $event)
{
$request = $event->getRequest();
if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
$error = $event->getError();
if (!$error) {
return;
}
$response = $event->getResponse();
if('error-exception' == $error) {
$exception = $event->getParam('exception');
error_log($exception->getCode() . ' ' . $exception->getMessage());
//error_log($exception->getTraceAsString());
$data = [
'success' => false,
'data' => 'An error occurred during execution; please try again later.'
];
} else if('error-router-no-match' == $error) {
$data = [
'success' => false,
'data' => 'Resource not found.'
];
} else if(' error-controller-not-found' == $error) {
$data = [
'success' => false,
'data' => 'Controller not found.'
];
} else {
$data = [
'success' => false,
'data' => 'Unknow error.' , 'error' => $error
];
}
$this->sendResponse($response, $data);
}
$this->initAcl($event);
}
public function authPreDispatch(MvcEvent $event)
{
$serviceManager = $event->getApplication()->getServiceManager();
$adapter = $serviceManager->get('leaders-linked-db');
$userTypeId = $this->currentUser->getUserTypeId();
$routeName = $event->getRouteMatch()->getMatchedRouteName();
if($this->acl->isAllowed($userTypeId, $routeName)) {
$user = $this->currentUser->getUser();
if($user) {
$updateLastActivity = true;
if ('chat' == substr($routeName, 0, 4)) {
$updateLastActivity = false;
}
if ('inmail' == substr($routeName, 0, 6)) {
$updateLastActivity = false;
}
if ('check-session' == $routeName) {
$updateLastActivity = false;
}
if($updateLastActivity) {
$userMapper = UserMapper::getInstance($adapter);
$userMapper->updateLastActivity($user->id);
}
}
} else {
echo "userTypeId = $userTypeId routeName = $routeName";
exit;
$this->currentUser->clearIdentity();
if($this->isJson) {
$response = $event->getResponse();
$headers = $response->getHeaders();
$headers->clearHeaders();
$headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
$response->setStatusCode(200);
$response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
$response->send();
} else {
$url = $event->getRouter()->assemble([], ['name' => 'signout']);
$response = $event->getResponse();
$headers = $response->getHeaders();
$headers->clearHeaders();
$headers->addHeaderLine('Location', $url);
$response->setStatusCode(302);
$response->send();
}
exit;
}
}
public function authPosDispatch(MvcEvent $event)
{
}
}