晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 sh-3ll

HOME


sh-3ll 1.0
DIR:/proc/self/root/proc/self/root/opt/cpanel/ea-wappspector/src/Helper/
Upload File :
Current File : //proc/self/root/proc/self/root/opt/cpanel/ea-wappspector/src/Helper/ScanDirectoryIterator.php
<?php

declare(strict_types=1);

namespace Plesk\Wappspector\Helper;

use FilesystemIterator;
use Plesk\Wappspector\Matchers\CpanelWebApp;
use RecursiveCallbackFilterIterator;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use SplFileInfo;

/**
 * Walks the directories under a path, depth-limited, for inspection.
 *
 * The depth limit is relaxed for one directory: a web application registered by the
 * cPanel Web App feature lives in `ea-podman.d/<container>/webapp`, three levels below
 * the account home and so deeper than any useful default. Pruning at the limit would
 * hide every web application on the server unless the caller knew to raise `--depth`,
 * so the two levels under `ea-podman.d` are always descended into. They hold one
 * directory per container and are cheap to walk; nothing below them is, and nothing
 * below them is descended into either.
 *
 * One directory is left out of the walk entirely: `ea-podman.d/<container>.bak`, the
 * copy a redeploy leaves behind.
 */
final class ScanDirectoryIterator extends RecursiveIteratorIterator
{
    /**
     * Suffix of the directory a redeploy leaves behind, alongside the container it
     * replaced.
     */
    private const LEFT_OVER_SUFFIX = '.bak';

    private const FLAGS = FilesystemIterator::KEY_AS_PATHNAME
        | FilesystemIterator::CURRENT_AS_FILEINFO
        | FilesystemIterator::SKIP_DOTS;

    public function __construct(string $path, private int $maxDepth)
    {
        parent::__construct(
            new RecursiveCallbackFilterIterator(
                new RecursiveDirectoryIterator($path, self::FLAGS),
                static fn(SplFileInfo $item): bool => !self::isLeftOverContainer($item)
            ),
            self::SELF_FIRST
        );
    }

    public function callHasChildren(): bool
    {
        if (!parent::callHasChildren()) {
            return false;
        }

        return $this->getDepth() < $this->maxDepth || $this->holdsContainers();
    }

    /**
     * Whether the current directory is `ea-podman.d` itself, or one of the container
     * directories directly inside it.
     */
    private function holdsContainers(): bool
    {
        $current = $this->current();

        if (!$current instanceof SplFileInfo) {
            return false;
        }

        return $current->getFilename() === CpanelWebApp::CONTAINER_DIR
            || $current->getPathInfo()?->getFilename() === CpanelWebApp::CONTAINER_DIR;
    }

    /**
     * Whether the path is a container's plumbing rather than a place an application
     * lives: `ea-podman.d` itself, one of the container directories inside it, or
     * anything in a container other than its `webapp` directory.
     *
     * The walk passes through these to reach the application directories below them,
     * but none of them is a document root. Inspecting one reports a container's own
     * configuration as though it were a site -- an `index.php` next to the container
     * config reads as a PHP site, and the container is listed alongside the
     * application it hosts.
     */
    public static function isContainerInternals(string $path): bool
    {
        $parts = explode('/', str_replace('\\', '/', $path));
        $containerDir = array_search(CpanelWebApp::CONTAINER_DIR, $parts, true);

        if ($containerDir === false) {
            return false;
        }

        $below = array_slice($parts, $containerDir + 1);

        return count($below) !== 2 || $below[1] !== CpanelWebApp::APP_DIR;
    }

    /**
     * Whether the item is the container copy a redeploy leaves behind. Such a copy is
     * in no registry, so it is not a web application, yet it still holds a full copy of
     * the superseded one — reporting what is inside it would report every superseded
     * deploy on the server as a live site. It is dropped from the walk, along with
     * everything below it.
     *
     * This exclusion is not a caller preference. Should an `--ignore=<pattern>` option
     * ever be added, this one must stay in effect regardless of what the caller passes.
     */
    private static function isLeftOverContainer(SplFileInfo $item): bool
    {
        return $item->isDir()
            && str_ends_with($item->getFilename(), self::LEFT_OVER_SUFFIX)
            && $item->getPathInfo()?->getFilename() === CpanelWebApp::CONTAINER_DIR;
    }
}