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;
|