vendor/se7enxweb/legacy-bridge/bundle/LegacyMapper/Configuration.php line 113

Open in your IDE?
  1. <?php
  2. /**
  3. * @copyright Copyright (C) eZ Systems AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. */
  6. namespace eZ\Bundle\EzPublishLegacyBundle\LegacyMapper;
  7. use eZ\Publish\Core\FieldType\Image\AliasCleanerInterface;
  8. use eZ\Publish\Core\MVC\Legacy\LegacyEvents;
  9. use eZ\Publish\Core\MVC\Legacy\Event\PreBuildKernelEvent;
  10. use eZ\Publish\Core\MVC\ConfigResolverInterface;
  11. use EzSystems\PlatformHttpCacheBundle\PurgeClient\PurgeClientInterface;
  12. use eZ\Bundle\EzPublishLegacyBundle\Cache\PersistenceCachePurger;
  13. use eZ\Publish\Core\MVC\Symfony\Routing\Generator\UrlAliasGenerator;
  14. use Doctrine\DBAL\Connection;
  15. use ezpEvent;
  16. use ezxFormToken;
  17. use Symfony\Component\DependencyInjection\ContainerAwareTrait;
  18. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  19. use RuntimeException;
  20. use Exception;
  21. /**
  22. * Maps configuration parameters to the legacy parameters.
  23. */
  24. class Configuration implements EventSubscriberInterface
  25. {
  26. use ContainerAwareTrait;
  27. /**
  28. * @var \eZ\Publish\Core\MVC\ConfigResolverInterface
  29. */
  30. private $configResolver;
  31. /**
  32. * @var \EzSystems\PlatformHttpCacheBundle\PurgeClient\PurgeClientInterface
  33. */
  34. private $purgeClient;
  35. /**
  36. * @var \eZ\Bundle\EzPublishLegacyBundle\Cache\PersistenceCachePurger
  37. */
  38. private $persistenceCachePurger;
  39. /**
  40. * @var \eZ\Publish\Core\MVC\Symfony\Routing\Generator\UrlAliasGenerator
  41. */
  42. private $urlAliasGenerator;
  43. /**
  44. * @var \Doctrine\DBAL\Connection
  45. */
  46. private $legacyDbHandler;
  47. /**
  48. * @var array
  49. */
  50. private $options;
  51. /**
  52. * Disables the feature when set using setEnabled().
  53. *
  54. * @var bool
  55. */
  56. private $enabled = true;
  57. /**
  58. * @var AliasCleanerInterface
  59. */
  60. private $aliasCleaner;
  61. public function __construct(
  62. ConfigResolverInterface $configResolver,
  63. PurgeClientInterface $purgeClient,
  64. PersistenceCachePurger $persistenceCachePurger,
  65. UrlAliasGenerator $urlAliasGenerator,
  66. Connection $legacyDbHandler,
  67. AliasCleanerInterface $aliasCleaner,
  68. array $options = []
  69. ) {
  70. $this->configResolver = $configResolver;
  71. $this->purgeClient = $purgeClient;
  72. $this->persistenceCachePurger = $persistenceCachePurger;
  73. $this->urlAliasGenerator = $urlAliasGenerator;
  74. $this->legacyDbHandler = $legacyDbHandler;
  75. $this->aliasCleaner = $aliasCleaner;
  76. $this->options = $options;
  77. }
  78. /**
  79. * Toggles the feature.
  80. *
  81. * @param bool $isEnabled
  82. */
  83. public function setEnabled($isEnabled)
  84. {
  85. $this->enabled = (bool)$isEnabled;
  86. }
  87. public static function getSubscribedEvents()
  88. {
  89. return [
  90. LegacyEvents::PRE_BUILD_LEGACY_KERNEL => ['onBuildKernel', 128],
  91. ];
  92. }
  93. /**
  94. * Adds settings to the parameters that will be injected into the legacy kernel.
  95. *
  96. * @param \eZ\Publish\Core\MVC\Legacy\Event\PreBuildKernelEvent $event
  97. */
  98. public function onBuildKernel(PreBuildKernelEvent $event)
  99. {
  100. if (!$this->enabled) {
  101. return;
  102. }
  103. $databaseSettings = $this->legacyDbHandler->getParams();
  104. $settings = [];
  105. foreach (
  106. [
  107. 'host' => 'Server',
  108. 'port' => 'Port',
  109. 'user' => 'User',
  110. 'password' => 'Password',
  111. 'dbname' => 'Database',
  112. 'unix_socket' => 'Socket',
  113. 'driver' => 'DatabaseImplementation',
  114. ] as $key => $iniKey
  115. ) {
  116. if (isset($databaseSettings[$key])) {
  117. $iniValue = $databaseSettings[$key];
  118. switch ($key) {
  119. case 'driver':
  120. $driverMap = [
  121. 'pdo_mysql' => 'ezmysqli',
  122. 'pdo_pgsql' => 'ezpostgresql',
  123. 'oci8' => 'ezoracle',
  124. ];
  125. if (!isset($driverMap[$iniValue])) {
  126. throw new RuntimeException(
  127. "Could not map database driver to Legacy Stack database implementation.\n" .
  128. "Expected one of '" . implode("', '", array_keys($driverMap)) . "', got '" .
  129. $iniValue . "'."
  130. );
  131. }
  132. $iniValue = $driverMap[$iniValue];
  133. break;
  134. }
  135. $settings["site.ini/DatabaseSettings/$iniKey"] = $iniValue;
  136. }
  137. // Some settings need specific values when not present.
  138. else {
  139. switch ($key) {
  140. case 'unix_socket':
  141. $settings["site.ini/DatabaseSettings/$iniKey"] = 'disabled';
  142. break;
  143. }
  144. }
  145. }
  146. // Image settings
  147. $settings += $this->getImageSettings();
  148. // File settings
  149. $settings += [
  150. 'site.ini/FileSettings/VarDir' => $this->configResolver->getParameter('var_dir'),
  151. 'site.ini/FileSettings/StorageDir' => $this->configResolver->getParameter('storage_dir'),
  152. ];
  153. // Multisite settings (PathPrefix and co)
  154. $settings += $this->getMultiSiteSettings();
  155. // User settings
  156. $settings['site.ini/UserSettings/AnonymousUserID'] = $this->configResolver->getParameter('anonymous_user_id');
  157. // Cache settings
  158. // Enforce ViewCaching to be enabled in order to persistence/http cache to be purged correctly.
  159. $settings['site.ini/ContentSettings/ViewCaching'] = 'enabled';
  160. // Cluster Settings
  161. $settings += $this->getClusterSettings();
  162. $event->getParameters()->set(
  163. 'injected-settings',
  164. $settings + (array)$event->getParameters()->get('injected-settings')
  165. );
  166. if (class_exists('ezxFormToken')) {
  167. // Inject csrf protection settings to make sure legacy & symfony stack work together
  168. if (
  169. $this->container->hasParameter('form.type_extension.csrf.enabled') &&
  170. $this->container->getParameter('form.type_extension.csrf.enabled')
  171. ) {
  172. ezxFormToken::setSecret($this->container->getParameter('kernel.secret'));
  173. ezxFormToken::setFormField($this->container->getParameter('form.type_extension.csrf.field_name'));
  174. }
  175. // csrf protection is disabled, disable it in legacy extension as well.
  176. else {
  177. ezxFormToken::setIsEnabled(false);
  178. }
  179. }
  180. // Register http cache content/cache event listener
  181. $ezpEvent = ezpEvent::getInstance();
  182. $ezpEvent->attach('content/cache', [$this->purgeClient, 'purge']);
  183. $ezpEvent->attach('content/cache/all', [$this->purgeClient, 'purgeAll']);
  184. // Register persistence cache event listeners
  185. $ezpEvent->attach('content/cache', [$this->persistenceCachePurger, 'content']);
  186. $ezpEvent->attach('content/cache/all', [$this->persistenceCachePurger, 'all']);
  187. $ezpEvent->attach('content/cache/version', [$this->persistenceCachePurger, 'contentVersion']);
  188. $ezpEvent->attach('content/class/cache/all', [$this->persistenceCachePurger, 'contentType']);
  189. $ezpEvent->attach('content/class/cache', [$this->persistenceCachePurger, 'contentType']);
  190. $ezpEvent->attach('content/class/group/cache', [$this->persistenceCachePurger, 'contentTypeGroup']);
  191. $ezpEvent->attach('content/section/cache', [$this->persistenceCachePurger, 'section']);
  192. $ezpEvent->attach('user/cache/all', [$this->persistenceCachePurger, 'user']);
  193. $ezpEvent->attach('content/translations/cache', [$this->persistenceCachePurger, 'languages']);
  194. $ezpEvent->attach('content/state/assign', [$this->persistenceCachePurger, 'stateAssign']);
  195. // Register image alias removal listeners
  196. $ezpEvent->attach('image/removeAliases', [$this->aliasCleaner, 'removeAliases']);
  197. $ezpEvent->attach('image/trashAliases', [$this->aliasCleaner, 'removeAliases']);
  198. $ezpEvent->attach('image/purgeAliases', [$this->aliasCleaner, 'removeAliases']);
  199. }
  200. private function getImageSettings()
  201. {
  202. $imageSettings = [
  203. // Basic settings
  204. 'image.ini/FileSettings/TemporaryDir' => $this->configResolver->getParameter('image.temporary_dir'),
  205. 'image.ini/FileSettings/PublishedImages' => $this->configResolver->getParameter('image.published_images_dir'),
  206. 'image.ini/FileSettings/VersionedImages' => $this->configResolver->getParameter('image.versioned_images_dir'),
  207. 'image.ini/AliasSettings/AliasList' => [],
  208. // ImageMagick configuration
  209. 'image.ini/ImageMagick/IsEnabled' => $this->options['imagemagick_enabled'] ? 'true' : 'false',
  210. 'image.ini/ImageMagick/ExecutablePath' => $this->options['imagemagick_executable_path'],
  211. 'image.ini/ImageMagick/Executable' => $this->options['imagemagick_executable'],
  212. 'image.ini/ImageMagick/PreParameters' => $this->configResolver->getParameter('imagemagick.pre_parameters'),
  213. 'image.ini/ImageMagick/PostParameters' => $this->configResolver->getParameter('imagemagick.post_parameters'),
  214. 'image.ini/ImageMagick/Filters' => [],
  215. ];
  216. // Aliases configuration
  217. $imageVariations = $this->configResolver->getParameter('image_variations');
  218. foreach ($imageVariations as $aliasName => $aliasSettings) {
  219. $imageSettings['image.ini/AliasSettings/AliasList'][] = $aliasName;
  220. if (isset($aliasSettings['reference'])) {
  221. $imageSettings["image.ini/$aliasName/Reference"] = $aliasSettings['reference'];
  222. }
  223. foreach ($aliasSettings['filters'] as $filterName => $filter) {
  224. if (!isset($this->options['imagemagick_filters'][$filterName])) {
  225. continue;
  226. }
  227. $imageSettings["image.ini/$aliasName/Filters"][] = $filterName . '=' . implode(';', $filter);
  228. }
  229. }
  230. foreach ($this->options['imagemagick_filters'] as $filterName => $filter) {
  231. $imageSettings['image.ini/ImageMagick/Filters'][] = "$filterName=" . strtr($filter, ['{' => '%', '}' => '']);
  232. }
  233. return $imageSettings;
  234. }
  235. private function getMultiSiteSettings()
  236. {
  237. $rootLocationId = $this->configResolver->getParameter('content.tree_root.location_id');
  238. $indexPage = $this->configResolver->getParameter('index_page');
  239. $defaultPage = $this->configResolver->getParameter('default_page');
  240. if ($rootLocationId === null) {
  241. // return SiteSettings if there is no MultiSite (rootLocation is not defined)
  242. $result = [];
  243. if ($indexPage !== null) {
  244. $result['site.ini/SiteSettings/IndexPage'] = $indexPage;
  245. }
  246. if ($defaultPage !== null) {
  247. $result['site.ini/SiteSettings/DefaultPage'] = $defaultPage;
  248. }
  249. return $result;
  250. }
  251. $pathPrefix = $this->loadPathPrefix($rootLocationId);
  252. $pathPrefixExcludeItems = array_map(
  253. static function ($value) {
  254. return trim($value, '/');
  255. },
  256. $this->configResolver->getParameter('content.tree_root.excluded_uri_prefixes')
  257. );
  258. return [
  259. 'site.ini/SiteAccessSettings/PathPrefix' => $pathPrefix,
  260. 'site.ini/SiteAccessSettings/PathPrefixExclude' => $pathPrefixExcludeItems,
  261. 'logfile.ini/AccessLogFileSettings/PathPrefix' => $pathPrefix,
  262. 'site.ini/SiteSettings/IndexPage' => $indexPage !== null ? $indexPage : "/content/view/full/$rootLocationId/",
  263. 'site.ini/SiteSettings/DefaultPage' => $defaultPage !== null ? $defaultPage : "/content/view/full/$rootLocationId/",
  264. ];
  265. }
  266. private function getClusterSettings()
  267. {
  268. $clusterSettings = [];
  269. if ($this->container->hasParameter('dfs_nfs_path')) {
  270. $clusterSettings += [
  271. 'file.ini/ClusteringSettings/FileHandler' => 'eZDFSFileHandler',
  272. 'file.ini/eZDFSClusteringSettings/MountPointPath' => $this->container->getParameter('dfs_nfs_path'),
  273. 'file.ini/eZDFSClusteringSettings/DBHost' => $this->container->getParameter('dfs_database_host'),
  274. 'file.ini/eZDFSClusteringSettings/DBPort' => $this->container->getParameter('dfs_database_port'),
  275. 'file.ini/eZDFSClusteringSettings/DBName' => $this->container->getParameter('dfs_database_name'),
  276. 'file.ini/eZDFSClusteringSettings/DBUser' => $this->container->getParameter('dfs_database_user'),
  277. 'file.ini/eZDFSClusteringSettings/DBPassword' => $this->container->getParameter('dfs_database_password'),
  278. ];
  279. }
  280. return $clusterSettings;
  281. }
  282. private function loadPathPrefix($rootLocationId)
  283. {
  284. // If root location is 2 we know path is empty, so we can skip loading location + urlAlias data
  285. if ($rootLocationId === 2) {
  286. return '';
  287. }
  288. try {
  289. return trim($this->urlAliasGenerator->getPathPrefixByRootLocationId($rootLocationId), '/');
  290. } catch (Exception $e) {
  291. // Ignore any errors
  292. // Most probable cause for error is database not being ready yet,
  293. // i.e. initial install of the project which includes eZ Publish Legacy
  294. }
  295. return '';
  296. }
  297. }