You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							178 lines
						
					
					
						
							5.2 KiB
						
					
					
				
			
		
		
	
	
							178 lines
						
					
					
						
							5.2 KiB
						
					
					
				<?php
 | 
						|
use function Hestiacp\quoteshellarg\quoteshellarg;
 | 
						|
 | 
						|
$dist_config = require __DIR__ . "/configuration_sample.php";
 | 
						|
 | 
						|
$dist_config["public_path"] = "/fm/";
 | 
						|
$dist_config["frontend_config"]["app_name"] = "File Manager - Hestia Control Panel";
 | 
						|
$dist_config["frontend_config"]["logo"] = "../images/logo.svg";
 | 
						|
$dist_config["frontend_config"]["editable"] = [
 | 
						|
	".txt",
 | 
						|
	".css",
 | 
						|
	".js",
 | 
						|
	".json",
 | 
						|
	".ts",
 | 
						|
	".html",
 | 
						|
	".php",
 | 
						|
	".py",
 | 
						|
	".yml",
 | 
						|
	".xml",
 | 
						|
	".md",
 | 
						|
	".log",
 | 
						|
	".csv",
 | 
						|
	".conf",
 | 
						|
	".config",
 | 
						|
	".ini",
 | 
						|
	".scss",
 | 
						|
	".service",
 | 
						|
	".sh",
 | 
						|
	".env",
 | 
						|
	".example",
 | 
						|
	".htaccess",
 | 
						|
	".twig",
 | 
						|
	".tpl",
 | 
						|
	".yaml",
 | 
						|
];
 | 
						|
$dist_config["frontend_config"]["guest_redirection"] = "/login/";
 | 
						|
$dist_config["frontend_config"]["upload_max_size"] = 1024 * 1024 * 1024;
 | 
						|
 | 
						|
