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
			| 
											2 years ago
										 | <?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; |