Rev 318 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?php
declare(strict_types=1);
namespace LeadersLinked\Controller;
use Laminas\Authentication\AuthenticationService;
use Laminas\Authentication\Result as AuthResult;
use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Log\LoggerInterface;
use Laminas\View\Model\JsonModel;
use LeadersLinked\Authentication\AuthAdapter;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Mapper\EmailTemplateMapper;
use LeadersLinked\Model\User;
use LeadersLinked\Model\UserType;
use LeadersLinked\Library\AesCipher;
use LeadersLinked\Library\AesEncryption;
use LeadersLinked\Library\QueueEmail;
use LeadersLinked\Library\Functions;
use LeadersLinked\Model\EmailTemplate;
use LeadersLinked\Mapper\UserPasswordMapper;
use LeadersLinked\Mapper\DeviceMapper;
use LeadersLinked\Model\Device;
use LeadersLinked\Mapper\ApplicationMapper;
use LeadersLinked\Model\Application;
use LeadersLinked\Validator\PasswordStrengthCheck;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Model\Company;
use LeadersLinked\Mapper\MicrolearningTopicMapper;
use LeadersLinked\Mapper\MicrolearningCapsuleMapper;
use LeadersLinked\Mapper\MicrolearningSlideMapper;
use LeadersLinked\Model\MicrolearningSlide;
use LeadersLinked\Mapper\MicrolearningUserLogMapper;
use LeadersLinked\Mapper\MicrolearningUserProgressMapper;
use LeadersLinked\Mapper\MicrolearningQuizMapper;
use LeadersLinked\Mapper\MicrolearningQuestionMapper;
use LeadersLinked\Mapper\MicrolearningAnswerMapper;
use LeadersLinked\Model\MicrolearningUserProgress;
use LeadersLinked\Model\MicrolearningUserLog;
use LeadersLinked\Mapper\DeviceHistoryMapper;
use LeadersLinked\Model\DeviceHistory;
use LeadersLinked\Mapper\PushMapper;
use LeadersLinked\Model\Push;
use LeadersLinked\Mapper\MicrolearningCapsuleUserMapper;
use LeadersLinked\Mapper\CompanyServiceMapper;
use LeadersLinked\Model\Service;
use LeadersLinked\Model\CompanyService;
use LeadersLinked\Model\MicrolearningCapsuleUser;
use LeadersLinked\Model\MicrolearningUserQuiz;
use LeadersLinked\Mapper\MicrolearningUserQuizMapper;
use LeadersLinked\Mapper\MicrolearningUserMapper;
use LeadersLinked\Model\MicrolearningUser;
use LeadersLinked\Mapper\PushTemplateMapper;
use LeadersLinked\Model\PushTemplate;
use LeadersLinked\Mapper\SyncLogMapper;
use LeadersLinked\Model\SyncLog;
use LeadersLinked\Model\MicrolearningExtendUser;
use LeadersLinked\Mapper\MicrolearningExtendUserMapper;
use LeadersLinked\Model\MicrolearningExtendUserCompany;
use LeadersLinked\Mapper\MicrolearningCapsuleCommentMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserCompanyMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserFunctionMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserGroupMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserInstitutionMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserPartnerMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserProgramMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserStudentTypeMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserSectorMapper;
use Nullix\CryptoJsAes\CryptoJsAes;
use LeadersLinked\Model\MicrolearningTopic;
use LeadersLinked\Model\MicrolearningCapsule;
use LeadersLinked\Model\UserDeleted;
use LeadersLinked\Mapper\UserDeletedMapper;
use LeadersLinked\Mapper\ApplicationVariantMapper;
use LeadersLinked\Library\EasyAES;
class ServiceController extends AbstractActionController
{
/**
*
* @var \Laminas\Db\Adapter\AdapterInterface
*/
private $adapter;
/**
*
* @var \LeadersLinked\Cache\CacheInterface
*/
private $cache;
/**
*
* @var \Laminas\Log\LoggerInterface
*/
private $logger;
/**
*
* @var array
*/
private $config;
/**
*
* @var \Laminas\Mvc\I18n\Translator
*/
private $translator;
/**
*
* @param \Laminas\Db\Adapter\AdapterInterface $adapter
* @param \LeadersLinked\Cache\CacheInterface $cache
* @param \Laminas\Log\LoggerInterface LoggerInterface $logger
* @param array $config
* @param \Laminas\Mvc\I18n\Translator $translator
*/
public function __construct($adapter, $cache, $logger, $config, $translator)
{
$this->adapter = $adapter;
$this->cache = $cache;
$this->logger = $logger;
$this->config = $config;
$this->translator = $translator;
}
public function indexAction()
{
return new JsonModel(['ok' => false]);
}
public function signinAction()
{
$rawdata = file_get_contents("php://input");
error_log('URL = ' . $_SERVER['REQUEST_URI'] );
error_log('$rawdata = ' . $rawdata );
$request = $this->getRequest();
if($request->isPost()) {
$seed = $this->config['leaderslinked.services.seed'];
$min = strtotime('-1 day');
$max = strtotime('+1 day');
$device_uuid = Functions::sanitizeFilterString($this->params()->fromPost('device_uuid', ''));
$user_uuid = Functions::sanitizeFilterString($this->params()->fromPost('user_uuid', ''));
$rand = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
$timestamp = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
$password = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
$sync_id = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
$ok = $device_uuid && strlen($device_uuid) == 32;
$ok = $ok && $rand > 0;
$ok = $ok && ($timestamp / 1000) >= $min;
$ok = $ok && ($timestamp / 1000) <= $max;
$ok = $ok && strlen($password) == 32;
$ok = $ok && strlen($user_uuid) == 36;
$ok = $ok && $sync_id;
if(!$ok) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_PARAMETERS_ARE_INVALID',
]);
}
$password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $user_uuid );
if($password != $password_md5) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_WEBSERVICE_PASSWORD',
]);
}
$deviceMapper = DeviceMapper::getInstance($this->adapter);
$device = $deviceMapper->fetchOne($device_uuid);
if(!$device) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_DEVICE_NOT_FOUND',
]);
}
$userMapper = UserMapper::getInstance($this->adapter);
$user = $userMapper->fetchOneByUuid($user_uuid);
if(!$user) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_USER_NOT_FOUND',
]);
}
$syncLog = new SyncLog();
$syncLog->data = json_encode(['user' => $user_uuid]);
$syncLog->type = 'signin';
$syncLog->device_uuid = $device->id;
$syncLog->ip = Functions::getUserIP();
$syncLogMapper = SyncLogMapper::getInstance($this->adapter);
$syncLogMapper->insert($syncLog);
$device->user_id = $user->id;
$device->ip = Functions::getUserIP();
$result = $deviceMapper->update($device);
if($result) {
$deviceHistory = new DeviceHistory();
$deviceHistory->device_id = $device->id;
$deviceHistory->user_id = $user->id;
$deviceHistory->ip = Functions::getUserIP();
$deviceHistoryMapper = DeviceHistoryMapper::getInstance($this->adapter);
$deviceHistoryMapper->insert($deviceHistory);
return new JsonModel([
'success' => true,
'data' => [
'sync_id' => $sync_id
]
]);
} else {
return new JsonModel([
'success' => false,
'data' => 'ERROR_THERE_WAS_AN_ERROR',
]);
}
}
return new JsonModel([
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
]);
}
public function fcmAction()
{
$rawdata = file_get_contents("php://input");
error_log('URL = ' . $_SERVER['REQUEST_URI'] );
error_log('$rawdata = ' . $rawdata );
$request = $this->getRequest();
if($request->isPost()) {
$seed = $this->config['leaderslinked.services.seed'];
$min = strtotime('-1 day');
$max = strtotime('+1 day');
$device_uuid = Functions::sanitizeFilterString($this->params()->fromPost('device_uuid', ''));
$token = Functions::sanitizeFilterString($this->params()->fromPost('token', ''));
$rand = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
$timestamp = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
$password = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
$sync_id = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
$ok = $device_uuid && strlen($device_uuid) == 32;
$ok = $ok && $rand > 0;
$ok = $ok && ($timestamp / 1000) >= $min;
$ok = $ok && ($timestamp / 1000) <= $max;
$ok = $ok && strlen($password) == 32;
$ok = $ok && strlen($token) <= 512;
$ok = $ok && $sync_id;
if(!$ok) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_PARAMETERS_ARE_INVALID',
]);
}
$password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $token );
if($password != $password_md5) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_WEBSERVICE_PASSWORD',
]);
}
$deviceMapper = DeviceMapper::getInstance($this->adapter);
$device = $deviceMapper->fetchOne($device_uuid);
if(!$device) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_DEVICE_NOT_FOUND',
]);
}
$syncLog = new SyncLog();
$syncLog->data = json_encode(['token' => $token]);
$syncLog->type = 'token';
$syncLog->device_uuid = $device->id;
$syncLog->ip = Functions::getUserIP();
$syncLogMapper = SyncLogMapper::getInstance($this->adapter);
$syncLogMapper->insert($syncLog);
$device->token = $token;
$device->ip = Functions::getUserIP();
$result = $deviceMapper->update($device);
if($result) {
return new JsonModel([
'success' => true,
'data' => [
'sync_id' => $sync_id
]
]);
} else {
return new JsonModel([
'success' => false,
'data' => 'ERROR_THERE_WAS_AN_ERROR',
]);
}
}
return new JsonModel([
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
]);
}
public function deviceAction()
{
$rawdata = file_get_contents("php://input");
error_log('URL = ' . $_SERVER['REQUEST_URI'] );
error_log('$rawdata = ' . $rawdata );
$request = $this->getRequest();
if($request->isPost()) {
$seed = $this->config['leaderslinked.services.seed'];
$min = strtotime('-1 day');
$max = strtotime('+1 day');
$device_uuid = Functions::sanitizeFilterString($this->params()->fromPost('device_uuid', ''));
$manufacturer = Functions::sanitizeFilterString($this->params()->fromPost('manufacturer', ''));
$platform = Functions::sanitizeFilterString($this->params()->fromPost('platform', ''));
$brand = Functions::sanitizeFilterString($this->params()->fromPost('brand', ''));
$version = Functions::sanitizeFilterString($this->params()->fromPost('version', ''));
$model = Functions::sanitizeFilterString($this->params()->fromPost('model', ''));
$rand = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
$timestamp = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
$password = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
$sync_id = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
$ok = $device_uuid && strlen($device_uuid) == 32;
$ok = $ok && strlen($manufacturer) <= 250;
$ok = $ok && strlen($brand) <= 250;
$ok = $ok && strlen($version) <= 250;
$ok = $ok && strlen($model) <= 250;
$ok = $ok && $rand > 0;
$ok = $ok && ($timestamp / 1000) >= $min;
$ok = $ok && ($timestamp / 1000) <= $max;
$ok = $ok && strlen($password) == 32;
$ok = $ok && $sync_id;
$password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $manufacturer . '-' . $brand . '-' . $version . '-' . $model);
if($password != $password_md5) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_WEBSERVICE_PASSWORD',
]);
}
if(!$ok) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_PARAMETERS_ARE_INVALID',
]);
}
$syncLog = new SyncLog();
$syncLog->data = json_encode([
'platform' => $platform,
'manufacturer' => $manufacturer,
'brand' => $brand,
'version' => $version,
'model' => $model,
]);
$syncLog->type = 'device';
$syncLog->device_uuid = $device_uuid;
$syncLog->ip = Functions::getUserIP();
$syncLogMapper = SyncLogMapper::getInstance($this->adapter);
$syncLogMapper->insert($syncLog);
$deviceMapper = DeviceMapper::getInstance($this->adapter);
$device = $deviceMapper->fetchOne($device_uuid);
if($device) {
$device->platform = $platform;
$device->manufacturer = $manufacturer;
$device->brand = $brand;
$device->version = $version;
$device->model = $model;
$device->ip = Functions::getUserIP();
$result = $deviceMapper->update($device);
} else {
$device = new Device();
$device->id = $device_uuid;
$device->manufacturer = $manufacturer;
$device->brand = $brand;
$device->version = $version;
$device->model = $model;
$device->platform = $platform;
$device->ip = Functions::getUserIP();
$result = $deviceMapper->insert($device);
}
if($result) {
return new JsonModel([
'success' => true,
'data' => [
'sync_id' => $sync_id,
]
]);
} else {
return new JsonModel([
'success' => false,
'data' => 'ERROR_THERE_WAS_AN_ERROR',
]);
}
}
return new JsonModel([
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
]);
}
public function signoutAction()
{
$rawdata = file_get_contents("php://input");
error_log('URL = ' . $_SERVER['REQUEST_URI'] );
error_log('$rawdata = ' . $rawdata );
$request = $this->getRequest();
if($request->isPost()) {
$seed = $this->config['leaderslinked.services.seed'];
$min = strtotime('-1 day');
$max = strtotime('+1 day');
$device_uuid = Functions::sanitizeFilterString($this->params()->fromPost('device_uuid', ''));
$user_uuid = Functions::sanitizeFilterString($this->params()->fromPost('user_uuid', ''));
$rand = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
$timestamp = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
$password = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
$sync_id = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
$ok = $device_uuid && strlen($device_uuid) == 32;
$ok = $ok && $rand > 0;
$ok = $ok && ($timestamp / 1000) >= $min;
$ok = $ok && ($timestamp / 1000) <= $max;
$ok = $ok && strlen($password) == 32;
$ok = $ok && strlen($user_uuid) == 36;
$ok = $ok && $sync_id;
if(!$ok) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_PARAMETERS_ARE_INVALID',
]);
}
$password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $user_uuid );
if($password != $password_md5) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_WEBSERVICE_PASSWORD',
]);
}
$deviceMapper = DeviceMapper::getInstance($this->adapter);
$device = $deviceMapper->fetchOne($device_uuid);
if(!$device) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_DEVICE_NOT_FOUND',
]);
}
$userMapper = UserMapper::getInstance($this->adapter);
$user = $userMapper->fetchOneByUuid($user_uuid);
if(!$user) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_USER_NOT_FOUND',
]);
}
$syncLog = new SyncLog();
$syncLog->data = json_encode(['user' => $user_uuid]);
$syncLog->type = 'signin';
$syncLog->device_uuid = $device->id;
$syncLog->ip = Functions::getUserIP();
$syncLogMapper = SyncLogMapper::getInstance($this->adapter);
$syncLogMapper->insert($syncLog);
$device->user_id =
$device->ip = Functions::getUserIP();
$result = $deviceMapper->update($device);
if($result) {
return new JsonModel([
'success' => true,
'data' => [
'sync_id' => $sync_id
]
]);
} else {
return new JsonModel([
'success' => false,
'data' => 'ERROR_THERE_WAS_AN_ERROR',
]);
}
}
return new JsonModel([
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
]);
}
}