diff --git a/apps/encryption/js/encryption.js b/apps/encryption/js/encryption.js
deleted file mode 100644
index 3e528e8c18b10..0000000000000
--- a/apps/encryption/js/encryption.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2014-2015 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-/**
- * @namespace OC
- */
-OC.Encryption = _.extend(OC.Encryption || {}, {
- displayEncryptionWarning: function() {
- if (!OC.currentUser || !OC.Notification.isHidden()) {
- return
- }
-
- $.get(
- OC.generateUrl('/apps/encryption/ajax/getStatus'),
- function(result) {
- if (result.status === 'interactionNeeded') {
- OC.Notification.show(result.data.message)
- }
- },
- )
- },
-})
-window.addEventListener('DOMContentLoaded', function() {
- // wait for other apps/extensions to register their event handlers and file actions
- // in the "ready" clause
- _.defer(function() {
- OC.Encryption.displayEncryptionWarning()
- })
-})
diff --git a/apps/encryption/js/settings-admin.js b/apps/encryption/js/settings-admin.js
deleted file mode 100644
index dd0c1823ede3d..0000000000000
--- a/apps/encryption/js/settings-admin.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2013-2015 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-window.addEventListener('DOMContentLoaded', function() {
- $('input:button[name="enableRecoveryKey"]').click(function() {
- const recoveryStatus = $(this).attr('status')
- const newRecoveryStatus = (1 + parseInt(recoveryStatus)) % 2
- const buttonValue = $(this).attr('value')
-
- const recoveryPassword = $('#encryptionRecoveryPassword').val()
- const confirmPassword = $('#repeatEncryptionRecoveryPassword').val()
- OC.msg.startSaving('#encryptionSetRecoveryKey .msg')
- $.post(
- OC.generateUrl('/apps/encryption/ajax/adminRecovery'),
- {
- adminEnableRecovery: newRecoveryStatus,
- recoveryPassword,
- confirmPassword,
- },
- ).done(function(data) {
- OC.msg.finishedSuccess('#encryptionSetRecoveryKey .msg', data.data.message)
-
- if (newRecoveryStatus === 0) {
- $('p[name="changeRecoveryPasswordBlock"]').addClass('hidden')
- $('input:button[name="enableRecoveryKey"]').attr('value', 'Enable recovery key')
- $('input:button[name="enableRecoveryKey"]').attr('status', '0')
- } else {
- $('input:password[name="changeRecoveryPassword"]').val('')
- $('p[name="changeRecoveryPasswordBlock"]').removeClass('hidden')
- $('input:button[name="enableRecoveryKey"]').attr('value', 'Disable recovery key')
- $('input:button[name="enableRecoveryKey"]').attr('status', '1')
- }
- })
- .fail(function(jqXHR) {
- $('input:button[name="enableRecoveryKey"]').attr('value', buttonValue)
- $('input:button[name="enableRecoveryKey"]').attr('status', recoveryStatus)
- OC.msg.finishedError('#encryptionSetRecoveryKey .msg', JSON.parse(jqXHR.responseText).data.message)
- })
- })
-
- $('#repeatEncryptionRecoveryPassword').keyup(function(event) {
- if (event.keyCode == 13) {
- $('#enableRecoveryKey').click()
- }
- })
-
- // change recovery password
-
- $('button:button[name="submitChangeRecoveryKey"]').click(function() {
- const oldRecoveryPassword = $('#oldEncryptionRecoveryPassword').val()
- const newRecoveryPassword = $('#newEncryptionRecoveryPassword').val()
- const confirmNewPassword = $('#repeatedNewEncryptionRecoveryPassword').val()
- OC.msg.startSaving('#encryptionChangeRecoveryKey .msg')
- $.post(
- OC.generateUrl('/apps/encryption/ajax/changeRecoveryPassword'),
- {
- oldPassword: oldRecoveryPassword,
- newPassword: newRecoveryPassword,
- confirmPassword: confirmNewPassword,
- },
- ).done(function(data) {
- OC.msg.finishedSuccess('#encryptionChangeRecoveryKey .msg', data.data.message)
- })
- .fail(function(jqXHR) {
- OC.msg.finishedError('#encryptionChangeRecoveryKey .msg', JSON.parse(jqXHR.responseText).data.message)
- })
- })
-
- $('#encryptHomeStorage').change(function() {
- $.post(
- OC.generateUrl('/apps/encryption/ajax/setEncryptHomeStorage'),
- {
- encryptHomeStorage: this.checked,
- },
- )
- })
-})
diff --git a/apps/encryption/js/settings-personal.js b/apps/encryption/js/settings-personal.js
deleted file mode 100644
index 76560afab58e7..0000000000000
--- a/apps/encryption/js/settings-personal.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2013-2015 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-OC.Encryption = _.extend(OC.Encryption || {}, {
- updatePrivateKeyPassword: function() {
- const oldPrivateKeyPassword = $('input:password[id="oldPrivateKeyPassword"]').val()
- const newPrivateKeyPassword = $('input:password[id="newPrivateKeyPassword"]').val()
- OC.msg.startSaving('#ocDefaultEncryptionModule .msg')
- $.post(
- OC.generateUrl('/apps/encryption/ajax/updatePrivateKeyPassword'),
- {
- oldPassword: oldPrivateKeyPassword,
- newPassword: newPrivateKeyPassword,
- },
- ).done(function(data) {
- OC.msg.finishedSuccess('#ocDefaultEncryptionModule .msg', data.message)
- }).fail(function(jqXHR) {
- OC.msg.finishedError('#ocDefaultEncryptionModule .msg', JSON.parse(jqXHR.responseText).message)
- })
- },
-})
-
-window.addEventListener('DOMContentLoaded', function() {
- // Trigger ajax on recoveryAdmin status change
- $('input:radio[name="userEnableRecovery"]').change(function() {
- const recoveryStatus = $(this).val()
- OC.msg.startAction('#userEnableRecovery .msg', 'Updating recovery keys. This can take some time...')
- $.post(
- OC.generateUrl('/apps/encryption/ajax/userSetRecovery'),
- {
- userEnableRecovery: recoveryStatus,
- },
- ).done(function(data) {
- OC.msg.finishedSuccess('#userEnableRecovery .msg', data.data.message)
- })
- .fail(function(jqXHR) {
- OC.msg.finishedError('#userEnableRecovery .msg', JSON.parse(jqXHR.responseText).data.message)
- })
- // Ensure page is not reloaded on form submit
- return false
- })
-
- // update private key password
-
- $('input:password[name="changePrivateKeyPassword"]').keyup(function(event) {
- const oldPrivateKeyPassword = $('input:password[id="oldPrivateKeyPassword"]').val()
- const newPrivateKeyPassword = $('input:password[id="newPrivateKeyPassword"]').val()
- if (newPrivateKeyPassword !== '' && oldPrivateKeyPassword !== '') {
- $('button:button[name="submitChangePrivateKeyPassword"]').removeAttr('disabled')
- if (event.which === 13) {
- OC.Encryption.updatePrivateKeyPassword()
- }
- } else {
- $('button:button[name="submitChangePrivateKeyPassword"]').attr('disabled', 'true')
- }
- })
-
- $('button:button[name="submitChangePrivateKeyPassword"]').click(function() {
- OC.Encryption.updatePrivateKeyPassword()
- })
-})
diff --git a/apps/encryption/lib/Controller/RecoveryController.php b/apps/encryption/lib/Controller/RecoveryController.php
index e7fb6bafb672d..cc172d18b3035 100644
--- a/apps/encryption/lib/Controller/RecoveryController.php
+++ b/apps/encryption/lib/Controller/RecoveryController.php
@@ -12,35 +12,23 @@
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\DataResponse;
-use OCP\IConfig;
+use OCP\Encryption\Exceptions\GenericEncryptionException;
use OCP\IL10N;
use OCP\IRequest;
+use Psr\Log\LoggerInterface;
class RecoveryController extends Controller {
- /**
- * @param string $AppName
- * @param IRequest $request
- * @param IConfig $config
- * @param IL10N $l
- * @param Recovery $recovery
- */
public function __construct(
- $appName,
+ string $appName,
IRequest $request,
- private IConfig $config,
private IL10N $l,
private Recovery $recovery,
+ private LoggerInterface $logger,
) {
parent::__construct($appName, $request);
}
- /**
- * @param string $recoveryPassword
- * @param string $confirmPassword
- * @param string $adminEnableRecovery
- * @return DataResponse
- */
- public function adminRecovery($recoveryPassword, $confirmPassword, $adminEnableRecovery) {
+ public function adminRecovery(string $recoveryPassword, string $confirmPassword, bool $adminEnableRecovery): DataResponse {
// Check if both passwords are the same
if (empty($recoveryPassword)) {
$errorMessage = $this->l->t('Missing recovery key password');
@@ -60,28 +48,28 @@ public function adminRecovery($recoveryPassword, $confirmPassword, $adminEnableR
Http::STATUS_BAD_REQUEST);
}
- if (isset($adminEnableRecovery) && $adminEnableRecovery === '1') {
- if ($this->recovery->enableAdminRecovery($recoveryPassword)) {
- return new DataResponse(['data' => ['message' => $this->l->t('Recovery key successfully enabled')]]);
+ try {
+ if ($adminEnableRecovery) {
+ if ($this->recovery->enableAdminRecovery($recoveryPassword)) {
+ return new DataResponse(['data' => ['message' => $this->l->t('Recovery key successfully enabled')]]);
+ }
+ return new DataResponse(['data' => ['message' => $this->l->t('Could not enable recovery key. Please check your recovery key password!')]], Http::STATUS_BAD_REQUEST);
+ } else {
+ if ($this->recovery->disableAdminRecovery($recoveryPassword)) {
+ return new DataResponse(['data' => ['message' => $this->l->t('Recovery key successfully disabled')]]);
+ }
+ return new DataResponse(['data' => ['message' => $this->l->t('Could not disable recovery key. Please check your recovery key password!')]], Http::STATUS_BAD_REQUEST);
}
- return new DataResponse(['data' => ['message' => $this->l->t('Could not enable recovery key. Please check your recovery key password!')]], Http::STATUS_BAD_REQUEST);
- } elseif (isset($adminEnableRecovery) && $adminEnableRecovery === '0') {
- if ($this->recovery->disableAdminRecovery($recoveryPassword)) {
- return new DataResponse(['data' => ['message' => $this->l->t('Recovery key successfully disabled')]]);
+ } catch (\Exception $e) {
+ $this->logger->error('Error enabling or disabling recovery key', ['exception' => $e]);
+ if ($e instanceof GenericEncryptionException) {
+ return new DataResponse(['data' => ['message' => $e->getMessage()]], Http::STATUS_INTERNAL_SERVER_ERROR);
}
- return new DataResponse(['data' => ['message' => $this->l->t('Could not disable recovery key. Please check your recovery key password!')]], Http::STATUS_BAD_REQUEST);
+ return new DataResponse([], Http::STATUS_INTERNAL_SERVER_ERROR);
}
- // this response should never be sent but just in case.
- return new DataResponse(['data' => ['message' => $this->l->t('Missing parameters')]], Http::STATUS_BAD_REQUEST);
}
- /**
- * @param string $newPassword
- * @param string $oldPassword
- * @param string $confirmPassword
- * @return DataResponse
- */
- public function changeRecoveryPassword($newPassword, $oldPassword, $confirmPassword) {
+ public function changeRecoveryPassword(string $newPassword, string $oldPassword, string $confirmPassword): DataResponse {
//check if both passwords are the same
if (empty($oldPassword)) {
$errorMessage = $this->l->t('Please provide the old recovery password');
@@ -103,23 +91,30 @@ public function changeRecoveryPassword($newPassword, $oldPassword, $confirmPassw
return new DataResponse(['data' => ['message' => $errorMessage]], Http::STATUS_BAD_REQUEST);
}
- $result = $this->recovery->changeRecoveryKeyPassword($newPassword,
- $oldPassword);
+ try {
+ $result = $this->recovery->changeRecoveryKeyPassword($newPassword,
+ $oldPassword);
- if ($result) {
- return new DataResponse(
- [
- 'data' => [
- 'message' => $this->l->t('Password successfully changed.')]
- ]
- );
- }
- return new DataResponse(
- [
+ if ($result) {
+ return new DataResponse(
+ [
+ 'data' => [
+ 'message' => $this->l->t('Password successfully changed.')]
+ ]
+ );
+ }
+ return new DataResponse([
'data' => [
'message' => $this->l->t('Could not change the password. Maybe the old password was not correct.')
]
], Http::STATUS_BAD_REQUEST);
+ } catch (\Exception $e) {
+ $this->logger->error('Error changing recovery password', ['exception' => $e]);
+ if ($e instanceof GenericEncryptionException) {
+ return new DataResponse(['data' => ['message' => $e->getMessage()]], Http::STATUS_INTERNAL_SERVER_ERROR);
+ }
+ return new DataResponse([], Http::STATUS_INTERNAL_SERVER_ERROR);
+ }
}
/**
diff --git a/apps/encryption/lib/Controller/StatusController.php b/apps/encryption/lib/Controller/StatusController.php
index 914432f78a321..582401502a1f3 100644
--- a/apps/encryption/lib/Controller/StatusController.php
+++ b/apps/encryption/lib/Controller/StatusController.php
@@ -68,8 +68,10 @@ public function getStatus() {
return new DataResponse(
[
'status' => $status,
+ 'initStatus' => $this->session->getStatus(),
'data' => [
- 'message' => $message]
+ 'message' => $message,
+ ],
]
);
}
diff --git a/apps/encryption/lib/Settings/Admin.php b/apps/encryption/lib/Settings/Admin.php
index a5de4ba68ffa0..1ac2ab5ff5eeb 100644
--- a/apps/encryption/lib/Settings/Admin.php
+++ b/apps/encryption/lib/Settings/Admin.php
@@ -7,10 +7,13 @@
namespace OCA\Encryption\Settings;
use OC\Files\View;
+use OCA\Encryption\AppInfo\Application;
use OCA\Encryption\Crypto\Crypt;
use OCA\Encryption\Session;
use OCA\Encryption\Util;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\AppFramework\Services\IInitialState;
+use OCP\IAppConfig;
use OCP\IConfig;
use OCP\IL10N;
use OCP\ISession;
@@ -27,6 +30,8 @@ public function __construct(
private IConfig $config,
private IUserManager $userManager,
private ISession $session,
+ private IInitialState $initialState,
+ private IAppConfig $appConfig,
) {
}
@@ -48,19 +53,21 @@ public function getForm() {
$this->userManager);
// Check if an adminRecovery account is enabled for recovering files after lost pwd
- $recoveryAdminEnabled = $this->config->getAppValue('encryption', 'recoveryAdminEnabled', '0');
+ $recoveryAdminEnabled = $this->appConfig->getValueBool('encryption', 'recoveryAdminEnabled');
$session = new Session($this->session);
$encryptHomeStorage = $util->shouldEncryptHomeStorage();
- $parameters = [
+ $this->initialState->provideInitialState('adminSettings', [
'recoveryEnabled' => $recoveryAdminEnabled,
'initStatus' => $session->getStatus(),
'encryptHomeStorage' => $encryptHomeStorage,
'masterKeyEnabled' => $util->isMasterKeyEnabled(),
- ];
+ ]);
- return new TemplateResponse('encryption', 'settings-admin', $parameters, '');
+ \OCP\Util::addStyle(Application::APP_ID, 'settings_admin');
+ \OCP\Util::addScript(Application::APP_ID, 'settings_admin');
+ return new TemplateResponse(Application::APP_ID, 'settings', renderAs: '');
}
/**
diff --git a/apps/encryption/lib/Settings/Personal.php b/apps/encryption/lib/Settings/Personal.php
index 8814d3afb585f..cac6ff249eb6f 100644
--- a/apps/encryption/lib/Settings/Personal.php
+++ b/apps/encryption/lib/Settings/Personal.php
@@ -6,20 +6,25 @@
*/
namespace OCA\Encryption\Settings;
+use OCA\Encryption\AppInfo\Application;
use OCA\Encryption\Session;
use OCA\Encryption\Util;
use OCP\AppFramework\Http\TemplateResponse;
-use OCP\IConfig;
+use OCP\AppFramework\Services\IInitialState;
+use OCP\Encryption\IManager;
+use OCP\IAppConfig;
use OCP\IUserSession;
use OCP\Settings\ISettings;
class Personal implements ISettings {
public function __construct(
- private IConfig $config,
private Session $session,
private Util $util,
private IUserSession $userSession,
+ private IInitialState $initialState,
+ private IAppConfig $appConfig,
+ private IManager $manager,
) {
}
@@ -28,7 +33,7 @@ public function __construct(
* @since 9.1
*/
public function getForm() {
- $recoveryAdminEnabled = $this->config->getAppValue('encryption', 'recoveryAdminEnabled');
+ $recoveryAdminEnabled = $this->appConfig->getValueBool('encryption', 'recoveryAdminEnabled');
$privateKeySet = $this->session->isPrivateKeySet();
if (!$recoveryAdminEnabled && $privateKeySet) {
@@ -38,20 +43,23 @@ public function getForm() {
$userId = $this->userSession->getUser()->getUID();
$recoveryEnabledForUser = $this->util->isRecoveryEnabledForUser($userId);
- $parameters = [
+ $this->initialState->provideInitialState('personalSettings', [
'recoveryEnabled' => $recoveryAdminEnabled,
'recoveryEnabledForUser' => $recoveryEnabledForUser,
'privateKeySet' => $privateKeySet,
'initialized' => $this->session->getStatus(),
- ];
- return new TemplateResponse('encryption', 'settings-personal', $parameters, '');
+ ]);
+
+ \OCP\Util::addStyle(Application::APP_ID, 'settings_personal');
+ \OCP\Util::addScript(Application::APP_ID, 'settings_personal');
+ return new TemplateResponse(Application::APP_ID, 'settings', renderAs: '');
}
- /**
- * @return string the section ID, e.g. 'sharing'
- * @since 9.1
- */
public function getSection() {
+ if (!$this->manager->isEnabled()) {
+ return null;
+ }
+
return 'security';
}
diff --git a/apps/encryption/src/components/SettingsAdminHomeStorage.vue b/apps/encryption/src/components/SettingsAdminHomeStorage.vue
new file mode 100644
index 0000000000000..3c2a9a9ceb58d
--- /dev/null
+++ b/apps/encryption/src/components/SettingsAdminHomeStorage.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
-
-
diff --git a/dist/AuthMechanismRsa-C7Dhz5x5.chunk.mjs b/dist/AuthMechanismRsa-C7Dhz5x5.chunk.mjs
new file mode 100644
index 0000000000000..74e6e3bb1b80d
--- /dev/null
+++ b/dist/AuthMechanismRsa-C7Dhz5x5.chunk.mjs
@@ -0,0 +1,2 @@
+import{b as g,p as y,q as v,c as p,u as o,o as n,N as h,w as _,g as V,t as k,r as x,s as M,j as d,e as f,F as q,C as w,E as U,G as j}from"./runtime-dom.esm-bundler-BrYCUcZF.chunk.mjs";import{c as C}from"./index-FffHbzvj.chunk.mjs";import{a as E}from"./index-JpgrUA2Z-BU0x-nEh.chunk.mjs";import{t as s}from"./translation-DoG5ZELJ-Cr5LJw9O.chunk.mjs";import{g as N}from"./createElementId-DhjFt1I9-CmaX6aVQ.chunk.mjs";import{c as S}from"./NcNoteCard-CVhtNL04-DvQ-q8jC.chunk.mjs";import{N as A}from"./NcSelect-Czzsi3P_-DYeov0Mn.chunk.mjs";import{N as K}from"./NcCheckboxRadioSwitch-BCSKF7Tk-BfYgMYeK.chunk.mjs";import{N as z}from"./NcPasswordField-djttkA5Q-PPKLVftl.chunk.mjs";import{_ as B}from"./TrashCanOutline-Dy-u-_ok.chunk.mjs";import{a as c,C as b}from"./types-enGIHWiM.chunk.mjs";import{l as G}from"./logger-CrDakPzW.chunk.mjs";const P=g({__name:"ConfigurationEntry",props:y({configKey:{},configOption:{}},{modelValue:{type:[String,Boolean],default:""},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const a=v(e,"modelValue");return(t,i)=>e.configOption.type!==o(c).Boolean?(n(),p(h(e.configOption.type===o(c).Password?o(z):o(B)),{key:0,modelValue:a.value,"onUpdate:modelValue":i[0]||(i[0]=l=>a.value=l),name:e.configKey,required:!(e.configOption.flags&o(b).Optional),label:e.configOption.value,title:e.configOption.tooltip},null,8,["modelValue","name","required","label","title"])):(n(),p(o(K),{key:1,modelValue:a.value,"onUpdate:modelValue":i[1]||(i[1]=l=>a.value=l),type:"switch",title:e.configOption.tooltip},{default:_(()=>[V(k(e.configOption.value),1)]),_:1},8,["modelValue","title"]))}}),R=g({__name:"AuthMechanismRsa",props:y({authMechanism:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const a=v(e,"modelValue"),t=x();M(t,()=>{t.value&&(a.value.private_key="",a.value.public_key="")});async function i(){try{const{data:l}=await C.post(N("/apps/files_external/ajax/public_key.php"),{keyLength:t.value});a.value.private_key=l.data.private_key,a.value.public_key=l.data.public_key}catch(l){G.error("Error generating RSA key pair",{error:l}),E(s("files_external","Error generating key pair"))}}return(l,m)=>(n(),d("div",null,[(n(!0),d(q,null,w(e.authMechanism.configuration,(r,u)=>U((n(),p(P,{key:r.value,modelValue:a.value[u],"onUpdate:modelValue":O=>a.value[u]=O,"config-key":u,"config-option":r},null,8,["modelValue","onUpdate:modelValue","config-key","config-option"])),[[j,!(r.flags&o(b).Hidden)]])),128)),f(o(A),{modelValue:t.value,"onUpdate:modelValue":m[0]||(m[0]=r=>t.value=r),clearable:!1,"input-label":o(s)("files_external","Key size"),options:[1024,2048,4096],required:""},null,8,["modelValue","input-label"]),f(o(S),{disabled:!t.value,wide:"",onClick:i},{default:_(()=>[V(k(o(s)("files_external","Generate keys")),1)]),_:1},8,["disabled"])]))}}),$=Object.freeze(Object.defineProperty({__proto__:null,default:R},Symbol.toStringTag,{value:"Module"}));export{$ as A,P as _};
+//# sourceMappingURL=AuthMechanismRsa-C7Dhz5x5.chunk.mjs.map
diff --git a/dist/AuthMechanismRsa-Difzo-Vr.chunk.mjs.license b/dist/AuthMechanismRsa-C7Dhz5x5.chunk.mjs.license
similarity index 100%
rename from dist/AuthMechanismRsa-Difzo-Vr.chunk.mjs.license
rename to dist/AuthMechanismRsa-C7Dhz5x5.chunk.mjs.license
diff --git a/dist/AuthMechanismRsa-Difzo-Vr.chunk.mjs.map b/dist/AuthMechanismRsa-C7Dhz5x5.chunk.mjs.map
similarity index 97%
rename from dist/AuthMechanismRsa-Difzo-Vr.chunk.mjs.map
rename to dist/AuthMechanismRsa-C7Dhz5x5.chunk.mjs.map
index 07336e685066a..70b410e0d8e56 100644
--- a/dist/AuthMechanismRsa-Difzo-Vr.chunk.mjs.map
+++ b/dist/AuthMechanismRsa-C7Dhz5x5.chunk.mjs.map
@@ -1 +1 @@
-{"version":3,"file":"AuthMechanismRsa-Difzo-Vr.chunk.mjs","sources":["../build/frontend/apps/files_external/src/components/AddExternalStorageDialog/ConfigurationEntry.vue","../build/frontend/apps/files_external/src/views/AuthMechanismRsa.vue"],"sourcesContent":["\n\n\n\n\n\t\n\t\t\t{{ t('files_versions', 'Named versions are persisted, and excluded from automatic cleanups when your storage quota is full.') }}\n\t\t
\n\t\n\t\t\t{{ t('files_versions', 'Named versions are persisted, and excluded from automatic cleanups when your storage quota is full.') }}\n\t\t
\n\t