2023-01-23 11:03:31 +01:00

206 lines
6.1 KiB
PHP

<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\Diagnostics;
use Piwik\Development;
use Piwik\Ini\IniReader;
use Piwik\Application\Kernel\GlobalSettingsProvider;
use Piwik\Settings as PiwikSettings;
use Piwik\Plugin\Settings as PluginSettings;
/**
* A diagnostic report contains all the results of all the diagnostics.
*/
class ConfigReader
{
/**
* @var GlobalSettingsProvider
*/
private $settings;
/**
* @var IniReader
*/
private $iniReader;
public function __construct(GlobalSettingsProvider $settings, IniReader $iniReader)
{
$this->settings = $settings;
$this->iniReader = $iniReader;
}
public function getConfigValuesFromFiles()
{
$ini = $this->settings->getIniFileChain();
$descriptions = $this->iniReader->readComments($this->settings->getPathGlobal());
$copy = array();
foreach ($ini->getAll() as $category => $values) {
if ($this->shouldSkipCategory($category)) {
continue;
}
$local = $this->getFromLocalConfig($category);
if (empty($local)) {
$local = array();
}
$global = $this->getFromGlobalConfig($category);
if (empty($global)) {
$global = array();
}
$copy[$category] = array();
foreach ($values as $key => $value) {
$newValue = $value;
if ($this->isKeyAPassword($key)) {
$newValue = $this->getMaskedPassword();
}
$defaultValue = null;
if (array_key_exists($key, $global)) {
$defaultValue = $global[$key];
}
$description = '';
if (!empty($descriptions[$category][$key])) {
$description = trim($descriptions[$category][$key]);
}
$copy[$category][$key] = array(
'value' => $newValue,
'description' => $description,
'isCustomValue' => array_key_exists($key, $local),
'defaultValue' => $defaultValue,
);
}
}
return $copy;
}
private function shouldSkipCategory($category)
{
$category = strtolower($category);
if ($category === 'database') {
return true;
}
$developmentOnlySections = array('database_tests', 'tests', 'debugtests');
return !Development::isEnabled() && in_array($category, $developmentOnlySections);
}
public function getFromGlobalConfig($name)
{
return $this->settings->getIniFileChain()->getFrom($this->settings->getPathGlobal(), $name);
}
public function getFromLocalConfig($name)
{
return $this->settings->getIniFileChain()->getFrom($this->settings->getPathLocal(), $name);
}
private function getMaskedPassword()
{
return '******';
}
private function isKeyAPassword($key)
{
$key = strtolower($key);
$passwordFields = array(
'password', 'secret', 'apikey', 'privatekey', 'admin_pass', 'md5', 'sha1'
);
foreach ($passwordFields as $value) {
if (strpos($key, $value) !== false) {
return true;
}
}
if ($key === 'salt') {
return true;
}
return false;
}
/**
* Adds config values that can be used to overwrite a plugin system setting and adds a description + default value
* for already existing configured config values that overwrite a plugin system setting.
*
* @param array $configValues
* @param \Piwik\Settings\Plugin\SystemSettings[] $systemSettings
* @return array
*/
public function addConfigValuesFromSystemSettings($configValues, $systemSettings)
{
foreach ($systemSettings as $pluginSetting) {
$pluginName = $pluginSetting->getPluginName();
if (empty($pluginName)) {
continue;
}
if (!array_key_exists($pluginName, $configValues)) {
$configValues[$pluginName] = array();
}
foreach ($pluginSetting->getSettingsWritableByCurrentUser() as $setting) {
$name = $setting->getName();
$configSection = $pluginName;
if ($setting instanceof PiwikSettings\Plugin\SystemConfigSetting) {
$configSection = $setting->getConfigSectionName();
if ($this->shouldSkipCategory($configSection)) {
continue;
}
}
$config = $setting->configureField();
$description = '';
if (!empty($config->description)) {
$description .= $config->description . ' ';
}
if (!empty($config->inlineHelp)) {
$description .= $config->inlineHelp;
}
if (isset($configValues[$configSection][$name])) {
$configValues[$configSection][$name]['defaultValue'] = $setting->getDefaultValue();
$configValues[$configSection][$name]['description'] = trim($description);
if ($config->uiControl === PiwikSettings\FieldConfig::UI_CONTROL_PASSWORD) {
$configValues[$configSection][$name]['value'] = $this->getMaskedPassword();
}
} else {
$defaultValue = $setting->getValue();
$configValues[$configSection][$name] = array(
'value' => null,
'description' => trim($description),
'isCustomValue' => false,
'defaultValue' => $defaultValue
);
}
}
if (empty($configValues[$pluginName])) {
unset($configValues[$pluginName]);
}
}
return $configValues;
}
}