1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Settings\Controller;
use Exception;
use OC\AppFramework\Middleware\Security\Exceptions\NotAdminException;
use OC\AppFramework\Middleware\Security\Exceptions\NotLoggedInException;
use OCA\Settings\ResponseDefinitions;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSBadRequestException;
use OCP\AppFramework\OCSController;
use OCP\IRequest;
use OCP\IUserSession;
use OCP\Settings\IDeclarativeManager;
use Psr\Log\LoggerInterface;
/**
* @psalm-import-type SettingsDeclarativeForm from ResponseDefinitions
*/
class DeclarativeSettingsController extends OCSController {
public function __construct(
string $appName,
IRequest $request,
private IUserSession $userSession,
private IDeclarativeManager $declarativeManager,
private LoggerInterface $logger,
) {
parent::__construct($appName, $request);
}
/**
* Sets a declarative settings value
*
* @param string $app ID of the app
* @param string $formId ID of the form
* @param string $fieldId ID of the field
* @param mixed $value Value to be saved
* @return DataResponse<Http::STATUS_OK, null, array{}>
* @throws NotLoggedInException Not logged in or not an admin user
* @throws NotAdminException Not logged in or not an admin user
* @throws OCSBadRequestException Invalid arguments to save value
*
* 200: Value set successfully
*/
#[NoAdminRequired]
public function setValue(string $app, string $formId, string $fieldId, mixed $value): DataResponse {
return $this->saveValue($app, $formId, $fieldId, $value);
}
/**
* Sets a declarative settings value.
* Password confirmation is required for sensitive values.
*
* @param string $app ID of the app
* @param string $formId ID of the form
* @param string $fieldId ID of the field
* @param mixed $value Value to be saved
* @return DataResponse<Http::STATUS_OK, null, array{}>
* @throws NotLoggedInException Not logged in or not an admin user
* @throws NotAdminException Not logged in or not an admin user
* @throws OCSBadRequestException Invalid arguments to save value
*
* 200: Value set successfully
*/
#[NoAdminRequired]
#[PasswordConfirmationRequired]
public function setSensitiveValue(string $app, string $formId, string $fieldId, mixed $value): DataResponse {
return $this->saveValue($app, $formId, $fieldId, $value);
}
/**
* Sets a declarative settings value.
*
* @param string $app ID of the app
* @param string $formId ID of the form
* @param string $fieldId ID of the field
* @param mixed $value Value to be saved
* @return DataResponse<Http::STATUS_OK, null, array{}>
* @throws NotLoggedInException Not logged in or not an admin user
* @throws NotAdminException Not logged in or not an admin user
* @throws OCSBadRequestException Invalid arguments to save value
*
* 200: Value set successfully
*/
private function saveValue(string $app, string $formId, string $fieldId, mixed $value): DataResponse {
$user = $this->userSession->getUser();
if ($user === null) {
throw new NotLoggedInException();
}
try {
$this->declarativeManager->loadSchemas();
$this->declarativeManager->setValue($user, $app, $formId, $fieldId, $value);
return new DataResponse(null);
} catch (NotAdminException $e) {
throw $e;
} catch (Exception $e) {
$this->logger->error('Failed to set declarative settings value: ' . $e->getMessage());
throw new OCSBadRequestException();
}
}
/**
* Gets all declarative forms with the values prefilled.
*
* @return DataResponse<Http::STATUS_OK, list<SettingsDeclarativeForm>, array{}>
* @throws NotLoggedInException
* @NoSubAdminRequired
*
* 200: Forms returned
*/
#[NoAdminRequired]
public function getForms(): DataResponse {
$user = $this->userSession->getUser();
if ($user === null) {
throw new NotLoggedInException();
}
$this->declarativeManager->loadSchemas();
return new DataResponse($this->declarativeManager->getFormsWithValues($user, null, null));
}
}
|