friendica/src/Module/Admin/Storage.php

155 lines
5.4 KiB
PHP
Raw Normal View History

<?php
/**
* @copyright Copyright (C) 2010-2021, the Friendica project
*
* @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 <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Module\Admin;
use Friendica\Core\Renderer;
use Friendica\DI;
2021-10-23 06:11:38 -04:00
use Friendica\Core\Storage\Exception\InvalidClassStorageException;
use Friendica\Core\Storage\Capability\ICanConfigureStorage;
use Friendica\Core\Storage\Capability\ICanWriteToStorage;
use Friendica\Module\BaseAdmin;
use Friendica\Util\Strings;
class Storage extends BaseAdmin
{
public static function post(array $parameters = [])
{
self::checkAdminAccess();
self::checkFormSecurityTokenRedirectOnError('/admin/storage', 'admin_storage');
$storagebackend = Strings::escapeTags(trim($parameters['name'] ?? ''));
try {
2021-10-23 06:11:38 -04:00
/** @var \Friendica\Core\Storage\Capability\ICanConfigureStorage|false $newStorageConfig */
$newStorageConfig = DI::storageManager()->getConfigurationByName($storagebackend);
} catch (InvalidClassStorageException $storageException) {
notice(DI::l10n()->t('Storage backend, %s is invalid.', $storagebackend));
DI::baseUrl()->redirect('admin/storage');
}
if ($newStorageConfig !== false) {
// save storage backend form
$storage_opts = $newStorageConfig->getOptions();
$storage_form_prefix = preg_replace('|[^a-zA-Z0-9]|', '', $storagebackend);
$storage_opts_data = [];
foreach ($storage_opts as $name => $info) {
$fieldname = $storage_form_prefix . '_' . $name;
switch ($info[0]) { // type
case 'checkbox':
case 'yesno':
$value = !empty($_POST[$fieldname]);
break;
default:
$value = $_POST[$fieldname] ?? '';
}
$storage_opts_data[$name] = $value;
}
unset($name);
unset($info);
$storage_form_errors = $newStorageConfig->saveOptions($storage_opts_data);
if (count($storage_form_errors)) {
foreach ($storage_form_errors as $name => $err) {
notice(DI::l10n()->t('Storage backend %s error: %s', $storage_opts[$name][1], $err));
}
DI::baseUrl()->redirect('admin/storage');
}
2021-07-18 17:09:45 -04:00
}
if (!empty($_POST['submit_save_set'])) {
try {
2021-10-23 06:11:38 -04:00
/** @var \Friendica\Core\Storage\Capability\ICanWriteToStorage $newstorage */
$newstorage = DI::storageManager()->getWritableStorageByName($storagebackend);
2021-08-01 08:00:48 -04:00
if (!DI::storageManager()->setBackend($newstorage)) {
notice(DI::l10n()->t('Invalid storage backend setting value.'));
}
} catch (InvalidClassStorageException $storageException) {
notice(DI::l10n()->t('Invalid storage backend setting value.'));
}
}
DI::baseUrl()->redirect('admin/storage');
}
public static function content(array $parameters = [])
{
parent::content($parameters);
2021-07-31 14:56:32 -04:00
$current_storage_backend = DI::storage();
$available_storage_forms = [];
2021-08-15 18:10:37 -04:00
foreach (DI::storageManager()->listBackends() as $name) {
2021-07-18 16:36:06 -04:00
// build storage config form,
2021-07-18 17:09:45 -04:00
$storage_form_prefix = preg_replace('|[^a-zA-Z0-9]|', '', $name);
$storage_form = [];
$storageConfig = DI::storageManager()->getConfigurationByName($name);
if ($storageConfig !== false) {
foreach ($storageConfig->getOptions() as $option => $info) {
$type = $info[0];
// Backward compatibilty with yesno field description
if ($type == 'yesno') {
$type = 'checkbox';
// Remove translated labels Yes No from field info
unset($info[4]);
}
$info[0] = $storage_form_prefix . '_' . $option;
$info['type'] = $type;
$info['field'] = 'field_' . $type . '.tpl';
$storage_form[$option] = $info;
}
2021-07-18 16:36:06 -04:00
}
$available_storage_forms[] = [
'name' => $name,
'prefix' => $storage_form_prefix,
'form' => $storage_form,
2021-10-23 06:11:38 -04:00
'active' => $current_storage_backend instanceof ICanWriteToStorage && $name === $current_storage_backend::getName(),
];
}
$t = Renderer::getMarkupTemplate('admin/storage.tpl');
return Renderer::replaceMacros($t, [
2021-07-18 16:36:06 -04:00
'$title' => DI::l10n()->t('Administration'),
2021-09-01 08:00:23 -04:00
'$label_current' => DI::l10n()->t('Current Storage Backend'),
'$label_config' => DI::l10n()->t('Storage Configuration'),
2021-07-18 16:36:06 -04:00
'$page' => DI::l10n()->t('Storage'),
2021-07-20 17:41:38 -04:00
'$save' => DI::l10n()->t('Save'),
2021-09-02 17:27:35 -04:00
'$save_use' => DI::l10n()->t('Save & Use storage backend'),
'$use' => DI::l10n()->t('Use storage backend'),
2021-07-24 12:57:29 -04:00
'$save_reload' => DI::l10n()->t('Save & Reload'),
'$noconfig' => DI::l10n()->t('This backend doesn\'t have custom settings'),
2021-07-18 16:36:06 -04:00
'$baseurl' => DI::baseUrl()->get(true),
'$form_security_token' => self::getFormSecurityToken("admin_storage"),
2021-10-23 06:11:38 -04:00
'$storagebackend' => $current_storage_backend instanceof ICanWriteToStorage ? $current_storage_backend::getName() : DI::l10n()->t('Database (legacy)'),
2021-07-18 16:36:06 -04:00
'$availablestorageforms' => $available_storage_forms,
]);
}
}