*/ class SetValueListener implements IEventListener { public function __construct( private readonly SettingsService $service, private readonly ExAppPreferenceService $preferenceService, private readonly ExAppConfigService $configService, private readonly ICrypto $crypto, private readonly LoggerInterface $logger, ) { } public function handle(Event $event): void { if (!$event instanceof DeclarativeSettingsSetValueEvent) { return; } $settingsForm = $this->service->getForm($event->getApp(), $event->getFormId()); if ($settingsForm === null) { return; } $formSchema = $settingsForm->getScheme(); $field = $settingsForm->getSchemaField($event->getFieldId()); $isSensitive = isset($field['sensitive']) && $field['sensitive'] === true; $value = $event->getValue(); if ($isSensitive) { try { $value = $this->crypto->encrypt($value); } catch (\Exception $e) { $this->logger->warning( sprintf('Failed to encrypt sensitive value for app %s, field %s', $event->getApp(), $event->getFieldId()), ['exception' => $e, 'app' => $event->getApp()] ); return; } } if ($formSchema['section_type'] === DeclarativeSettingsTypes::SECTION_TYPE_ADMIN) { $this->configService->setAppConfigValue($event->getApp(), $event->getFieldId(), $value); } else { $this->preferenceService->setUserConfigValue( $event->getUser()->getUID(), $event->getApp(), $event->getFieldId(), $value ); } } }