NodeToken.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Middleware;
  4. use App\Models\Node;
  5. use App\Services\RateLimit;
  6. use Psr\Http\Message\ResponseInterface;
  7. use Psr\Http\Message\ServerRequestInterface;
  8. use Psr\Http\Server\MiddlewareInterface;
  9. use Psr\Http\Server\RequestHandlerInterface;
  10. use RedisException;
  11. use Slim\Factory\AppFactory;
  12. use voku\helper\AntiXSS;
  13. final class NodeToken implements MiddlewareInterface
  14. {
  15. /**
  16. * @throws RedisException
  17. */
  18. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
  19. {
  20. $key = $request->getQueryParams()['key'] ?? null;
  21. if ($key === null) {
  22. return AppFactory::determineResponseFactory()->createResponse(401)->withJson([
  23. 'ret' => 0,
  24. 'data' => 'Invalid request.',
  25. ]);
  26. }
  27. $antiXss = new AntiXSS();
  28. if ($_ENV['enable_rate_limit'] &&
  29. (! RateLimit::checkIPLimit($request->getServerParam('REMOTE_ADDR')) ||
  30. ! RateLimit::checkWebAPILimit($antiXss->xss_clean($key)))
  31. ) {
  32. return AppFactory::determineResponseFactory()->createResponse(401)->withJson([
  33. 'ret' => 0,
  34. 'data' => 'Invalid request.',
  35. ]);
  36. }
  37. if (! $_ENV['WebAPI'] || $key !== $_ENV['muKey']) {
  38. return AppFactory::determineResponseFactory()->createResponse(401)->withJson([
  39. 'ret' => 0,
  40. 'data' => 'Invalid request.',
  41. ]);
  42. }
  43. if ($_ENV['checkNodeIp']) {
  44. $ip = $request->getServerParam('REMOTE_ADDR');
  45. if ($ip !== '127.0.0.1' && ! Node::where('node_ip', $ip)->exists()) {
  46. return AppFactory::determineResponseFactory()->createResponse(401)->withJson([
  47. 'ret' => 0,
  48. 'data' => 'Invalid request IP.',
  49. ]);
  50. }
  51. }
  52. return $handler->handle($request);
  53. }
  54. }