aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Alexander <admin@m-a-styles.de>2016-12-09 08:17:51 +0100
committerMarc Alexander <admin@m-a-styles.de>2016-12-09 08:17:51 +0100
commit7fedc19cc422a00ad460f7f9dc41e916c67073ef (patch)
treeda254464c0072de3a5ddccbe3c1095f633fe3b0c /phpBB/phpbb/di
parentMerge pull request #4568 from marc1706/ticket/14900 (diff)
downloadphpbb-7fedc19cc422a00ad460f7f9dc41e916c67073ef.tar.gz
phpbb-7fedc19cc422a00ad460f7f9dc41e916c67073ef.tar.bz2
phpbb-7fedc19cc422a00ad460f7f9dc41e916c67073ef.zip
[ticket/14891] Use own proxy instantiator for open_basedir compatibility
Also reverted random_compat lib to 1.4.x. PHPBB3-14891
Diffstat (limited to 'phpBB/phpbb/di')
-rw-r--r--phpBB/phpbb/di/container_builder.php2
-rw-r--r--phpBB/phpbb/di/proxy_instantiator.php74
2 files changed, 75 insertions, 1 deletions
diff --git a/phpBB/phpbb/di/container_builder.php b/phpBB/phpbb/di/container_builder.php
index b6854673c2..6412ccea46 100644
--- a/phpBB/phpbb/di/container_builder.php
+++ b/phpBB/phpbb/di/container_builder.php
@@ -488,7 +488,7 @@ class container_builder
protected function create_container(array $extensions)
{
$container = new ContainerBuilder(new ParameterBag($this->get_core_parameters()));
- $container->setProxyInstantiator(new RuntimeInstantiator());
+ $container->setProxyInstantiator(new proxy_instantiator($this->get_cache_dir()));
$extensions_alias = array();
diff --git a/phpBB/phpbb/di/proxy_instantiator.php b/phpBB/phpbb/di/proxy_instantiator.php
new file mode 100644
index 0000000000..28d9972cd7
--- /dev/null
+++ b/phpBB/phpbb/di/proxy_instantiator.php
@@ -0,0 +1,74 @@
+<?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.
+ *
+ */
+
+namespace phpbb\di;
+
+use \bantu\IniGetWrapper\IniGetWrapper;
+use ProxyManager\Configuration;
+use ProxyManager\Factory\LazyLoadingValueHolderFactory;
+use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy;
+use ProxyManager\Proxy\LazyLoadingInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\InstantiatorInterface;
+
+/**
+ * Runtime lazy loading proxy generator extended for allowing use while using
+ * open_basedir restrictions
+ *
+ * Original author: Marco Pivetta <ocramius@gmail.com>
+ */
+class proxy_instantiator implements InstantiatorInterface
+{
+ /**
+ * @var LazyLoadingValueHolderFactory
+ */
+ private $factory;
+
+ /**
+ * proxy_instantiator constructor
+ * @param string $cache_dir Cache dir for fall back when using open_basedir
+ */
+ public function __construct($cache_dir)
+ {
+ $config = new Configuration();
+
+ // Prevent trying to write to system temp dir in case of open_basedir
+ // restrictions being in effect
+ $ini_wrapper = new IniGetWrapper();
+ if ($ini_wrapper->getString('open_basedir') || !file_exists(sys_get_temp_dir()))
+ {
+ $config->setProxiesTargetDir($cache_dir);
+ }
+ $config->setGeneratorStrategy(new EvaluatingGeneratorStrategy());
+
+ $this->factory = new LazyLoadingValueHolderFactory($config);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function instantiateProxy(ContainerInterface $container, Definition $definition, $id, $realInstantiator)
+ {
+ return $this->factory->createProxy(
+ $definition->getClass(),
+ function (&$wrappedInstance, LazyLoadingInterface $proxy) use ($realInstantiator) {
+ $wrappedInstance = call_user_func($realInstantiator);
+
+ $proxy->setProxyInitializer(null);
+
+ return true;
+ }
+ );
+ }
+}