$dist_config["services"]["Filegator\Services\Storage\Filesystem"]["config"][
 | 
						|
	"adapter"
 | 
						|
] = function () {
 | 
						|
	if (!empty($_SESSION["INACTIVE_SESSION_TIMEOUT"])) {
 | 
						|
		if ($_SESSION["INACTIVE_SESSION_TIMEOUT"] * 60 + $_SESSION["LAST_ACTIVITY"] < time()) {
 | 
						|
			$v_user = quoteshellarg($_SESSION["user"]);
 | 
						|
			$v_session_id = quoteshellarg($_SESSION["token"]);
 | 
						|
			exec(
 | 
						|
				"/usr/local/hestia/bin/v-log-user-logout " . $v_user . " " . $v_session_id,
 | 
						|
				$output,
 | 
						|
				$return_var,
 | 
						|
			);
 | 
						|
			unset($_SESSION);
 | 
						|
			session_unset();
 | 
						|
			session_destroy();
 | 
						|
			session_start();
 | 
						|
			echo '<meta http-equiv="refresh" content="0; url=/">';
 | 
						|
			exit();
 | 
						|
		} else {
 | 
						|
			$_SESSION["LAST_ACTIVITY"] = time();
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		echo '<meta http-equiv="refresh" content="0; url=/">';
 | 
						|
	}
 | 
						|
	if (isset($_SESSION["user"])) {
 | 
						|
		$v_user = $_SESSION["user"];
 | 
						|
	}
 | 
						|
	if (!empty($_SESSION["look"])) {
 | 
						|
		if (isset($_SESSION["look"]) && $_SESSION["userContext"] === "admin") {
 | 
						|
			$v_user = $_SESSION["look"];
 | 
						|
		}
 | 
						|
		if (
 | 
						|
			isset($_SESSION["look"]) &&
 | 
						|
			$_SESSION["look"] == "admin" &&
 | 
						|
			$_SESSION["POLICY_SYSTEM_PROTECTED_ADMIN"] == "yes"
 | 
						|
		) {
 | 
						|
			header("Location: /");
 | 
						|
		}
 | 
						|
	}
 | 
						|
	# Create filemanager sftp key if missing and trash it after 30 min
 | 
						|
	if (!file_exists("/home/" . basename($v_user) . "/.ssh/hst-filemanager-key")) {
 | 
						|
		exec(
 | 
						|
			"sudo /usr/local/hestia/bin/v-add-user-sftp-key " .
 | 
						|
				quoteshellarg(basename($v_user)) .
 | 
						|
				" 30",
 | 
						|
			$output,
 | 
						|
			$return_var,
 | 
						|
		);
 | 
						|
		// filemanager also requires .ssh chmod o+x ... hopefully we can improve it to g+x or u+x someday
 | 
						|
		// current minimum for filemanager: chmod 0701 .ssh
 | 
						|
		shell_exec("sudo chmod o+x " . quoteshellarg("/home/" . basename($v_user) . "/.ssh"));
 | 
						|
	}
 | 
						|
 | 
						|
	if (!isset($_SESSION["SFTP_PORT"])) {
 | 
						|
		exec("sudo /usr/local/hestia/bin/v-list-sys-sshd-port json", $output, $result);
 | 
						|
		$port = json_decode(implode("", $output));
 | 
						|
		if (is_numeric($port[0]) && $port[0] > 0) {
 | 
						|
			$_SESSION["SFTP_PORT"] = $port[0];
 | 
						|
		} elseif (
 | 
						|
			preg_match('/^\s*Port\s+(\d+)$/im', file_get_contents("/etc/ssh/sshd_config"), $matches)
 | 
						|
		) {
 | 
						|
			$_SESSION["SFTP_PORT"] = $matches[1] ?? 22;
 | 
						|
		} else {
 | 
						|
			$_SESSION["SFTP_PORT"] = 22;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	preg_match(
 | 
						|
		'/(Hestia SFTP Chroot\nMatch User)(.*)/i',
 | 
						|
		file_get_contents("/etc/ssh/sshd_config"),
 | 
						|
		$matches,
 | 
						|
	);
 | 
						|
	$user_list = explode(",", $matches[2]);
 | 
						|
	if (in_array($v_user, $user_list)) {
 | 
						|
		$root = "/";
 | 
						|
	} else {
 | 
						|
		$root = "/home/" . $v_user;
 | 
						|
	}
 | 
						|
 | 
						|
	return new \League\Flysystem\Sftp\SftpAdapter([
 | 
						|
		"host" => "127.0.0.1",
 | 
						|
		"port" => intval($_SESSION["SFTP_PORT"]),
 | 
						|
		"username" => basename($v_user),
 | 
						|
		"privateKey" => "/home/" . basename($v_user) . "/.ssh/hst-filemanager-key",
 | 
						|
		"root" => $root,
 | 
						|
		"timeout" => 10,
 | 
						|
		"directoryPerm" => 0755,
 | 
						|
	]);
 | 
						|
};
 | 
						|
 | 
						|
$dist_config["services"]["Filegator\Services\Archiver\ArchiverInterface"] = [
 | 
						|
	"handler" => "\Filegator\Services\Archiver\Adapters\HestiaZipArchiver",
 | 
						|
	"config" => [],
 | 
						|
];
 | 
						|
 | 
						|
$dist_config["services"]["Filegator\Services\Auth\AuthInterface"] = [
 | 
						|
	"handler" => "\Filegator\Services\Auth\Adapters\HestiaAuth",
 | 
						|
	"config" => [
 | 
						|
		"permissions" => ["read", "write", "upload", "download", "batchdownload", "zip"],
 | 
						|
		"private_repos" => false,
 | 
						|
	],
 | 
						|
];
 | 
						|
 | 
						|
$dist_config["services"]["Filegator\Services\View\ViewInterface"]["config"] = [
 | 
						|
	"add_to_head" => '
 | 
						|
    <style>
 | 
						|
        .logo {
 | 
						|
            width: 46px;
 | 
						|
        }
 | 
						|
    </style>
 | 
						|
    ',
 | 
						|
	"add_to_body" => '
 | 
						|
<script>
 | 
						|
    var checkVueLoaded = setInterval(function() {
 | 
						|
        if (document.getElementsByClassName("container").length) {
 | 
						|
            clearInterval(checkVueLoaded);
 | 
						|
            var navProfile = document.getElementsByClassName("navbar-item profile")[0]; navProfile.replaceWith(navProfile.cloneNode(true))
 | 
						|
            document.getElementsByClassName("navbar-item logout")[0].text="Exit to Control Panel \u00BB";
 | 
						|
            div = document.getElementsByClassName("container")[0];
 | 
						|
            callback = function(){
 | 
						|
                if (document.getElementsByClassName("navbar-item logout")[0]){
 | 
						|
                    if ( document.getElementsByClassName("navbar-item logout")[0].text != "Exit to Control Panel \u00BB" ){
 | 
						|
                        var navProfile = document.getElementsByClassName("navbar-item profile")[0]; navProfile.replaceWith(navProfile.cloneNode(true))
 | 
						|
                        document.getElementsByClassName("navbar-item logout")[0].text="Exit to Control Panel \u00BB";
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            config = {
 | 
						|
                childList:true,
 | 
						|
                subtree:true
 | 
						|
            }
 | 
						|
            observer = new MutationObserver(callback);
 | 
						|
            observer.observe(div,config);
 | 
						|
        }
 | 
						|
    }, 200);
 | 
						|
</script>',
 | 
						|
];
 | 
						|
 | 
						|
return $dist_config;
 |