index.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <?php
  2. use function Hestiacp\quoteshellarg\quoteshellarg;
  3. ob_start();
  4. $TAB = "DNS";
  5. // Main include
  6. include $_SERVER["DOCUMENT_ROOT"] . "/inc/main.php";
  7. // Check domain name
  8. if (empty($_GET["domain"])) {
  9. header("Location: /list/dns/");
  10. exit();
  11. }
  12. // Edit as someone else?
  13. if ($_SESSION["userContext"] === "admin" && !empty($_GET["user"])) {
  14. $user = quoteshellarg($_GET["user"]);
  15. $user_plain = htmlentities($_GET["user"]);
  16. }
  17. // List ip addresses
  18. exec(HESTIA_CMD . "v-list-user-ips " . $user . " json", $output, $return_var);
  19. $v_ips = json_decode(implode("", $output), true);
  20. unset($output);
  21. // List dns domain
  22. if (!empty($_GET["domain"]) && empty($_GET["record_id"])) {
  23. $v_domain = quoteshellarg($_GET["domain"]);
  24. exec(
  25. HESTIA_CMD . "v-list-dns-domain " . $user . " " . $v_domain . " json",
  26. $output,
  27. $return_var,
  28. );
  29. check_return_code_redirect($return_var, $output, "/list/dns/");
  30. $data = json_decode(implode("", $output), true);
  31. unset($output);
  32. // Parse dns domain
  33. $v_username = $user;
  34. $v_domain = $_GET["domain"];
  35. $v_ip = $data[$v_domain]["IP"];
  36. $v_template = $data[$v_domain]["TPL"];
  37. $v_ttl = $data[$v_domain]["TTL"];
  38. $v_dnssec = $data[$v_domain]["DNSSEC"];
  39. $v_exp = $data[$v_domain]["EXP"];
  40. $v_soa = $data[$v_domain]["SOA"];
  41. $v_date = $data[$v_domain]["DATE"];
  42. $v_time = $data[$v_domain]["TIME"];
  43. $v_suspended = $data[$v_domain]["SUSPENDED"];
  44. if ($v_suspended == "yes") {
  45. $v_status = "suspended";
  46. } else {
  47. $v_status = "active";
  48. }
  49. // List dns templates
  50. exec(HESTIA_CMD . "v-list-dns-templates json", $output, $return_var);
  51. $templates = json_decode(implode("", $output), true);
  52. unset($output);
  53. }
  54. // List dns record
  55. if (!empty($_GET["domain"]) && !empty($_GET["record_id"])) {
  56. $v_domain = quoteshellarg($_GET["domain"]);
  57. $v_record_id = quoteshellarg($_GET["record_id"]);
  58. exec(
  59. HESTIA_CMD . "v-list-dns-records " . $user . " " . $v_domain . " 'json'",
  60. $output,
  61. $return_var,
  62. );
  63. check_return_code_redirect($return_var, $output, "/list/dns/");
  64. $data = json_decode(implode("", $output), true);
  65. unset($output);
  66. // Parse dns record
  67. $v_username = $user;
  68. $v_domain = $_GET["domain"];
  69. $v_record_id = $_GET["record_id"];
  70. $v_rec = $data[$v_record_id]["RECORD"];
  71. $v_type = $data[$v_record_id]["TYPE"];
  72. $v_val = $data[$v_record_id]["VALUE"];
  73. $v_priority = $data[$v_record_id]["PRIORITY"];
  74. $v_suspended = $data[$v_record_id]["SUSPENDED"];
  75. if ($v_suspended == "yes") {
  76. $v_status = "suspended";
  77. } else {
  78. $v_status = "active";
  79. }
  80. $v_date = $data[$v_record_id]["DATE"];
  81. $v_time = $data[$v_record_id]["TIME"];
  82. $v_ttl = $data[$v_record_id]["TTL"];
  83. }
  84. // Check POST request for dns domain
  85. if (!empty($_POST["save"]) && !empty($_GET["domain"]) && empty($_GET["record_id"])) {
  86. $v_domain = quoteshellarg($_POST["v_domain"]);
  87. // Check token
  88. verify_csrf($_POST);
  89. // Change domain IP
  90. if ($v_ip != $_POST["v_ip"] && empty($_SESSION["error_msg"])) {
  91. $v_ip = quoteshellarg($_POST["v_ip"]);
  92. exec(
  93. HESTIA_CMD .
  94. "v-change-dns-domain-ip " .
  95. $user .
  96. " " .
  97. $v_domain .
  98. " " .
  99. $v_ip .
  100. " 'no'",
  101. $output,
  102. $return_var,
  103. );
  104. check_return_code($return_var, $output);
  105. $restart_dns = "yes";
  106. unset($output);
  107. }
  108. if (
  109. $_SESSION["POLICY_USER_EDIT_DNS_TEMPLATES"] == "yes" ||
  110. $_SESSION["userContext"] === "admin"
  111. ) {
  112. // Change domain template
  113. if ($v_template != $_POST["v_template"] && empty($_SESSION["error_msg"])) {
  114. $v_template = quoteshellarg($_POST["v_template"]);
  115. exec(
  116. HESTIA_CMD .
  117. "v-change-dns-domain-tpl " .
  118. $user .
  119. " " .
  120. $v_domain .
  121. " " .
  122. $v_template .
  123. " 'no'",
  124. $output,
  125. $return_var,
  126. );
  127. check_return_code($return_var, $output);
  128. unset($output);
  129. $restart_dns = "yes";
  130. }
  131. }
  132. // Change SOA record
  133. if ($v_soa != $_POST["v_soa"] && empty($_SESSION["error_msg"])) {
  134. $v_soa = quoteshellarg($_POST["v_soa"]);
  135. exec(
  136. HESTIA_CMD .
  137. "v-change-dns-domain-soa " .
  138. $user .
  139. " " .
  140. $v_domain .
  141. " " .
  142. $v_soa .
  143. " 'no'",
  144. $output,
  145. $return_var,
  146. );
  147. check_return_code($return_var, $output);
  148. unset($output);
  149. $restart_dns = "yes";
  150. }
  151. // Change expiration date
  152. if ($v_exp != $_POST["v_exp"] && empty($_SESSION["error_msg"])) {
  153. $v_exp = quoteshellarg($_POST["v_exp"]);
  154. exec(
  155. HESTIA_CMD .
  156. "v-change-dns-domain-exp " .
  157. $user .
  158. " " .
  159. $v_domain .
  160. " " .
  161. $v_exp .
  162. " 'no'",
  163. $output,
  164. $return_var,
  165. );
  166. check_return_code($return_var, $output);
  167. unset($output);
  168. }
  169. // Change domain ttl
  170. if ($v_ttl != $_POST["v_ttl"] && empty($_SESSION["error_msg"])) {
  171. $v_ttl = quoteshellarg($_POST["v_ttl"]);
  172. exec(
  173. HESTIA_CMD .
  174. "v-change-dns-domain-ttl " .
  175. $user .
  176. " " .
  177. $v_domain .
  178. " " .
  179. $v_ttl .
  180. " 'no'",
  181. $output,
  182. $return_var,
  183. );
  184. check_return_code($return_var, $output);
  185. unset($output);
  186. $restart_dns = "yes";
  187. }
  188. // Change domain dnssec
  189. if ($_POST["v_dnssec"] == "" && $v_dnssec == "yes" && empty($_SESSION["error_msg"])) {
  190. exec(
  191. HESTIA_CMD . "v-change-dns-domain-dnssec " . $user . " " . $v_domain . " 'no'",
  192. $output,
  193. $return_var,
  194. );
  195. check_return_code($return_var, $output);
  196. unset($output);
  197. $v_dnssec = "no";
  198. $restart_dns = "yes";
  199. }
  200. // Change domain dnssec
  201. if ($_POST["v_dnssec"] == "yes" && $v_dnssec !== "yes" && empty($_SESSION["error_msg"])) {
  202. exec(
  203. HESTIA_CMD . "v-change-dns-domain-dnssec " . $user . " " . $v_domain . " 'yes'",
  204. $output,
  205. $return_var,
  206. );
  207. check_return_code($return_var, $output);
  208. unset($output);
  209. $v_dnssec = "yes";
  210. $restart_dns = "yes";
  211. }
  212. // Restart dns server
  213. if (!empty($restart_dns) && empty($_SESSION["error_msg"])) {
  214. exec(HESTIA_CMD . "v-restart-dns", $output, $return_var);
  215. check_return_code($return_var, $output);
  216. unset($output);
  217. }
  218. // Set success message
  219. if (empty($_SESSION["error_msg"])) {
  220. $_SESSION["ok_msg"] = _("Changes have been saved.");
  221. }
  222. // Restart dns server
  223. if (empty($_SESSION["error_msg"])) {
  224. exec(HESTIA_CMD . "v-restart-dns", $output, $return_var);
  225. check_return_code($return_var, $output);
  226. unset($output);
  227. }
  228. }
  229. // Check POST request for dns record
  230. if (!empty($_POST["save"]) && !empty($_GET["domain"]) && !empty($_GET["record_id"])) {
  231. // Check token
  232. verify_csrf($_POST);
  233. // Protect input
  234. $v_domain = quoteshellarg($_POST["v_domain"]);
  235. $v_record_id = quoteshellarg($_POST["v_record_id"]);
  236. // Change dns record
  237. if (
  238. $v_rec != $_POST["v_rec"] ||
  239. $v_type != $_POST["v_type"] ||
  240. $v_val != $_POST["v_val"] ||
  241. $v_priority != $_POST["v_priority"] ||
  242. ($v_ttl != $_POST["v_ttl"] && empty($_SESSION["error_msg"]))
  243. ) {
  244. $v_rec = quoteshellarg($_POST["v_rec"]);
  245. $v_type = quoteshellarg($_POST["v_type"]);
  246. $v_val = quoteshellarg($_POST["v_val"]);
  247. $v_priority = quoteshellarg($_POST["v_priority"]);
  248. $v_ttl = quoteshellarg($_POST["v_ttl"]);
  249. exec(
  250. HESTIA_CMD .
  251. "v-change-dns-record " .
  252. $user .
  253. " " .
  254. $v_domain .
  255. " " .
  256. $v_record_id .
  257. " " .
  258. $v_rec .
  259. " " .
  260. $v_type .
  261. " " .
  262. $v_val .
  263. " " .
  264. $v_priority .
  265. " yes " .
  266. $v_ttl,
  267. $output,
  268. $return_var,
  269. );
  270. check_return_code($return_var, $output);
  271. $v_rec = $_POST["v_rec"];
  272. $v_type = $_POST["v_type"];
  273. $v_val = $_POST["v_val"];
  274. unset($output);
  275. $restart_dns = "yes";
  276. }
  277. // Change dns record id
  278. if ($_GET["record_id"] != $_POST["v_record_id"] && empty($_SESSION["error_msg"])) {
  279. $v_old_record_id = quoteshellarg($_GET["record_id"]);
  280. exec(
  281. HESTIA_CMD .
  282. "v-change-dns-record-id " .
  283. $user .
  284. " " .
  285. $v_domain .
  286. " " .
  287. $v_old_record_id .
  288. " " .
  289. $v_record_id,
  290. $output,
  291. $return_var,
  292. );
  293. check_return_code($return_var, $output);
  294. unset($output);
  295. $restart_dns = "yes";
  296. }
  297. // Restart dns server
  298. if (!empty($restart_dns) && empty($_SESSION["error_msg"])) {
  299. exec(HESTIA_CMD . "v-restart-dns", $output, $return_var);
  300. check_return_code($return_var, $output);
  301. unset($output);
  302. }
  303. // Set success message
  304. if (empty($_SESSION["error_msg"])) {
  305. $_SESSION["ok_msg"] = _("Changes have been saved.");
  306. }
  307. // Change url if record id was changed
  308. if (empty($_SESSION["error_msg"]) && $_GET["record_id"] != $_POST["v_record_id"]) {
  309. header(
  310. "Location: /edit/dns/?domain=" .
  311. $_GET["domain"] .
  312. "&record_id=" .
  313. $_POST["v_record_id"],
  314. );
  315. exit();
  316. }
  317. }
  318. // Render page
  319. if (empty($_GET["record_id"])) {
  320. // Display body for dns domain
  321. render_page($user, $TAB, "edit_dns");
  322. } else {
  323. if (empty($data[$_GET["record_id"]])) {
  324. header("Location: /list/dns/");
  325. $_SESSION["error_msg"] = _("Error: unknown record ID.");
  326. }
  327. // Display body for dns record
  328. render_page($user, $TAB, "edit_dns_rec");
  329. }
  330. // Flush session messages
  331. unset($_SESSION["error_msg"]);
  332. unset($_SESSION["ok_msg"]);