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;
+ }
+}