1<?php 2/** 3 * Matomo - free/libre analytics platform 4 * 5 * @link https://matomo.org 6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later 7 */ 8 9namespace Piwik\Config; 10 11use Matomo\Cache\Backend\File; 12use Piwik\Common; 13use Piwik\Piwik; 14use Piwik\Url; 15 16/** 17 * Exception thrown when the config file doesn't exist. 18 */ 19class Cache extends File 20{ 21 private $host = ''; 22 23 public function __construct() 24 { 25 $this->host = $this->getHost(); 26 27 // because the config is not yet loaded we cannot identify the instanceId... 28 // need to use the hostname 29 $dir = $this->makeCacheDir($this->host); 30 31 parent::__construct($dir); 32 } 33 34 private function makeCacheDir($host) 35 { 36 return PIWIK_INCLUDE_PATH . '/tmp/' . $host . '/cache/tracker'; 37 } 38 39 public function isValidHost($mergedConfigSettings) 40 { 41 if (!isset($mergedConfigSettings['General']['trusted_hosts']) || !is_array($mergedConfigSettings['General']['trusted_hosts'])) { 42 return false; 43 } 44 // note: we do not support "enable_trusted_host_check" to keep things secure 45 return in_array($this->host, $mergedConfigSettings['General']['trusted_hosts'], true); 46 } 47 48 private function getHost() 49 { 50 $host = Url::getHost($checkIfTrusted = false); 51 $host = Url::getHostSanitized($host); // Remove any port number to get actual hostname 52 $host = Common::sanitizeInputValue($host); 53 54 if (empty($host) 55 || strpos($host, '..') !== false 56 || strpos($host, '\\') !== false 57 || strpos($host, '/') !== false) { 58 throw new \Exception('Unsupported host'); 59 } 60 61 $this->host = $host; 62 63 return $host; 64 } 65 66 public function doDelete($id) 67 { 68 // when the config changes, we need to invalidate the config caches for all configured hosts as well, not only 69 // the currently trusted host 70 $hosts = Url::getTrustedHosts(); 71 $initialDir = $this->directory; 72 73 foreach ($hosts as $host) 74 { 75 $dir = $this->makeCacheDir($host); 76 if (@is_dir($dir)) { 77 $this->directory = $dir; 78 $success = parent::doDelete($id); 79 if ($success) { 80 Piwik::postEvent('Core.configFileDeleted', array($this->getFilename($id))); 81 } 82 } 83 } 84 85 $this->directory = $initialDir; 86 } 87 88} 89