index.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. <?php
  2. use function Hestiacp\quoteshellarg\quoteshellarg;
  3. ob_start();
  4. $TAB = "USER";
  5. // Main include
  6. include $_SERVER["DOCUMENT_ROOT"] . "/inc/main.php";
  7. // Check user argument
  8. if (empty($_GET["user"])) {
  9. header("Location: /list/user/");
  10. exit();
  11. }
  12. // Edit as someone else?
  13. if ($_SESSION["userContext"] === "admin" && !empty($_GET["user"])) {
  14. $user = $_GET["user"];
  15. $v_username = $_GET["user"];
  16. } else {
  17. $user = $_SESSION["user"];
  18. $v_username = $_SESSION["user"];
  19. }
  20. // Prevent other users with admin privileges from editing properties of default 'admin' user
  21. if (
  22. ($_SESSION["userContext"] === "admin" &&
  23. $_SESSION["look"] != "" &&
  24. $user == $_SESSION["ROOT_USER"]) ||
  25. ($_SESSION["userContext"] === "admin" &&
  26. !isset($_SESSION["look"]) &&
  27. $user == "admin" &&
  28. $_SESSION["user"] != $_SESSION["ROOT_USER"])
  29. ) {
  30. header("Location: /list/user/");
  31. exit();
  32. }
  33. // Check token
  34. verify_csrf($_GET);
  35. // List user
  36. exec(HESTIA_CMD . "v-list-user " . quoteshellarg($v_username) . " json", $output, $return_var);
  37. check_return_code_redirect($return_var, $output, "/list/user/");
  38. $data = json_decode(implode("", $output), true);
  39. unset($output);
  40. // Parse user
  41. $v_password = "";
  42. $v_email = $data[$v_username]["CONTACT"];
  43. $v_package = $data[$v_username]["PACKAGE"];
  44. $v_language = $data[$v_username]["LANGUAGE"];
  45. $v_user_theme = $data[$v_username]["THEME"];
  46. $v_sort_order = $data[$v_username]["PREF_UI_SORT"];
  47. $v_name = $data[$v_username]["NAME"];
  48. $v_shell = $data[$v_username]["SHELL"];
  49. $v_shell_jail_enabled = $data[$v_username]["SHELL_JAIL_ENABLED"];
  50. $v_twofa = $data[$v_username]["TWOFA"];
  51. $v_qrcode = $data[$v_username]["QRCODE"];
  52. $v_phpcli = $data[$v_username]["PHPCLI"];
  53. $v_role = $data[$v_username]["ROLE"];
  54. $v_login_disabled = $data[$v_username]["LOGIN_DISABLED"];
  55. $v_login_use_iplist = $data[$v_username]["LOGIN_USE_IPLIST"];
  56. $v_login_allowed_ips = $data[$v_username]["LOGIN_ALLOW_IPS"];
  57. $v_ns = $data[$v_username]["NS"];
  58. $nameservers = explode(",", $v_ns);
  59. if (empty($nameservers[0])) {
  60. $v_ns1 = "";
  61. } else {
  62. $v_ns1 = $nameservers[0];
  63. }
  64. if (empty($nameservers[1])) {
  65. $v_ns2 = "";
  66. } else {
  67. $v_ns2 = $nameservers[1];
  68. }
  69. if (empty($nameservers[2])) {
  70. $v_ns3 = "";
  71. } else {
  72. $v_ns3 = $nameservers[2];
  73. }
  74. if (empty($nameservers[3])) {
  75. $v_ns4 = "";
  76. } else {
  77. $v_ns4 = $nameservers[3];
  78. }
  79. if (empty($nameservers[4])) {
  80. $v_ns5 = "";
  81. } else {
  82. $v_ns5 = $nameservers[4];
  83. }
  84. if (empty($nameservers[5])) {
  85. $v_ns6 = "";
  86. } else {
  87. $v_ns6 = $nameservers[5];
  88. }
  89. if (empty($nameservers[6])) {
  90. $v_ns7 = "";
  91. } else {
  92. $v_ns7 = $nameservers[6];
  93. }
  94. if (empty($nameservers[7])) {
  95. $v_ns8 = "";
  96. } else {
  97. $v_ns8 = $nameservers[7];
  98. }
  99. $v_suspended = $data[$v_username]["SUSPENDED"];
  100. if ($v_suspended == "yes") {
  101. $v_status = "suspended";
  102. } else {
  103. $v_status = "active";
  104. }
  105. $v_time = $data[$v_username]["TIME"];
  106. $v_date = $data[$v_username]["DATE"];
  107. if (empty($v_phpcli)) {
  108. $v_phpcli = substr(DEFAULT_PHP_VERSION, 4);
  109. }
  110. // List packages
  111. exec(HESTIA_CMD . "v-list-user-packages json", $output, $return_var);
  112. $packages = json_decode(implode("", $output), true);
  113. unset($output);
  114. // List languages
  115. exec(HESTIA_CMD . "v-list-sys-languages json", $output, $return_var);
  116. $language = json_decode(implode("", $output), true);
  117. foreach ($language as $lang) {
  118. $languages[$lang] = translate_json($lang);
  119. }
  120. asort($languages);
  121. unset($output);
  122. // List themes
  123. exec(HESTIA_CMD . "v-list-sys-themes json", $output, $return_var);
  124. $themes = json_decode(implode("", $output), true);
  125. unset($output);
  126. // List shells
  127. exec(HESTIA_CMD . "v-list-sys-shells json", $output, $return_var);
  128. $shells = json_decode(implode("", $output), true);
  129. unset($output);
  130. //List PHP Versions
  131. // List supported php versions
  132. exec(HESTIA_CMD . "v-list-sys-php json", $output, $return_var);
  133. $php_versions = json_decode(implode("", $output), true);
  134. unset($output);
  135. // Check POST request
  136. if (!empty($_POST["save"])) {
  137. // Check token
  138. verify_csrf($_POST);
  139. // Change password
  140. if (!empty($_POST["v_password"]) && empty($_SESSION["error_msg"])) {
  141. // Check password length
  142. $pw_len = strlen($_POST["v_password"]);
  143. if (!validate_password($_POST["v_password"])) {
  144. $_SESSION["error_msg"] = _("Password does not match the minimum requirements.");
  145. }
  146. if (empty($_SESSION["error_msg"])) {
  147. $v_password = tempnam("/tmp", "vst");
  148. $fp = fopen($v_password, "w");
  149. fwrite($fp, $_POST["v_password"] . "\n");
  150. fclose($fp);
  151. exec(
  152. HESTIA_CMD .
  153. "v-change-user-password " .
  154. quoteshellarg($v_username) .
  155. " " .
  156. $v_password,
  157. $output,
  158. $return_var,
  159. );
  160. check_return_code($return_var, $output);
  161. unset($output);
  162. unlink($v_password);
  163. $v_password = quoteshellarg($_POST["v_password"]);
  164. }
  165. }
  166. // Enable twofa
  167. if (!empty($_POST["v_twofa"]) && empty($v_twofa) && empty($_SESSION["error_msg"])) {
  168. exec(HESTIA_CMD . "v-add-user-2fa " . quoteshellarg($v_username), $output, $return_var);
  169. check_return_code($return_var, $output);
  170. unset($output);
  171. // List user
  172. exec(
  173. HESTIA_CMD . "v-list-user " . quoteshellarg($v_username) . " json",
  174. $output,
  175. $return_var,
  176. );
  177. check_return_code($return_var, $output);
  178. $data = json_decode(implode("", $output), true);
  179. unset($output);
  180. // Parse user twofa
  181. $v_twofa = $data[$v_username]["TWOFA"];
  182. $v_qrcode = $data[$v_username]["QRCODE"];
  183. }
  184. // Disable twofa
  185. if (empty($_POST["v_twofa"]) && !empty($v_twofa) && empty($_SESSION["error_msg"])) {
  186. exec(HESTIA_CMD . "v-delete-user-2fa " . quoteshellarg($v_username), $output, $return_var);
  187. check_return_code($return_var, $output);
  188. unset($output);
  189. $v_twofa = "";
  190. $v_qrcode = "";
  191. }
  192. // Change default sort order
  193. if ($v_sort_order != $_POST["v_sort_order"] && empty($_SESSION["error_msg"])) {
  194. $v_sort_order = quoteshellarg($_POST["v_sort_order"]);
  195. exec(
  196. HESTIA_CMD .
  197. "v-change-user-sort-order " .
  198. quoteshellarg($v_username) .
  199. " " .
  200. $v_sort_order,
  201. $output,
  202. $return_var,
  203. );
  204. check_return_code($return_var, $output);
  205. unset($_SESSION["userSortOrder"]);
  206. $_SESSION["userSortOrder"] = $v_sort_order;
  207. unset($output);
  208. }
  209. // Update Control Panel login disabled status (admin only)
  210. if (empty($_SESSION["error_msg"])) {
  211. if (empty($_POST["v_login_disabled"])) {
  212. $_POST["v_login_disabled"] = "";
  213. }
  214. if ($_POST["v_login_disabled"] != $v_login_disabled) {
  215. if ($_POST["v_login_disabled"] == "on") {
  216. $_POST["v_login_disabled"] = "yes";
  217. } else {
  218. $_POST["v_login_disabled"] = "no";
  219. }
  220. exec(
  221. HESTIA_CMD .
  222. "v-change-user-config-value " .
  223. quoteshellarg($v_username) .
  224. " LOGIN_DISABLED " .
  225. quoteshellarg($_POST["v_login_disabled"]),
  226. $output,
  227. $return_var,
  228. );
  229. check_return_code($return_var, $output);
  230. $data[$user]["LOGIN_DISABLED"] = $_POST["v_login_disabled"];
  231. unset($output);
  232. }
  233. }
  234. // Update IP whitelist option
  235. if (empty($_SESSION["error_msg"])) {
  236. if (empty($_POST["v_login_use_iplist"])) {
  237. $_POST["v_login_use_iplist"] = "";
  238. }
  239. if ($_POST["v_login_use_iplist"] != $v_login_use_iplist) {
  240. if ($_POST["v_login_use_iplist"] == "on") {
  241. $_POST["v_login_use_iplist"] = "yes";
  242. } else {
  243. $_POST["v_login_use_iplist"] = "no";
  244. }
  245. exec(
  246. HESTIA_CMD .
  247. "v-change-user-config-value " .
  248. quoteshellarg($v_username) .
  249. " LOGIN_USE_IPLIST " .
  250. quoteshellarg($_POST["v_login_use_iplist"]),
  251. $output,
  252. $return_var,
  253. );
  254. if ($_POST["v_login_use_iplist"] === "no") {
  255. exec(
  256. HESTIA_CMD .
  257. "v-change-user-config-value " .
  258. quoteshellarg($v_username) .
  259. " LOGIN_ALLOW_IPS ''",
  260. $output,
  261. $return_var,
  262. );
  263. $v_login_allowed_ips = "";
  264. } else {
  265. exec(
  266. HESTIA_CMD .
  267. "v-change-user-config-value " .
  268. quoteshellarg($v_username) .
  269. " LOGIN_ALLOW_IPS " .
  270. quoteshellarg($_POST["v_login_allowed_ips"]),
  271. $output,
  272. $return_var,
  273. );
  274. unset($v_login_allowed_ips);
  275. $v_login_allowed_ips = $_POST["v_login_allowed_ips"];
  276. }
  277. check_return_code($return_var, $output);
  278. $data[$user]["LOGIN_USE_IPLIST"] = $_POST["v_login_use_iplist"];
  279. unset($output);
  280. }
  281. }
  282. if ($_SESSION["userContext"] === "admin") {
  283. // Change package (admin only)
  284. if (
  285. $v_package != $_POST["v_package"] &&
  286. $_SESSION["userContext"] === "admin" &&
  287. empty($_SESSION["error_msg"])
  288. ) {
  289. $v_package = quoteshellarg($_POST["v_package"]);
  290. exec(
  291. HESTIA_CMD .
  292. "v-change-user-package " .
  293. quoteshellarg($v_username) .
  294. " " .
  295. $v_package,
  296. $output,
  297. $return_var,
  298. );
  299. check_return_code($return_var, $output);
  300. unset($output);
  301. }
  302. // Change phpcli (admin only)
  303. if (
  304. $v_phpcli != $_POST["v_phpcli"] &&
  305. $_SESSION["userContext"] === "admin" &&
  306. empty($_SESSION["error_msg"])
  307. ) {
  308. $v_phpcli = quoteshellarg($_POST["v_phpcli"]);
  309. exec(
  310. HESTIA_CMD .
  311. "v-change-user-php-cli " .
  312. quoteshellarg($v_username) .
  313. " " .
  314. $v_phpcli,
  315. $output,
  316. $return_var,
  317. );
  318. check_return_code($return_var, $output);
  319. unset($output);
  320. }
  321. $_POST["v_role"] = $_POST["v_role"] ?? "";
  322. if (
  323. $v_role != $_POST["v_role"] &&
  324. $_SESSION["userContext"] === "admin" &&
  325. $v_username != "admin" &&
  326. empty($_SESSION["error_msg"])
  327. ) {
  328. if (!empty($_POST["v_role"])) {
  329. $v_role = quoteshellarg($_POST["v_role"]);
  330. exec(
  331. HESTIA_CMD . "v-change-user-role " . quoteshellarg($v_username) . " " . $v_role,
  332. $output,
  333. $return_var,
  334. );
  335. check_return_code($return_var, $output);
  336. unset($output);
  337. $v_role = $_POST["v_role"];
  338. }
  339. }
  340. // Change shell (admin only)
  341. if (!empty($_POST["v_shell"])) {
  342. if (empty($_POST["v_shell_jail_enabled"])) {
  343. $_POST["v_shell_jail_enabled"] = "no";
  344. }
  345. if (
  346. in_array($_POST["v_shell"], ["nologin", "rssh"]) &&
  347. $_POST["v_shell_jail_enabled"] == "yes"
  348. ) {
  349. $_SESSION["error_msg"] = _(
  350. "Cannot combine nologin and rssh shell with jailed shell.",
  351. );
  352. }
  353. if (
  354. ($v_shell != $_POST["v_shell"] ||
  355. $v_shell_jail_enabled != $_POST["v_shell_jail_enabled"]) &&
  356. $_SESSION["userContext"] === "admin" &&
  357. empty($_SESSION["error_msg"])
  358. ) {
  359. $v_shell = quoteshellarg($_POST["v_shell"]);
  360. $v_shell_jail_enabled = quoteshellarg($_POST["v_shell_jail_enabled"]);
  361. exec(
  362. HESTIA_CMD .
  363. "v-change-user-shell " .
  364. quoteshellarg($v_username) .
  365. " " .
  366. $v_shell .
  367. " " .
  368. $v_shell_jail_enabled,
  369. $output,
  370. $return_var,
  371. );
  372. check_return_code($return_var, $output);
  373. unset($output);
  374. }
  375. }
  376. }
  377. // Change language
  378. if ($v_language != $_POST["v_language"] && empty($_SESSION["error_msg"])) {
  379. $v_language = quoteshellarg($_POST["v_language"]);
  380. exec(
  381. HESTIA_CMD . "v-change-user-language " . quoteshellarg($v_username) . " " . $v_language,
  382. $output,
  383. $return_var,
  384. );
  385. check_return_code($return_var, $output);
  386. if (empty($_SESSION["error_msg"])) {
  387. if ($_GET["user"] == $_SESSION["user"]) {
  388. unset($_SESSION["language"]);
  389. $_SESSION["language"] = $_POST["v_language"];
  390. $refresh = $_SERVER["REQUEST_URI"];
  391. header("Location: $refresh");
  392. }
  393. }
  394. unset($output);
  395. }
  396. // Change contact email
  397. if ($v_email != $_POST["v_email"] && empty($_SESSION["error_msg"])) {
  398. if (!filter_var($_POST["v_email"], FILTER_VALIDATE_EMAIL)) {
  399. $_SESSION["error_msg"] = _("Please enter a valid email address.");
  400. } else {
  401. $v_email = quoteshellarg($_POST["v_email"]);
  402. exec(
  403. HESTIA_CMD . "v-change-user-contact " . quoteshellarg($v_username) . " " . $v_email,
  404. $output,
  405. $return_var,
  406. );
  407. check_return_code($return_var, $output);
  408. unset($output);
  409. }
  410. }
  411. // Change full name
  412. if ($v_name != $_POST["v_name"]) {
  413. if (empty($_POST["v_name"])) {
  414. $_SESSION["error_msg"] = _("Please enter a valid contact name.");
  415. } else {
  416. $v_name = quoteshellarg($_POST["v_name"]);
  417. exec(
  418. HESTIA_CMD . "v-change-user-name " . quoteshellarg($v_username) . " " . $v_name,
  419. $output,
  420. $return_var,
  421. );
  422. check_return_code($return_var, $output);
  423. unset($output);
  424. $v_name = $_POST["v_name"];
  425. }
  426. }
  427. // Update theme
  428. if (empty($_SESSION["error_msg"])) {
  429. if (empty($_SESSION["userTheme"])) {
  430. $_SESSION["userTheme"] = "";
  431. }
  432. if ($_POST["v_user_theme"] != $_SESSION["userTheme"]) {
  433. exec(
  434. HESTIA_CMD .
  435. "v-change-user-theme " .
  436. quoteshellarg($v_username) .
  437. " " .
  438. quoteshellarg($_POST["v_user_theme"]),
  439. $output,
  440. $return_var,
  441. );
  442. check_return_code($return_var, $output);
  443. unset($output);
  444. $v_user_theme = $_POST["v_user_theme"];
  445. if ($_SESSION["user"] === $v_username) {
  446. unset($_SESSION["userTheme"]);
  447. $_SESSION["userTheme"] = $v_user_theme;
  448. }
  449. }
  450. }
  451. if (!empty($_SESSION["DNS_SYSTEM"])) {
  452. if ($_SESSION["userContext"] === "admin") {
  453. // Change NameServers
  454. if (empty($_POST["v_ns1"])) {
  455. $_POST["v_ns1"] = "";
  456. }
  457. if (empty($_POST["v_ns2"])) {
  458. $_POST["v_ns2"] = "";
  459. }
  460. if (empty($_POST["v_ns3"])) {
  461. $_POST["v_ns3"] = "";
  462. }
  463. if (empty($_POST["v_ns4"])) {
  464. $_POST["v_ns4"] = "";
  465. }
  466. if (empty($_POST["v_ns5"])) {
  467. $_POST["v_ns5"] = "";
  468. }
  469. if (empty($_POST["v_ns6"])) {
  470. $_POST["v_ns6"] = "";
  471. }
  472. if (empty($_POST["v_ns7"])) {
  473. $_POST["v_ns7"] = "";
  474. }
  475. if (empty($_POST["v_ns8"])) {
  476. $_POST["v_ns8"] = "";
  477. }
  478. if (
  479. $v_ns1 != $_POST["v_ns1"] ||
  480. $v_ns2 != $_POST["v_ns2"] ||
  481. $v_ns3 != $_POST["v_ns3"] ||
  482. $v_ns4 != $_POST["v_ns4"] ||
  483. $v_ns5 != $_POST["v_ns5"] ||
  484. $v_ns6 != $_POST["v_ns6"] ||
  485. $v_ns7 != $_POST["v_ns7"] ||
  486. ($v_ns8 != $_POST["v_ns8"] &&
  487. empty($_SESSION["error_msg"] && !empty($_POST["v_ns1"]) && $_POST["v_ns2"]))
  488. ) {
  489. $v_ns1 = quoteshellarg($_POST["v_ns1"]);
  490. $v_ns2 = quoteshellarg($_POST["v_ns2"]);
  491. $v_ns3 = quoteshellarg($_POST["v_ns3"]);
  492. $v_ns4 = quoteshellarg($_POST["v_ns4"]);
  493. $v_ns5 = quoteshellarg($_POST["v_ns5"]);
  494. $v_ns6 = quoteshellarg($_POST["v_ns6"]);
  495. $v_ns7 = quoteshellarg($_POST["v_ns7"]);
  496. $v_ns8 = quoteshellarg($_POST["v_ns8"]);
  497. $ns_cmd =
  498. HESTIA_CMD .
  499. "v-change-user-ns " .
  500. quoteshellarg($v_username) .
  501. " " .
  502. $v_ns1 .
  503. " " .
  504. $v_ns2;
  505. if (!empty($_POST["v_ns3"])) {
  506. $ns_cmd = $ns_cmd . " " . $v_ns3;
  507. }
  508. if (!empty($_POST["v_ns4"])) {
  509. $ns_cmd = $ns_cmd . " " . $v_ns4;
  510. }
  511. if (!empty($_POST["v_ns5"])) {
  512. $ns_cmd = $ns_cmd . " " . $v_ns5;
  513. }
  514. if (!empty($_POST["v_ns6"])) {
  515. $ns_cmd = $ns_cmd . " " . $v_ns6;
  516. }
  517. if (!empty($_POST["v_ns7"])) {
  518. $ns_cmd = $ns_cmd . " " . $v_ns7;
  519. }
  520. if (!empty($_POST["v_ns8"])) {
  521. $ns_cmd = $ns_cmd . " " . $v_ns8;
  522. }
  523. exec($ns_cmd, $output, $return_var);
  524. check_return_code($return_var, $output);
  525. unset($output);
  526. $v_ns1 = str_replace("'", "", $v_ns1);
  527. $v_ns2 = str_replace("'", "", $v_ns2);
  528. $v_ns3 = str_replace("'", "", $v_ns3);
  529. $v_ns4 = str_replace("'", "", $v_ns4);
  530. $v_ns5 = str_replace("'", "", $v_ns5);
  531. $v_ns6 = str_replace("'", "", $v_ns6);
  532. $v_ns7 = str_replace("'", "", $v_ns7);
  533. $v_ns8 = str_replace("'", "", $v_ns8);
  534. }
  535. }
  536. }
  537. // Set success message
  538. if (empty($_SESSION["error_msg"])) {
  539. $_SESSION["ok_msg"] = _("Changes have been saved.");
  540. }
  541. }
  542. // Render page
  543. render_page($user, $TAB, "edit_user");
  544. // Flush session messages
  545. unset($_SESSION["error_msg"]);
  546. unset($_SESSION["ok_msg"]);