2021-07-18 22:09:11 +02:00
< ? php
/**
2023-01-01 09:36:24 -05:00
* @ copyright Copyright ( C ) 2010 - 2023 , the Friendica project
2021-07-18 22:09:11 +02:00
*
* @ 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 12:11:38 +02:00
use Friendica\Core\Storage\Exception\InvalidClassStorageException ;
use Friendica\Core\Storage\Capability\ICanConfigureStorage ;
use Friendica\Core\Storage\Capability\ICanWriteToStorage ;
2021-07-18 22:09:11 +02:00
use Friendica\Module\BaseAdmin ;
use Friendica\Util\Strings ;
class Storage extends BaseAdmin
{
2021-11-28 13:44:42 +01:00
protected function post ( array $request = [])
2021-07-18 22:09:11 +02:00
{
self :: checkAdminAccess ();
self :: checkFormSecurityTokenRedirectOnError ( '/admin/storage' , 'admin_storage' );
2021-11-14 23:19:25 +01:00
$storagebackend = trim ( $this -> parameters [ 'name' ] ? ? '' );
2021-07-20 23:33:35 +02:00
2021-08-10 23:56:30 +02:00
try {
2021-10-27 20:16:34 +02:00
/** @var ICanConfigureStorage|false $newStorageConfig */
2021-10-04 10:25:29 +02:00
$newStorageConfig = DI :: storageManager () -> getConfigurationByName ( $storagebackend );
2021-08-10 23:56:30 +02:00
} catch ( InvalidClassStorageException $storageException ) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Storage backend, %s is invalid.' , $storagebackend ));
2021-08-10 23:56:30 +02:00
DI :: baseUrl () -> redirect ( 'admin/storage' );
}
2021-07-18 22:09:11 +02:00
2021-10-04 10:25:29 +02:00
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 ;
2021-07-18 22:09:11 +02:00
}
2021-10-04 10:25:29 +02:00
unset ( $name );
unset ( $info );
2021-07-18 22:09:11 +02:00
2021-10-04 10:25:29 +02:00
$storage_form_errors = $newStorageConfig -> saveOptions ( $storage_opts_data );
if ( count ( $storage_form_errors )) {
foreach ( $storage_form_errors as $name => $err ) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Storage backend %s error: %s' , $storage_opts [ $name ][ 1 ], $err ));
2021-10-04 10:25:29 +02:00
}
DI :: baseUrl () -> redirect ( 'admin/storage' );
2021-07-18 22:09:11 +02:00
}
2021-07-18 23:09:45 +02:00
}
2023-03-27 00:17:40 +02:00
if ( ! empty ( $_POST [ 'submit_save_set' ]) && DI :: config () -> isWritable ( 'storage' , 'name' ) ) {
2021-08-10 23:56:30 +02:00
try {
$newstorage = DI :: storageManager () -> getWritableStorageByName ( $storagebackend );
2021-08-01 14:00:48 +02:00
2021-08-10 23:56:30 +02:00
if ( ! DI :: storageManager () -> setBackend ( $newstorage )) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Invalid storage backend setting value.' ));
2021-08-10 23:56:30 +02:00
}
} catch ( InvalidClassStorageException $storageException ) {
2022-10-17 18:55:22 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Invalid storage backend setting value.' ));
2021-07-20 23:33:35 +02:00
}
2021-07-18 22:09:11 +02:00
}
DI :: baseUrl () -> redirect ( 'admin/storage' );
}
2021-11-20 15:38:03 +01:00
protected function content ( array $request = []) : string
2021-07-18 22:09:11 +02:00
{
2021-11-14 20:46:25 +01:00
parent :: content ();
2021-07-18 22:09:11 +02:00
2021-07-31 20:56:32 +02:00
$current_storage_backend = DI :: storage ();
$available_storage_forms = [];
2021-07-18 22:09:11 +02:00
2021-08-16 00:10:37 +02:00
foreach ( DI :: storageManager () -> listBackends () as $name ) {
2021-07-18 22:09:11 +02:00
2021-07-18 22:36:06 +02:00
// build storage config form,
2021-07-18 23:09:45 +02:00
$storage_form_prefix = preg_replace ( '|[^a-zA-Z0-9]|' , '' , $name );
2021-07-18 22:09:11 +02:00
2021-10-04 10:25:29 +02:00
$storage_form = [];
$storageConfig = DI :: storageManager () -> getConfigurationByName ( $name );
if ( $storageConfig !== false ) {
foreach ( $storageConfig -> getOptions () as $option => $info ) {
2021-07-18 22:09:11 +02:00
2021-10-04 10:25:29 +02:00
$type = $info [ 0 ];
2023-03-21 23:17:09 -04:00
// Backward compatibility with yesno field description
2021-10-04 10:25:29 +02:00
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 22:36:06 +02:00
}
2021-07-20 23:33:35 +02:00
$available_storage_forms [] = [
'name' => $name ,
'prefix' => $storage_form_prefix ,
'form' => $storage_form ,
2021-10-23 12:11:38 +02:00
'active' => $current_storage_backend instanceof ICanWriteToStorage && $name === $current_storage_backend :: getName (),
2021-07-20 23:33:35 +02:00
];
2021-07-18 22:09:11 +02:00
}
$t = Renderer :: getMarkupTemplate ( 'admin/storage.tpl' );
return Renderer :: replaceMacros ( $t , [
2021-07-18 22:36:06 +02:00
'$title' => DI :: l10n () -> t ( 'Administration' ),
2021-09-01 14:00:23 +02:00
'$label_current' => DI :: l10n () -> t ( 'Current Storage Backend' ),
'$label_config' => DI :: l10n () -> t ( 'Storage Configuration' ),
2021-07-18 22:36:06 +02:00
'$page' => DI :: l10n () -> t ( 'Storage' ),
2021-07-20 23:41:38 +02:00
'$save' => DI :: l10n () -> t ( 'Save' ),
2021-09-02 23:27:35 +02:00
'$save_use' => DI :: l10n () -> t ( 'Save & Use storage backend' ),
'$use' => DI :: l10n () -> t ( 'Use storage backend' ),
2021-07-24 18:57:29 +02:00
'$save_reload' => DI :: l10n () -> t ( 'Save & Reload' ),
'$noconfig' => DI :: l10n () -> t ( 'This backend doesn\'t have custom settings' ),
2021-07-18 22:36:06 +02:00
'$form_security_token' => self :: getFormSecurityToken ( " admin_storage " ),
2023-03-27 00:17:40 +02:00
'$storagebackend_ro_txt' => ! DI :: config () -> isWritable ( 'storage' , 'name' ) ? DI :: l10n () -> t ( 'Changing the current backend is prohibited because it is set by an environment variable' ) : '' ,
2023-03-27 19:30:28 +02:00
'$is_writable' => DI :: config () -> isWritable ( 'storage' , 'name' ),
2021-10-23 12:11:38 +02:00
'$storagebackend' => $current_storage_backend instanceof ICanWriteToStorage ? $current_storage_backend :: getName () : DI :: l10n () -> t ( 'Database (legacy)' ),
2021-07-18 22:36:06 +02:00
'$availablestorageforms' => $available_storage_forms ,
2021-07-18 22:09:11 +02:00
]);
}
}