configuration.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <?php
  2. use function Hestiacp\quoteshellarg\quoteshellarg;
  3. $dist_config = require __DIR__ . "/configuration_sample.php";
  4. session_start();
  5. $dist_config["public_path"] = "/fm/";
  6. $dist_config["frontend_config"]["app_name"] = "File Manager - Hestia Control Panel";
  7. $dist_config["frontend_config"]["logo"] = "../images/logo.svg";
  8. $dist_config["frontend_config"]["editable"] = [
  9. ".txt",
  10. ".css",
  11. ".js",
  12. ".ts",
  13. ".html",
  14. ".php",
  15. ".py",
  16. ".yml",
  17. ".xml",
  18. ".md",
  19. ".log",
  20. ".csv",
  21. ".conf",
  22. ".config",
  23. ".ini",
  24. ".scss",
  25. ".sh",
  26. ".env",
  27. ".example",
  28. ".htaccess",
  29. ".twig",
  30. ".tpl",
  31. ".yaml",
  32. ];
  33. $dist_config["frontend_config"]["date_format"] = "YY/MM/DD H:mm:ss";
  34. $dist_config["frontend_config"]["guest_redirection"] = "/login/";
  35. $dist_config["frontend_config"]["upload_max_size"] = 1024 * 1024 * 1024;
  36. if (!empty($_SESSION["language"])) {
  37. $lang = $_SESSION["language"];
  38. } elseif (!empty($_SESSION["LANGUAGE"])) {
  39. $lang = $_SESSION["LANGUAGE"];
  40. } else {
  41. $lang = "en";
  42. }
  43. // Update list of languages when new language is added on Hestia or Filegator side
  44. switch ($lang) {
  45. case "es":
  46. $dist_config["frontend_config"]["language"] = "spanish";
  47. break;
  48. case "de":
  49. $dist_config["frontend_config"]["language"] = "german";
  50. break;
  51. case "id":
  52. $dist_config["frontend_config"]["language"] = "indonesian";
  53. break;
  54. case "tr":
  55. $dist_config["frontend_config"]["language"] = "turkish";
  56. break;
  57. case "lt":
  58. $dist_config["frontend_config"]["language"] = "lithuanian";
  59. break;
  60. case "pt":
  61. case "pt-pt":
  62. $dist_config["frontend_config"]["language"] = "portuguese";
  63. break;
  64. case "nl":
  65. $dist_config["frontend_config"]["language"] = "dutch";
  66. break;
  67. case "zh":
  68. case "zh-cn":
  69. case "zh-tw":
  70. $dist_config["frontend_config"]["language"] = "chinese";
  71. break;
  72. case "bg":
  73. $dist_config["frontend_config"]["language"] = "bulgarian";
  74. break;
  75. case "sr":
  76. $dist_config["frontend_config"]["language"] = "serbian";
  77. break;
  78. case "fr":
  79. $dist_config["frontend_config"]["language"] = "french";
  80. break;
  81. case "sk":
  82. $dist_config["frontend_config"]["language"] = "slovak";
  83. break;
  84. case "pl":
  85. $dist_config["frontend_config"]["language"] = "polish";
  86. break;
  87. case "it":
  88. $dist_config["frontend_config"]["language"] = "italian";
  89. break;
  90. case "ko":
  91. $dist_config["frontend_config"]["language"] = "korean";
  92. break;
  93. case "cs":
  94. $dist_config["frontend_config"]["language"] = "czech";
  95. break;
  96. case "gl":
  97. $dist_config["frontend_config"]["language"] = "galician";
  98. break;
  99. case "ru":
  100. $dist_config["frontend_config"]["language"] = "russian";
  101. break;
  102. case "hu":
  103. $dist_config["frontend_config"]["language"] = "hungarian";
  104. break;
  105. case "sv":
  106. $dist_config["frontend_config"]["language"] = "swedish";
  107. break;
  108. case "ja":
  109. $dist_config["frontend_config"]["language"] = "japanese";
  110. break;
  111. case "sl":
  112. $dist_config["frontend_config"]["language"] = "slovenian";
  113. break;
  114. case "he":
  115. $dist_config["frontend_config"]["language"] = "hebrew";
  116. break;
  117. case "ro":
  118. $dist_config["frontend_config"]["language"] = "romanian";
  119. break;
  120. case "ar":
  121. $dist_config["frontend_config"]["language"] = "arabic";
  122. break;
  123. case "pt-br":
  124. $dist_config["frontend_config"]["language"] = "portuguese_br";
  125. break;
  126. case "fa":
  127. $dist_config["frontend_config"]["language"] = "persian";
  128. break;
  129. case "et":
  130. $dist_config["frontend_config"]["language"] = "estonian";
  131. break;
  132. case "uk":
  133. $dist_config["frontend_config"]["language"] = "ukrainian";
  134. break;
  135. default:
  136. $dist_config["frontend_config"]["language"] = "english";
  137. break;
  138. }
  139. $dist_config["services"]["Filegator\Services\Storage\Filesystem"]["config"][
  140. "adapter"
  141. ] = function () {
  142. if (!empty($_SESSION["INACTIVE_SESSION_TIMEOUT"])) {
  143. if ($_SESSION["INACTIVE_SESSION_TIMEOUT"] * 60 + $_SESSION["LAST_ACTIVITY"] < time()) {
  144. $v_user = quoteshellarg($_SESSION["user"]);
  145. $v_session_id = quoteshellarg($_SESSION["token"]);
  146. exec(
  147. "/usr/local/hestia/bin/v-log-user-logout " . $v_user . " " . $v_session_id,
  148. $output,
  149. $return_var,
  150. );
  151. unset($_SESSION);
  152. session_unset();
  153. session_destroy();
  154. session_start();
  155. echo '<meta http-equiv="refresh" content="0; url=/">';
  156. exit();
  157. } else {
  158. $_SESSION["LAST_ACTIVITY"] = time();
  159. }
  160. } else {
  161. echo '<meta http-equiv="refresh" content="0; url=/">';
  162. }
  163. if (isset($_SESSION["user"])) {
  164. $v_user = $_SESSION["user"];
  165. }
  166. if (!empty($_SESSION["look"])) {
  167. if (isset($_SESSION["look"]) && $_SESSION["userContext"] === "admin") {
  168. $v_user = $_SESSION["look"];
  169. }
  170. if (
  171. isset($_SESSION["look"]) &&
  172. $_SESSION["look"] == "admin" &&
  173. $_SESSION["POLICY_SYSTEM_PROTECTED_ADMIN"] == "yes"
  174. ) {
  175. header("Location: /");
  176. }
  177. }
  178. # Create filemanager sftp key if missing and trash it after 30 min
  179. if (!file_exists("/home/" . basename($v_user) . "/.ssh/hst-filemanager-key")) {
  180. exec(
  181. "sudo /usr/local/hestia/bin/v-add-user-sftp-key " .
  182. quoteshellarg(basename($v_user)) .
  183. " 30",
  184. $output,
  185. $return_var,
  186. );
  187. // filemanager also requires .ssh chmod o+x ... hopefully we can improve it to g+x or u+x someday
  188. // current minimum for filemanager: chmod 0701 .ssh
  189. shell_exec("sudo chmod o+x " . quoteshellarg("/home/" . basename($v_user) . "/.ssh"));
  190. }
  191. if (!isset($_SESSION["SFTP_PORT"])) {
  192. exec("sudo /usr/local/hestia/bin/v-list-sys-sshd-port json", $output, $result);
  193. $port = json_decode(implode("", $output));
  194. if (is_numeric($port[0]) && $port[0] > 0) {
  195. $_SESSION["SFTP_PORT"] = $port[0];
  196. } elseif (
  197. preg_match('/^\s*Port\s+(\d+)$/im', file_get_contents("/etc/ssh/sshd_config"), $matches)
  198. ) {
  199. $_SESSION["SFTP_PORT"] = $matches[1] ?? 22;
  200. } else {
  201. $_SESSION["SFTP_PORT"] = 22;
  202. }
  203. }
  204. preg_match(
  205. '/(Hestia SFTP Chroot\nMatch User)(.*)/i',
  206. file_get_contents("/etc/ssh/sshd_config"),
  207. $matches,
  208. );
  209. $user_list = explode(",", $matches[2]);
  210. if (in_array($v_user, $user_list)) {
  211. $root = "/";
  212. } else {
  213. $root = "/home/" . $v_user;
  214. }
  215. return new \League\Flysystem\Sftp\SftpAdapter([
  216. "host" => "127.0.0.1",
  217. "port" => intval($_SESSION["SFTP_PORT"]),
  218. "username" => basename($v_user),
  219. "privateKey" => "/home/" . basename($v_user) . "/.ssh/hst-filemanager-key",
  220. "root" => $root,
  221. "timeout" => 10,
  222. "directoryPerm" => 0755,
  223. ]);
  224. };
  225. $dist_config["services"]["Filegator\Services\Archiver\ArchiverInterface"] = [
  226. "handler" => "\Filegator\Services\Archiver\Adapters\HestiaZipArchiver",
  227. "config" => [],
  228. ];
  229. $dist_config["services"]["Filegator\Services\Auth\AuthInterface"] = [
  230. "handler" => "\Filegator\Services\Auth\Adapters\HestiaAuth",
  231. "config" => [
  232. "permissions" => ["read", "write", "upload", "download", "batchdownload", "zip", "chmod"],
  233. "private_repos" => false,
  234. ],
  235. ];
  236. $dist_config["services"]["Filegator\Services\View\ViewInterface"]["config"] = [
  237. "add_to_head" => '
  238. <style>
  239. .logo {
  240. width: 46px;
  241. }
  242. </style>
  243. ',
  244. "add_to_body" => '
  245. <script>
  246. var checkVueLoaded = setInterval(function() {
  247. if (document.getElementsByClassName("container").length) {
  248. clearInterval(checkVueLoaded);
  249. var navProfile = document.getElementsByClassName("navbar-item profile")[0]; navProfile.replaceWith(navProfile.cloneNode(true))
  250. document.getElementsByClassName("navbar-item logout")[0].text="Exit to Control Panel \u00BB";
  251. div = document.getElementsByClassName("container")[0];
  252. callback = function(){
  253. if (document.getElementsByClassName("navbar-item logout")[0]){
  254. if ( document.getElementsByClassName("navbar-item logout")[0].text != "Exit to Control Panel \u00BB" ){
  255. var navProfile = document.getElementsByClassName("navbar-item profile")[0]; navProfile.replaceWith(navProfile.cloneNode(true))
  256. document.getElementsByClassName("navbar-item logout")[0].text="Exit to Control Panel \u00BB";
  257. }
  258. }
  259. }
  260. config = {
  261. childList:true,
  262. subtree:true
  263. }
  264. observer = new MutationObserver(callback);
  265. observer.observe(div,config);
  266. }
  267. }, 200);
  268. </script>',
  269. ];
  270. return $dist_config;