diff --git a/CLI.Dockerfile b/CLI.Dockerfile index 66e5da3..1801b43 100644 --- a/CLI.Dockerfile +++ b/CLI.Dockerfile @@ -7,11 +7,13 @@ ENV API_URL "${API_URL}" RUN apt-get update && apt-get install -y --no-install-recommends cron rsyslog nano && rm -r /var/lib/apt/lists/* RUN pecl install xdebug-3.4.2 \ - && docker-php-ext-enable xdebug + && docker-php-ext-enable xdebug \ + && echo $TZ > /etc/timezone COPY --chmod=550 ./cli/entrypoint /root/entrypoint COPY ./php-errors.ini /usr/local/etc/php/conf.d/docker-php-errors.ini +COPY ./php-timezone.ini /usr/local/etc/php/conf.d/docker-php-timezone.ini WORKDIR /code/bin diff --git a/app/resources/database/migrations/20250506164824_create_toku_customers.php b/app/resources/database/migrations/20250506164824_create_toku_customers.php index 8176743..d51ad45 100644 --- a/app/resources/database/migrations/20250506164824_create_toku_customers.php +++ b/app/resources/database/migrations/20250506164824_create_toku_customers.php @@ -23,6 +23,7 @@ final class CreateTokuCustomers extends AbstractMigration ->addColumn('rut', 'string', ['length' => 9]) ->addColumn('toku_id', 'string', ['length' => 255]) ->addTimestamps() + ->addIndex(['rut'], ['unique' => true]) ->create(); } } diff --git a/app/resources/database/migrations/20250506212422_create_toku_subscriptions.php b/app/resources/database/migrations/20250506212422_create_toku_subscriptions.php index 97346c7..03b6b63 100644 --- a/app/resources/database/migrations/20250506212422_create_toku_subscriptions.php +++ b/app/resources/database/migrations/20250506212422_create_toku_subscriptions.php @@ -23,6 +23,7 @@ final class CreateTokuSubscriptions extends AbstractMigration ->addColumn('venta_id', 'integer', ['signed' => false]) ->addColumn('toku_id', 'string', ['length' => 255]) ->addTimestamps() + ->addIndex(['venta_id'], ['unique' => true]) ->create(); } } diff --git a/app/resources/database/migrations/20250506213859_create_toku_invoices.php b/app/resources/database/migrations/20250506213859_create_toku_invoices.php index e1c3314..aa1a143 100644 --- a/app/resources/database/migrations/20250506213859_create_toku_invoices.php +++ b/app/resources/database/migrations/20250506213859_create_toku_invoices.php @@ -23,6 +23,7 @@ final class CreateTokuInvoices extends AbstractMigration ->addColumn('cuota_id', 'integer', ['signed' => false]) ->addColumn('toku_id', 'string', ['length' => 255]) ->addTimestamps() + ->addIndex(['cuota_id'], ['unique' => true]) ->create(); } } diff --git a/app/resources/database/migrations/20250604015839_create_toku_webhooks.php b/app/resources/database/migrations/20250604015839_create_toku_webhooks.php new file mode 100644 index 0000000..bec7088 --- /dev/null +++ b/app/resources/database/migrations/20250604015839_create_toku_webhooks.php @@ -0,0 +1,29 @@ +table('toku_webhooks') + ->addColumn('secret', 'string', ['length' => 255]) + ->addColumn('events', 'json') + ->addColumn('enabled', 'boolean', ['default' => true]) + ->addTimestamps() + ->create(); + } +} diff --git a/app/setup/settings/time.php b/app/setup/settings/time.php new file mode 100644 index 0000000..0ac8b73 --- /dev/null +++ b/app/setup/settings/time.php @@ -0,0 +1,8 @@ + function(ContainerInterface $container) { + return new DateTimeZone($container->get('TZ') ?? 'America/Santiago'); + } +]; diff --git a/app/setup/settings/urls.php b/app/setup/settings/urls.php index b634238..01b7b7d 100644 --- a/app/setup/settings/urls.php +++ b/app/setup/settings/urls.php @@ -44,8 +44,8 @@ return [ 'externalPaths' => [ '/api/external' => [ '/toku/success' => [ - 'validator' => Incoviba\Service\Venta\MediosPago\Toku::class, - 'token' => $container->get('TOKU_TOKEN') + 'validator' => $container->get(Incoviba\Service\Venta\MediosPago\Toku::class), + 'token' => $container->get('TOKU_TOKEN'), ] ], ] diff --git a/app/setup/setups/logs.php b/app/setup/setups/logs.php index 0a94a68..dd1595d 100644 --- a/app/setup/setups/logs.php +++ b/app/setup/setups/logs.php @@ -17,85 +17,122 @@ return [ return (new Monolog\Formatter\LineFormatter(null, null, false, false, true)) ->setBasePath('/code/'); }, - Psr\Log\LoggerInterface::class => function(ContainerInterface $container) { - return new Monolog\Logger('incoviba', [ - new Monolog\Handler\FilterHandler( - ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') - ? (new Monolog\Handler\StreamHandler('/logs/error.log')) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)) - : (new Monolog\Handler\RotatingFileHandler('/logs/error.log', 10)) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)), - Monolog\Level::Error, - Monolog\Level::Error, - false - ), - new Monolog\Handler\FilterHandler( - ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') - ? (new Monolog\Handler\StreamHandler('/logs/critical.log')) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)) - : (new Monolog\Handler\RotatingFileHandler('/logs/critical.log', 10)) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)), - Monolog\Level::Critical - ), - new Monolog\Handler\FilterHandler( - ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') - ? (new Monolog\Handler\StreamHandler('/logs/debug.log')) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)) - : new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:notices'), - Monolog\Level::Debug, - Monolog\Level::Info, - false - ), - new Monolog\Handler\FilterHandler( - ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') - ? (new Monolog\Handler\StreamHandler('/logs/notices.log')) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)) - : (new Incoviba\Common\Implement\Log\Handler\MySQL($container->get(Incoviba\Common\Define\Connection::class))) - ->setFormatter(new \Incoviba\Common\Implement\Log\Formatter\PDO()), - Monolog\Level::Notice, - Monolog\Level::Warning, - false - ) - ], [ - $container->get(Incoviba\Common\Implement\Log\Processor\User::class), + 'baseMonologProcessors' => function(ContainerInterface $container) { + return [ $container->get(Monolog\Processor\IntrospectionProcessor::class), $container->get(Monolog\Processor\WebProcessor::class), $container->get(Monolog\Processor\MemoryUsageProcessor::class), $container->get(Monolog\Processor\MemoryPeakUsageProcessor::class), $container->get(Monolog\Processor\PsrLogMessageProcessor::class), - ], new DateTimeZone($container->get('TZ') ?? 'America/Santiago')); + $container->get(Monolog\Processor\UidProcessor::class), + ]; + }, + 'defaultMonologHandlers' => function(ContainerInterface $container) { + $baseHandlers = [ + 'critical' => [ + 'handler' => Monolog\Handler\RotatingFileHandler::class, + 'filename' => 'critical.log', + 'levels' => Monolog\Level::Critical + ], + 'error' => [ + 'handler' => Monolog\Handler\RotatingFileHandler::class, + 'filename' => 'error.log', + 'levels' => [Monolog\Level::Error, Monolog\Level::Error], + ], + 'notices' => [ + 'handler' => Incoviba\Common\Implement\Log\Handler\MySQL::class, + 'levels' => [Monolog\Level::Notice, Monolog\Level::Warning] + ], + 'debug' => [ + 'handler' => Monolog\Handler\RedisHandler::class, + 'name' => 'notices', + 'levels' => [Monolog\Level::Debug, Monolog\Level::Info] + ], + ]; + if ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') { + $baseHandlers['critical']['handler'] = Monolog\Handler\StreamHandler::class; + $baseHandlers['error']['handler'] = Monolog\Handler\StreamHandler::class; + $baseHandlers['notices']['handler'] = Monolog\Handler\StreamHandler::class; + $baseHandlers['notices']['filename'] = 'notices.log'; + $baseHandlers['debug']['handler'] = Monolog\Handler\StreamHandler::class; + $baseHandlers['debug']['filename'] = 'debug.log'; + } + $handlers = []; + foreach ($baseHandlers as $handlerData) { + if (in_array($handlerData['handler'], [ + Monolog\Handler\StreamHandler::class, + Monolog\Handler\RotatingFileHandler::class, + ])) { + $params = [ + "/logs/{$handlerData['filename']}", + ]; + if ($handlerData['handler'] === Monolog\Handler\RotatingFileHandler::class) { + $params []= 10; + } + $handler = new $handlerData['handler'](...$params) + ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)); + } elseif ($handlerData['handler'] === Incoviba\Common\Implement\Log\Handler\MySQL::class) { + $params = [ + $container->get(Incoviba\Common\Define\Connection::class) + ]; + $handler = new $handlerData['handler'](...$params) + ->setFormatter(new \Incoviba\Common\Implement\Log\Formatter\PDO()); + } elseif ($handlerData['handler'] === Monolog\Handler\RedisHandler::class) { + $params = [ + $container->get(Predis\ClientInterface::class), + "logs:{$handlerData['name']}" + ]; + $handler = new $handlerData['handler'](...$params); + } + $params = [ + $handler, + ]; + if (is_array($handlerData['levels'])) { + foreach ($handlerData['levels'] as $level) { + $params []= $level; + } + } else { + $params []= $handlerData['levels']; + $params []= Monolog\Level::Emergency; + } + $params []= false; + $handlers []= new Monolog\Handler\FilterHandler(...$params); + } + return $handlers; + }, + Psr\Log\LoggerInterface::class => function(ContainerInterface $container) { + return new Monolog\Logger('incoviba', + $container->get('defaultMonologHandlers'), + [$container->get(Incoviba\Common\Implement\Log\Processor\User::class)] + + $container->get('baseMonologProcessors'), + $container->get(DateTimeZone::class) + ); }, 'loginLogger' => function(ContainerInterface $container) { - return new Monolog\Logger('login', [ - new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:login'), - ], [ - $container->get(Monolog\Processor\IntrospectionProcessor::class), - $container->get(Monolog\Processor\WebProcessor::class), - $container->get(Monolog\Processor\MemoryUsageProcessor::class), - $container->get(Monolog\Processor\MemoryPeakUsageProcessor::class), - $container->get(Monolog\Processor\PsrLogMessageProcessor::class), - ]); + return new Monolog\Logger('login', + [ + new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:login'), + ], + $container->get('baseMonologProcessors'), + $container->get(DateTimeZone::class) + ); }, 'accessLogger' => function(ContainerInterface $container) { - return new Monolog\Logger('access', [ - new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:access'), - ], [ - $container->get(Monolog\Processor\IntrospectionProcessor::class), - $container->get(Monolog\Processor\WebProcessor::class), - $container->get(Monolog\Processor\MemoryUsageProcessor::class), - $container->get(Monolog\Processor\MemoryPeakUsageProcessor::class), - $container->get(Monolog\Processor\PsrLogMessageProcessor::class), - ]); + return new Monolog\Logger('access', + [ + new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:access'), + ], + $container->get('baseMonologProcessors'), + $container->get(DateTimeZone::class) + ); }, 'externalLogger' => function(ContainerInterface $container) { - return new Monolog\Logger('external', [ - new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:external'), - ], [ - $container->get(Monolog\Processor\IntrospectionProcessor::class), - $container->get(Monolog\Processor\WebProcessor::class), - $container->get(Monolog\Processor\MemoryUsageProcessor::class), - $container->get(Monolog\Processor\MemoryPeakUsageProcessor::class), - $container->get(Monolog\Processor\PsrLogMessageProcessor::class), - ]); + return new Monolog\Logger('external', + [ + new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:external'), + ], + $container->get('baseMonologProcessors'), + $container->get(DateTimeZone::class) + ); }, ]; diff --git a/app/setup/setups/services.php b/app/setup/setups/services.php index 67dab05..0d3b665 100644 --- a/app/setup/setups/services.php +++ b/app/setup/setups/services.php @@ -153,7 +153,9 @@ return [ }, Incoviba\Service\Venta\MediosPago\Toku::class => function(ContainerInterface $container) { return (new Incoviba\Service\Venta\MediosPago\Toku( - $container->get('externalLogger') + $container->get('externalLogger'), + $container->get(Incoviba\Common\Define\Connection::class), + $container->get(Incoviba\Service\HMAC::class) )) ->register('customer', $container->get(Incoviba\Service\Venta\MediosPago\Toku\Customer::class)) ->register('subscription', $container->get(Incoviba\Service\Venta\MediosPago\Toku\Subscription::class)) diff --git a/app/src/Controller/API/Login.php b/app/src/Controller/API/Login.php index dd4e5f2..3c0bad8 100644 --- a/app/src/Controller/API/Login.php +++ b/app/src/Controller/API/Login.php @@ -20,20 +20,23 @@ class Login extends Ideal\Controller $body = $request->getParsedBody(); $output = [ 'username' => $body['username'], + 'success' => false ]; + $statusCode = 409; try { $user = $userRepository->fetchByName($body['username']); - if ($user->validate($body['password'])) { - $loginService->login($user); - $output['token'] = $loginService->getToken(); + if (!$user->validate($body['password'])) { + throw new EmptyResult("Invalid password"); } + $loginService->login($user); + $output['token'] = $loginService->getToken(); + $output['success'] = true; + $statusCode = 200; } catch (EmptyResult $exception) { - $output['error'] = [ - 'code' => $exception->getCode(), - 'message' => $exception->getMessage(), - 'stackTrace' => $exception->getTraceAsString() - ]; + $this->logger->error($exception, [ + 'username' => $body['username'] + ]); } - return $this->withJson($response, $output); + return $this->withJson($response, $output, $statusCode); } } diff --git a/app/src/Controller/API/Ventas/MediosPago/Toku.php b/app/src/Controller/API/Ventas/MediosPago/Toku.php index 82c14f9..dc7594a 100644 --- a/app/src/Controller/API/Ventas/MediosPago/Toku.php +++ b/app/src/Controller/API/Ventas/MediosPago/Toku.php @@ -109,7 +109,7 @@ class Toku extends Controller Service\Venta\MediosPago\Toku $tokuService, ContainerInterface $container): ResponseInterface { if (!$container->has('TOKU_ENV') or strtolower($container->get('TOKU_ENV')) !== 'sandbox') { - return $this->withJson($response); + return $this->withJson($response, ['success' => false], 409); } $input = $request->getParsedBody(); $output = [ diff --git a/app/src/Middleware/API.php b/app/src/Middleware/API.php index 5db679a..a439540 100644 --- a/app/src/Middleware/API.php +++ b/app/src/Middleware/API.php @@ -102,6 +102,11 @@ class API if (isset($data['validator'])) { $method = [$data['validator'], 'validateToken']; if ($method($request, $data)) { + $this->logger->info("Validated external key", [ + 'path' => $request->getUri()->getPath(), + 'headers' => $request->getHeaders(), + 'body' => $request->getBody()->getContents() + ]); return true; } } diff --git a/app/src/Repository/Venta/MediosPago/Toku/Customer.php b/app/src/Repository/Venta/MediosPago/Toku/Customer.php index ed632fb..db7928e 100644 --- a/app/src/Repository/Venta/MediosPago/Toku/Customer.php +++ b/app/src/Repository/Venta/MediosPago/Toku/Customer.php @@ -47,7 +47,7 @@ class Customer extends Ideal\Repository /** * @param string $rut - * @return \Incoviba\Model\Venta\MediosPago\Toku\Customer + * @return Model\Venta\MediosPago\Toku\Customer * @throws Implement\Exception\EmptyResult */ public function fetchByRut(string $rut): Model\Venta\MediosPago\Toku\Customer @@ -68,7 +68,7 @@ class Customer extends Ideal\Repository /** * @param string $toku_id - * @return \Incoviba\Model\Venta\MediosPago\Toku\Customer + * @return Model\Venta\MediosPago\Toku\Customer * @throws Implement\Exception\EmptyResult */ public function fetchByTokuId(string $toku_id): Model\Venta\MediosPago\Toku\Customer diff --git a/app/src/Service/HMAC.php b/app/src/Service/HMAC.php new file mode 100644 index 0000000..2747181 --- /dev/null +++ b/app/src/Service/HMAC.php @@ -0,0 +1,16 @@ + $propietario) { + foreach ($propietarios as $propietario) { $data []= [ 'rut' => $propietario->rut, 'digito' => $propietario->dv, diff --git a/app/src/Service/Venta/MediosPago/Toku.php b/app/src/Service/Venta/MediosPago/Toku.php index 8885461..efdd475 100644 --- a/app/src/Service/Venta/MediosPago/Toku.php +++ b/app/src/Service/Venta/MediosPago/Toku.php @@ -2,8 +2,9 @@ namespace Incoviba\Service\Venta\MediosPago; use InvalidArgumentException; +use PDO; use Psr\Http\Message\ServerRequestInterface; -use Incoviba\Service\Venta\MediosPago\Toku\{Customer,Subscription,Invoice}; +use Incoviba\Common\Define\Connection; use Incoviba\Common\Ideal; use Incoviba\Common\Implement\Exception\EmptyResponse; use Incoviba\Exception\InvalidResult; @@ -11,6 +12,10 @@ use Incoviba\Exception\ServiceAction\Read; use Incoviba\Model; use Incoviba\Model\Persona; use Incoviba\Model\Venta\Propietario; +use Incoviba\Service\HMAC; +use Incoviba\Service\Venta\MediosPago\Toku\{Customer,Subscription,Invoice}; +use Psr\Log\LoggerInterface; +use Throwable; class Toku extends Ideal\Service { @@ -21,6 +26,12 @@ class Toku extends Ideal\Service protected Customer $customer; protected Subscription $subscription; protected Invoice $invoice; + + public function __construct(LoggerInterface $logger, protected Connection $connection, protected HMAC $hmac) + { + parent::__construct($logger); + } + public function register(string $type, EndPoint $endPoint): self { if (!in_array(strtolower($type), ['customer', 'subscription', 'invoice'])) { @@ -395,7 +406,7 @@ class Toku extends Ideal\Service return $data; } - public static function validateToken(ServerRequestInterface $request, array $tokenConfig): bool + public function validateToken(ServerRequestInterface $request, array $tokenConfig): bool { if (!$request->hasHeader('User-Agent') or !str_starts_with($request->getHeaderLine('User-Agent'), 'Toku-Webhooks')) { return false; @@ -407,12 +418,41 @@ class Toku extends Ideal\Service return false; } - $tracestate = explode(';', substr($request->getHeaderLine('Tracestate'), strlen('dd='))); - $ptid = substr(array_find($tracestate, fn($item) => str_starts_with($item, 't.tid:')), strlen('t.tid:')); - $datadogTags = explode(',', $request->getHeaderLine('X-Datadog-Tags')); - $tid = array_find($datadogTags, fn($item) => str_contains($item, 'p.tid=')); - $tid = substr($tid, strpos($tid, 'p.tid=') + strlen('p.tid=')); + $tokuSignature = $request->getHeaderLine('Toku-Signature'); + try { + list($timestamp, $signature) = array_map(function($elem) { + return explode('=', $elem)[1]; + }, explode(',', $tokuSignature)); + $body = $request->getBody()->getContents(); + $json = json_decode($body, true); + if (!is_array($json)) { + return false; + } + if (!array_key_exists('id', $json)) { + return false; + } + $eventId = $json['id']; + $eventType = $json['event_type']; - return $tid === $ptid; + $query = $this->connection->getQueryBuilder() + ->select('secret') + ->from('toku_webhooks') + ->where('enabled = ? AND JSON_SEARCH(events, "one", ?) IS NOT NULL'); + $params = [true, $eventType]; + $statement = $this->connection->prepare($query); + $statement->execute($params); + $results = $statement->fetchAll(PDO::FETCH_COLUMN); + if (count($results) === 0) { + return false; + } + + if (array_any($results, fn($secret) => $this->hmac->validate($timestamp, $signature, $eventId, $secret))) { + return true; + } + + } catch (Throwable $throwable) { + $this->logger->error($throwable); + } + return false; } } diff --git a/app/src/Service/Venta/MediosPago/Toku/Customer.php b/app/src/Service/Venta/MediosPago/Toku/Customer.php index 53fc013..4845190 100644 --- a/app/src/Service/Venta/MediosPago/Toku/Customer.php +++ b/app/src/Service/Venta/MediosPago/Toku/Customer.php @@ -41,7 +41,7 @@ class Customer extends AbstractEndPoint } public function delete(string $id): void { - $request_uri = "/customer/{$id}"; + $request_uri = "/customers/{$id}"; $this->sendDelete($request_uri, [204], [404, 409]); } public function reset(array $skip = []): array @@ -55,6 +55,7 @@ class Customer extends AbstractEndPoint $this->logger->warning($exception); return []; } + $this->logger->info('Resetando ' . count($customers) . ' clientes'); foreach ($customers as $customer) { try { $this->delete($customer->toku_id); diff --git a/cli.tar b/cli.tar deleted file mode 100644 index 7489b3a..0000000 Binary files a/cli.tar and /dev/null differ diff --git a/cli/crontab b/cli/crontab index f8f718e..a0f9640 100644 --- a/cli/crontab +++ b/cli/crontab @@ -7,5 +7,5 @@ 0 2 * * * /code/bin/incoviba money:uf >> /logs/commands 2>&1 0 2 * * * /code/bin/incoviba money:uf:update >> /logs/commands 2>&1 0 2 1 * * /code/bin/incoviba money:ipc >> /logs/commands 2>&1 -*/5 * * * * /code/bin/incoviba queue >> /logs/commands 2>&1 +*/2 * * * * /code/bin/incoviba queue >> /logs/commands 2>&1 0 3 * * * /code/bin/incoviba external:services >> /logs/commands 2>&1 diff --git a/cli/src/Command/Ventas/MedioPagos/Toku/Reset.php b/cli/src/Command/Ventas/MedioPagos/Toku/Reset.php index dc17d61..29a2fb8 100644 --- a/cli/src/Command/Ventas/MedioPagos/Toku/Reset.php +++ b/cli/src/Command/Ventas/MedioPagos/Toku/Reset.php @@ -9,7 +9,7 @@ class Reset extends Command { protected function configure(): void { - $this->addOption('venta_ids', 'vid', Console\Input\InputOption::VALUE_OPTIONAL, 'Venta IDs separated by |', ''); + $this->addOption('venta_ids', 'vid', Console\Input\InputOption::VALUE_REQUIRED, 'Venta IDs separated by |', ''); } protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output): int @@ -17,10 +17,15 @@ class Reset extends Command $this->logger->debug("Running {$this->getName()}"); $uri = '/api/external/toku/reset'; $output->writeln("DELETE {$uri}"); - $body = ['venta_ids' => explode('|', $input->getArgument('venta_ids'))]; + $venta_ids = $input->getOption('venta_ids'); + $body = []; + if (!empty($venta_ids)) { + $body = ['skips' => ['subscription' => explode('|', $venta_ids)]]; + } $options = count($body) > 0 ? ['json' => $body] : []; $response = $this->client->delete($uri, $options); $output->writeln("Response Code: {$response->getStatusCode()}"); + $this->logger->debug("Response: {$response->getBody()->getContents()}"); return self::SUCCESS; } diff --git a/cli/src/Service/Login.php b/cli/src/Service/Login.php index 8939cd7..da2d8db 100644 --- a/cli/src/Service/Login.php +++ b/cli/src/Service/Login.php @@ -45,7 +45,9 @@ class Login $body = $response->getBody()->getContents(); $data = json_decode($body, true); if (!key_exists('token', $data)) { - $this->logger->error('Token not found'); + $this->logger->error('Token not found', [ + 'body' => $body + ]); return ''; } $result = file_put_contents($this->tokenFilename, $data['token']); @@ -93,7 +95,7 @@ class Login } catch (Exception $exception) { $this->logger->notice($exception); $savedToken = $this->login(); - if ($savedToken === '') { + if ($savedToken === '' and file_exists($this->tokenFilename)) { unlink($this->tokenFilename); return ''; } diff --git a/incoviba.sql.gz b/incoviba.sql.gz deleted file mode 100644 index 3839f9c..0000000 Binary files a/incoviba.sql.gz and /dev/null differ diff --git a/php.tar b/php.tar deleted file mode 100644 index fcafb04..0000000 Binary files a/php.tar and /dev/null differ