dwoo-project / dwoo

[UNMAINTAINED] php template engine
http://dwoo.org
GNU Lesser General Public License v3.0
167 stars 58 forks source link

Incorrect login in Loader.php #72

Open char101 opened 6 years ago

char101 commented 6 years ago

https://github.com/dwoo-project/dwoo/blob/master/lib/Dwoo/Loader.php#L131

This expression will always be false even when

isset($this->classPath[$class]) && is_readable($this->classPath[$class]) == true

because

isset($this->classPath[$class . 'Compile']) && is_readable($this->classPath[$class . 'Compile']) == false

Correct logic is

if (!(isset($this->classPath[$class]) && is_readable($this->classPath[$class])) &&
    !(isset($this->classPath[$class . 'Compile']) && is_readable($this->classPath[$class . 'Compile']))) {
char101 commented 6 years ago

Also the if needs an else clause when the plugin already exists in $this->classPath

        } else {
            if (isset($this->classPath[$class])) {
                include_once $this->classPath[$class];
            } elseif (isset($this->classPath[$class . 'Compile'])) {
                include_once $this->classPath[$class . 'Compile'];
            }
        }
char101 commented 6 years ago

I think this is easier to digest

    public function loadPlugin($class, $forceRehash = true)
    {
        /**
         * An unknown class was requested (maybe newly added) or the
         * include failed so we rebuild the cache. include() will fail
         * with an uncatchable error if the file doesn't exist, which
         * usually means that the cache is stale and must be rebuilt,
         * so we check for that before trying to include() the plugin.
         */
        if (isset($this->classPath[$class]) && is_readable($this->classPath[$class])) {
            include_once $this->classPath[$class];
        } elseif (isset($this->classPath[$class . 'Compile']) && is_readable($this->classPath[$class . 'Compile'])) {
            include_once $this->classPath[$class . 'Compile'];
        } else {
            if ($forceRehash) {
                $this->rebuildClassPathCache($this->corePluginDir, $this->cacheDir . 'classpath.cache.d' .
                    Core::RELEASE_TAG . '.php');
                foreach ($this->paths as $path => $file) {
                    $this->rebuildClassPathCache($path, $file);
                }
                if (isset($this->classPath[$class])) {
                    include_once $this->classPath[$class];
                } elseif (isset($this->classPath[$class . 'Compile'])) {
                    include_once $this->classPath[$class . 'Compile'];
                } else {
                    throw new Exception('Plugin "' . $class . '" can not be found, maybe you forgot to bind it if it\'s a custom plugin ?', E_USER_NOTICE);
                }
            } else {
                throw new Exception('Plugin "' . $class . '" can not be found, maybe you forgot to bind it if it\'s a custom plugin ?', E_USER_NOTICE);
            }
        }
    }