From 27d7c18b7773e10fb24ae137674ec121a739aca8 Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Wed, 25 Feb 2026 15:00:48 +0100 Subject: [PATCH] feat(AppFramework): Add support for PSR-7 ServerRequestInterface Signed-off-by: Carl Schwan --- .../lib/Controller/OCSAuthAPIController.php | 4 +-- apps/files/lib/AppInfo/Application.php | 31 +++++++++++------ apps/files/lib/Controller/ApiController.php | 4 +-- .../Controller/ConversionApiController.php | 4 +-- .../Controller/DirectEditingController.php | 4 +-- .../DirectEditingViewController.php | 6 ++-- .../lib/Controller/FilenamesController.php | 8 ++--- .../Controller/OpenLocalEditorController.php | 4 +-- .../lib/Controller/TemplateController.php | 4 +-- .../TransferOwnershipController.php | 4 +-- apps/files/lib/Controller/ViewController.php | 6 ++-- .../tests/Controller/ViewControllerTest.php | 4 --- apps/theming/lib/Themes/DefaultTheme.php | 9 ++--- .../lib/Controller/WebhooksController.php | 10 +++--- build/psalm-baseline.xml | 6 ---- core/Controller/ClientFlowLoginController.php | 1 + lib/private/Server.php | 16 +++++++++ lib/public/AppFramework/ApiController.php | 5 +-- .../AuthPublicShareController.php | 3 +- lib/public/AppFramework/Controller.php | 28 ++++------------ lib/public/AppFramework/Http/Response.php | 10 ++---- lib/public/AppFramework/Http/ZipResponse.php | 5 +-- lib/public/AppFramework/OCSController.php | 5 +-- .../AppFramework/PublicShareController.php | 3 +- lib/public/AppFramework/RequestHelper.php | 33 +++++++++++++++++++ 25 files changed, 126 insertions(+), 91 deletions(-) create mode 100644 lib/public/AppFramework/RequestHelper.php diff --git a/apps/federation/lib/Controller/OCSAuthAPIController.php b/apps/federation/lib/Controller/OCSAuthAPIController.php index 733b6b63544c1..1b309269c4f17 100644 --- a/apps/federation/lib/Controller/OCSAuthAPIController.php +++ b/apps/federation/lib/Controller/OCSAuthAPIController.php @@ -19,9 +19,9 @@ use OCP\AppFramework\OCSController; use OCP\AppFramework\Utility\ITimeFactory; use OCP\BackgroundJob\IJobList; -use OCP\IRequest; use OCP\Security\Bruteforce\IThrottler; use OCP\Security\ISecureRandom; +use Psr\Http\Message\ServerRequestInterface; use Psr\Log\LoggerInterface; /** @@ -35,7 +35,7 @@ class OCSAuthAPIController extends OCSController { public function __construct( string $appName, - IRequest $request, + ServerRequestInterface $request, private ISecureRandom $secureRandom, private IJobList $jobList, private TrustedServers $trustedServers, diff --git a/apps/files/lib/AppInfo/Application.php b/apps/files/lib/AppInfo/Application.php index 34883bb5be379..21947c272030c 100644 --- a/apps/files/lib/AppInfo/Application.php +++ b/apps/files/lib/AppInfo/Application.php @@ -48,13 +48,12 @@ use OCP\IConfig; use OCP\IL10N; use OCP\IPreview; -use OCP\IRequest; -use OCP\IServerContainer; use OCP\ITagManager; use OCP\IUserSession; use OCP\Share\IManager as IShareManager; use OCP\Util; use Psr\Container\ContainerInterface; +use Psr\Http\Message\ServerRequestInterface; use Psr\Log\LoggerInterface; class Application extends App implements IBootstrap { @@ -69,18 +68,24 @@ public function register(IRegistrationContext $context): void { * Controllers */ $context->registerService('APIController', function (ContainerInterface $c) { - /** @var IServerContainer $server */ - $server = $c->get(IServerContainer::class); + $user = $c->get(IUserSession::class)->getUser(); + if (!$user) { + $folder = null; + } else { + $userId = $user->getUID(); + $root = $c->get(IRootFolder::class); + $folder = $root->getUserFolder($userId); + } return new ApiController( - $c->get('AppName'), - $c->get(IRequest::class), + $c->get('appName'), + $c->get(ServerRequestInterface::class), $c->get(IUserSession::class), $c->get(TagService::class), $c->get(IPreview::class), $c->get(IShareManager::class), $c->get(IConfig::class), - $server->getUserFolder(), + $folder, $c->get(UserConfig::class), $c->get(ViewConfig::class), $c->get(IL10N::class), @@ -93,14 +98,20 @@ public function register(IRegistrationContext $context): void { * Services */ $context->registerService(TagService::class, function (ContainerInterface $c) { - /** @var IServerContainer $server */ - $server = $c->get(IServerContainer::class); + $user = $c->get(IUserSession::class)->getUser(); + if (!$user) { + $folder = null; + } else { + $userId = $user->getUID(); + $root = $c->get(IRootFolder::class); + $folder = $root->getUserFolder($userId); + } return new TagService( $c->get(IUserSession::class), $c->get(IActivityManager::class), $c->get(ITagManager::class)->load(self::APP_ID), - $server->getUserFolder(), + $folder, ); }); diff --git a/apps/files/lib/Controller/ApiController.php b/apps/files/lib/Controller/ApiController.php index 03c4bcf49a75c..40f3567c7f9a9 100644 --- a/apps/files/lib/Controller/ApiController.php +++ b/apps/files/lib/Controller/ApiController.php @@ -38,12 +38,12 @@ use OCP\IConfig; use OCP\IL10N; use OCP\IPreview; -use OCP\IRequest; use OCP\IUser; use OCP\IUserSession; use OCP\PreConditionNotMetException; use OCP\Share\IManager; use OCP\Share\IShare; +use Psr\Http\Message\ServerRequestInterface; use Psr\Log\LoggerInterface; use Throwable; @@ -55,7 +55,7 @@ class ApiController extends Controller { public function __construct( string $appName, - IRequest $request, + ServerRequestInterface $request, private IUserSession $userSession, private TagService $tagService, private IPreview $previewManager, diff --git a/apps/files/lib/Controller/ConversionApiController.php b/apps/files/lib/Controller/ConversionApiController.php index 40a42d6ca4c8f..57d609bd410b8 100644 --- a/apps/files/lib/Controller/ConversionApiController.php +++ b/apps/files/lib/Controller/ConversionApiController.php @@ -26,13 +26,13 @@ use OCP\Files\GenericFileException; use OCP\Files\IRootFolder; use OCP\IL10N; -use OCP\IRequest; +use Psr\Http\Message\ServerRequestInterface; use function OCP\Log\logger; class ConversionApiController extends OCSController { public function __construct( string $appName, - IRequest $request, + ServerRequestInterface $request, private IConversionManager $fileConversionManager, private IRootFolder $rootFolder, private IL10N $l10n, diff --git a/apps/files/lib/Controller/DirectEditingController.php b/apps/files/lib/Controller/DirectEditingController.php index c8addc33e9868..5504cff3396d1 100644 --- a/apps/files/lib/Controller/DirectEditingController.php +++ b/apps/files/lib/Controller/DirectEditingController.php @@ -15,14 +15,14 @@ use OCP\DirectEditing\IManager; use OCP\DirectEditing\RegisterDirectEditorEvent; use OCP\EventDispatcher\IEventDispatcher; -use OCP\IRequest; use OCP\IURLGenerator; +use Psr\Http\Message\ServerRequestInterface; use Psr\Log\LoggerInterface; class DirectEditingController extends OCSController { public function __construct( string $appName, - IRequest $request, + ServerRequestInterface $request, string $corsMethods, string $corsAllowedHeaders, int $corsMaxAge, diff --git a/apps/files/lib/Controller/DirectEditingViewController.php b/apps/files/lib/Controller/DirectEditingViewController.php index b13e68f7766bc..415e8eae9b577 100644 --- a/apps/files/lib/Controller/DirectEditingViewController.php +++ b/apps/files/lib/Controller/DirectEditingViewController.php @@ -17,14 +17,14 @@ use OCP\DirectEditing\IManager; use OCP\DirectEditing\RegisterDirectEditorEvent; use OCP\EventDispatcher\IEventDispatcher; -use OCP\IRequest; +use Psr\Http\Message\ServerRequestInterface; use Psr\Log\LoggerInterface; #[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)] class DirectEditingViewController extends Controller { public function __construct( - $appName, - IRequest $request, + string $appName, + ServerRequestInterface $request, private IEventDispatcher $eventDispatcher, private IManager $directEditingManager, private LoggerInterface $logger, diff --git a/apps/files/lib/Controller/FilenamesController.php b/apps/files/lib/Controller/FilenamesController.php index 5b9ee17fd51ff..9160c26496c19 100644 --- a/apps/files/lib/Controller/FilenamesController.php +++ b/apps/files/lib/Controller/FilenamesController.php @@ -15,21 +15,17 @@ use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCS\OCSBadRequestException; use OCP\AppFramework\OCSController; -use OCP\AppFramework\Services\IAppConfig; use OCP\BackgroundJob\IJobList; use OCP\IL10N; -use OCP\IRequest; -use OCP\IUserManager; +use Psr\Http\Message\ServerRequestInterface; class FilenamesController extends OCSController { public function __construct( string $appName, - IRequest $request, + ServerRequestInterface $request, private IL10N $l10n, private IJobList $jobList, - private IAppConfig $appConfig, - private IUserManager $userManager, private SettingsService $settingsService, ) { parent::__construct($appName, $request); diff --git a/apps/files/lib/Controller/OpenLocalEditorController.php b/apps/files/lib/Controller/OpenLocalEditorController.php index b000304eef668..b54ce437436b3 100644 --- a/apps/files/lib/Controller/OpenLocalEditorController.php +++ b/apps/files/lib/Controller/OpenLocalEditorController.php @@ -20,8 +20,8 @@ use OCP\AppFramework\OCSController; use OCP\AppFramework\Utility\ITimeFactory; use OCP\DB\Exception; -use OCP\IRequest; use OCP\Security\ISecureRandom; +use Psr\Http\Message\ServerRequestInterface; use Psr\Log\LoggerInterface; class OpenLocalEditorController extends OCSController { @@ -31,7 +31,7 @@ class OpenLocalEditorController extends OCSController { public function __construct( string $appName, - IRequest $request, + ServerRequestInterface $request, protected ITimeFactory $timeFactory, protected OpenLocalEditorMapper $mapper, protected ISecureRandom $secureRandom, diff --git a/apps/files/lib/Controller/TemplateController.php b/apps/files/lib/Controller/TemplateController.php index ee4c86941c730..269f6805df7ca 100644 --- a/apps/files/lib/Controller/TemplateController.php +++ b/apps/files/lib/Controller/TemplateController.php @@ -18,7 +18,7 @@ use OCP\Files\Template\ITemplateManager; use OCP\Files\Template\Template; use OCP\Files\Template\TemplateFileCreator; -use OCP\IRequest; +use Psr\Http\Message\ServerRequestInterface; /** * @psalm-import-type FilesTemplateFile from ResponseDefinitions @@ -30,7 +30,7 @@ class TemplateController extends OCSController { public function __construct( $appName, - IRequest $request, + ServerRequestInterface $request, protected ITemplateManager $templateManager, ) { parent::__construct($appName, $request); diff --git a/apps/files/lib/Controller/TransferOwnershipController.php b/apps/files/lib/Controller/TransferOwnershipController.php index 51a25400efb8a..92b8af8dd57b0 100644 --- a/apps/files/lib/Controller/TransferOwnershipController.php +++ b/apps/files/lib/Controller/TransferOwnershipController.php @@ -20,15 +20,15 @@ use OCP\BackgroundJob\IJobList; use OCP\Files\IHomeStorage; use OCP\Files\IRootFolder; -use OCP\IRequest; use OCP\IUserManager; use OCP\Notification\IManager as NotificationManager; +use Psr\Http\Message\ServerRequestInterface; class TransferOwnershipController extends OCSController { public function __construct( string $appName, - IRequest $request, + ServerRequestInterface $request, private string $userId, private NotificationManager $notificationManager, private ITimeFactory $timeFactory, diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php index ecf21cef313ac..d87a692446af6 100644 --- a/apps/files/lib/Controller/ViewController.php +++ b/apps/files/lib/Controller/ViewController.php @@ -34,11 +34,10 @@ use OCP\Files\NotFoundException; use OCP\Files\Template\ITemplateManager; use OCP\IConfig; -use OCP\IL10N; -use OCP\IRequest; use OCP\IURLGenerator; use OCP\IUserSession; use OCP\Util; +use Psr\Http\Message\ServerRequestInterface; /** * @package OCA\Files\Controller @@ -48,9 +47,8 @@ class ViewController extends Controller { public function __construct( string $appName, - IRequest $request, + ServerRequestInterface $request, private IURLGenerator $urlGenerator, - private IL10N $l10n, private IConfig $config, private IEventDispatcher $eventDispatcher, private IUserSession $userSession, diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php index 631097cbc6019..3e95e9b4569c3 100644 --- a/apps/files/tests/Controller/ViewControllerTest.php +++ b/apps/files/tests/Controller/ViewControllerTest.php @@ -28,7 +28,6 @@ use OCP\Files\Template\ITemplateManager; use OCP\ICacheFactory; use OCP\IConfig; -use OCP\IL10N; use OCP\IRequest; use OCP\IURLGenerator; use OCP\IUser; @@ -53,7 +52,6 @@ class ViewControllerTest extends TestCase { private IEventDispatcher $eventDispatcher; private IEventLogger&MockObject $eventLogger; private IInitialState&MockObject $initialState; - private IL10N&MockObject $l10n; private IRequest&MockObject $request; private IRootFolder&MockObject $rootFolder; private ITemplateManager&MockObject $templateManager; @@ -74,7 +72,6 @@ protected function setUp(): void { $this->config = $this->createMock(IConfig::class); $this->eventDispatcher = $this->createMock(IEventDispatcher::class); $this->initialState = $this->createMock(IInitialState::class); - $this->l10n = $this->createMock(IL10N::class); $this->request = $this->createMock(IRequest::class); $this->rootFolder = $this->createMock(IRootFolder::class); $this->templateManager = $this->createMock(ITemplateManager::class); @@ -130,7 +127,6 @@ protected function setUp(): void { 'files', $this->request, $this->urlGenerator, - $this->l10n, $this->config, $this->eventDispatcher, $this->userSession, diff --git a/apps/theming/lib/Themes/DefaultTheme.php b/apps/theming/lib/Themes/DefaultTheme.php index db605dd3ed229..fb01844c055d1 100644 --- a/apps/theming/lib/Themes/DefaultTheme.php +++ b/apps/theming/lib/Themes/DefaultTheme.php @@ -13,11 +13,12 @@ use OCA\Theming\ThemingDefaults; use OCA\Theming\Util; use OCP\App\IAppManager; +use OCP\AppFramework\RequestHelper; use OCP\IConfig; use OCP\IL10N; -use OCP\IRequest; use OCP\IURLGenerator; use OCP\IUserSession; +use Psr\Http\Message\ServerRequestInterface; class DefaultTheme implements ITheme { use CommonThemeTrait; @@ -34,7 +35,7 @@ public function __construct( public IConfig $config, public IL10N $l, public IAppManager $appManager, - private ?IRequest $request, + private ?ServerRequestInterface $request, ) { $this->defaultPrimaryColor = $this->themingDefaults->getDefaultColorPrimary(); $this->primaryColor = $this->themingDefaults->getColorPrimary(); @@ -97,9 +98,9 @@ public function getCSSVariables(): array { $user = $this->userSession->getUser(); // Chromium based browsers currently (2024) have huge performance issues with blur filters - $isChromium = $this->request !== null && $this->request->isUserAgent([Request::USER_AGENT_CHROME, Request::USER_AGENT_MS_EDGE]); + $isChromium = $this->request !== null && RequestHelper::isUserAgent($this->request, [Request::USER_AGENT_CHROME, Request::USER_AGENT_MS_EDGE]); // Ignore MacOS because they always have hardware accelartion - $isChromium = $isChromium && !$this->request->isUserAgent(['/Macintosh/']); + $isChromium = $isChromium && !RequestHelper::isUserAgent($this->request, ['/Macintosh/']); // Allow to force the blur filter $forceEnableBlur = $user === null ? false : $this->config->getUserValue( $user->getUID(), diff --git a/apps/webhook_listeners/lib/Controller/WebhooksController.php b/apps/webhook_listeners/lib/Controller/WebhooksController.php index 0eb6913f9d896..ffe77341c6e8e 100644 --- a/apps/webhook_listeners/lib/Controller/WebhooksController.php +++ b/apps/webhook_listeners/lib/Controller/WebhooksController.php @@ -26,8 +26,8 @@ use OCP\AppFramework\OCS\OCSForbiddenException; use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\AppFramework\OCSController; -use OCP\IRequest; use OCP\ISession; +use Psr\Http\Message\ServerRequestInterface; use Psr\Log\LoggerInterface; /** @@ -37,7 +37,7 @@ class WebhooksController extends OCSController { public function __construct( string $appName, - IRequest $request, + ServerRequestInterface $request, private LoggerInterface $logger, private WebhookListenerMapper $mapper, private ?string $userId, @@ -143,7 +143,8 @@ public function create( ): DataResponse { $appId = null; if ($this->session->get('app_api') === true) { - $appId = $this->request->getHeader('ex-app-id'); + $appIds = $this->request->getHeader('ex-app-id'); + $appId = $appIds !== [] ? $appIds[0] : null; } try { $authMethod = AuthMethod::from($authMethod ?? AuthMethod::None->value); @@ -219,7 +220,8 @@ public function update( ): DataResponse { $appId = null; if ($this->session->get('app_api') === true) { - $appId = $this->request->getHeader('ex-app-id'); + $appIds = $this->request->getHeader('ex-app-id'); + $appId = $appIds !== [] ? $appIds[0] : null; } try { $authMethod = AuthMethod::from($authMethod ?? AuthMethod::None->value); diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml index 9936d3543d934..d1db8bb9043b9 100644 --- a/build/psalm-baseline.xml +++ b/build/psalm-baseline.xml @@ -1227,14 +1227,8 @@ - - - - - - diff --git a/core/Controller/ClientFlowLoginController.php b/core/Controller/ClientFlowLoginController.php index 836bba6d8b734..779c8741f7012 100644 --- a/core/Controller/ClientFlowLoginController.php +++ b/core/Controller/ClientFlowLoginController.php @@ -69,6 +69,7 @@ public function __construct( } private function getClientName(): string { + /** @var string $userAgent */ $userAgent = $this->request->getHeader('user-agent'); return $userAgent !== '' ? $userAgent : 'unknown'; } diff --git a/lib/private/Server.php b/lib/private/Server.php index f608d3ee26d28..17ef26572ef46 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -8,6 +8,8 @@ namespace OC; use bantu\IniGetWrapper\IniGetWrapper; +use Nyholm\Psr7\Factory\Psr17Factory; +use Nyholm\Psr7Server\ServerRequestCreator; use OC\Accounts\AccountManager; use OC\App\AppManager; use OC\App\AppStore\Bundles\BundleFetcher; @@ -280,6 +282,7 @@ use OCP\User\Events\UserLoggedOutEvent; use OCP\User\IAvailabilityCoordinator; use Psr\Container\ContainerInterface; +use Psr\Http\Message\ServerRequestInterface; use Psr\Log\LoggerInterface; /** @@ -880,6 +883,19 @@ public function __construct( $c->get(IMimeTypeDetector::class) ); }); + $this->registerService(ServerRequestInterface::class, function (): ServerRequestInterface { + $psr17Factory = new Psr17Factory(); + $creator = new ServerRequestCreator( + $psr17Factory, // ServerRequestFactory + $psr17Factory, // UriFactory + $psr17Factory, // UploadedFileFactory + $psr17Factory // StreamFactory + ); + $requestId = $this->get(IRequestId::class); + return $creator->fromGlobals() + ->withAttribute('request-id', $requestId->getId()); + }); + $this->registerService(Request::class, function (ContainerInterface $c) { if (isset($this['urlParams'])) { $urlParams = $this['urlParams']; diff --git a/lib/public/AppFramework/ApiController.php b/lib/public/AppFramework/ApiController.php index 729582c850563..a87c7d1c91b14 100644 --- a/lib/public/AppFramework/ApiController.php +++ b/lib/public/AppFramework/ApiController.php @@ -12,6 +12,7 @@ use OCP\AppFramework\Http\Attribute\PublicPage; use OCP\AppFramework\Http\Response; use OCP\IRequest; +use Psr\Http\Message\ServerRequestInterface; /** * Base class to inherit your controllers from that are used for RESTful APIs @@ -25,7 +26,7 @@ abstract class ApiController extends Controller { /** * constructor of the controller * @param string $appName the name of the app - * @param IRequest $request an instance of the request + * @param IRequest|ServerRequestInterface $request an instance of the request * @param string $corsMethods comma separated string of HTTP verbs which * should be allowed for websites or webapps when calling your API, defaults to * 'PUT, POST, GET, DELETE, PATCH' @@ -37,7 +38,7 @@ abstract class ApiController extends Controller { * @since 7.0.0 */ public function __construct($appName, - IRequest $request, + IRequest|ServerRequestInterface $request, $corsMethods = 'PUT, POST, GET, DELETE, PATCH', $corsAllowedHeaders = 'Authorization, Content-Type, Accept', $corsMaxAge = 1728000) { diff --git a/lib/public/AppFramework/AuthPublicShareController.php b/lib/public/AppFramework/AuthPublicShareController.php index 4113f95770b12..12e3207677c2a 100644 --- a/lib/public/AppFramework/AuthPublicShareController.php +++ b/lib/public/AppFramework/AuthPublicShareController.php @@ -17,6 +17,7 @@ use OCP\IRequest; use OCP\ISession; use OCP\IURLGenerator; +use Psr\Http\Message\ServerRequestInterface; /** * Base controller for interactive public shares @@ -37,7 +38,7 @@ abstract class AuthPublicShareController extends PublicShareController { * @since 14.0.0 */ public function __construct(string $appName, - IRequest $request, + IRequest|ServerRequestInterface $request, ISession $session, IURLGenerator $urlGenerator) { parent::__construct($appName, $request, $session); diff --git a/lib/public/AppFramework/Controller.php b/lib/public/AppFramework/Controller.php index a4c0ae49ddbfa..4479e64693780 100644 --- a/lib/public/AppFramework/Controller.php +++ b/lib/public/AppFramework/Controller.php @@ -12,26 +12,13 @@ use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Http\Response; use OCP\IRequest; +use Psr\Http\Message\ServerRequestInterface; /** * Base class to inherit your controllers from * @since 6.0.0 */ abstract class Controller { - /** - * app name - * @var string - * @since 7.0.0 - */ - protected $appName; - - /** - * current request - * @var \OCP\IRequest - * @since 6.0.0 - */ - protected $request; - /** * @var array * @since 7.0.0 @@ -39,16 +26,15 @@ abstract class Controller { private $responders; /** - * constructor of the controller + * Constructor of the controller * @param string $appName the name of the app - * @param IRequest $request an instance of the request + * @param IRequest|ServerRequestInterface $request an instance of the request * @since 6.0.0 - parameter $appName was added in 7.0.0 - parameter $app was removed in 7.0.0 */ - public function __construct($appName, - IRequest $request) { - $this->appName = $appName; - $this->request = $request; - + public function __construct( + protected $appName, + protected $request, + ) { // default responders $this->responders = [ 'json' => function ($data) { diff --git a/lib/public/AppFramework/Http/Response.php b/lib/public/AppFramework/Http/Response.php index 0f82ca9a73830..c30f146cf2683 100644 --- a/lib/public/AppFramework/Http/Response.php +++ b/lib/public/AppFramework/Http/Response.php @@ -10,7 +10,7 @@ use OCP\AppFramework\Http; use OCP\AppFramework\Utility\ITimeFactory; use OCP\IConfig; -use OCP\IRequest; +use OCP\IRequestId; use OCP\IUserSession; use OCP\Server; use Psr\Log\LoggerInterface; @@ -226,13 +226,9 @@ public function setHeaders(array $headers): static { * @since 6.0.0 */ public function getHeaders() { - /** @var IRequest $request */ - /** - * @psalm-suppress UndefinedClass - */ - $request = Server::get(IRequest::class); + $requestId = Server::get(IRequestId::class); $mergeWith = [ - 'X-Request-Id' => $request->getId(), + 'X-Request-Id' => $requestId->getId(), 'Cache-Control' => 'no-cache, no-store, must-revalidate', 'Content-Security-Policy' => $this->getContentSecurityPolicy()->buildPolicy(), 'Feature-Policy' => $this->getFeaturePolicy()->buildPolicy(), diff --git a/lib/public/AppFramework/Http/ZipResponse.php b/lib/public/AppFramework/Http/ZipResponse.php index 128fb1b7f761f..8fca002d40cdb 100644 --- a/lib/public/AppFramework/Http/ZipResponse.php +++ b/lib/public/AppFramework/Http/ZipResponse.php @@ -11,6 +11,7 @@ use OCP\AppFramework\Http; use OCP\IDateTimeZone; use OCP\IRequest; +use Psr\Http\Message\ServerRequestInterface; /** * Public library to send several files in one zip archive. @@ -25,14 +26,14 @@ class ZipResponse extends Response implements ICallbackResponse { private array $resources = []; /** @var string Filename that the zip file should have */ private string $name; - private IRequest $request; + private ServerRequestInterface|IRequest $request; /** * @param S $status * @param H $headers * @since 15.0.0 */ - public function __construct(IRequest $request, string $name = 'output', int $status = Http::STATUS_OK, array $headers = []) { + public function __construct(ServerRequestInterface|IRequest $request, string $name = 'output', int $status = Http::STATUS_OK, array $headers = []) { parent::__construct($status, $headers); $this->name = $name; diff --git a/lib/public/AppFramework/OCSController.php b/lib/public/AppFramework/OCSController.php index 7cde2a7e427f6..0e2a4a93d69f6 100644 --- a/lib/public/AppFramework/OCSController.php +++ b/lib/public/AppFramework/OCSController.php @@ -10,6 +10,7 @@ use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\Response; use OCP\IRequest; +use Psr\Http\Message\ServerRequestInterface; /** * Base class to inherit your controllers from that are used for RESTful APIs @@ -42,7 +43,7 @@ abstract class OCSController extends ApiController { /** * constructor of the controller * @param string $appName the name of the app - * @param IRequest $request an instance of the request + * @param ServerRequestInterface|IRequest $request an instance of the request * @param string $corsMethods comma separated string of HTTP verbs which * should be allowed for websites or webapps when calling your API, defaults to * 'PUT, POST, GET, DELETE, PATCH' @@ -54,7 +55,7 @@ abstract class OCSController extends ApiController { * @since 8.1.0 */ public function __construct($appName, - IRequest $request, + ServerRequestInterface|IRequest $request, $corsMethods = 'PUT, POST, GET, DELETE, PATCH', $corsAllowedHeaders = 'Authorization, Content-Type, Accept, OCS-APIRequest', $corsMaxAge = 1728000) { diff --git a/lib/public/AppFramework/PublicShareController.php b/lib/public/AppFramework/PublicShareController.php index 9bab261d7bd5f..9d1d07444e515 100644 --- a/lib/public/AppFramework/PublicShareController.php +++ b/lib/public/AppFramework/PublicShareController.php @@ -9,6 +9,7 @@ use OCP\IRequest; use OCP\ISession; +use Psr\Http\Message\ServerRequestInterface; /** * Base controller for public shares @@ -36,7 +37,7 @@ abstract class PublicShareController extends Controller { */ public function __construct( string $appName, - IRequest $request, + IRequest|ServerRequestInterface $request, protected ISession $session, ) { parent::__construct($appName, $request); diff --git a/lib/public/AppFramework/RequestHelper.php b/lib/public/AppFramework/RequestHelper.php new file mode 100644 index 0000000000000..ce3da371a8502 --- /dev/null +++ b/lib/public/AppFramework/RequestHelper.php @@ -0,0 +1,33 @@ +getHeader('HTTP_USER_AGENT'); + if ($userAgent === []) { + return false; + } + foreach ($agent as $regex) { + if (preg_match($regex, $userAgent[0])) { + return true; + } + } + return false; + } +}