fixes, improvements, and another app:

* setupSettings now also triggered on enable
* fixes detection of present admin section or settings in the DB
* add update routine in such cases
* encryption app migrated
This commit is contained in:
Arthur Schiwon 2016-08-11 01:41:18 +02:00
parent 0fc34c99f4
commit f3b15a9ab9
No known key found for this signature in database
GPG key ID: 7424F1874854DF23
6 changed files with 196 additions and 66 deletions

View file

@ -19,7 +19,7 @@
<admin>admin-encryption</admin>
</documentation>
<rememberlogin>false</rememberlogin>
<version>1.4.0</version>
<version>1.4.1</version>
<types>
<filesystem/>
</types>
@ -27,5 +27,7 @@
<lib>openssl</lib>
<owncloud min-version="9.2" max-version="9.2" />
</dependencies>
<settings>
<admin>OCA\Encryption\Settings\Admin</admin>
</settings>
</info>

View file

@ -269,7 +269,6 @@ class Application extends \OCP\AppFramework\App {
public function registerSettings() {
// Register settings scripts
App::registerAdmin('encryption', 'settings/settings-admin');
App::registerPersonal('encryption', 'settings/settings-personal');
}
}

View file

@ -0,0 +1,127 @@
<?php
/**
* @copyright Copyright (c) 2016 Arthur Schiwon <blizzz@arthur-schiwon.de>
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Encryption\Settings;
use OC\Files\View;
use OCA\Encryption\Crypto\Crypt;
use OCA\Encryption\Session;
use OCA\Encryption\Util;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IL10N;
use OCP\ILogger;
use OCP\ISession;
use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Settings\IAdmin;
use OCP\IConfig;
class Admin implements IAdmin {
/** @var IL10N */
private $l;
/** @var ILogger */
private $logger;
/** @var IUserSession */
private $userSession;
/** @var IConfig */
private $config;
/** @var IUserManager */
private $userManager;
/** @var ISession */
private $session;
public function __construct(
IL10N $l,
ILogger $logger,
IUserSession $userSession,
IConfig $config,
IUserManager $userManager,
ISession $session
) {
$this->l = $l;
$this->logger = $logger;
$this->userSession = $userSession;
$this->config = $config;
$this->userManager = $userManager;
$this->session = $session;
}
/**
* @return TemplateResponse
*/
public function getForm() {
$crypt = new Crypt(
$this->logger,
$this->userSession,
$this->config,
$this->l);
$util = new Util(
new View(),
$crypt,
$this->logger,
$this->userSession,
$this->config,
$this->userManager);
// Check if an adminRecovery account is enabled for recovering files after lost pwd
$recoveryAdminEnabled = $this->config->getAppValue('encryption', 'recoveryAdminEnabled', '0');
$session = new Session($this->session);
$encryptHomeStorage = $util->shouldEncryptHomeStorage();
$parameters = [
'recoveryEnabled' => $recoveryAdminEnabled,
'initStatus' => $session->getStatus(),
'encryptHomeStorage' => $encryptHomeStorage,
'masterKeyEnabled' => $util->isMasterKeyEnabled(),
];
return new TemplateResponse('encryption', 'settings-admin', $parameters, '');
}
/**
* @return string the section ID, e.g. 'sharing'
*/
public function getSection() {
return 'encryption';
}
/**
* @return int whether the form should be rather on the top or bottom of
* the admin section. The forms are arranged in ascending order of the
* priority values. It is required to return a value between 0 and 100.
*
* E.g.: 70
*/
public function getPriority() {
return 5;
}
}

View file

