@@ -37,90 +37,90 @@ discard block |
||
| 37 | 37 | /** @var Application $application */ |
| 38 | 38 | $application = \OC::$server->query(Application::class); |
| 39 | 39 | $application->registerRoutes($this, [ |
| 40 | - 'routes' => [ |
|
| 41 | - ['name' => 'lost#email', 'url' => '/lostpassword/email', 'verb' => 'POST'], |
|
| 42 | - ['name' => 'lost#resetform', 'url' => '/lostpassword/reset/form/{token}/{userId}', 'verb' => 'GET'], |
|
| 43 | - ['name' => 'lost#setPassword', 'url' => '/lostpassword/set/{token}/{userId}', 'verb' => 'POST'], |
|
| 44 | - ['name' => 'user#getDisplayNames', 'url' => '/displaynames', 'verb' => 'POST'], |
|
| 45 | - ['name' => 'avatar#getAvatar', 'url' => '/avatar/{userId}/{size}', 'verb' => 'GET'], |
|
| 46 | - ['name' => 'avatar#deleteAvatar', 'url' => '/avatar/', 'verb' => 'DELETE'], |
|
| 47 | - ['name' => 'avatar#postCroppedAvatar', 'url' => '/avatar/cropped', 'verb' => 'POST'], |
|
| 48 | - ['name' => 'avatar#getTmpAvatar', 'url' => '/avatar/tmp', 'verb' => 'GET'], |
|
| 49 | - ['name' => 'avatar#postAvatar', 'url' => '/avatar/', 'verb' => 'POST'], |
|
| 50 | - ['name' => 'GuestAvatar#getAvatar', 'url' => '/avatar/guest/{guestName}/{size}', 'verb' => 'GET'], |
|
| 51 | - ['name' => 'CSRFToken#index', 'url' => '/csrftoken', 'verb' => 'GET'], |
|
| 52 | - ['name' => 'login#tryLogin', 'url' => '/login', 'verb' => 'POST'], |
|
| 53 | - ['name' => 'login#confirmPassword', 'url' => '/login/confirm', 'verb' => 'POST'], |
|
| 54 | - ['name' => 'login#showLoginForm', 'url' => '/login', 'verb' => 'GET'], |
|
| 55 | - ['name' => 'login#logout', 'url' => '/logout', 'verb' => 'GET'], |
|
| 56 | - // Original login flow used by all clients |
|
| 57 | - ['name' => 'ClientFlowLogin#showAuthPickerPage', 'url' => '/login/flow', 'verb' => 'GET'], |
|
| 58 | - ['name' => 'ClientFlowLogin#generateAppPassword', 'url' => '/login/flow', 'verb' => 'POST'], |
|
| 59 | - ['name' => 'ClientFlowLogin#grantPage', 'url' => '/login/flow/grant', 'verb' => 'GET'], |
|
| 60 | - ['name' => 'ClientFlowLogin#apptokenRedirect', 'url' => '/login/flow/apptoken', 'verb' => 'POST'], |
|
| 61 | - // NG login flow used by desktop client in case of Kerberos/fancy 2fa (smart cards for example) |
|
| 62 | - ['name' => 'ClientFlowLoginV2#poll', 'url' => '/login/v2/poll', 'verb' => 'POST'], |
|
| 63 | - ['name' => 'ClientFlowLoginV2#showAuthPickerPage', 'url' => '/login/v2/flow', 'verb' => 'GET'], |
|
| 64 | - ['name' => 'ClientFlowLoginV2#landing', 'url' => '/login/v2/flow/{token}', 'verb' => 'GET'], |
|
| 65 | - ['name' => 'ClientFlowLoginV2#grantPage', 'url' => '/login/v2/grant', 'verb' => 'GET'], |
|
| 66 | - ['name' => 'ClientFlowLoginV2#generateAppPassword', 'url' => '/login/v2/grant', 'verb' => 'POST'], |
|
| 67 | - ['name' => 'ClientFlowLoginV2#init', 'url' => '/login/v2', 'verb' => 'POST'], |
|
| 68 | - ['name' => 'TwoFactorChallenge#selectChallenge', 'url' => '/login/selectchallenge', 'verb' => 'GET'], |
|
| 69 | - ['name' => 'TwoFactorChallenge#showChallenge', 'url' => '/login/challenge/{challengeProviderId}', 'verb' => 'GET'], |
|
| 70 | - ['name' => 'TwoFactorChallenge#solveChallenge', 'url' => '/login/challenge/{challengeProviderId}', 'verb' => 'POST'], |
|
| 71 | - ['name' => 'TwoFactorChallenge#setupProviders', 'url' => 'login/setupchallenge', 'verb' => 'GET'], |
|
| 72 | - ['name' => 'TwoFactorChallenge#setupProvider', 'url' => 'login/setupchallenge/{providerId}', 'verb' => 'GET'], |
|
| 73 | - ['name' => 'TwoFactorChallenge#confirmProviderSetup', 'url' => 'login/setupchallenge/{providerId}', 'verb' => 'POST'], |
|
| 74 | - ['name' => 'OCJS#getConfig', 'url' => '/core/js/oc.js', 'verb' => 'GET'], |
|
| 75 | - ['name' => 'Preview#getPreviewByFileId', 'url' => '/core/preview', 'verb' => 'GET'], |
|
| 76 | - ['name' => 'Preview#getPreview', 'url' => '/core/preview.png', 'verb' => 'GET'], |
|
| 77 | - ['name' => 'RecommendedApps#index', 'url' => '/core/apps/recommended', 'verb' => 'GET'], |
|
| 78 | - ['name' => 'Svg#getSvgFromCore', 'url' => '/svg/core/{folder}/{fileName}', 'verb' => 'GET'], |
|
| 79 | - ['name' => 'Svg#getSvgFromApp', 'url' => '/svg/{app}/{fileName}', 'verb' => 'GET'], |
|
| 80 | - ['name' => 'Css#getCss', 'url' => '/css/{appName}/{fileName}', 'verb' => 'GET'], |
|
| 81 | - ['name' => 'Js#getJs', 'url' => '/js/{appName}/{fileName}', 'verb' => 'GET'], |
|
| 82 | - ['name' => 'contactsMenu#index', 'url' => '/contactsmenu/contacts', 'verb' => 'POST'], |
|
| 83 | - ['name' => 'contactsMenu#findOne', 'url' => '/contactsmenu/findOne', 'verb' => 'POST'], |
|
| 84 | - ['name' => 'WalledGarden#get', 'url' => '/204', 'verb' => 'GET'], |
|
| 85 | - ['name' => 'Search#search', 'url' => '/core/search', 'verb' => 'GET'], |
|
| 86 | - ['name' => 'Wipe#checkWipe', 'url' => '/core/wipe/check', 'verb' => 'POST'], |
|
| 87 | - ['name' => 'Wipe#wipeDone', 'url' => '/core/wipe/success', 'verb' => 'POST'], |
|
| 40 | + 'routes' => [ |
|
| 41 | + ['name' => 'lost#email', 'url' => '/lostpassword/email', 'verb' => 'POST'], |
|
| 42 | + ['name' => 'lost#resetform', 'url' => '/lostpassword/reset/form/{token}/{userId}', 'verb' => 'GET'], |
|
| 43 | + ['name' => 'lost#setPassword', 'url' => '/lostpassword/set/{token}/{userId}', 'verb' => 'POST'], |
|
| 44 | + ['name' => 'user#getDisplayNames', 'url' => '/displaynames', 'verb' => 'POST'], |
|
| 45 | + ['name' => 'avatar#getAvatar', 'url' => '/avatar/{userId}/{size}', 'verb' => 'GET'], |
|
| 46 | + ['name' => 'avatar#deleteAvatar', 'url' => '/avatar/', 'verb' => 'DELETE'], |
|
| 47 | + ['name' => 'avatar#postCroppedAvatar', 'url' => '/avatar/cropped', 'verb' => 'POST'], |
|
| 48 | + ['name' => 'avatar#getTmpAvatar', 'url' => '/avatar/tmp', 'verb' => 'GET'], |
|
| 49 | + ['name' => 'avatar#postAvatar', 'url' => '/avatar/', 'verb' => 'POST'], |
|
| 50 | + ['name' => 'GuestAvatar#getAvatar', 'url' => '/avatar/guest/{guestName}/{size}', 'verb' => 'GET'], |
|
| 51 | + ['name' => 'CSRFToken#index', 'url' => '/csrftoken', 'verb' => 'GET'], |
|
| 52 | + ['name' => 'login#tryLogin', 'url' => '/login', 'verb' => 'POST'], |
|
| 53 | + ['name' => 'login#confirmPassword', 'url' => '/login/confirm', 'verb' => 'POST'], |
|
| 54 | + ['name' => 'login#showLoginForm', 'url' => '/login', 'verb' => 'GET'], |
|
| 55 | + ['name' => 'login#logout', 'url' => '/logout', 'verb' => 'GET'], |
|
| 56 | + // Original login flow used by all clients |
|
| 57 | + ['name' => 'ClientFlowLogin#showAuthPickerPage', 'url' => '/login/flow', 'verb' => 'GET'], |
|
| 58 | + ['name' => 'ClientFlowLogin#generateAppPassword', 'url' => '/login/flow', 'verb' => 'POST'], |
|
| 59 | + ['name' => 'ClientFlowLogin#grantPage', 'url' => '/login/flow/grant', 'verb' => 'GET'], |
|
| 60 | + ['name' => 'ClientFlowLogin#apptokenRedirect', 'url' => '/login/flow/apptoken', 'verb' => 'POST'], |
|
| 61 | + // NG login flow used by desktop client in case of Kerberos/fancy 2fa (smart cards for example) |
|
| 62 | + ['name' => 'ClientFlowLoginV2#poll', 'url' => '/login/v2/poll', 'verb' => 'POST'], |
|
| 63 | + ['name' => 'ClientFlowLoginV2#showAuthPickerPage', 'url' => '/login/v2/flow', 'verb' => 'GET'], |
|
| 64 | + ['name' => 'ClientFlowLoginV2#landing', 'url' => '/login/v2/flow/{token}', 'verb' => 'GET'], |
|
| 65 | + ['name' => 'ClientFlowLoginV2#grantPage', 'url' => '/login/v2/grant', 'verb' => 'GET'], |
|
| 66 | + ['name' => 'ClientFlowLoginV2#generateAppPassword', 'url' => '/login/v2/grant', 'verb' => 'POST'], |
|
| 67 | + ['name' => 'ClientFlowLoginV2#init', 'url' => '/login/v2', 'verb' => 'POST'], |
|
| 68 | + ['name' => 'TwoFactorChallenge#selectChallenge', 'url' => '/login/selectchallenge', 'verb' => 'GET'], |
|
| 69 | + ['name' => 'TwoFactorChallenge#showChallenge', 'url' => '/login/challenge/{challengeProviderId}', 'verb' => 'GET'], |
|
| 70 | + ['name' => 'TwoFactorChallenge#solveChallenge', 'url' => '/login/challenge/{challengeProviderId}', 'verb' => 'POST'], |
|
| 71 | + ['name' => 'TwoFactorChallenge#setupProviders', 'url' => 'login/setupchallenge', 'verb' => 'GET'], |
|
| 72 | + ['name' => 'TwoFactorChallenge#setupProvider', 'url' => 'login/setupchallenge/{providerId}', 'verb' => 'GET'], |
|
| 73 | + ['name' => 'TwoFactorChallenge#confirmProviderSetup', 'url' => 'login/setupchallenge/{providerId}', 'verb' => 'POST'], |
|
| 74 | + ['name' => 'OCJS#getConfig', 'url' => '/core/js/oc.js', 'verb' => 'GET'], |
|
| 75 | + ['name' => 'Preview#getPreviewByFileId', 'url' => '/core/preview', 'verb' => 'GET'], |
|
| 76 | + ['name' => 'Preview#getPreview', 'url' => '/core/preview.png', 'verb' => 'GET'], |
|
| 77 | + ['name' => 'RecommendedApps#index', 'url' => '/core/apps/recommended', 'verb' => 'GET'], |
|
| 78 | + ['name' => 'Svg#getSvgFromCore', 'url' => '/svg/core/{folder}/{fileName}', 'verb' => 'GET'], |
|
| 79 | + ['name' => 'Svg#getSvgFromApp', 'url' => '/svg/{app}/{fileName}', 'verb' => 'GET'], |
|
| 80 | + ['name' => 'Css#getCss', 'url' => '/css/{appName}/{fileName}', 'verb' => 'GET'], |
|
| 81 | + ['name' => 'Js#getJs', 'url' => '/js/{appName}/{fileName}', 'verb' => 'GET'], |
|
| 82 | + ['name' => 'contactsMenu#index', 'url' => '/contactsmenu/contacts', 'verb' => 'POST'], |
|
| 83 | + ['name' => 'contactsMenu#findOne', 'url' => '/contactsmenu/findOne', 'verb' => 'POST'], |
|
| 84 | + ['name' => 'WalledGarden#get', 'url' => '/204', 'verb' => 'GET'], |
|
| 85 | + ['name' => 'Search#search', 'url' => '/core/search', 'verb' => 'GET'], |
|
| 86 | + ['name' => 'Wipe#checkWipe', 'url' => '/core/wipe/check', 'verb' => 'POST'], |
|
| 87 | + ['name' => 'Wipe#wipeDone', 'url' => '/core/wipe/success', 'verb' => 'POST'], |
|
| 88 | 88 | |
| 89 | - // Logins for passwordless auth |
|
| 90 | - ['name' => 'WebAuthn#startAuthentication', 'url' => 'login/webauthn/start', 'verb' => 'POST'], |
|
| 91 | - ['name' => 'WebAuthn#finishAuthentication', 'url' => 'login/webauthn/finish', 'verb' => 'POST'], |
|
| 89 | + // Logins for passwordless auth |
|
| 90 | + ['name' => 'WebAuthn#startAuthentication', 'url' => 'login/webauthn/start', 'verb' => 'POST'], |
|
| 91 | + ['name' => 'WebAuthn#finishAuthentication', 'url' => 'login/webauthn/finish', 'verb' => 'POST'], |
|
| 92 | 92 | |
| 93 | - // Well known requests https://tools.ietf.org/html/rfc5785 |
|
| 94 | - ['name' => 'WellKnown#handle', 'url' => '.well-known/{service}'], |
|
| 95 | - ], |
|
| 96 | - 'ocs' => [ |
|
| 97 | - ['root' => '/cloud', 'name' => 'OCS#getCapabilities', 'url' => '/capabilities', 'verb' => 'GET'], |
|
| 98 | - ['root' => '', 'name' => 'OCS#getConfig', 'url' => '/config', 'verb' => 'GET'], |
|
| 99 | - ['root' => '/person', 'name' => 'OCS#personCheck', 'url' => '/check', 'verb' => 'POST'], |
|
| 100 | - ['root' => '/identityproof', 'name' => 'OCS#getIdentityProof', 'url' => '/key/{cloudId}', 'verb' => 'GET'], |
|
| 101 | - ['root' => '/core', 'name' => 'Navigation#getAppsNavigation', 'url' => '/navigation/apps', 'verb' => 'GET'], |
|
| 102 | - ['root' => '/core', 'name' => 'Navigation#getSettingsNavigation', 'url' => '/navigation/settings', 'verb' => 'GET'], |
|
| 103 | - ['root' => '/core', 'name' => 'AutoComplete#get', 'url' => '/autocomplete/get', 'verb' => 'GET'], |
|
| 104 | - ['root' => '/core', 'name' => 'WhatsNew#get', 'url' => '/whatsnew', 'verb' => 'GET'], |
|
| 105 | - ['root' => '/core', 'name' => 'WhatsNew#dismiss', 'url' => '/whatsnew', 'verb' => 'POST'], |
|
| 106 | - ['root' => '/core', 'name' => 'AppPassword#getAppPassword', 'url' => '/getapppassword', 'verb' => 'GET'], |
|
| 107 | - ['root' => '/core', 'name' => 'AppPassword#rotateAppPassword', 'url' => '/apppassword/rotate', 'verb' => 'POST'], |
|
| 108 | - ['root' => '/core', 'name' => 'AppPassword#deleteAppPassword', 'url' => '/apppassword', 'verb' => 'DELETE'], |
|
| 93 | + // Well known requests https://tools.ietf.org/html/rfc5785 |
|
| 94 | + ['name' => 'WellKnown#handle', 'url' => '.well-known/{service}'], |
|
| 95 | + ], |
|
| 96 | + 'ocs' => [ |
|
| 97 | + ['root' => '/cloud', 'name' => 'OCS#getCapabilities', 'url' => '/capabilities', 'verb' => 'GET'], |
|
| 98 | + ['root' => '', 'name' => 'OCS#getConfig', 'url' => '/config', 'verb' => 'GET'], |
|
| 99 | + ['root' => '/person', 'name' => 'OCS#personCheck', 'url' => '/check', 'verb' => 'POST'], |
|
| 100 | + ['root' => '/identityproof', 'name' => 'OCS#getIdentityProof', 'url' => '/key/{cloudId}', 'verb' => 'GET'], |
|
| 101 | + ['root' => '/core', 'name' => 'Navigation#getAppsNavigation', 'url' => '/navigation/apps', 'verb' => 'GET'], |
|
| 102 | + ['root' => '/core', 'name' => 'Navigation#getSettingsNavigation', 'url' => '/navigation/settings', 'verb' => 'GET'], |
|
| 103 | + ['root' => '/core', 'name' => 'AutoComplete#get', 'url' => '/autocomplete/get', 'verb' => 'GET'], |
|
| 104 | + ['root' => '/core', 'name' => 'WhatsNew#get', 'url' => '/whatsnew', 'verb' => 'GET'], |
|
| 105 | + ['root' => '/core', 'name' => 'WhatsNew#dismiss', 'url' => '/whatsnew', 'verb' => 'POST'], |
|
| 106 | + ['root' => '/core', 'name' => 'AppPassword#getAppPassword', 'url' => '/getapppassword', 'verb' => 'GET'], |
|
| 107 | + ['root' => '/core', 'name' => 'AppPassword#rotateAppPassword', 'url' => '/apppassword/rotate', 'verb' => 'POST'], |
|
| 108 | + ['root' => '/core', 'name' => 'AppPassword#deleteAppPassword', 'url' => '/apppassword', 'verb' => 'DELETE'], |
|
| 109 | 109 | |
| 110 | - ['root' => '/collaboration', 'name' => 'CollaborationResources#searchCollections', 'url' => '/resources/collections/search/{filter}', 'verb' => 'GET'], |
|
| 111 | - ['root' => '/collaboration', 'name' => 'CollaborationResources#listCollection', 'url' => '/resources/collections/{collectionId}', 'verb' => 'GET'], |
|
| 112 | - ['root' => '/collaboration', 'name' => 'CollaborationResources#renameCollection', 'url' => '/resources/collections/{collectionId}', 'verb' => 'PUT'], |
|
| 113 | - ['root' => '/collaboration', 'name' => 'CollaborationResources#addResource', 'url' => '/resources/collections/{collectionId}', 'verb' => 'POST'], |
|
| 110 | + ['root' => '/collaboration', 'name' => 'CollaborationResources#searchCollections', 'url' => '/resources/collections/search/{filter}', 'verb' => 'GET'], |
|
| 111 | + ['root' => '/collaboration', 'name' => 'CollaborationResources#listCollection', 'url' => '/resources/collections/{collectionId}', 'verb' => 'GET'], |
|
| 112 | + ['root' => '/collaboration', 'name' => 'CollaborationResources#renameCollection', 'url' => '/resources/collections/{collectionId}', 'verb' => 'PUT'], |
|
| 113 | + ['root' => '/collaboration', 'name' => 'CollaborationResources#addResource', 'url' => '/resources/collections/{collectionId}', 'verb' => 'POST'], |
|
| 114 | 114 | |
| 115 | - ['root' => '/collaboration', 'name' => 'CollaborationResources#removeResource', 'url' => '/resources/collections/{collectionId}', 'verb' => 'DELETE'], |
|
| 116 | - ['root' => '/collaboration', 'name' => 'CollaborationResources#getCollectionsByResource', 'url' => '/resources/{resourceType}/{resourceId}', 'verb' => 'GET'], |
|
| 117 | - ['root' => '/collaboration', 'name' => 'CollaborationResources#createCollectionOnResource', 'url' => '/resources/{baseResourceType}/{baseResourceId}', 'verb' => 'POST'], |
|
| 115 | + ['root' => '/collaboration', 'name' => 'CollaborationResources#removeResource', 'url' => '/resources/collections/{collectionId}', 'verb' => 'DELETE'], |
|
| 116 | + ['root' => '/collaboration', 'name' => 'CollaborationResources#getCollectionsByResource', 'url' => '/resources/{resourceType}/{resourceId}', 'verb' => 'GET'], |
|
| 117 | + ['root' => '/collaboration', 'name' => 'CollaborationResources#createCollectionOnResource', 'url' => '/resources/{baseResourceType}/{baseResourceId}', 'verb' => 'POST'], |
|
| 118 | 118 | |
| 119 | - // Unified search |
|
| 120 | - ['root' => '/search', 'name' => 'UnifiedSearch#getProviders', 'url' => '/providers', 'verb' => 'GET'], |
|
| 121 | - ['root' => '/search', 'name' => 'UnifiedSearch#search', 'url' => '/providers/{providerId}/search', 'verb' => 'GET'], |
|
| 119 | + // Unified search |
|
| 120 | + ['root' => '/search', 'name' => 'UnifiedSearch#getProviders', 'url' => '/providers', 'verb' => 'GET'], |
|
| 121 | + ['root' => '/search', 'name' => 'UnifiedSearch#search', 'url' => '/providers/{providerId}/search', 'verb' => 'GET'], |
|
| 122 | 122 | |
| 123 | - ], |
|
| 123 | + ], |
|
| 124 | 124 | ]); |
| 125 | 125 | |
| 126 | 126 | // Post installation check |
@@ -129,4 +129,4 @@ discard block |
||
| 129 | 129 | // Core ajax actions |
| 130 | 130 | // Routing |
| 131 | 131 | $this->create('core_ajax_update', '/core/ajax/update.php') |
| 132 | - ->actionInclude('core/ajax/update.php'); |
|
| 132 | + ->actionInclude('core/ajax/update.php'); |
|
@@ -34,34 +34,34 @@ |
||
| 34 | 34 | |
| 35 | 35 | class WellKnownController extends Controller { |
| 36 | 36 | |
| 37 | - /** @var RequestManager */ |
|
| 38 | - private $requestManager; |
|
| 37 | + /** @var RequestManager */ |
|
| 38 | + private $requestManager; |
|
| 39 | 39 | |
| 40 | - public function __construct(IRequest $request, |
|
| 41 | - RequestManager $wellKnownManager) { |
|
| 42 | - parent::__construct('core', $request); |
|
| 43 | - $this->requestManager = $wellKnownManager; |
|
| 44 | - } |
|
| 40 | + public function __construct(IRequest $request, |
|
| 41 | + RequestManager $wellKnownManager) { |
|
| 42 | + parent::__construct('core', $request); |
|
| 43 | + $this->requestManager = $wellKnownManager; |
|
| 44 | + } |
|
| 45 | 45 | |
| 46 | - /** |
|
| 47 | - * @PublicPage |
|
| 48 | - * @NoCSRFRequired |
|
| 49 | - * |
|
| 50 | - * @return Response |
|
| 51 | - */ |
|
| 52 | - public function handle(string $service): Response { |
|
| 53 | - $response = $this->requestManager->process( |
|
| 54 | - $service, |
|
| 55 | - $this->request |
|
| 56 | - ); |
|
| 46 | + /** |
|
| 47 | + * @PublicPage |
|
| 48 | + * @NoCSRFRequired |
|
| 49 | + * |
|
| 50 | + * @return Response |
|
| 51 | + */ |
|
| 52 | + public function handle(string $service): Response { |
|
| 53 | + $response = $this->requestManager->process( |
|
| 54 | + $service, |
|
| 55 | + $this->request |
|
| 56 | + ); |
|
| 57 | 57 | |
| 58 | - if ($response === null) { |
|
| 59 | - $httpResponse = new JSONResponse(["message" => "$service not supported"], Http::STATUS_NOT_FOUND); |
|
| 60 | - } else { |
|
| 61 | - $httpResponse = $response->toHttpResponse(); |
|
| 62 | - } |
|
| 58 | + if ($response === null) { |
|
| 59 | + $httpResponse = new JSONResponse(["message" => "$service not supported"], Http::STATUS_NOT_FOUND); |
|
| 60 | + } else { |
|
| 61 | + $httpResponse = $response->toHttpResponse(); |
|
| 62 | + } |
|
| 63 | 63 | |
| 64 | - // We add a custom header so that setup checks can detect if their requests are answered by this controller |
|
| 65 | - return $httpResponse->addHeader('X-NEXTCLOUD-WELL-KNOWN', '1'); |
|
| 66 | - } |
|
| 64 | + // We add a custom header so that setup checks can detect if their requests are answered by this controller |
|
| 65 | + return $httpResponse->addHeader('X-NEXTCLOUD-WELL-KNOWN', '1'); |
|
| 66 | + } |
|
| 67 | 67 | } |
@@ -66,145 +66,145 @@ |
||
| 66 | 66 | use Symfony\Component\EventDispatcher\GenericEvent; |
| 67 | 67 | |
| 68 | 68 | class Application extends App implements IBootstrap { |
| 69 | - public const APP_ID = 'settings'; |
|
| 70 | - |
|
| 71 | - /** |
|
| 72 | - * @param array $urlParams |
|
| 73 | - */ |
|
| 74 | - public function __construct(array $urlParams = []) { |
|
| 75 | - parent::__construct(self::APP_ID, $urlParams); |
|
| 76 | - } |
|
| 77 | - |
|
| 78 | - public function register(IRegistrationContext $context): void { |
|
| 79 | - // Register Middleware |
|
| 80 | - $context->registerServiceAlias('SubadminMiddleware', SubadminMiddleware::class); |
|
| 81 | - $context->registerMiddleware(SubadminMiddleware::class); |
|
| 82 | - $context->registerSearchProvider(SectionSearch::class); |
|
| 83 | - $context->registerSearchProvider(AppSearch::class); |
|
| 84 | - |
|
| 85 | - /** |
|
| 86 | - * Core class wrappers |
|
| 87 | - */ |
|
| 88 | - /** FIXME: Remove once OC_User is non-static and mockable */ |
|
| 89 | - $context->registerService('isAdmin', function () { |
|
| 90 | - return \OC_User::isAdminUser(\OC_User::getUser()); |
|
| 91 | - }); |
|
| 92 | - /** FIXME: Remove once OC_SubAdmin is non-static and mockable */ |
|
| 93 | - $context->registerService('isSubAdmin', function () { |
|
| 94 | - $userObject = \OC::$server->getUserSession()->getUser(); |
|
| 95 | - $isSubAdmin = false; |
|
| 96 | - if ($userObject !== null) { |
|
| 97 | - $isSubAdmin = \OC::$server->getGroupManager()->getSubAdmin()->isSubAdmin($userObject); |
|
| 98 | - } |
|
| 99 | - return $isSubAdmin; |
|
| 100 | - }); |
|
| 101 | - $context->registerService(IProvider::class, function (IAppContainer $appContainer) { |
|
| 102 | - /** @var IServerContainer $serverContainer */ |
|
| 103 | - $serverContainer = $appContainer->query(IServerContainer::class); |
|
| 104 | - return $serverContainer->query(IProvider::class); |
|
| 105 | - }); |
|
| 106 | - $context->registerService(IManager::class, function (IAppContainer $appContainer) { |
|
| 107 | - /** @var IServerContainer $serverContainer */ |
|
| 108 | - $serverContainer = $appContainer->query(IServerContainer::class); |
|
| 109 | - return $serverContainer->getSettingsManager(); |
|
| 110 | - }); |
|
| 111 | - |
|
| 112 | - $context->registerService(NewUserMailHelper::class, function (IAppContainer $appContainer) { |
|
| 113 | - /** @var Server $server */ |
|
| 114 | - $server = $appContainer->query(IServerContainer::class); |
|
| 115 | - /** @var Defaults $defaults */ |
|
| 116 | - $defaults = $server->query(Defaults::class); |
|
| 117 | - |
|
| 118 | - return new NewUserMailHelper( |
|
| 119 | - $defaults, |
|
| 120 | - $server->getURLGenerator(), |
|
| 121 | - $server->getL10NFactory(), |
|
| 122 | - $server->getMailer(), |
|
| 123 | - $server->getSecureRandom(), |
|
| 124 | - new TimeFactory(), |
|
| 125 | - $server->getConfig(), |
|
| 126 | - $server->getCrypto(), |
|
| 127 | - Util::getDefaultEmailAddress('no-reply') |
|
| 128 | - ); |
|
| 129 | - }); |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - public function boot(IBootContext $context): void { |
|
| 133 | - $context->injectFn(function (EventDispatcherInterface $dispatcher, IAppContainer $appContainer) { |
|
| 134 | - $dispatcher->addListener('app_password_created', function (GenericEvent $event) use ($appContainer) { |
|
| 135 | - if (($token = $event->getSubject()) instanceof IToken) { |
|
| 136 | - /** @var IActivityManager $activityManager */ |
|
| 137 | - $activityManager = $appContainer->get(IActivityManager::class); |
|
| 138 | - /** @var ILogger $logger */ |
|
| 139 | - $logger = $appContainer->get(ILogger::class); |
|
| 140 | - |
|
| 141 | - $activity = $activityManager->generateEvent(); |
|
| 142 | - $activity->setApp('settings') |
|
| 143 | - ->setType('security') |
|
| 144 | - ->setAffectedUser($token->getUID()) |
|
| 145 | - ->setAuthor($token->getUID()) |
|
| 146 | - ->setSubject(Provider::APP_TOKEN_CREATED, ['name' => $token->getName()]) |
|
| 147 | - ->setObject('app_token', $token->getId()); |
|
| 148 | - |
|
| 149 | - try { |
|
| 150 | - $activityManager->publish($activity); |
|
| 151 | - } catch (BadMethodCallException $e) { |
|
| 152 | - $logger->logException($e, ['message' => 'could not publish activity', 'level' => ILogger::WARN]); |
|
| 153 | - } |
|
| 154 | - } |
|
| 155 | - }); |
|
| 156 | - }); |
|
| 157 | - |
|
| 158 | - Util::connectHook('OC_User', 'post_setPassword', $this, 'onChangePassword'); |
|
| 159 | - Util::connectHook('OC_User', 'changeUser', $this, 'onChangeInfo'); |
|
| 160 | - |
|
| 161 | - $context->injectFn(function (IGroupManager $groupManager) { |
|
| 162 | - /** @var IGroupManager|Manager $groupManager */ |
|
| 163 | - $groupManager->listen('\OC\Group', 'postRemoveUser', [$this, 'removeUserFromGroup']); |
|
| 164 | - $groupManager->listen('\OC\Group', 'postAddUser', [$this, 'addUserToGroup']); |
|
| 165 | - }); |
|
| 166 | - } |
|
| 167 | - |
|
| 168 | - public function addUserToGroup(IGroup $group, IUser $user): void { |
|
| 169 | - /** @var Hooks $hooks */ |
|
| 170 | - $hooks = $this->getContainer()->query(Hooks::class); |
|
| 171 | - $hooks->addUserToGroup($group, $user); |
|
| 172 | - } |
|
| 173 | - |
|
| 174 | - public function removeUserFromGroup(IGroup $group, IUser $user): void { |
|
| 175 | - /** @var Hooks $hooks */ |
|
| 176 | - $hooks = $this->getContainer()->query(Hooks::class); |
|
| 177 | - $hooks->removeUserFromGroup($group, $user); |
|
| 178 | - } |
|
| 179 | - |
|
| 180 | - |
|
| 181 | - /** |
|
| 182 | - * @param array $parameters |
|
| 183 | - * @throws \InvalidArgumentException |
|
| 184 | - * @throws \BadMethodCallException |
|
| 185 | - * @throws \Exception |
|
| 186 | - * @throws \OCP\AppFramework\QueryException |
|
| 187 | - */ |
|
| 188 | - public function onChangePassword(array $parameters) { |
|
| 189 | - /** @var Hooks $hooks */ |
|
| 190 | - $hooks = $this->getContainer()->query(Hooks::class); |
|
| 191 | - $hooks->onChangePassword($parameters['uid']); |
|
| 192 | - } |
|
| 193 | - |
|
| 194 | - /** |
|
| 195 | - * @param array $parameters |
|
| 196 | - * @throws \InvalidArgumentException |
|
| 197 | - * @throws \BadMethodCallException |
|
| 198 | - * @throws \Exception |
|
| 199 | - * @throws \OCP\AppFramework\QueryException |
|
| 200 | - */ |
|
| 201 | - public function onChangeInfo(array $parameters) { |
|
| 202 | - if ($parameters['feature'] !== 'eMailAddress') { |
|
| 203 | - return; |
|
| 204 | - } |
|
| 205 | - |
|
| 206 | - /** @var Hooks $hooks */ |
|
| 207 | - $hooks = $this->getContainer()->query(Hooks::class); |
|
| 208 | - $hooks->onChangeEmail($parameters['user'], $parameters['old_value']); |
|
| 209 | - } |
|
| 69 | + public const APP_ID = 'settings'; |
|
| 70 | + |
|
| 71 | + /** |
|
| 72 | + * @param array $urlParams |
|
| 73 | + */ |
|
| 74 | + public function __construct(array $urlParams = []) { |
|
| 75 | + parent::__construct(self::APP_ID, $urlParams); |
|
| 76 | + } |
|
| 77 | + |
|
| 78 | + public function register(IRegistrationContext $context): void { |
|
| 79 | + // Register Middleware |
|
| 80 | + $context->registerServiceAlias('SubadminMiddleware', SubadminMiddleware::class); |
|
| 81 | + $context->registerMiddleware(SubadminMiddleware::class); |
|
| 82 | + $context->registerSearchProvider(SectionSearch::class); |
|
| 83 | + $context->registerSearchProvider(AppSearch::class); |
|
| 84 | + |
|
| 85 | + /** |
|
| 86 | + * Core class wrappers |
|
| 87 | + */ |
|
| 88 | + /** FIXME: Remove once OC_User is non-static and mockable */ |
|
| 89 | + $context->registerService('isAdmin', function () { |
|
| 90 | + return \OC_User::isAdminUser(\OC_User::getUser()); |
|
| 91 | + }); |
|
| 92 | + /** FIXME: Remove once OC_SubAdmin is non-static and mockable */ |
|
| 93 | + $context->registerService('isSubAdmin', function () { |
|
| 94 | + $userObject = \OC::$server->getUserSession()->getUser(); |
|
| 95 | + $isSubAdmin = false; |
|
| 96 | + if ($userObject !== null) { |
|
| 97 | + $isSubAdmin = \OC::$server->getGroupManager()->getSubAdmin()->isSubAdmin($userObject); |
|
| 98 | + } |
|
| 99 | + return $isSubAdmin; |
|
| 100 | + }); |
|
| 101 | + $context->registerService(IProvider::class, function (IAppContainer $appContainer) { |
|
| 102 | + /** @var IServerContainer $serverContainer */ |
|
| 103 | + $serverContainer = $appContainer->query(IServerContainer::class); |
|
| 104 | + return $serverContainer->query(IProvider::class); |
|
| 105 | + }); |
|
| 106 | + $context->registerService(IManager::class, function (IAppContainer $appContainer) { |
|
| 107 | + /** @var IServerContainer $serverContainer */ |
|
| 108 | + $serverContainer = $appContainer->query(IServerContainer::class); |
|
| 109 | + return $serverContainer->getSettingsManager(); |
|
| 110 | + }); |
|
| 111 | + |
|
| 112 | + $context->registerService(NewUserMailHelper::class, function (IAppContainer $appContainer) { |
|
| 113 | + /** @var Server $server */ |
|
| 114 | + $server = $appContainer->query(IServerContainer::class); |
|
| 115 | + /** @var Defaults $defaults */ |
|
| 116 | + $defaults = $server->query(Defaults::class); |
|
| 117 | + |
|
| 118 | + return new NewUserMailHelper( |
|
| 119 | + $defaults, |
|
| 120 | + $server->getURLGenerator(), |
|
| 121 | + $server->getL10NFactory(), |
|
| 122 | + $server->getMailer(), |
|
| 123 | + $server->getSecureRandom(), |
|
| 124 | + new TimeFactory(), |
|
| 125 | + $server->getConfig(), |
|
| 126 | + $server->getCrypto(), |
|
| 127 | + Util::getDefaultEmailAddress('no-reply') |
|
| 128 | + ); |
|
| 129 | + }); |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + public function boot(IBootContext $context): void { |
|
| 133 | + $context->injectFn(function (EventDispatcherInterface $dispatcher, IAppContainer $appContainer) { |
|
| 134 | + $dispatcher->addListener('app_password_created', function (GenericEvent $event) use ($appContainer) { |
|
| 135 | + if (($token = $event->getSubject()) instanceof IToken) { |
|
| 136 | + /** @var IActivityManager $activityManager */ |
|
| 137 | + $activityManager = $appContainer->get(IActivityManager::class); |
|
| 138 | + /** @var ILogger $logger */ |
|
| 139 | + $logger = $appContainer->get(ILogger::class); |
|
| 140 | + |
|
| 141 | + $activity = $activityManager->generateEvent(); |
|
| 142 | + $activity->setApp('settings') |
|
| 143 | + ->setType('security') |
|
| 144 | + ->setAffectedUser($token->getUID()) |
|
| 145 | + ->setAuthor($token->getUID()) |
|
| 146 | + ->setSubject(Provider::APP_TOKEN_CREATED, ['name' => $token->getName()]) |
|
| 147 | + ->setObject('app_token', $token->getId()); |
|
| 148 | + |
|
| 149 | + try { |
|
| 150 | + $activityManager->publish($activity); |
|
| 151 | + } catch (BadMethodCallException $e) { |
|
| 152 | + $logger->logException($e, ['message' => 'could not publish activity', 'level' => ILogger::WARN]); |
|
| 153 | + } |
|
| 154 | + } |
|
| 155 | + }); |
|
| 156 | + }); |
|
| 157 | + |
|
| 158 | + Util::connectHook('OC_User', 'post_setPassword', $this, 'onChangePassword'); |
|
| 159 | + Util::connectHook('OC_User', 'changeUser', $this, 'onChangeInfo'); |
|
| 160 | + |
|
| 161 | + $context->injectFn(function (IGroupManager $groupManager) { |
|
| 162 | + /** @var IGroupManager|Manager $groupManager */ |
|
| 163 | + $groupManager->listen('\OC\Group', 'postRemoveUser', [$this, 'removeUserFromGroup']); |
|
| 164 | + $groupManager->listen('\OC\Group', 'postAddUser', [$this, 'addUserToGroup']); |
|
| 165 | + }); |
|
| 166 | + } |
|
| 167 | + |
|
| 168 | + public function addUserToGroup(IGroup $group, IUser $user): void { |
|
| 169 | + /** @var Hooks $hooks */ |
|
| 170 | + $hooks = $this->getContainer()->query(Hooks::class); |
|
| 171 | + $hooks->addUserToGroup($group, $user); |
|
| 172 | + } |
|
| 173 | + |
|
| 174 | + public function removeUserFromGroup(IGroup $group, IUser $user): void { |
|
| 175 | + /** @var Hooks $hooks */ |
|
| 176 | + $hooks = $this->getContainer()->query(Hooks::class); |
|
| 177 | + $hooks->removeUserFromGroup($group, $user); |
|
| 178 | + } |
|
| 179 | + |
|
| 180 | + |
|
| 181 | + /** |
|
| 182 | + * @param array $parameters |
|
| 183 | + * @throws \InvalidArgumentException |
|
| 184 | + * @throws \BadMethodCallException |
|
| 185 | + * @throws \Exception |
|
| 186 | + * @throws \OCP\AppFramework\QueryException |
|
| 187 | + */ |
|
| 188 | + public function onChangePassword(array $parameters) { |
|
| 189 | + /** @var Hooks $hooks */ |
|
| 190 | + $hooks = $this->getContainer()->query(Hooks::class); |
|
| 191 | + $hooks->onChangePassword($parameters['uid']); |
|
| 192 | + } |
|
| 193 | + |
|
| 194 | + /** |
|
| 195 | + * @param array $parameters |
|
| 196 | + * @throws \InvalidArgumentException |
|
| 197 | + * @throws \BadMethodCallException |
|
| 198 | + * @throws \Exception |
|
| 199 | + * @throws \OCP\AppFramework\QueryException |
|
| 200 | + */ |
|
| 201 | + public function onChangeInfo(array $parameters) { |
|
| 202 | + if ($parameters['feature'] !== 'eMailAddress') { |
|
| 203 | + return; |
|
| 204 | + } |
|
| 205 | + |
|
| 206 | + /** @var Hooks $hooks */ |
|
| 207 | + $hooks = $this->getContainer()->query(Hooks::class); |
|
| 208 | + $hooks->onChangeEmail($parameters['user'], $parameters['old_value']); |
|
| 209 | + } |
|
| 210 | 210 | } |
@@ -86,11 +86,11 @@ discard block |
||
| 86 | 86 | * Core class wrappers |
| 87 | 87 | */ |
| 88 | 88 | /** FIXME: Remove once OC_User is non-static and mockable */ |
| 89 | - $context->registerService('isAdmin', function () { |
|
| 89 | + $context->registerService('isAdmin', function() { |
|
| 90 | 90 | return \OC_User::isAdminUser(\OC_User::getUser()); |
| 91 | 91 | }); |
| 92 | 92 | /** FIXME: Remove once OC_SubAdmin is non-static and mockable */ |
| 93 | - $context->registerService('isSubAdmin', function () { |
|
| 93 | + $context->registerService('isSubAdmin', function() { |
|
| 94 | 94 | $userObject = \OC::$server->getUserSession()->getUser(); |
| 95 | 95 | $isSubAdmin = false; |
| 96 | 96 | if ($userObject !== null) { |
@@ -98,18 +98,18 @@ discard block |
||
| 98 | 98 | } |
| 99 | 99 | return $isSubAdmin; |
| 100 | 100 | }); |
| 101 | - $context->registerService(IProvider::class, function (IAppContainer $appContainer) { |
|
| 101 | + $context->registerService(IProvider::class, function(IAppContainer $appContainer) { |
|
| 102 | 102 | /** @var IServerContainer $serverContainer */ |
| 103 | 103 | $serverContainer = $appContainer->query(IServerContainer::class); |
| 104 | 104 | return $serverContainer->query(IProvider::class); |
| 105 | 105 | }); |
| 106 | - $context->registerService(IManager::class, function (IAppContainer $appContainer) { |
|
| 106 | + $context->registerService(IManager::class, function(IAppContainer $appContainer) { |
|
| 107 | 107 | /** @var IServerContainer $serverContainer */ |
| 108 | 108 | $serverContainer = $appContainer->query(IServerContainer::class); |
| 109 | 109 | return $serverContainer->getSettingsManager(); |
| 110 | 110 | }); |
| 111 | 111 | |
| 112 | - $context->registerService(NewUserMailHelper::class, function (IAppContainer $appContainer) { |
|
| 112 | + $context->registerService(NewUserMailHelper::class, function(IAppContainer $appContainer) { |
|
| 113 | 113 | /** @var Server $server */ |
| 114 | 114 | $server = $appContainer->query(IServerContainer::class); |
| 115 | 115 | /** @var Defaults $defaults */ |
@@ -130,8 +130,8 @@ discard block |
||
| 130 | 130 | } |
| 131 | 131 | |
| 132 | 132 | public function boot(IBootContext $context): void { |
| 133 | - $context->injectFn(function (EventDispatcherInterface $dispatcher, IAppContainer $appContainer) { |
|
| 134 | - $dispatcher->addListener('app_password_created', function (GenericEvent $event) use ($appContainer) { |
|
| 133 | + $context->injectFn(function(EventDispatcherInterface $dispatcher, IAppContainer $appContainer) { |
|
| 134 | + $dispatcher->addListener('app_password_created', function(GenericEvent $event) use ($appContainer) { |
|
| 135 | 135 | if (($token = $event->getSubject()) instanceof IToken) { |
| 136 | 136 | /** @var IActivityManager $activityManager */ |
| 137 | 137 | $activityManager = $appContainer->get(IActivityManager::class); |
@@ -158,10 +158,10 @@ discard block |
||
| 158 | 158 | Util::connectHook('OC_User', 'post_setPassword', $this, 'onChangePassword'); |
| 159 | 159 | Util::connectHook('OC_User', 'changeUser', $this, 'onChangeInfo'); |
| 160 | 160 | |
| 161 | - $context->injectFn(function (IGroupManager $groupManager) { |
|
| 161 | + $context->injectFn(function(IGroupManager $groupManager) { |
|
| 162 | 162 | /** @var IGroupManager|Manager $groupManager */ |
| 163 | - $groupManager->listen('\OC\Group', 'postRemoveUser', [$this, 'removeUserFromGroup']); |
|
| 164 | - $groupManager->listen('\OC\Group', 'postAddUser', [$this, 'addUserToGroup']); |
|
| 163 | + $groupManager->listen('\OC\Group', 'postRemoveUser', [$this, 'removeUserFromGroup']); |
|
| 164 | + $groupManager->listen('\OC\Group', 'postAddUser', [$this, 'addUserToGroup']); |
|
| 165 | 165 | }); |
| 166 | 166 | } |
| 167 | 167 | |
@@ -39,132 +39,132 @@ |
||
| 39 | 39 | */ |
| 40 | 40 | final class JrdResponse implements IResponse { |
| 41 | 41 | |
| 42 | - /** @var string */ |
|
| 43 | - private $subject; |
|
| 44 | - |
|
| 45 | - /** @var string|null */ |
|
| 46 | - private $expires; |
|
| 47 | - |
|
| 48 | - /** @var string[] */ |
|
| 49 | - private $aliases = []; |
|
| 50 | - |
|
| 51 | - /** @var (string|null)[] */ |
|
| 52 | - private $properties = []; |
|
| 53 | - |
|
| 54 | - /** @var mixed[] */ |
|
| 55 | - private $links; |
|
| 56 | - |
|
| 57 | - /** |
|
| 58 | - * @param string $subject https://tools.ietf.org/html/rfc7033#section-4.4.1 |
|
| 59 | - * |
|
| 60 | - * @since 21.0.0 |
|
| 61 | - */ |
|
| 62 | - public function __construct(string $subject) { |
|
| 63 | - $this->subject = $subject; |
|
| 64 | - } |
|
| 65 | - |
|
| 66 | - /** |
|
| 67 | - * @param string $expires |
|
| 68 | - * |
|
| 69 | - * @return $this |
|
| 70 | - * |
|
| 71 | - * @since 21.0.0 |
|
| 72 | - */ |
|
| 73 | - public function setExpires(string $expires): self { |
|
| 74 | - $this->expires = $expires; |
|
| 75 | - |
|
| 76 | - return $this; |
|
| 77 | - } |
|
| 78 | - |
|
| 79 | - /** |
|
| 80 | - * Add an alias |
|
| 81 | - * |
|
| 82 | - * @ref https://tools.ietf.org/html/rfc7033#section-4.4.2 |
|
| 83 | - * |
|
| 84 | - * @param string $alias |
|
| 85 | - * |
|
| 86 | - * @return $this |
|
| 87 | - * |
|
| 88 | - * @since 21.0.0 |
|
| 89 | - */ |
|
| 90 | - public function addAlias(string $alias): self { |
|
| 91 | - $this->aliases[] = $alias; |
|
| 92 | - |
|
| 93 | - return $this; |
|
| 94 | - } |
|
| 95 | - |
|
| 96 | - /** |
|
| 97 | - * Add a property |
|
| 98 | - * |
|
| 99 | - * @ref https://tools.ietf.org/html/rfc7033#section-4.4.3 |
|
| 100 | - * |
|
| 101 | - * @param string $property |
|
| 102 | - * @param string|null $value |
|
| 103 | - * |
|
| 104 | - * @return $this |
|
| 105 | - * |
|
| 106 | - * @since 21.0.0 |
|
| 107 | - */ |
|
| 108 | - public function addProperty(string $property, ?string $value): self { |
|
| 109 | - $this->properties[$property] = $value; |
|
| 110 | - |
|
| 111 | - return $this; |
|
| 112 | - } |
|
| 113 | - |
|
| 114 | - /** |
|
| 115 | - * Add a link |
|
| 116 | - * |
|
| 117 | - * @ref https://tools.ietf.org/html/rfc7033#section-8.4 |
|
| 118 | - * |
|
| 119 | - * @param string $rel https://tools.ietf.org/html/rfc7033#section-4.4.4.1 |
|
| 120 | - * @param string|null $type https://tools.ietf.org/html/rfc7033#section-4.4.4.2 |
|
| 121 | - * @param string|null $href https://tools.ietf.org/html/rfc7033#section-4.4.4.3 |
|
| 122 | - * @param string[]|null $titles https://tools.ietf.org/html/rfc7033#section-4.4.4.4 |
|
| 123 | - * @param string|null $properties https://tools.ietf.org/html/rfc7033#section-4.4.4.5 |
|
| 124 | - * |
|
| 125 | - * @psalm-param array<string,(string|null)>|null $properties https://tools.ietf.org/html/rfc7033#section-4.4.4.5 |
|
| 126 | - * |
|
| 127 | - * @return JrdResponse |
|
| 128 | - * @since 21.0.0 |
|
| 129 | - */ |
|
| 130 | - public function addLink(string $rel, |
|
| 131 | - ?string $type, |
|
| 132 | - ?string $href, |
|
| 133 | - ?array $titles = [], |
|
| 134 | - ?array $properties = []): self { |
|
| 135 | - $this->links[] = array_filter([ |
|
| 136 | - 'rel' => $rel, |
|
| 137 | - 'type' => $type, |
|
| 138 | - 'href' => $href, |
|
| 139 | - 'titles' => $titles, |
|
| 140 | - 'properties' => $properties, |
|
| 141 | - ]); |
|
| 142 | - |
|
| 143 | - return $this; |
|
| 144 | - } |
|
| 145 | - |
|
| 146 | - /** |
|
| 147 | - * @since 21.0.0 |
|
| 148 | - */ |
|
| 149 | - public function toHttpResponse(): Response { |
|
| 150 | - return new JSONResponse(array_filter([ |
|
| 151 | - 'subject' => $this->subject, |
|
| 152 | - 'expires' => $this->expires, |
|
| 153 | - 'aliases' => $this->aliases, |
|
| 154 | - 'properties' => $this->properties, |
|
| 155 | - 'links' => $this->links, |
|
| 156 | - ])); |
|
| 157 | - } |
|
| 158 | - |
|
| 159 | - /** |
|
| 160 | - * Does this response have any data attached to it? |
|
| 161 | - * |
|
| 162 | - * @since 21.0.0 |
|
| 163 | - */ |
|
| 164 | - public function isEmpty(): bool { |
|
| 165 | - return $this->expires === null |
|
| 166 | - && empty($this->aliases) |
|
| 167 | - && empty($this->properties) |
|
| 168 | - && empty($this->links); |
|
| 169 | - } |
|
| 42 | + /** @var string */ |
|
| 43 | + private $subject; |
|
| 44 | + |
|
| 45 | + /** @var string|null */ |
|
| 46 | + private $expires; |
|
| 47 | + |
|
| 48 | + /** @var string[] */ |
|
| 49 | + private $aliases = []; |
|
| 50 | + |
|
| 51 | + /** @var (string|null)[] */ |
|
| 52 | + private $properties = []; |
|
| 53 | + |
|
| 54 | + /** @var mixed[] */ |
|
| 55 | + private $links; |
|
| 56 | + |
|
| 57 | + /** |
|
| 58 | + * @param string $subject https://tools.ietf.org/html/rfc7033#section-4.4.1 |
|
| 59 | + * |
|
| 60 | + * @since 21.0.0 |
|
| 61 | + */ |
|
| 62 | + public function __construct(string $subject) { |
|
| 63 | + $this->subject = $subject; |
|
| 64 | + } |
|
| 65 | + |
|
| 66 | + /** |
|
| 67 | + * @param string $expires |
|
| 68 | + * |
|
| 69 | + * @return $this |
|
| 70 | + * |
|
| 71 | + * @since 21.0.0 |
|
| 72 | + */ |
|
| 73 | + public function setExpires(string $expires): self { |
|
| 74 | + $this->expires = $expires; |
|
| 75 | + |
|
| 76 | + return $this; |
|
| 77 | + } |
|
| 78 | + |
|
| 79 | + /** |
|
| 80 | + * Add an alias |
|
| 81 | + * |
|
| 82 | + * @ref https://tools.ietf.org/html/rfc7033#section-4.4.2 |
|
| 83 | + * |
|
| 84 | + * @param string $alias |
|
| 85 | + * |
|
| 86 | + * @return $this |
|
| 87 | + * |
|
| 88 | + * @since 21.0.0 |
|
| 89 | + */ |
|
| 90 | + public function addAlias(string $alias): self { |
|
| 91 | + $this->aliases[] = $alias; |
|
| 92 | + |
|
| 93 | + return $this; |
|
| 94 | + } |
|
| 95 | + |
|
| 96 | + /** |
|
| 97 | + * Add a property |
|
| 98 | + * |
|
| 99 | + * @ref https://tools.ietf.org/html/rfc7033#section-4.4.3 |
|
| 100 | + * |
|
| 101 | + * @param string $property |
|
| 102 | + * @param string|null $value |
|
| 103 | + * |
|
| 104 | + * @return $this |
|
| 105 | + * |
|
| 106 | + * @since 21.0.0 |
|
| 107 | + */ |
|
| 108 | + public function addProperty(string $property, ?string $value): self { |
|
| 109 | + $this->properties[$property] = $value; |
|
| 110 | + |
|
| 111 | + return $this; |
|
| 112 | + } |
|
| 113 | + |
|
| 114 | + /** |
|
| 115 | + * Add a link |
|
| 116 | + * |
|
| 117 | + * @ref https://tools.ietf.org/html/rfc7033#section-8.4 |
|
| 118 | + * |
|
| 119 | + * @param string $rel https://tools.ietf.org/html/rfc7033#section-4.4.4.1 |
|
| 120 | + * @param string|null $type https://tools.ietf.org/html/rfc7033#section-4.4.4.2 |
|
| 121 | + * @param string|null $href https://tools.ietf.org/html/rfc7033#section-4.4.4.3 |
|
| 122 | + * @param string[]|null $titles https://tools.ietf.org/html/rfc7033#section-4.4.4.4 |
|
| 123 | + * @param string|null $properties https://tools.ietf.org/html/rfc7033#section-4.4.4.5 |
|
| 124 | + * |
|
| 125 | + * @psalm-param array<string,(string|null)>|null $properties https://tools.ietf.org/html/rfc7033#section-4.4.4.5 |
|
| 126 | + * |
|
| 127 | + * @return JrdResponse |
|
| 128 | + * @since 21.0.0 |
|
| 129 | + */ |
|
| 130 | + public function addLink(string $rel, |
|
| 131 | + ?string $type, |
|
| 132 | + ?string $href, |
|
| 133 | + ?array $titles = [], |
|
| 134 | + ?array $properties = []): self { |
|
| 135 | + $this->links[] = array_filter([ |
|
| 136 | + 'rel' => $rel, |
|
| 137 | + 'type' => $type, |
|
| 138 | + 'href' => $href, |
|
| 139 | + 'titles' => $titles, |
|
| 140 | + 'properties' => $properties, |
|
| 141 | + ]); |
|
| 142 | + |
|
| 143 | + return $this; |
|
| 144 | + } |
|
| 145 | + |
|
| 146 | + /** |
|
| 147 | + * @since 21.0.0 |
|
| 148 | + */ |
|
| 149 | + public function toHttpResponse(): Response { |
|
| 150 | + return new JSONResponse(array_filter([ |
|
| 151 | + 'subject' => $this->subject, |
|
| 152 | + 'expires' => $this->expires, |
|
| 153 | + 'aliases' => $this->aliases, |
|
| 154 | + 'properties' => $this->properties, |
|
| 155 | + 'links' => $this->links, |
|
| 156 | + ])); |
|
| 157 | + } |
|
| 158 | + |
|
| 159 | + /** |
|
| 160 | + * Does this response have any data attached to it? |
|
| 161 | + * |
|
| 162 | + * @since 21.0.0 |
|
| 163 | + */ |
|
| 164 | + public function isEmpty(): bool { |
|
| 165 | + return $this->expires === null |
|
| 166 | + && empty($this->aliases) |
|
| 167 | + && empty($this->properties) |
|
| 168 | + && empty($this->links); |
|
| 169 | + } |
|
| 170 | 170 | } |
@@ -32,20 +32,20 @@ |
||
| 32 | 32 | */ |
| 33 | 33 | final class GenericResponse implements IResponse { |
| 34 | 34 | |
| 35 | - /** @var Response */ |
|
| 36 | - private $response; |
|
| 37 | - |
|
| 38 | - /** |
|
| 39 | - * @since 21.0.0 |
|
| 40 | - */ |
|
| 41 | - public function __construct(Response $response) { |
|
| 42 | - $this->response = $response; |
|
| 43 | - } |
|
| 44 | - |
|
| 45 | - /** |
|
| 46 | - * @since 21.0.0 |
|
| 47 | - */ |
|
| 48 | - public function toHttpResponse(): Response { |
|
| 49 | - return $this->response; |
|
| 50 | - } |
|
| 35 | + /** @var Response */ |
|
| 36 | + private $response; |
|
| 37 | + |
|
| 38 | + /** |
|
| 39 | + * @since 21.0.0 |
|
| 40 | + */ |
|
| 41 | + public function __construct(Response $response) { |
|
| 42 | + $this->response = $response; |
|
| 43 | + } |
|
| 44 | + |
|
| 45 | + /** |
|
| 46 | + * @since 21.0.0 |
|
| 47 | + */ |
|
| 48 | + public function toHttpResponse(): Response { |
|
| 49 | + return $this->response; |
|
| 50 | + } |
|
| 51 | 51 | } |
@@ -37,10 +37,10 @@ |
||
| 37 | 37 | */ |
| 38 | 38 | interface IRequestContext { |
| 39 | 39 | |
| 40 | - /** |
|
| 41 | - * @return IRequest |
|
| 42 | - * |
|
| 43 | - * @since 21.0.0 |
|
| 44 | - */ |
|
| 45 | - public function getHttpRequest(): IRequest; |
|
| 40 | + /** |
|
| 41 | + * @return IRequest |
|
| 42 | + * |
|
| 43 | + * @since 21.0.0 |
|
| 44 | + */ |
|
| 45 | + public function getHttpRequest(): IRequest; |
|
| 46 | 46 | } |
@@ -32,8 +32,8 @@ |
||
| 32 | 32 | */ |
| 33 | 33 | interface IResponse { |
| 34 | 34 | |
| 35 | - /** |
|
| 36 | - * @since 21.0.0 |
|
| 37 | - */ |
|
| 38 | - public function toHttpResponse(): Response; |
|
| 35 | + /** |
|
| 36 | + * @since 21.0.0 |
|
| 37 | + */ |
|
| 38 | + public function toHttpResponse(): Response; |
|
| 39 | 39 | } |
@@ -35,14 +35,14 @@ |
||
| 35 | 35 | */ |
| 36 | 36 | interface IHandler { |
| 37 | 37 | |
| 38 | - /** |
|
| 39 | - * @param string $service the name of the well known service, e.g. 'webfinger' |
|
| 40 | - * @param IRequestContext $context |
|
| 41 | - * @param IResponse|null $previousResponse the response of the previous handler, if any |
|
| 42 | - * |
|
| 43 | - * @return IResponse|null a response object if the request could be handled, null otherwise |
|
| 44 | - * |
|
| 45 | - * @since 21.0.0 |
|
| 46 | - */ |
|
| 47 | - public function handle(string $service, IRequestContext $context, ?IResponse $previousResponse): ?IResponse; |
|
| 38 | + /** |
|
| 39 | + * @param string $service the name of the well known service, e.g. 'webfinger' |
|
| 40 | + * @param IRequestContext $context |
|
| 41 | + * @param IResponse|null $previousResponse the response of the previous handler, if any |
|
| 42 | + * |
|
| 43 | + * @return IResponse|null a response object if the request could be handled, null otherwise |
|
| 44 | + * |
|
| 45 | + * @since 21.0.0 |
|
| 46 | + */ |
|
| 47 | + public function handle(string $service, IRequestContext $context, ?IResponse $previousResponse): ?IResponse; |
|
| 48 | 48 | } |
@@ -41,158 +41,158 @@ |
||
| 41 | 41 | */ |
| 42 | 42 | interface IRegistrationContext { |
| 43 | 43 | |
| 44 | - /** |
|
| 45 | - * @param string $capability |
|
| 46 | - * @see IAppContainer::registerCapability |
|
| 47 | - * |
|
| 48 | - * @since 20.0.0 |
|
| 49 | - */ |
|
| 50 | - public function registerCapability(string $capability): void; |
|
| 51 | - |
|
| 52 | - /** |
|
| 53 | - * Register an implementation of \OCP\Support\CrashReport\IReporter that |
|
| 54 | - * will receive unhandled exceptions and throwables |
|
| 55 | - * |
|
| 56 | - * @param string $reporterClass |
|
| 57 | - * @psalm-param class-string<\OCP\Support\CrashReport\IReporter> $reporterClass |
|
| 58 | - * @return void |
|
| 59 | - * @since 20.0.0 |
|
| 60 | - */ |
|
| 61 | - public function registerCrashReporter(string $reporterClass): void; |
|
| 62 | - |
|
| 63 | - /** |
|
| 64 | - * Register an implementation of \OCP\Dashboard\IWidget that |
|
| 65 | - * will handle the implementation of a dashboard widget |
|
| 66 | - * |
|
| 67 | - * @param string $widgetClass |
|
| 68 | - * @psalm-param class-string<\OCP\Dashboard\IWidget> $widgetClass |
|
| 69 | - * @return void |
|
| 70 | - * @since 20.0.0 |
|
| 71 | - */ |
|
| 72 | - public function registerDashboardWidget(string $widgetClass): void; |
|
| 73 | - /** |
|
| 74 | - * Register a service |
|
| 75 | - * |
|
| 76 | - * @param string $name |
|
| 77 | - * @param callable $factory |
|
| 78 | - * @psalm-param callable(\Psr\Container\ContainerInterface): mixed $factory |
|
| 79 | - * @param bool $shared |
|
| 80 | - * |
|
| 81 | - * @return void |
|
| 82 | - * @see IContainer::registerService() |
|
| 83 | - * |
|
| 84 | - * @since 20.0.0 |
|
| 85 | - */ |
|
| 86 | - public function registerService(string $name, callable $factory, bool $shared = true): void; |
|
| 87 | - |
|
| 88 | - /** |
|
| 89 | - * @param string $alias |
|
| 90 | - * @psalm-param string|class-string $alias |
|
| 91 | - * @param string $target |
|
| 92 | - * @psalm-param string|class-string $target |
|
| 93 | - * |
|
| 94 | - * @return void |
|
| 95 | - * @see IContainer::registerAlias() |
|
| 96 | - * |
|
| 97 | - * @since 20.0.0 |
|
| 98 | - */ |
|
| 99 | - public function registerServiceAlias(string $alias, string $target): void; |
|
| 100 | - |
|
| 101 | - /** |
|
| 102 | - * @param string $name |
|
| 103 | - * @param mixed $value |
|
| 104 | - * |
|
| 105 | - * @return void |
|
| 106 | - * @see IContainer::registerParameter() |
|
| 107 | - * |
|
| 108 | - * @since 20.0.0 |
|
| 109 | - */ |
|
| 110 | - public function registerParameter(string $name, $value): void; |
|
| 111 | - |
|
| 112 | - /** |
|
| 113 | - * Register a service listener |
|
| 114 | - * |
|
| 115 | - * This is equivalent to calling IEventDispatcher::addServiceListener |
|
| 116 | - * |
|
| 117 | - * @template T of \OCP\EventDispatcher\Event |
|
| 118 | - * @param string $event preferably the fully-qualified class name of the Event sub class to listen for |
|
| 119 | - * @psalm-param string|class-string<T> $event preferably the fully-qualified class name of the Event sub class to listen for |
|
| 120 | - * @param string $listener fully qualified class name (or ::class notation) of a \OCP\EventDispatcher\IEventListener that can be built by the DI container |
|
| 121 | - * @psalm-param class-string<\OCP\EventDispatcher\IEventListener<T>> $listener fully qualified class name that can be built by the DI container |
|
| 122 | - * @param int $priority |
|
| 123 | - * |
|
| 124 | - * @see IEventDispatcher::addServiceListener() |
|
| 125 | - * |
|
| 126 | - * @since 20.0.0 |
|
| 127 | - */ |
|
| 128 | - public function registerEventListener(string $event, string $listener, int $priority = 0): void; |
|
| 129 | - |
|
| 130 | - /** |
|
| 131 | - * @param string $class |
|
| 132 | - * @psalm-param class-string<\OCP\AppFramework\Middleware> $class |
|
| 133 | - * |
|
| 134 | - * @return void |
|
| 135 | - * @see IAppContainer::registerMiddleWare() |
|
| 136 | - * |
|
| 137 | - * @since 20.0.0 |
|
| 138 | - */ |
|
| 139 | - public function registerMiddleware(string $class): void; |
|
| 140 | - |
|
| 141 | - /** |
|
| 142 | - * Register a search provider for the unified search |
|
| 143 | - * |
|
| 144 | - * It is allowed to register more than one provider per app as the search |
|
| 145 | - * results can go into distinct sections, e.g. "Files" and "Files shared |
|
| 146 | - * with you" in the Files app. |
|
| 147 | - * |
|
| 148 | - * @param string $class |
|
| 149 | - * @psalm-param class-string<\OCP\Search\IProvider> $class |
|
| 150 | - * |
|
| 151 | - * @return void |
|
| 152 | - * |
|
| 153 | - * @since 20.0.0 |
|
| 154 | - */ |
|
| 155 | - public function registerSearchProvider(string $class): void; |
|
| 156 | - |
|
| 157 | - /** |
|
| 158 | - * Register an alternative login option |
|
| 159 | - * |
|
| 160 | - * It is allowed to register more than one option per app. |
|
| 161 | - * |
|
| 162 | - * @param string $class |
|
| 163 | - * @psalm-param class-string<\OCP\Authentication\IAlternativeLogin> $class |
|
| 164 | - * |
|
| 165 | - * @return void |
|
| 166 | - * |
|
| 167 | - * @since 20.0.0 |
|
| 168 | - */ |
|
| 169 | - public function registerAlternativeLogin(string $class): void; |
|
| 170 | - |
|
| 171 | - /** |
|
| 172 | - * Register an initialstate provider |
|
| 173 | - * |
|
| 174 | - * It is allowed to register more than one provider per app. |
|
| 175 | - * |
|
| 176 | - * @param string $class |
|
| 177 | - * @psalm-param class-string<\OCP\AppFramework\Services\InitialStateProvider> $class |
|
| 178 | - * |
|
| 179 | - * @return void |
|
| 180 | - * |
|
| 181 | - * @since 21.0.0 |
|
| 182 | - */ |
|
| 183 | - public function registerInitialStateProvider(string $class): void; |
|
| 184 | - |
|
| 185 | - /** |
|
| 186 | - * Register a well known protocol handler |
|
| 187 | - * |
|
| 188 | - * It is allowed to register more than one handler per app. |
|
| 189 | - * |
|
| 190 | - * @param string $class |
|
| 191 | - * @psalm-param class-string<\OCP\Http\WellKnown\IHandler> $class |
|
| 192 | - * |
|
| 193 | - * @return void |
|
| 194 | - * |
|
| 195 | - * @since 21.0.0 |
|
| 196 | - */ |
|
| 197 | - public function registerWellKnownHandler(string $class): void; |
|
| 44 | + /** |
|
| 45 | + * @param string $capability |
|
| 46 | + * @see IAppContainer::registerCapability |
|
| 47 | + * |
|
| 48 | + * @since 20.0.0 |
|
| 49 | + */ |
|
| 50 | + public function registerCapability(string $capability): void; |
|
| 51 | + |
|
| 52 | + /** |
|
| 53 | + * Register an implementation of \OCP\Support\CrashReport\IReporter that |
|
| 54 | + * will receive unhandled exceptions and throwables |
|
| 55 | + * |
|
| 56 | + * @param string $reporterClass |
|
| 57 | + * @psalm-param class-string<\OCP\Support\CrashReport\IReporter> $reporterClass |
|
| 58 | + * @return void |
|
| 59 | + * @since 20.0.0 |
|
| 60 | + */ |
|
| 61 | + public function registerCrashReporter(string $reporterClass): void; |
|
| 62 | + |
|
| 63 | + /** |
|
| 64 | + * Register an implementation of \OCP\Dashboard\IWidget that |
|
| 65 | + * will handle the implementation of a dashboard widget |
|
| 66 | + * |
|
| 67 | + * @param string $widgetClass |
|
| 68 | + * @psalm-param class-string<\OCP\Dashboard\IWidget> $widgetClass |
|
| 69 | + * @return void |
|
| 70 | + * @since 20.0.0 |
|
| 71 | + */ |
|
| 72 | + public function registerDashboardWidget(string $widgetClass): void; |
|
| 73 | + /** |
|
| 74 | + * Register a service |
|
| 75 | + * |
|
| 76 | + * @param string $name |
|
| 77 | + * @param callable $factory |
|
| 78 | + * @psalm-param callable(\Psr\Container\ContainerInterface): mixed $factory |
|
| 79 | + * @param bool $shared |
|
| 80 | + * |
|
| 81 | + * @return void |
|
| 82 | + * @see IContainer::registerService() |
|
| 83 | + * |
|
| 84 | + * @since 20.0.0 |
|
| 85 | + */ |
|
| 86 | + public function registerService(string $name, callable $factory, bool $shared = true): void; |
|
| 87 | + |
|
| 88 | + /** |
|
| 89 | + * @param string $alias |
|
| 90 | + * @psalm-param string|class-string $alias |
|
| 91 | + * @param string $target |
|
| 92 | + * @psalm-param string|class-string $target |
|
| 93 | + * |
|
| 94 | + * @return void |
|
| 95 | + * @see IContainer::registerAlias() |
|
| 96 | + * |
|
| 97 | + * @since 20.0.0 |
|
| 98 | + */ |
|
| 99 | + public function registerServiceAlias(string $alias, string $target): void; |
|
| 100 | + |
|
| 101 | + /** |
|
| 102 | + * @param string $name |
|
| 103 | + * @param mixed $value |
|
| 104 | + * |
|
| 105 | + * @return void |
|
| 106 | + * @see IContainer::registerParameter() |
|
| 107 | + * |
|
| 108 | + * @since 20.0.0 |
|
| 109 | + */ |
|
| 110 | + public function registerParameter(string $name, $value): void; |
|
| 111 | + |
|
| 112 | + /** |
|
| 113 | + * Register a service listener |
|
| 114 | + * |
|
| 115 | + * This is equivalent to calling IEventDispatcher::addServiceListener |
|
| 116 | + * |
|
| 117 | + * @template T of \OCP\EventDispatcher\Event |
|
| 118 | + * @param string $event preferably the fully-qualified class name of the Event sub class to listen for |
|
| 119 | + * @psalm-param string|class-string<T> $event preferably the fully-qualified class name of the Event sub class to listen for |
|
| 120 | + * @param string $listener fully qualified class name (or ::class notation) of a \OCP\EventDispatcher\IEventListener that can be built by the DI container |
|
| 121 | + * @psalm-param class-string<\OCP\EventDispatcher\IEventListener<T>> $listener fully qualified class name that can be built by the DI container |
|
| 122 | + * @param int $priority |
|
| 123 | + * |
|
| 124 | + * @see IEventDispatcher::addServiceListener() |
|
| 125 | + * |
|
| 126 | + * @since 20.0.0 |
|
| 127 | + */ |
|
| 128 | + public function registerEventListener(string $event, string $listener, int $priority = 0): void; |
|
| 129 | + |
|
| 130 | + /** |
|
| 131 | + * @param string $class |
|
| 132 | + * @psalm-param class-string<\OCP\AppFramework\Middleware> $class |
|
| 133 | + * |
|
| 134 | + * @return void |
|
| 135 | + * @see IAppContainer::registerMiddleWare() |
|
| 136 | + * |
|
| 137 | + * @since 20.0.0 |
|
| 138 | + */ |
|
| 139 | + public function registerMiddleware(string $class): void; |
|
| 140 | + |
|
| 141 | + /** |
|
| 142 | + * Register a search provider for the unified search |
|
| 143 | + * |
|
| 144 | + * It is allowed to register more than one provider per app as the search |
|
| 145 | + * results can go into distinct sections, e.g. "Files" and "Files shared |
|
| 146 | + * with you" in the Files app. |
|
| 147 | + * |
|
| 148 | + * @param string $class |
|
| 149 | + * @psalm-param class-string<\OCP\Search\IProvider> $class |
|
| 150 | + * |
|
| 151 | + * @return void |
|
| 152 | + * |
|
| 153 | + * @since 20.0.0 |
|
| 154 | + */ |
|
| 155 | + public function registerSearchProvider(string $class): void; |
|
| 156 | + |
|
| 157 | + /** |
|
| 158 | + * Register an alternative login option |
|
| 159 | + * |
|
| 160 | + * It is allowed to register more than one option per app. |
|
| 161 | + * |
|
| 162 | + * @param string $class |
|
| 163 | + * @psalm-param class-string<\OCP\Authentication\IAlternativeLogin> $class |
|
| 164 | + * |
|
| 165 | + * @return void |
|
| 166 | + * |
|
| 167 | + * @since 20.0.0 |
|
| 168 | + */ |
|
| 169 | + public function registerAlternativeLogin(string $class): void; |
|
| 170 | + |
|
| 171 | + /** |
|
| 172 | + * Register an initialstate provider |
|
| 173 | + * |
|
| 174 | + * It is allowed to register more than one provider per app. |
|
| 175 | + * |
|
| 176 | + * @param string $class |
|
| 177 | + * @psalm-param class-string<\OCP\AppFramework\Services\InitialStateProvider> $class |
|
| 178 | + * |
|
| 179 | + * @return void |
|
| 180 | + * |
|
| 181 | + * @since 21.0.0 |
|
| 182 | + */ |
|
| 183 | + public function registerInitialStateProvider(string $class): void; |
|
| 184 | + |
|
| 185 | + /** |
|
| 186 | + * Register a well known protocol handler |
|
| 187 | + * |
|
| 188 | + * It is allowed to register more than one handler per app. |
|
| 189 | + * |
|
| 190 | + * @param string $class |
|
| 191 | + * @psalm-param class-string<\OCP\Http\WellKnown\IHandler> $class |
|
| 192 | + * |
|
| 193 | + * @return void |
|
| 194 | + * |
|
| 195 | + * @since 21.0.0 |
|
| 196 | + */ |
|
| 197 | + public function registerWellKnownHandler(string $class): void; |
|
| 198 | 198 | } |