index.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. use function Hestiacp\quoteshellarg\quoteshellarg;
  3. define("NO_AUTH_REQUIRED", true);
  4. $TAB = "RESET PASSWORD";
  5. // Main include
  6. include $_SERVER["DOCUMENT_ROOT"] . "/inc/main.php";
  7. if (isset($_SESSION["user"])) {
  8. header("Location: /list/user");
  9. }
  10. if ($_SESSION["POLICY_SYSTEM_PASSWORD_RESET"] == "no") {
  11. header("Location: /login/");
  12. exit();
  13. }
  14. if (!empty($_POST["user"]) && empty($_POST["code"])) {
  15. // Check token
  16. verify_csrf($_POST);
  17. $v_user = quoteshellarg($_POST["user"]);
  18. $user = $_POST["user"];
  19. $email = $_POST["email"];
  20. $cmd = "/usr/bin/sudo /usr/local/hestia/bin/v-list-user";
  21. exec($cmd . " " . $v_user . " json", $output, $return_var);
  22. if ($return_var == 0) {
  23. $data = json_decode(implode("", $output), true);
  24. unset($output);
  25. exec(HESTIA_CMD . "v-get-user-value " . $v_user . " RKEYEXP", $output, $return_var);
  26. $rkeyexp = json_decode(implode("", $output), true);
  27. if ($rkeyexp === null || $rkeyexp < time() - 900) {
  28. if ($email == $data[$user]["CONTACT"]) {
  29. $rkey = substr(password_hash("", PASSWORD_DEFAULT), 8, 12);
  30. $hash = password_hash($rkey, PASSWORD_DEFAULT);
  31. $v_rkey = tempnam("/tmp", "vst");
  32. $fp = fopen($v_rkey, "w");
  33. fwrite($fp, $hash . "\n");
  34. fclose($fp);
  35. exec(
  36. HESTIA_CMD . "v-change-user-rkey " . $v_user . " " . $v_rkey . "",
  37. $output,
  38. $return_var,
  39. );
  40. unset($output);
  41. unlink($v_rkey);
  42. $name = $data[$user]["NAME"];
  43. $contact = $data[$user]["CONTACT"];
  44. $to = $data[$user]["CONTACT"];
  45. $subject = sprintf(_("MAIL_RESET_SUBJECT"), date("Y-m-d H:i:s"));
  46. $hostname = get_hostname();
  47. if ($check == true) {
  48. $from = "noreply@" . $hostname;
  49. $from_name = _("Hestia Control Panel");
  50. if (!empty($name)) {
  51. $mailtext = sprintf(_("GREETINGS_GORDON"), $name);
  52. } else {
  53. $mailtext = _("GREETINGS");
  54. }
  55. $mailtext .= sprintf(
  56. _("PASSWORD_RESET_REQUEST"),
  57. $_SERVER["HTTP_HOST"],
  58. $user,
  59. $rkey,
  60. $_SERVER["HTTP_HOST"],
  61. $user,
  62. $rkey,
  63. );
  64. if (!empty($rkey)) {
  65. send_email(
  66. $to,
  67. $subject,
  68. $mailtext,
  69. $from,
  70. $from_name,
  71. $data[$user]["NAME"],
  72. );
  73. }
  74. header("Location: /reset/?action=code&user=" . $_POST["user"]);
  75. exit();
  76. }
  77. }
  78. } else {
  79. $ERROR =
  80. "<p class=\"error\">" .
  81. _("Please wait 15 minutes before sending a new request") .
  82. "</p>";
  83. }
  84. }
  85. unset($output);
  86. }
  87. if (!empty($_POST["user"]) && !empty($_POST["code"]) && !empty($_POST["password"])) {
  88. // Check token
  89. verify_csrf($_POST);
  90. if ($_POST["password"] == $_POST["password_confirm"]) {
  91. $v_user = quoteshellarg($_POST["user"]);
  92. $user = $_POST["user"];
  93. exec(HESTIA_CMD . "v-list-user " . $v_user . " json", $output, $return_var);
  94. if ($return_var == 0) {
  95. $data = json_decode(implode("", $output), true);
  96. $rkey = $data[$user]["RKEY"];
  97. if (password_verify($_POST["code"], $rkey)) {
  98. unset($output);
  99. exec(HESTIA_CMD . "v-get-user-value " . $v_user . " RKEYEXP", $output, $return_var);
  100. if ($output[0] > time() - 900) {
  101. $v_password = tempnam("/tmp", "vst");
  102. $fp = fopen($v_password, "w");
  103. fwrite($fp, $_POST["password"] . "\n");
  104. fclose($fp);
  105. exec(
  106. HESTIA_CMD . "v-change-user-password " . $v_user . " " . $v_password,
  107. $output,
  108. $return_var,
  109. );
  110. unlink($v_password);
  111. if ($return_var > 0) {
  112. sleep(5);
  113. $ERROR = "<p class=\"error\">" . _("An internal error occurred") . "</p>";
  114. } else {
  115. $_SESSION["user"] = $_POST["user"];
  116. header("Location: /");
  117. exit();
  118. }
  119. } else {
  120. sleep(5);
  121. $ERROR = "<p class=\"error\">" . _("Code has been expired") . "</p>";
  122. exec(
  123. HESTIA_CMD .
  124. "v-log-user-login " .
  125. $v_user .
  126. " " .
  127. $v_ip .
  128. " failed " .
  129. $v_session_id .
  130. " " .
  131. $v_user_agent .
  132. ' yes "Reset code has been expired"',
  133. $output,
  134. $return_var,
  135. );
  136. }
  137. } else {
  138. sleep(5);
  139. $ERROR = "<p class=\"error\">" . _("Invalid username or code") . "</p>";
  140. exec(
  141. HESTIA_CMD .
  142. "v-log-user-login " .
  143. $v_user .
  144. " " .
  145. $v_ip .
  146. " failed " .
  147. $v_session_id .
  148. " " .
  149. $v_user_agent .
  150. ' yes "Invalid Username or Code"',
  151. $output,
  152. $return_var,
  153. );
  154. }
  155. } else {
  156. sleep(5);
  157. $ERROR = "<p class=\"error\">" . _("Invalid username or code") . "</p>";
  158. }
  159. } else {
  160. $ERROR = "<p class=\"error\">" . _("Passwords not match") . "</p>";
  161. }
  162. }
  163. if (empty($_GET["action"])) {
  164. require_once "../templates/header.php";
  165. require_once "../templates/pages/login/reset_1.php";
  166. } else {
  167. require_once "../templates/header.php";
  168. if ($_GET["action"] == "code") {
  169. require_once "../templates/pages/login/reset_2.php";
  170. }
  171. if ($_GET["action"] == "confirm" && !empty($_GET["code"])) {
  172. require_once "../templates/pages/login/reset_3.php";
  173. }
  174. }