diff --git a/index.php b/index.php index 7b62f17e5bd..cf6329f6e53 100644 --- a/index.php +++ b/index.php @@ -30,6 +30,8 @@ */ require_once __DIR__ . '/lib/versioncheck.php'; +use OCP\Security\Bruteforce\MaxDelayReached; + try { require_once __DIR__ . '/lib/base.php'; @@ -67,6 +69,21 @@ try { exit(); } OC_Template::printErrorPage($ex->getMessage(), $ex->getMessage(), 401); +} catch (MaxDelayReached $ex) { + $request = \OC::$server->getRequest(); + /** + * Routes with the @CORS annotation and other API endpoints should + * not return a webpage, so we only print the error page when html is accepted, + * otherwise we reply with a JSON array like the BruteForceMiddleware would do. + */ + if (stripos($request->getHeader('Accept'), 'html') === false) { + http_response_code(429); + header('Content-Type: application/json; charset=utf-8'); + echo json_encode(['message' => $ex->getMessage()]); + exit(); + } + http_response_code(429); + OC_Template::printGuestPage('core', '429'); } catch (Exception $ex) { \OC::$server->getLogger()->logException($ex, ['app' => 'index']); diff --git a/ocs/v1.php b/ocs/v1.php index 05539899372..55e9f426aba 100644 --- a/ocs/v1.php +++ b/ocs/v1.php @@ -41,8 +41,9 @@ if (\OCP\Util::needUpgrade() exit; } -use Symfony\Component\Routing\Exception\ResourceNotFoundException; +use OCP\Security\Bruteforce\MaxDelayReached; use Symfony\Component\Routing\Exception\MethodNotAllowedException; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; /* * Try the appframework routes @@ -62,6 +63,9 @@ try { } OC::$server->get(\OC\Route\Router::class)->match('/ocsapp'.\OC::$server->getRequest()->getRawPathInfo()); +} catch (MaxDelayReached $ex) { + $format = \OC::$server->getRequest()->getParam('format', 'xml'); + OC_API::respond(new \OC\OCS\Result(null, OCP\AppFramework\Http::STATUS_TOO_MANY_REQUESTS, $ex->getMessage()), $format); } catch (ResourceNotFoundException $e) { OC_API::setContentType();