From bb0d1e18b451ca7eeabf34833bcc1940941631ec Mon Sep 17 00:00:00 2001 From: Andrey Borysenko Date: Mon, 26 May 2025 21:30:21 +0300 Subject: [PATCH] feat: sensitive declarative settings Signed-off-by: Andrey Borysenko --- .../digging_deeper/declarative_settings.rst | 37 +++++++++++++++++- .../images/declarative_settings_sensitive.png | Bin 0 -> 20787 bytes 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 developer_manual/images/declarative_settings_sensitive.png diff --git a/developer_manual/digging_deeper/declarative_settings.rst b/developer_manual/digging_deeper/declarative_settings.rst index 12da24c56..d4632474e 100644 --- a/developer_manual/digging_deeper/declarative_settings.rst +++ b/developer_manual/digging_deeper/declarative_settings.rst @@ -448,4 +448,39 @@ Select and Multi-select 'options' => ['foo', 'bar', 'baz'], // simple options for select, radio, multi-select 'placeholder' => 'Select some multiple options', // input placeholder 'default' => ['foo', 'bar'], - ], \ No newline at end of file + ], + + +Sensitive field type +-------------------- + +Since Nextcloud 32 there is a new field attribute ``sensitive: true/false`` available for ``DeclarativeSettingsTypes::TEXT``, ``DeclarativeSettingsTypes::PASSWORD`` types. +The values of such fields are stored in an encrypted form in the database and are not exposed to the UI. + + +.. code-block:: php + + [ + 'id' => 'test_sensitive_field', + 'title' => 'Sensitive text field', + 'description' => 'Set some secure value setting that is stored encrypted', + 'type' => DeclarativeSettingsTypes::TEXT, + 'label' => 'Sensitive field', + 'placeholder' => 'Set secure value', + 'default' => '', + 'sensitive' => true, // only for TEXT, PASSWORD types + ], + [ + 'id' => 'test_sensitive_field_2', + 'title' => 'Sensitive password field', + 'description' => 'Set some password setting that is stored encrypted', + 'type' => DeclarativeSettingsTypes::PASSWORD, + 'label' => 'Sensitive field', + 'placeholder' => 'Set secure value', + 'default' => '', + 'sensitive' => true, // only for TEXT, PASSWORD types + ], + +.. figure:: ../images/declarative_settings_sensitive.png + :alt: sensitive fields + diff --git a/developer_manual/images/declarative_settings_sensitive.png b/developer_manual/images/declarative_settings_sensitive.png new file mode 100644 index 0000000000000000000000000000000000000000..e32e0abd335217808d11230c3dad41ece9513d7c GIT binary patch literal 20787 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 pkmg?ppr2(Dkp}+%8>zmzjT7PR