@ -1,53 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Björn Schießle <bjoern@schiessle.org>
* @author Clark Tomlinson <fallen013@gmail.com>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @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 <http://www.gnu.org/licenses/>
*
*/
$tmpl = new OCP\Template('encryption', 'settings-admin');
$crypt = new \OCA\Encryption\Crypto\Crypt(
\OC::$server->getLogger(),
\OC::$server->getUserSession(),
\OC::$server->getConfig(),
\OC::$server->getL10N('encryption'));
$util = new \OCA\Encryption\Util(
new \OC\Files\View(),
$crypt,
\OC::$server->getLogger(),
\OC::$server->getUserSession(),
\OC::$server->getConfig(),
\OC::$server->getUserManager());
// Check if an adminRecovery account is enabled for recovering files after lost pwd
$recoveryAdminEnabled = \OC::$server->getConfig()->getAppValue('encryption', 'recoveryAdminEnabled', '0');
$session = new \OCA\Encryption\Session(\OC::$server->getSession());
$encryptHomeStorage = $util->shouldEncryptHomeStorage();
$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled);
$tmpl->assign('initStatus', $session->getStatus());
$tmpl->assign('encryptHomeStorage', $encryptHomeStorage);
$tmpl->assign('masterKeyEnabled', $util->isMasterKeyEnabled());
return $tmpl->fetchPage();

View file

@ -104,8 +104,10 @@ class Manager implements IManager {
);
return;
}
if(!$this->hasAdminSection($section)) {
if(!$this->hasAdminSection(get_class($section))) {
$this->addAdminSection($section);
} else {
$this->updateAdminSection($section);
}
}
@ -134,20 +136,64 @@ class Manager implements IManager {
$query->execute();
}
private function hasAdminSection(ISection $section) {
return $this->has(self::TABLE_ADMIN_SECTIONS, 'id', $section->getID());
private function updateAdminSettings(IAdmin $settings) {
$this->update(
self::TABLE_ADMIN_SETTINGS,
'class',
get_class($settings),
[
'section' => $settings->getSection(),
'priority' => $settings->getPriority(),
]
);
}
private function hasAdminSettings($pageClass) {
return $this->has(self::TABLE_ADMIN_SETTINGS, 'class', $pageClass);
private function updateAdminSection(ISection $section) {
$this->update(
self::TABLE_ADMIN_SECTIONS,
'class',
get_class($section),
[
'id' => $section->getID(),
'priority' => $section->getPriority(),
]
);
}
private function has($table, $idCol, $id) {
private function update($table, $idCol, $id, $values) {
$query = $this->dbc->getQueryBuilder();
$query->select($idCol)
$query->update($table);
foreach($values as $key => $value) {
$query->set($key, $query->createNamedParameter($value));
}
$query
->where($query->expr()->eq($idCol, $query->createParameter($idCol)))
->setParameter($idCol, $id)
->execute();
}
/**
* @param string $className
* @return bool
*/
private function hasAdminSection($className) {
return $this->has(self::TABLE_ADMIN_SECTIONS, $className);
}
/**
* @param string $className
* @return bool
*/
private function hasAdminSettings($className) {
return $this->has(self::TABLE_ADMIN_SETTINGS, $className);
}
private function has($table, $className) {
$query = $this->dbc->getQueryBuilder();
$query->select('class')
->from($table)
->where($query->expr()->eq($idCol, $query->createNamedParameter($id)))
->where($query->expr()->eq('class', $query->createNamedParameter($className)))
->setMaxResults(1);
$result = $query->execute();
@ -164,6 +210,7 @@ class Manager implements IManager {
}
try {
/** @var IAdmin $settings */
$settings = $this->query($settingsClassName);
} catch (QueryException $e) {
// cancel
@ -177,8 +224,10 @@ class Manager implements IManager {
);
return;
}
if(!$this->hasAdminSettings($settings)) {
if(!$this->hasAdminSettings(get_class($settings))) {
$this->addAdminSettings($settings);
} else {
$this->updateAdminSettings($settings);
}
}

View file

@ -345,6 +345,12 @@ class OC_App {
} else {
$appManager->enableApp($app);
}
$info = self::getAppInfo($app);
if(isset($info['settings']) && is_array($info['settings'])) {
self::loadApp($app, false);
\OC::$server->getSettingsManager()->setupSettings($info['settings']);
}
}
/**