diff --git a/apps/encryption/appinfo/info.xml b/apps/encryption/appinfo/info.xml index dc7f4048ba36..3c0e52c792e4 100644 --- a/apps/encryption/appinfo/info.xml +++ b/apps/encryption/appinfo/info.xml @@ -28,7 +28,7 @@ - OCA\Encryption\Command\EnableMasterKey + OCA\Encryption\Command\SelectEncryptionType OCA\Encryption\Command\MigrateKeys diff --git a/apps/encryption/js/settings-admin.js b/apps/encryption/js/settings-admin.js index 9b00a4ec6275..d7aafec1439d 100644 --- a/apps/encryption/js/settings-admin.js +++ b/apps/encryption/js/settings-admin.js @@ -8,7 +8,78 @@ */ $(document).ready(function () { - + + /* + * Do the action based on the selection of encryption type + * @param {string} encryptionType the type of encryption selection. (eg: masterkey or customkey) + * @param {string} state the state after relogin to the server which is always static. Before relogin its undefined and post relogin "static" is the state. + */ + function encryptionTypeSelection(encryptionType, state=undefined) { + if (encryptionType === "masterkey") { + //If user selects "Master Key" from the drop down + $("#select-mode").removeClass("hidden"); + + if(state === "static") { + $("#select-mode, #keyTypeId").addClass("hidden"); + $("#encryptHomeStorage, #encryptionSetRecoveryKey").addClass("hidden"); + if($("#encryptionType").val().length === 0) { + $("#encryptionType").text("Encryption type: Master Key"); + } + } + } else if (encryptionType === "customkey") { + //If user selects "User-specific key" from the drop down + $("#select-mode").removeClass("hidden"); + + if(state === "static") { + $("#keyTypeId, #select-mode").addClass("hidden"); + + $("#encryptHomeStorageSetting, #encryptionSetRecoveryKey").removeClass("hidden"); + + } + } else { + //If user selects "Please select an encryption option" from the drop down + $("#select-mode").addClass("hidden"); + } + + } + + $("#encryptionType").css({pointerEvents: "none"}); + + encryptionTypeSelection($("#keyTypeId :selected").val(), "static"); + + if($("#masterKeyVal").attr("data-master-key") === "") { + if($("#userSpecificKey").attr("data-user-specific-key") !== "") { + encryptionTypeSelection("customkey", "static"); + } + } + + $("#keyTypeId").change(function (element) { + encryptionTypeSelection($("#keyTypeId :selected").val()); + }); + + $("#select-mode").click(function () { + //Action to be taken when "Select this mode" button is selected. + var $loadSpinner = $('#encryptionKeySelection').find('div.hidden').first(); + $loadSpinner.toggleClass('hidden',false); + $loadSpinner.toggleClass('loading',true); + if($("#keyTypeId :selected").val() === "masterkey") { + var masterAjaxObj = OC.AppConfig.setValue('encryption', 'useMasterKey', '1'); + $.when(masterAjaxObj).done(function (masterKeyObj) { + $loadSpinner.toggleClass('hidden'); + location.reload(); + }); + } else if($("#keyTypeId :selected").val() === "customkey") { + if($("#encryptionType").val().length === 0) { + $("#encryptionType").text("Encryption type: User Specific Key"); + } + var userSpecificAjaxObj = OC.AppConfig.setValue("encryption", "userSpecificKey", '1'); + $.when(userSpecificAjaxObj).done(function (userSpecificAjaxObj) { + $loadSpinner.toggleClass('hidden'); + location.reload(); + }); + } + }); + $('input:button[name="enableRecoveryKey"]').click(function () { var recoveryStatus = $(this).attr('status'); diff --git a/apps/encryption/lib/Command/EnableMasterKey.php b/apps/encryption/lib/Command/EnableMasterKey.php deleted file mode 100644 index 4582377a65b6..000000000000 --- a/apps/encryption/lib/Command/EnableMasterKey.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * @copyright Copyright (c) 2017, ownCloud GmbH - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - - -namespace OCA\Encryption\Command; - - -use OCA\Encryption\Util; -use OCP\IConfig; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Helper\QuestionHelper; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ConfirmationQuestion; -use Symfony\Component\Console\Input\InputOption; - -class EnableMasterKey extends Command { - - /** @var Util */ - protected $util; - - /** @var IConfig */ - protected $config; - - /** @var QuestionHelper */ - protected $questionHelper; - - /** - * @param Util $util - * @param IConfig $config - * @param QuestionHelper $questionHelper - */ - public function __construct(Util $util, - IConfig $config, - QuestionHelper $questionHelper) { - - $this->util = $util; - $this->config = $config; - $this->questionHelper = $questionHelper; - parent::__construct(); - } - - protected function configure() { - $this - ->setName('encryption:enable-master-key') - ->setDescription('Enable the master key. Only available for fresh installations with no existing encrypted data! There is also no way to disable it again.'); - $this->addOption( - 'yes', - 'y', - InputOption::VALUE_NONE, - 'Answer yes to all questions' - ); - } - - protected function execute(InputInterface $input, OutputInterface $output) { - - $isAlreadyEnabled = $this->util->isMasterKeyEnabled(); - - $yes = $input->getOption('yes'); - if ($isAlreadyEnabled) { - $output->writeln('Master key already enabled'); - } else { - $question = new ConfirmationQuestion( - 'Warning: Only available for fresh installations with no existing encrypted data! ' - . 'There is also no way to disable it again. Do you want to continue? (y/n) ', false); - if ($yes || $this->questionHelper->ask($input, $output, $question)) { - $this->config->setAppValue('encryption', 'useMasterKey', '1'); - $output->writeln('Master key successfully enabled.'); - } else { - $output->writeln('aborted.'); - } - } - - } - -} diff --git a/apps/encryption/lib/Command/SelectEncryptionType.php b/apps/encryption/lib/Command/SelectEncryptionType.php new file mode 100644 index 000000000000..2e46c7a78763 --- /dev/null +++ b/apps/encryption/lib/Command/SelectEncryptionType.php @@ -0,0 +1,126 @@ + +* +* @copyright Copyright (c) 2017, ownCloud GmbH +* @license AGPL-3.0 +* +* This code is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License, version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License, version 3, +* along with this program. If not, see +* +*/ + + +namespace OCA\Encryption\Command; + +use OCA\Encryption\Util; +use OCP\IConfig; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Helper\QuestionHelper; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\ConfirmationQuestion; +use Symfony\Component\Console\Input\InputOption; + +class SelectEncryptionType extends Command { + + /** @var Util */ + protected $util; + + /** @var IConfig */ + protected $config; + + /** @var QuestionHelper */ + protected $questionHelper; + + /** + * @param Util $util + * @param IConfig $config + * @param QuestionHelper $questionHelper + */ + public function __construct(Util $util, + IConfig $config, + QuestionHelper $questionHelper) { + + $this->util = $util; + $this->config = $config; + $this->questionHelper = $questionHelper; + parent::__construct(); + } + + protected function configure() { + parent::configure(); + + $this + ->setName('encryption:select-encryption-type') + ->setDescription('Select the encryption type. The encryption types available are: masterkey and user-keys. There is also no way to disable it again.') + ->addArgument( + 'encryption-type', + InputArgument::REQUIRED, + 'Encryption type can be either: masterkey | user-keys' + ) + ; + + $this->addOption( + 'yes', + 'y', + InputOption::VALUE_NONE, + 'Answer yes to all questions' + ); + } + + protected function execute(InputInterface $input, OutputInterface $output) { + if($this->config->getAppValue('core', 'encryption_enabled', 'no') === 'no') { + $output->writeln('Kindly enable encryption to select the encryption type.'); + return 1; + } + + $encryptionType = $input->getArgument('encryption-type'); + $yes = $input->getOption('yes'); + + $masterKeyNotEnabled = (!$this->util->isMasterKeyEnabled()); + $userKeysNotEnabled = ($this->config->getAppValue('encryption','userSpecificKey', '') === ''); + $freshInstallation = ($masterKeyNotEnabled && $userKeysNotEnabled); + + if(!$freshInstallation) { + if(!$masterKeyNotEnabled) { + $output->writeln("Master key already enabled"); + } else { + $output->writeln("User keys already enabled"); + } + return 1; + } + + if($encryptionType === "masterkey") { + $question = new ConfirmationQuestion( + 'Warning: Only available for fresh installations with no existing encrypted data! ' + . 'There is also no way to disable it again. Do you want to continue? (y/n) ', false); + if ($yes || $this->questionHelper->ask($input, $output, $question)) { + $this->config->setAppValue('encryption', 'useMasterKey', '1'); + $output->writeln('Master key successfully enabled.'); + } + } elseif ($encryptionType === "user-keys") { + $question = new ConfirmationQuestion( + 'Warning: Only available for fresh installations with no existing encrypted data! ' + . 'There is also no way to disable it again. Do you want to continue? (y/n) ', false); + if ($yes || $this->questionHelper->ask($input, $output, $question)) { + $this->config->setAppValue('encryption', 'userSpecificKey', '1'); + $output->writeln('User key successfully enabled.'); + } + } else { + $output->writeln("The option provided for encryption-type " . $encryptionType . " is not valid. The available options are: 'masterkey' or 'user-keys'"); + } + + } +} + diff --git a/apps/encryption/lib/Session.php b/apps/encryption/lib/Session.php index d4d2ca0d3800..a2f39b2e50a3 100644 --- a/apps/encryption/lib/Session.php +++ b/apps/encryption/lib/Session.php @@ -60,7 +60,10 @@ public function setStatus($status) { public function getStatus() { $status = $this->session->get('encryptionInitialized'); if (is_null($status)) { - $status = self::NOT_INITIALIZED; + if(\OC::$server->getAppConfig()->getValue('encryption', 'useMasterKey', '0') !== '0' + or \OC::$server->getAppConfig()->getValue('encryption', 'userSpecificKey', '') !== '') { + $status = self::NOT_INITIALIZED; + } } return $status; diff --git a/apps/encryption/templates/settings-admin.php b/apps/encryption/templates/settings-admin.php index 662f4cf4e2f8..bc902eb1c2bf 100644 --- a/apps/encryption/templates/settings-admin.php +++ b/apps/encryption/templates/settings-admin.php @@ -5,11 +5,38 @@ style('encryption', 'settings-admin'); ?>
-

t('Encryption')); ?>

- +

t('Default encryption module')); ?>

+ getAppConfig()->getValue('encryption', 'useMasterKey', '0') !== '0' + or \OC::$server->getAppConfig()->getValue('encryption', 'encryptHomeStorage', '') !== '')): ?> t("Encryption App is enabled but your keys are not initialized, please log-out and log-in again")); ?> -

+ + + + +

+
">
+
">
+ +
+ +
-

+