Fix issue with cron API call not recognizing cron tokens, found by Rajib Mahmud

This commit is contained in:
Sander Dorigo
2026-06-23 16:23:49 +02:00
parent 78a21856f8
commit 311d562d1e
6 changed files with 18 additions and 15 deletions
@@ -26,6 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\System;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\System\CronRequest; use FireflyIII\Api\V1\Requests\System\CronRequest;
use FireflyIII\Http\Middleware\Binder;
use FireflyIII\Http\Middleware\Installer;
use FireflyIII\Support\Binder\CLIToken;
use FireflyIII\Support\Facades\AppConfiguration; use FireflyIII\Support\Facades\AppConfiguration;
use FireflyIII\Support\Http\Controllers\CronRunner; use FireflyIII\Support\Http\Controllers\CronRunner;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -42,8 +45,9 @@ final class CronController extends Controller
* This endpoint is documented at: * This endpoint is documented at:
* https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/about/getCron * https://api-docs.firefly-iii.org/?urls.primaryName=2.0.0%20(v1)#/about/getCron
*/ */
public function cron(CronRequest $request): JsonResponse public function cron(CronRequest $request, string $cliToken): JsonResponse
{ {
CLIToken::routeBinder($cliToken, $request->route());
$config = $request->getAll(); $config = $request->getAll();
Log::debug(sprintf('Now in %s', __METHOD__)); Log::debug(sprintf('Now in %s', __METHOD__));
+3 -1
View File
@@ -68,6 +68,8 @@ class CronRequest extends FormRequest
*/ */
public function rules(): array public function rules(): array
{ {
return ['force' => 'in:true,false', 'date' => ['nullable', 'date', 'after:1970-01-02', 'before:2038-01-17']]; return [
'force' => 'in:true,false',
'date' => ['nullable', 'date', 'after:1970-01-02', 'before:2038-01-17']];
} }
} }
+1 -6
View File
@@ -42,12 +42,7 @@ class Binder
/** /**
* Binder constructor. * Binder constructor.
*/ */
public function __construct( public function __construct(protected Auth $auth) {
/**
* The authentication factory instance.
*/
protected Auth $auth
) {
$this->binders = Domain::getBindables(); $this->binders = Domain::getBindables();
} }
+2 -1
View File
@@ -26,6 +26,7 @@ namespace FireflyIII\Support\Binder;
use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface;
use FireflyIII\Support\Facades\Preferences; use FireflyIII\Support\Facades\Preferences;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Routing\Route; use Illuminate\Routing\Route;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -56,6 +57,6 @@ class CLIToken implements BinderInterface
} }
Log::error(sprintf('Recognized no users by access token "%s"', $value)); Log::error(sprintf('Recognized no users by access token "%s"', $value));
throw new NotFoundHttpException(); throw new AuthenticationException();
} }
} }
-2
View File
@@ -160,8 +160,6 @@ $app = Application::configure(basePath: dirname(__DIR__))
AddQueuedCookiesToResponse::class, AddQueuedCookiesToResponse::class,
Binder::class, Binder::class,
]); ]);
// $middleware->priority([StartFireflyIIISession::class, ShareErrorsFromSession::class, Authenticate::class, Binder::class, Authorize::class]);
}) })
->withEvents(discover: [ ->withEvents(discover: [
__DIR__ . '/../app/Listeners', __DIR__ . '/../app/Listeners',
+7 -4
View File
@@ -22,8 +22,7 @@
declare(strict_types=1); declare(strict_types=1);
use FireflyIII\Http\Middleware\AcceptHeaders; use FireflyIII\Api\V1\Controllers\System\CronController;
use FireflyIII\Http\Middleware\Binder;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use function Safe\define; use function Safe\define;
@@ -47,10 +46,14 @@ Route::group(
'namespace' => 'FireflyIII\Api\V1\Controllers\System', 'namespace' => 'FireflyIII\Api\V1\Controllers\System',
'prefix' => 'v1', 'prefix' => 'v1',
'as' => 'api.v1.cron.', 'as' => 'api.v1.cron.',
'middleware' => [Binder::class, AcceptHeaders::class],
], ],
static function (): void { static function (): void {
Route::get('cron/{cliToken}', ['uses' => 'CronController@cron', 'as' => 'index'])->withoutMiddleware(['api']); Route::get('cron/{cliToken}', ['uses' => 'CronController@cron', 'as' => 'index'])
->withoutMiddleware(['api']);
Route::get('cron/{cliToken}',
[CronController::class, 'cron']
)->name('index')
->withoutMiddleware(['api']);
} }
); );