aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB/includes/acp/acp_storage.php')
-rw-r--r--phpBB/includes/acp/acp_storage.php339
1 files changed, 339 insertions, 0 deletions
diff --git a/phpBB/includes/acp/acp_storage.php b/phpBB/includes/acp/acp_storage.php
new file mode 100644
index 0000000000..12a4b45d67
--- /dev/null
+++ b/phpBB/includes/acp/acp_storage.php
@@ -0,0 +1,339 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+class acp_storage
+{
+ /** @var \phpbb\config $config */
+ protected $config;
+
+ /** @var \phpbb\language\language $lang */
+ protected $lang;
+
+ /** @var \phpbb\request\request */
+ protected $request;
+
+ /** @var \phpbb\template\template */
+ protected $template;
+
+ /** @var \phpbb\user */
+ protected $user;
+
+ /** @var \phpbb\di\service_collection */
+ protected $provider_collection;
+
+ /** @var \phpbb\di\service_collection */
+ protected $storage_collection;
+
+ /** @var string */
+ public $page_title;
+
+ /** @var string */
+ public $tpl_name;
+
+ /** @var string */
+ public $u_action;
+
+ /**
+ * @param string $id
+ * @param string $mode
+ */
+ public function main($id, $mode)
+ {
+ global $phpbb_container, $phpbb_dispatcher;
+
+ $this->config = $phpbb_container->get('config');
+ $this->lang = $phpbb_container->get('language');
+ $this->request = $phpbb_container->get('request');
+ $this->template = $phpbb_container->get('template');
+ $this->user = $phpbb_container->get('user');
+ $this->provider_collection = $phpbb_container->get('storage.provider_collection');
+ $this->storage_collection = $phpbb_container->get('storage.storage_collection');
+
+ // Add necesary language files
+ $this->lang->add_lang(['acp/storage']);
+
+ /**
+ * Add language strings
+ *
+ * @event core.acp_storage_load
+ * @since 3.3.0-a1
+ */
+ $phpbb_dispatcher->dispatch('core.acp_storage_load');
+
+ $this->overview($id, $mode);
+ }
+
+ /**
+ * @param string $id
+ * @param string $mode
+ */
+ public function overview($id, $mode)
+ {
+ $form_key = 'acp_storage';
+ add_form_key($form_key);
+
+ // Template from adm/style
+ $this->tpl_name = 'acp_storage';
+
+ // Set page title
+ $this->page_title = 'STORAGE_TITLE';
+
+ if ($this->request->is_set_post('submit'))
+ {
+ $modified_storages = [];
+ $messages = [];
+
+ if (!check_form_key($form_key))
+ {
+ $messages[] = $this->lang->lang('FORM_INVALID');
+ }
+
+ foreach ($this->storage_collection as $storage)
+ {
+ $storage_name = $storage->get_name();
+
+ $options = $this->get_provider_options($this->get_current_provider($storage_name));
+
+ $modified = false;
+
+ // Check if provider have been modified
+ if ($this->get_new_provider($storage_name) != $this->get_current_provider($storage_name))
+ {
+ $modified = true;
+ }
+
+ // Check if options have been modified
+ if (!$modified)
+ {
+ foreach (array_keys($options) as $definition)
+ {
+ if ($this->get_new_definition($storage_name, $definition) != $this->get_current_definition($storage_name, $definition))
+ {
+ $modified = true;
+ break;
+ }
+ }
+ }
+
+ // If the storage have been modified, validate options
+ if ($modified)
+ {
+ $modified_storages[] = $storage_name;
+ $this->validate_data($storage_name, $messages);
+ }
+ }
+
+ if (!empty($modified_storages))
+ {
+ if (empty($messages))
+ {
+ foreach ($modified_storages as $storage_name)
+ {
+ $this->update_storage_config($storage_name);
+ }
+
+ trigger_error($this->lang->lang('STORAGE_UPDATE_SUCCESSFUL') . adm_back_link($this->u_action), E_USER_NOTICE);
+ }
+ else
+ {
+ trigger_error(implode('<br />', $messages) . adm_back_link($this->u_action), E_USER_WARNING);
+ }
+ }
+
+ // If there is no changes
+ trigger_error($this->lang->lang('STORAGE_NO_CHANGES') . adm_back_link($this->u_action), E_USER_WARNING);
+ }
+
+ $storage_stats = [];
+ foreach ($this->storage_collection as $storage)
+ {
+ try
+ {
+ $free_space = get_formatted_filesize($storage->free_space());
+ }
+ catch (\phpbb\storage\exception\exception $e)
+ {
+ $free_space = $this->lang->lang('STORAGE_UNKNOWN');
+ }
+
+ $storage_stats[] = [
+ 'name' => $this->lang->lang('STORAGE_' . strtoupper($storage->get_name()) . '_TITLE'),
+ 'files' => $storage->get_num_files(),
+ 'size' => get_formatted_filesize($storage->get_size()),
+ 'free_space' => $free_space,
+ ];
+ }
+
+ $this->template->assign_vars(array(
+ 'STORAGES' => $this->storage_collection,
+ 'STORAGE_STATS' => $storage_stats,
+ 'PROVIDERS' => $this->provider_collection,
+ ));
+ }
+
+ /**
+ * Get the current provider from config
+ *
+ * @param string $storage_name Storage name
+ * @return string The current provider
+ */
+ protected function get_current_provider($storage_name)
+ {
+ return $this->config['storage\\' . $storage_name . '\\provider'];
+ }
+
+ /**
+ * Get the new provider from the request
+ *
+ * @param string $storage_name Storage name
+ * @return string The new provider
+ */
+ protected function get_new_provider($storage_name)
+ {
+ return $this->request->variable([$storage_name, 'provider'], '');
+ }
+
+ /**
+ * Get adapter definitions from a provider
+ *
+ * @param string $provider Provider class
+ * @return array Adapter definitions
+ */
+ protected function get_provider_options($provider)
+ {
+ return $this->provider_collection->get_by_class($provider)->get_options();
+ }
+
+ /**
+ * Get the current value of the definition of a storage from config
+ *
+ * @param string $storage_name Storage name
+ * @param string $definition Definition
+ * @return string Definition value
+ */
+ protected function get_current_definition($storage_name, $definition)
+ {
+ return $this->config['storage\\' . $storage_name . '\\config\\' . $definition];
+ }
+
+ /**
+ * Get the new value of the definition of a storage from the request
+ *
+ * @param string $storage_name Storage name
+ * @param string $definition Definition
+ * @return string Definition value
+ */
+ protected function get_new_definition($storage_name, $definition)
+ {
+ return $this->request->variable([$storage_name, $definition], '');
+ }
+
+ /**
+ * Validates data
+ *
+ * @param string $storage_name Storage name
+ * @param array $messages Reference to messages array
+ */
+ protected function validate_data($storage_name, &$messages)
+ {
+ $storage_title = $this->lang->lang('STORAGE_' . strtoupper($storage_name) . '_TITLE');
+
+ // Check if provider exists
+ try
+ {
+ $new_provider = $this->provider_collection->get_by_class($this->get_new_provider($storage_name));
+ }
+ catch (\Exception $e)
+ {
+ $messages[] = $this->lang->lang('STORAGE_PROVIDER_NOT_EXISTS', $storage_title);
+ return;
+ }
+
+ // Check if provider is available
+ if (!$new_provider->is_available())
+ {
+ $messages[] = $this->lang->lang('STORAGE_PROVIDER_NOT_AVAILABLE', $storage_title);
+ return;
+ }
+
+ // Check options
+ $new_options = $this->get_provider_options($this->get_new_provider($storage_name));
+
+ foreach ($new_options as $definition_key => $definition_value)
+ {
+ $provider = $this->provider_collection->get_by_class($this->get_new_provider($storage_name));
+ $definition_title = $this->lang->lang('STORAGE_ADAPTER_' . strtoupper($provider->get_name()) . '_OPTION_' . strtoupper($definition_key));
+
+ $value = $this->get_new_definition($storage_name, $definition_key);
+
+ switch ($definition_value['type'])
+ {
+ case 'email':
+ if (!filter_var($value, FILTER_VALIDATE_EMAIL))
+ {
+ $messages[] = $this->lang->lang('STORAGE_FORM_TYPE_EMAIL_INCORRECT_FORMAT', $definition_title, $storage_title);
+ }
+ case 'text':
+ case 'password':
+ $maxlength = isset($definition_value['maxlength']) ? $definition_value['maxlength'] : 255;
+ if (strlen($value) > $maxlength)
+ {
+ $messages[] = $this->lang->lang('STORAGE_FORM_TYPE_TEXT_TOO_LONG', $definition_title, $storage_title);
+ }
+ break;
+ case 'radio':
+ case 'select':
+ if (!in_array($value, array_values($definition_value['options'])))
+ {
+ $messages[] = $this->lang->lang('STORAGE_FORM_TYPE_SELECT_NOT_AVAILABLE', $definition_title, $storage_title);
+ }
+ break;
+ }
+ }
+ }
+
+ /**
+ * Updates an storage with the info provided in the form
+ *
+ * @param string $storage_name Storage name
+ */
+ protected function update_storage_config($storage_name)
+ {
+ $current_options = $this->get_provider_options($this->get_current_provider($storage_name));
+
+ // Remove old storage config
+ foreach (array_keys($current_options) as $definition)
+ {
+ $this->config->delete('storage\\' . $storage_name . '\\config\\' . $definition);
+ }
+
+ // Update provider
+ $this->config->set('storage\\' . $storage_name . '\\provider', $this->get_new_provider($storage_name));
+
+ // Set new storage config
+ $new_options = $this->get_provider_options($this->get_new_provider($storage_name));
+
+ foreach (array_keys($new_options) as $definition)
+ {
+ $this->config->set('storage\\' . $storage_name . '\\config\\' . $definition, $this->get_new_definition($storage_name, $definition));
+ }
+ }
+}