diff --git a/apps/encryption/js/encryption.js b/apps/encryption/js/encryption.js
deleted file mode 100644
index 3e528e8c18b..00000000000
--- 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 dd0c1823ede..00000000000
--- 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 76560afab58..00000000000
--- 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 e7fb6bafb67..cc172d18b30 100644
--- a/apps/encryption/lib/Controller/RecoveryController.php
+++ b/apps/encryption/lib/Controller/RecoveryController.php
@@ -12,35 +12,23 @@ use OCP\AppFramework\Controller;
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 @@ class RecoveryController extends Controller {
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 @@ class RecoveryController extends Controller {
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 914432f78a3..582401502a1 100644
--- a/apps/encryption/lib/Controller/StatusController.php
+++ b/apps/encryption/lib/Controller/StatusController.php
@@ -68,8 +68,10 @@ class StatusController extends Controller {
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 a5de4ba68ff..1ac2ab5ff5e 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 @@ class Admin implements ISettings {
private IConfig $config,
private IUserManager $userManager,
private ISession $session,
+ private IInitialState $initialState,
+ private IAppConfig $appConfig,
) {
}
@@ -48,19 +53,21 @@ class Admin implements ISettings {
$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 8814d3afb58..cac6ff249eb 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 @@ class Personal implements ISettings {
* @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 @@ class Personal implements ISettings {
$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 00000000000..3c2a9a9ceb5
--- /dev/null
+++ b/apps/encryption/src/components/SettingsAdminHomeStorage.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
-
-