diff --git a/appinfo/info.xml b/appinfo/info.xml
index c2a5a07..0cdd453 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -5,7 +5,7 @@
Integration of Zammad user support/ticketing solution
- 3.1.0
+ 3.2.0
agpl
Julien Veyssier
Zammad
diff --git a/lib/Controller/ConfigController.php b/lib/Controller/ConfigController.php
index 7ce2a6a..983829c 100644
--- a/lib/Controller/ConfigController.php
+++ b/lib/Controller/ConfigController.php
@@ -23,6 +23,7 @@
use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Http\RedirectResponse;
+use OCP\IAppConfig;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IRequest;
@@ -37,6 +38,7 @@ public function __construct(
string $appName,
IRequest $request,
private IConfig $config,
+ private IAppConfig $appConfig,
private IURLGenerator $urlGenerator,
private IL10N $l,
private ICrypto $crypto,
@@ -120,7 +122,7 @@ public function setAdminConfig(array $values): DataResponse {
if (in_array($key, ['client_id', 'client_secret', 'oauth_instance_url'], true)) {
return new DataResponse([], Http::STATUS_BAD_REQUEST);
}
- $this->config->setAppValue(Application::APP_ID, $key, $value);
+ $this->appConfig->setValueString(Application::APP_ID, $key, $value, lazy: true);
}
return new DataResponse([]);
}
@@ -135,10 +137,9 @@ public function setAdminConfig(array $values): DataResponse {
public function setSensitiveAdminConfig(array $values): DataResponse {
foreach ($values as $key => $value) {
if (in_array($key, ['client_id', 'client_secret'], true) && $value !== '') {
- $encryptedValue = $this->crypto->encrypt($value);
- $this->config->setAppValue(Application::APP_ID, $key, $encryptedValue);
+ $this->appConfig->setValueString(Application::APP_ID, $key, $value, lazy: true, sensitive: true);
} else {
- $this->config->setAppValue(Application::APP_ID, $key, $value);
+ $this->appConfig->setValueString(Application::APP_ID, $key, $value, lazy: true);
}
}
return new DataResponse([]);
@@ -156,15 +157,13 @@ public function setSensitiveAdminConfig(array $values): DataResponse {
#[NoCSRFRequired]
public function oauthRedirect(string $code = '', string $state = ''): RedirectResponse {
$configState = $this->config->getUserValue($this->userId, Application::APP_ID, 'oauth_state');
- $clientID = $this->config->getAppValue(Application::APP_ID, 'client_id');
- $clientID = $clientID === '' ? '' : $this->crypto->decrypt($clientID);
- $clientSecret = $this->config->getAppValue(Application::APP_ID, 'client_secret');
- $clientSecret = $clientSecret === '' ? '' : $this->crypto->decrypt($clientSecret);
+ $clientID = $this->appConfig->getValueString(Application::APP_ID, 'client_id', lazy: true);
+ $clientSecret = $this->appConfig->getValueString(Application::APP_ID, 'client_secret', lazy: true);
// anyway, reset state
$this->config->setUserValue($this->userId, Application::APP_ID, 'oauth_state', '');
- $adminZammadOauthUrl = $this->config->getAppValue(Application::APP_ID, 'oauth_instance_url');
+ $adminZammadOauthUrl = $this->appConfig->getValueString(Application::APP_ID, 'oauth_instance_url', lazy: true);
if ($clientID && $clientSecret && $configState !== '' && $configState === $state) {
$redirect_uri = $this->config->getUserValue($this->userId, Application::APP_ID, 'redirect_uri');
@@ -211,7 +210,7 @@ public function oauthRedirect(string $code = '', string $state = ''): RedirectRe
* @throws PreConditionNotMetException
*/
private function storeUserInfo(): array {
- $adminZammadOauthUrl = $this->config->getAppValue(Application::APP_ID, 'oauth_instance_url');
+ $adminZammadOauthUrl = $this->appConfig->getValueString(Application::APP_ID, 'oauth_instance_url', lazy: true);
$zammadUrl = $this->config->getUserValue($this->userId, Application::APP_ID, 'url') ?: $adminZammadOauthUrl;
if (!$zammadUrl || !preg_match('/^(https?:\/\/)?[^.]+\.[^.].*/', $zammadUrl)) {
diff --git a/lib/Migration/Version030200Date20251230225956.php b/lib/Migration/Version030200Date20251230225956.php
new file mode 100644
index 0000000..04a5d4b
--- /dev/null
+++ b/lib/Migration/Version030200Date20251230225956.php
@@ -0,0 +1,48 @@
+appConfig->getValueString(Application::APP_ID, $key);
+ if ($value !== '') {
+ $decryptedValue = $this->crypto->decrypt($value);
+ $this->appConfig->setValueString(Application::APP_ID, $key, $decryptedValue, lazy: true, sensitive: true);
+ }
+ }
+
+ foreach (['oauth_instance_url', 'link_preview_enabled'] as $key) {
+ $value = $this->appConfig->getValueString(Application::APP_ID, $key);
+ if ($value !== '') {
+ $this->appConfig->setValueString(Application::APP_ID, $key, $value, lazy: true);
+ }
+ }
+ }
+}
diff --git a/lib/Reference/ZammadReferenceProvider.php b/lib/Reference/ZammadReferenceProvider.php
index bb9c57c..447b420 100644
--- a/lib/Reference/ZammadReferenceProvider.php
+++ b/lib/Reference/ZammadReferenceProvider.php
@@ -31,6 +31,7 @@
use OCP\Collaboration\Reference\IReferenceManager;
use OCP\Collaboration\Reference\ISearchableReferenceProvider;
use OCP\Collaboration\Reference\Reference;
+use OCP\IAppConfig;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
@@ -41,6 +42,7 @@ class ZammadReferenceProvider extends ADiscoverableReferenceProvider implements
public function __construct(
private ZammadAPIService $zammadAPIService,
private IConfig $config,
+ private IAppConfig $appConfig,
private IReferenceManager $referenceManager,
private IURLGenerator $urlGenerator,
private IL10N $l10n,
@@ -108,12 +110,12 @@ public function matchReference(string $referenceText): bool {
return false;
}
}
- $adminLinkPreviewEnabled = $this->config->getAppValue(Application::APP_ID, 'link_preview_enabled', '1') === '1';
+ $adminLinkPreviewEnabled = $this->appConfig->getValueString(Application::APP_ID, 'link_preview_enabled', '1', lazy: true) === '1';
if (!$adminLinkPreviewEnabled) {
return false;
}
- $adminZammadOauthUrl = $this->config->getAppValue(Application::APP_ID, 'oauth_instance_url');
+ $adminZammadOauthUrl = $this->appConfig->getValueString(Application::APP_ID, 'oauth_instance_url', lazy: true);
$zammadUrl = $this->config->getUserValue($this->userId, Application::APP_ID, 'url') ?: $adminZammadOauthUrl;
return $this->isMatching($referenceText, $zammadUrl);
@@ -123,7 +125,7 @@ public function matchReference(string $referenceText): bool {
* @inheritDoc
*/
public function resolveReference(string $referenceText): ?IReference {
- $adminZammadOauthUrl = $this->config->getAppValue(Application::APP_ID, 'oauth_instance_url');
+ $adminZammadOauthUrl = $this->appConfig->getValueString(Application::APP_ID, 'oauth_instance_url', lazy: true);
$zammadUrl = $this->config->getUserValue($this->userId, Application::APP_ID, 'url') ?: $adminZammadOauthUrl;
if ($zammadUrl !== '') {
$parts = $this->getLinkParts($zammadUrl, $referenceText);
diff --git a/lib/Search/ZammadSearchProvider.php b/lib/Search/ZammadSearchProvider.php
index 32c77a3..df72f3a 100644
--- a/lib/Search/ZammadSearchProvider.php
+++ b/lib/Search/ZammadSearchProvider.php
@@ -28,6 +28,7 @@
use OCA\Zammad\AppInfo\Application;
use OCA\Zammad\Service\ZammadAPIService;
use OCP\App\IAppManager;
+use OCP\IAppConfig;
use OCP\IConfig;
use OCP\IDateTimeFormatter;
use OCP\IL10N;
@@ -43,6 +44,7 @@ public function __construct(
private IAppManager $appManager,
private IL10N $l10n,
private IConfig $config,
+ private IAppConfig $appConfig,
private IURLGenerator $urlGenerator,
private IDateTimeFormatter $dateTimeFormatter,
private ZammadAPIService $service,
@@ -93,7 +95,7 @@ public function search(IUser $user, ISearchQuery $query): SearchResult {
? $this->urlGenerator->imagePath(Application::APP_ID, 'app.svg')
: $this->urlGenerator->imagePath(Application::APP_ID, 'app-dark.svg');
- $adminZammadOauthUrl = $this->config->getAppValue(Application::APP_ID, 'oauth_instance_url');
+ $adminZammadOauthUrl = $this->appConfig->getValueString(Application::APP_ID, 'oauth_instance_url', lazy: true);
$zammadUrl = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'url') ?: $adminZammadOauthUrl;
$hasAccessToken = $this->config->getUserValue($user->getUID(), Application::APP_ID, 'token') !== '';
diff --git a/lib/Service/ZammadAPIService.php b/lib/Service/ZammadAPIService.php
index 948dd77..c04b1a9 100644
--- a/lib/Service/ZammadAPIService.php
+++ b/lib/Service/ZammadAPIService.php
@@ -21,6 +21,7 @@
use OCP\AppFramework\Http;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IClientService;
+use OCP\IAppConfig;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IConfig;
@@ -45,6 +46,7 @@ public function __construct(
private LoggerInterface $logger,
private IL10N $l10n,
private IConfig $config,
+ private IAppConfig $appConfig,
private INotificationManager $notificationManager,
private ICrypto $crypto,
ICacheFactory $cacheFactory,
@@ -55,7 +57,7 @@ public function __construct(
}
public function getZammadUrl(string $userId): string {
- $adminZammadOauthUrl = $this->config->getAppValue(Application::APP_ID, 'oauth_instance_url');
+ $adminZammadOauthUrl = $this->appConfig->getValueString(Application::APP_ID, 'oauth_instance_url', lazy: true);
return $this->config->getUserValue($userId, Application::APP_ID, 'url') ?: $adminZammadOauthUrl;
}
@@ -537,13 +539,11 @@ private function checkTokenExpiration(string $userId): void {
}
private function refreshToken(string $userId): bool {
- $clientID = $this->config->getAppValue(Application::APP_ID, 'client_id');
- $clientID = $clientID === '' ? '' : $this->crypto->decrypt($clientID);
- $clientSecret = $this->config->getAppValue(Application::APP_ID, 'client_secret');
- $clientSecret = $clientSecret === '' ? '' : $this->crypto->decrypt($clientSecret);
+ $clientID = $this->appConfig->getValueString(Application::APP_ID, 'client_id', lazy: true);
+ $clientSecret = $this->appConfig->getValueString(Application::APP_ID, 'client_secret', lazy: true);
$refreshToken = $this->config->getUserValue($userId, Application::APP_ID, 'refresh_token');
$refreshToken = $refreshToken === '' ? '' : $this->crypto->decrypt($refreshToken);
- $adminZammadOauthUrl = $this->config->getAppValue(Application::APP_ID, 'oauth_instance_url');
+ $adminZammadOauthUrl = $this->appConfig->getValueString(Application::APP_ID, 'oauth_instance_url', lazy: true);
if (!$refreshToken) {
$this->logger->error('No Zammad refresh token found', ['app' => Application::APP_ID]);
return false;
diff --git a/lib/Settings/Admin.php b/lib/Settings/Admin.php
index 85a1def..a47c5f9 100644
--- a/lib/Settings/Admin.php
+++ b/lib/Settings/Admin.php
@@ -5,17 +5,15 @@
use OCA\Zammad\AppInfo\Application;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
-use OCP\IConfig;
+use OCP\IAppConfig;
-use OCP\Security\ICrypto;
use OCP\Settings\ISettings;
class Admin implements ISettings {
public function __construct(
- private IConfig $config,
+ private IAppConfig $appConfig,
private IInitialState $initialStateService,
- private ICrypto $crypto,
) {
}
@@ -23,13 +21,11 @@ public function __construct(
* @return TemplateResponse
*/
public function getForm(): TemplateResponse {
- $clientID = $this->config->getAppValue(Application::APP_ID, 'client_id');
- $clientID = $clientID === '' ? '' : $this->crypto->decrypt($clientID);
- $clientSecret = $this->config->getAppValue(Application::APP_ID, 'client_secret');
- $clientSecret = $clientSecret === '' ? '' : $this->crypto->decrypt($clientSecret);
+ $clientID = $this->appConfig->getValueString(Application::APP_ID, 'client_id', lazy: true);
+ $clientSecret = $this->appConfig->getValueString(Application::APP_ID, 'client_secret', lazy: true);
- $oauthUrl = $this->config->getAppValue(Application::APP_ID, 'oauth_instance_url');
- $adminLinkPreviewEnabled = $this->config->getAppValue(Application::APP_ID, 'link_preview_enabled', '1') === '1';
+ $oauthUrl = $this->appConfig->getValueString(Application::APP_ID, 'oauth_instance_url', lazy: true);
+ $adminLinkPreviewEnabled = $this->appConfig->getValueString(Application::APP_ID, 'link_preview_enabled', '1', lazy: true) === '1';
$adminConfig = [
'client_id' => $clientID,
diff --git a/lib/Settings/Personal.php b/lib/Settings/Personal.php
index e2f2c70..323961c 100644
--- a/lib/Settings/Personal.php
+++ b/lib/Settings/Personal.php
@@ -5,6 +5,7 @@
use OCA\Zammad\AppInfo\Application;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
+use OCP\IAppConfig;
use OCP\IConfig;
use OCP\Security\ICrypto;
@@ -14,6 +15,7 @@ class Personal implements ISettings {
public function __construct(
private IConfig $config,
+ private IAppConfig $appConfig,
private IInitialState $initialStateService,
private ICrypto $crypto,
private ?string $userId,
@@ -25,11 +27,9 @@ public function __construct(
*/
public function getForm(): TemplateResponse {
// for OAuth
- $clientID = $this->config->getAppValue(Application::APP_ID, 'client_id');
- $clientID = $clientID === '' ? '' : $this->crypto->decrypt($clientID);
- $clientSecret = $this->config->getAppValue(Application::APP_ID, 'client_secret');
- $clientSecret = $clientSecret === '' ? '' : $this->crypto->decrypt($clientSecret);
- $adminOauthUrl = $this->config->getAppValue(Application::APP_ID, 'oauth_instance_url');
+ $clientID = $this->appConfig->getValueString(Application::APP_ID, 'client_id', lazy: true);
+ $clientSecret = $this->appConfig->getValueString(Application::APP_ID, 'client_secret', lazy: true);
+ $adminOauthUrl = $this->appConfig->getValueString(Application::APP_ID, 'oauth_instance_url', lazy: true);
$token = $this->config->getUserValue($this->userId, Application::APP_ID, 'token');
$token = $token === '' ? '' : $this->crypto->decrypt($token);