diff --git a/apps/encryption/appinfo/app.php b/apps/encryption/appinfo/app.php index 0c7c231aef..2eb12f638e 100644 --- a/apps/encryption/appinfo/app.php +++ b/apps/encryption/appinfo/app.php @@ -25,8 +25,10 @@ namespace OCA\Encryption\AppInfo; \OCP\Util::addscript('encryption', 'encryption'); -$app = new Application(); -if (\OC::$server->getEncryptionManager()->isReady()) { +$encryptionSystemReady = \OC::$server->getEncryptionManager()->isReady(); + +$app = new Application([], $encryptionSystemReady); +if ($encryptionSystemReady) { $app->registerEncryptionModule(); $app->registerHooks(); $app->registerSettings(); diff --git a/apps/encryption/appinfo/application.php b/apps/encryption/appinfo/application.php index 10ad610cd4..cb9c33cfe5 100644 --- a/apps/encryption/appinfo/application.php +++ b/apps/encryption/appinfo/application.php @@ -52,12 +52,18 @@ class Application extends \OCP\AppFramework\App { /** * @param array $urlParams + * @param bool $encryptionSystemReady */ - public function __construct($urlParams = array()) { + public function __construct($urlParams = array(), $encryptionSystemReady = true) { parent::__construct('encryption', $urlParams); $this->encryptionManager = \OC::$server->getEncryptionManager(); $this->config = \OC::$server->getConfig(); $this->registerServices(); + if($encryptionSystemReady === false) { + /** @var Session $session */ + $session = $this->getContainer()->query('Session'); + $session->setStatus(Session::RUN_MIGRATION); + } } /** diff --git a/apps/encryption/controller/statuscontroller.php b/apps/encryption/controller/statuscontroller.php index ef3d70a0b4..cdc4b2e92e 100644 --- a/apps/encryption/controller/statuscontroller.php +++ b/apps/encryption/controller/statuscontroller.php @@ -60,20 +60,29 @@ class StatusController extends Controller { public function getStatus() { $status = 'error'; - $message = ''; + $message = 'no valid init status'; switch( $this->session->getStatus()) { + case Session::RUN_MIGRATION: + $status = 'interactionNeeded'; + $message = (string)$this->l->t( + 'You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run \'occ encryption:migrate\' or contact your administrator' + ); + break; case Session::INIT_EXECUTED: - $status = 'success'; + $status = 'interactionNeeded'; $message = (string)$this->l->t( 'Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files.' ); break; case Session::NOT_INITIALIZED: - $status = 'success'; + $status = 'interactionNeeded'; $message = (string)$this->l->t( 'Encryption App is enabled but your keys are not initialized, please log-out and log-in again' ); break; + case Session::INIT_SUCCESSFUL: + $status = 'success'; + $message = (string)$this->l->t('Encryption App is enabled and ready'); } return new DataResponse( diff --git a/apps/encryption/js/encryption.js b/apps/encryption/js/encryption.js index ea6a5596f2..a6c1bea89b 100644 --- a/apps/encryption/js/encryption.js +++ b/apps/encryption/js/encryption.js @@ -22,7 +22,7 @@ OC.Encryption = { $.get( OC.generateUrl('/apps/encryption/ajax/getStatus'), function (result) { - if (result.status === "success") { + if (result.status === "interactionNeeded") { OC.Notification.show(result.data.message); } } diff --git a/apps/encryption/lib/session.php b/apps/encryption/lib/session.php index 85d2a7698e..9709518a27 100644 --- a/apps/encryption/lib/session.php +++ b/apps/encryption/lib/session.php @@ -33,6 +33,7 @@ class Session { const NOT_INITIALIZED = '0'; const INIT_EXECUTED = '1'; const INIT_SUCCESSFUL = '2'; + const RUN_MIGRATION = '3'; /** * @param ISession $session diff --git a/apps/encryption/tests/controller/StatusControllerTest.php b/apps/encryption/tests/controller/StatusControllerTest.php new file mode 100644 index 0000000000..b57fd1cc33 --- /dev/null +++ b/apps/encryption/tests/controller/StatusControllerTest.php @@ -0,0 +1,90 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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\Tests\Controller; + + +use OCA\Encryption\Controller\StatusController; +use OCA\Encryption\Session; +use Test\TestCase; + +class StatusControllerTest extends TestCase { + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + protected $requestMock; + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + protected $l10nMock; + + /** @var \OCA\Encryption\Session | \PHPUnit_Framework_MockObject_MockObject */ + protected $sessionMock; + + /** @var StatusController */ + protected $controller; + + protected function setUp() { + + parent::setUp(); + + $this->sessionMock = $this->getMockBuilder('OCA\Encryption\Session') + ->disableOriginalConstructor()->getMock(); + $this->requestMock = $this->getMock('OCP\IRequest'); + + $this->l10nMock = $this->getMockBuilder('OCP\IL10N') + ->disableOriginalConstructor()->getMock(); + $this->l10nMock->expects($this->any()) + ->method('t') + ->will($this->returnCallback(function($message) { + return $message; + })); + + $this->controller = new StatusController('encryptionTest', + $this->requestMock, + $this->l10nMock, + $this->sessionMock); + + } + + /** + * @dataProvider dataTestGetStatus + * + * @param string $status + * @param string $expectedStatus + */ + public function testGetStatus($status, $expectedStatus) { + $this->sessionMock->expects($this->once()) + ->method('getStatus')->willReturn($status); + $result = $this->controller->getStatus(); + $data = $result->getData(); + $this->assertSame($expectedStatus, $data['status']); + } + + public function dataTestGetStatus() { + return array( + array(Session::RUN_MIGRATION, 'interactionNeeded'), + array(Session::INIT_EXECUTED, 'interactionNeeded'), + array(Session::INIT_SUCCESSFUL, 'success'), + array(Session::NOT_INITIALIZED, 'interactionNeeded'), + array('unknown', 'error'), + ); + } +}