index.php 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661
  1. <?php
  2. use function Hestiacp\quoteshellarg\quoteshellarg;
  3. ob_start();
  4. unset($_SESSION["error_msg"]);
  5. $TAB = "WEB";
  6. // Main include
  7. include $_SERVER["DOCUMENT_ROOT"] . "/inc/main.php";
  8. // Check domain argument
  9. if (empty($_GET["domain"])) {
  10. header("Location: /list/web/");
  11. exit();
  12. }
  13. // Edit as someone else?
  14. if ($_SESSION["userContext"] === "admin" && !empty($_GET["user"])) {
  15. $user = quoteshellarg($_GET["user"]);
  16. $user_plain = htmlentities($_GET["user"]);
  17. }
  18. // Get all user domains
  19. exec(HESTIA_CMD . "v-list-web-domains " . $user . " json", $output, $return_var);
  20. $user_domains = json_decode(implode("", $output), true);
  21. $user_domains = array_keys($user_domains);
  22. unset($output);
  23. $v_domain = $_GET["domain"];
  24. exec(
  25. HESTIA_CMD . "v-list-web-domain " . $user . " " . quoteshellarg($v_domain) . " json",
  26. $output,
  27. $return_var,
  28. );
  29. # Check if domain exists if not return /list/web/
  30. check_return_code_redirect($return_var, $output, "/list/web/");
  31. $data = json_decode(implode("", $output), true);
  32. unset($output);
  33. // Parse domain
  34. $v_ip = $data[$v_domain]["IP"];
  35. $v_ipv6 = $data[$v_domain]["IP6"];
  36. $v_template = $data[$v_domain]["TPL"];
  37. $v_aliases = str_replace(",", "\n", $data[$v_domain]["ALIAS"]);
  38. $valiases = explode(",", $data[$v_domain]["ALIAS"]);
  39. $v_ssl = $data[$v_domain]["SSL"];
  40. if (!empty($v_ssl)) {
  41. exec(
  42. HESTIA_CMD . "v-list-web-domain-ssl " . $user . " " . quoteshellarg($v_domain) . " json",
  43. $output,
  44. $return_var,
  45. );
  46. $ssl_str = json_decode(implode("", $output), true);
  47. unset($output);
  48. $v_ssl_crt = $ssl_str[$v_domain]["CRT"];
  49. $v_ssl_key = $ssl_str[$v_domain]["KEY"];
  50. $v_ssl_ca = $ssl_str[$v_domain]["CA"];
  51. $v_ssl_subject = $ssl_str[$v_domain]["SUBJECT"];
  52. $v_ssl_aliases = $ssl_str[$v_domain]["ALIASES"];
  53. $v_ssl_not_before = $ssl_str[$v_domain]["NOT_BEFORE"];
  54. $v_ssl_not_after = $ssl_str[$v_domain]["NOT_AFTER"];
  55. $v_ssl_signature = $ssl_str[$v_domain]["SIGNATURE"];
  56. $v_ssl_pub_key = $ssl_str[$v_domain]["PUB_KEY"];
  57. $v_ssl_issuer = $ssl_str[$v_domain]["ISSUER"];
  58. $v_ssl_forcessl = $data[$v_domain]["SSL_FORCE"];
  59. $v_ssl_hsts = $data[$v_domain]["SSL_HSTS"];
  60. }
  61. $v_letsencrypt = $data[$v_domain]["LETSENCRYPT"];
  62. if (empty($v_letsencrypt)) {
  63. $v_letsencrypt = "no";
  64. }
  65. $v_ssl_home = $data[$v_domain]["SSL_HOME"];
  66. $v_backend_template = $data[$v_domain]["BACKEND"];
  67. $v_nginx_cache = $data[$v_domain]["FASTCGI_CACHE"] ?? "";
  68. $v_nginx_cache_duration = $data[$v_domain]["FASTCGI_DURATION"] ?? "";
  69. $v_nginx_cache_check = "";
  70. if (empty($v_nginx_cache_duration)) {
  71. $v_nginx_cache_duration = "2m";
  72. $v_nginx_cache_check = "";
  73. } else {
  74. $v_nginx_cache_check = "on";
  75. }
  76. $v_proxy = $data[$v_domain]["PROXY"];
  77. $v_proxy_template = $data[$v_domain]["PROXY"];
  78. $v_proxy_ext = str_replace(",", ", ", $data[$v_domain]["PROXY_EXT"]);
  79. $v_stats = $data[$v_domain]["STATS"];
  80. $v_stats_user = $data[$v_domain]["STATS_USER"];
  81. $v_stats_password = "";
  82. $v_custom_doc_root_prepath = "/home/" . $user_plain . "/web/";
  83. $v_custom_doc_root = "";
  84. $v_custom_doc_domain = "";
  85. $v_custom_doc_folder = "";
  86. if (!empty($data[$v_domain]["CUSTOM_DOCROOT"])) {
  87. $v_custom_doc_root = realpath($data[$v_domain]["CUSTOM_DOCROOT"]) . DIRECTORY_SEPARATOR;
  88. }
  89. if (
  90. !empty($v_custom_doc_root) &&
  91. false !==
  92. preg_match(
  93. "/\/home\/" . $user_plain . "\/web\/([[:alnum:]].*?)\/public_html\/([[:alnum:]].*)?/",
  94. $v_custom_doc_root,
  95. $matches,
  96. )
  97. ) {
  98. // Regex for extracting target web domain and custom document root. Regex test: https://regex101.com/r/2CLvIF/1
  99. if (!empty($matches[1])) {
  100. $v_custom_doc_domain = $matches[1];
  101. }
  102. if (!empty($matches[2])) {
  103. $v_custom_doc_folder = rtrim($matches[2], "/");
  104. }
  105. if ($v_custom_doc_domain && !in_array($v_custom_doc_domain, $user_domains)) {
  106. $v_custom_doc_domain = "";
  107. $v_custom_doc_folder = "";
  108. }
  109. }
  110. $redirect_code_options = [301, 302];
  111. $v_redirect = $data[$v_domain]["REDIRECT"];
  112. $v_redirect_code = $data[$v_domain]["REDIRECT_CODE"];
  113. if (!in_array($v_redirect, ["www." . $v_domain, $v_domain])) {
  114. $v_redirect_custom = $v_redirect;
  115. }
  116. $v_ftp_user = $data[$v_domain]["FTP_USER"];
  117. $v_ftp_path = $data[$v_domain]["FTP_PATH"];
  118. if (!empty($v_ftp_user)) {
  119. $v_ftp_password = "";
  120. }
  121. if (isset($v_custom_doc_domain) && $v_custom_doc_domain != "") {
  122. $v_ftp_user_prepath = "/home/" . $user_plain . "/web/" . $v_custom_doc_domain;
  123. } else {
  124. $v_ftp_user_prepath = "/home/" . $user_plain . "/web/" . $v_domain;
  125. }
  126. //$v_ftp_email = $panel[$user]['CONTACT'];
  127. $v_ftp_email = "";
  128. $v_suspended = $data[$v_domain]["SUSPENDED"];
  129. if ($v_suspended == "yes") {
  130. $v_status = "suspended";
  131. } else {
  132. $v_status = "active";
  133. }
  134. $v_time = $data[$v_domain]["TIME"];
  135. $v_date = $data[$v_domain]["DATE"];
  136. // List ip addresses
  137. exec(HESTIA_CMD . "v-list-user-ips " . $user . " json", $output, $return_var);
  138. $ips = json_decode(implode("", $output), true);
  139. unset($output);
  140. $v_ip_public = empty($ips[$v_ip]["NAT"]) ? $v_ip : $ips[$v_ip]["NAT"];
  141. // List web templates
  142. exec(HESTIA_CMD . "v-list-web-templates json", $output, $return_var);
  143. $templates = json_decode(implode("", $output), true);
  144. unset($output);
  145. // List backend templates
  146. if (!empty($_SESSION["WEB_BACKEND"])) {
  147. exec(HESTIA_CMD . "v-list-web-templates-backend json", $output, $return_var);
  148. $backend_templates = json_decode(implode("", $output), true);
  149. unset($output);
  150. }
  151. // List proxy templates
  152. if (!empty($_SESSION["PROXY_SYSTEM"])) {
  153. exec(HESTIA_CMD . "v-list-web-templates-proxy json", $output, $return_var);
  154. $proxy_templates = json_decode(implode("", $output), true);
  155. unset($output);
  156. }
  157. // List web stat engines
  158. exec(HESTIA_CMD . "v-list-web-stats json", $output, $return_var);
  159. $stats = json_decode(implode("", $output), true);
  160. unset($output);
  161. // Check POST request
  162. if (!empty($_POST["save"])) {
  163. $v_domain = $_POST["v_domain"];
  164. if (!in_array($v_domain, $user_domains)) {
  165. check_return_code(3, ["Unknown domain"]);
  166. }
  167. // Check token
  168. verify_csrf($_POST);
  169. // Change web domain IP
  170. $v_newip = "";
  171. $v_newipv6 = "";
  172. $v_newip_public = "";
  173. if (!empty($_POST["v_ip"])) {
  174. $v_newip = $_POST["v_ip"];
  175. $v_newip_public = empty($ips[$v_newip]["NAT"]) ? $v_newip : $ips[$v_newip]["NAT"];
  176. }
  177. if (!empty($_POST["v_ipv6"])) {
  178. $v_newipv6 = $_POST["v_ipv6"];
  179. }
  180. if ($v_ip != $_POST["v_ip"] && empty($_SESSION["error_msg"])) {
  181. exec(
  182. HESTIA_CMD .
  183. "v-change-web-domain-ip " .
  184. $user .
  185. " " .
  186. quoteshellarg($v_domain) .
  187. " " .
  188. quoteshellarg($_POST["v_ip"]) .
  189. " 'no'",
  190. $output,
  191. $return_var,
  192. );
  193. check_return_code($return_var, $output);
  194. $restart_web = "yes";
  195. $restart_proxy = "yes";
  196. unset($output);
  197. }
  198. if ($v_ipv6 != $_POST["v_ipv6"] && empty($_SESSION["error_msg"])) {
  199. exec(
  200. HESTIA_CMD .
  201. "v-change-web-domain-ipv6 " .
  202. $user .
  203. " " .
  204. quoteshellarg($v_domain) .
  205. " " .
  206. quoteshellarg($_POST["v_ipv6"]) .
  207. " 'no'",
  208. $output,
  209. $return_var,
  210. );
  211. check_return_code($return_var, $output);
  212. $restart_web = "yes";
  213. $restart_proxy = "yes";
  214. unset($output);
  215. }
  216. // Change dns domain IP
  217. if ($v_ip != $_POST["v_ip"] && empty($_SESSION["error_msg"])) {
  218. exec(
  219. HESTIA_CMD . "v-list-dns-domain " . $user . " " . quoteshellarg($v_domain) . " json",
  220. $output,
  221. $return_var,
  222. );
  223. unset($output);
  224. if ($return_var == 0) {
  225. exec(
  226. HESTIA_CMD .
  227. "v-change-dns-domain-ip " .
  228. $user .
  229. " " .
  230. quoteshellarg($v_domain) .
  231. " " .
  232. quoteshellarg($v_newip_public) .
  233. " 'no'",
  234. $output,
  235. $return_var,
  236. );
  237. check_return_code($return_var, $output);
  238. unset($output);
  239. $restart_dns = "yes";
  240. }
  241. }
  242. if ($v_ipv6 != $_POST["v_ipv6"] && empty($_SESSION["error_msg"])) {
  243. exec(
  244. HESTIA_CMD . "v-list-dns-domain " . $user . " " . quoteshellarg($v_domain) . " json",
  245. $output,
  246. $return_var,
  247. );
  248. unset($output);
  249. if ($return_var == 0) {
  250. exec(
  251. HESTIA_CMD .
  252. "v-change-dns-domain-ipv6 " .
  253. $user .
  254. " " .
  255. quoteshellarg($v_domain) .
  256. " " .
  257. quoteshellarg($v_newipv6) .
  258. " 'no'",
  259. $output,
  260. $return_var,
  261. );
  262. check_return_code($return_var, $output);
  263. unset($output);
  264. $restart_dns = "yes";
  265. }
  266. }
  267. // Change dns ip for each alias
  268. if ($v_ip != $_POST["v_ip"] && empty($_SESSION["error_msg"])) {
  269. foreach ($valiases as $v_alias) {
  270. exec(
  271. HESTIA_CMD . "v-list-dns-domain " . $user . " " . quoteshellarg($v_alias) . " json",
  272. $output,
  273. $return_var,
  274. );
  275. unset($output);
  276. if ($return_var == 0) {
  277. exec(
  278. HESTIA_CMD .
  279. "v-change-dns-domain-ip " .
  280. $user .
  281. " " .
  282. quoteshellarg($v_alias) .
  283. " " .
  284. quoteshellarg($v_newip_public),
  285. $output,
  286. $return_var,
  287. );
  288. check_return_code($return_var, $output);
  289. unset($output);
  290. $restart_dns = "yes";
  291. }
  292. }
  293. }
  294. if ($v_ipv6 != $_POST["v_ipv6"] && empty($_SESSION["error_msg"])) {
  295. foreach ($valiases as $v_alias) {
  296. exec(
  297. HESTIA_CMD . "v-list-dns-domain " . $user . " " . quoteshellarg($v_alias) . " json",
  298. $output,
  299. $return_var,
  300. );
  301. unset($output);
  302. if ($return_var == 0) {
  303. exec(
  304. HESTIA_CMD .
  305. "v-change-dns-domain-ipv6 " .
  306. $user .
  307. " " .
  308. quoteshellarg($v_alias) .
  309. " " .
  310. quoteshellarg($v_newipv6),
  311. $output,
  312. $return_var,
  313. );
  314. check_return_code($return_var, $output);
  315. unset($output);
  316. $restart_dns = "yes";
  317. }
  318. }
  319. }
  320. // Change mail domain IP
  321. if ((($v_ip != $_POST["v_ip"]) || ($v_ipv6 != $_POST["v_ipv6"])) && empty($_SESSION["error_msg"])) {
  322. exec(
  323. HESTIA_CMD . "v-list-mail-domain " . $user . " " . quoteshellarg($v_domain) . " json",
  324. $output,
  325. $return_var,
  326. );
  327. unset($output);
  328. if ($return_var == 0) {
  329. exec(
  330. HESTIA_CMD . "v-rebuild-mail-domain " . $user . " " . quoteshellarg($v_domain),
  331. $output,
  332. $return_var,
  333. );
  334. check_return_code($return_var, $output);
  335. unset($output);
  336. $restart_email = "yes";
  337. }
  338. }
  339. if (
  340. $_SESSION["POLICY_USER_EDIT_WEB_TEMPLATES"] == "yes" ||
  341. $_SESSION["userContext"] === "admin"
  342. ) {
  343. // Change template
  344. if ($v_template != $_POST["v_template"] && empty($_SESSION["error_msg"])) {
  345. exec(
  346. HESTIA_CMD .
  347. "v-change-web-domain-tpl " .
  348. $user .
  349. " " .
  350. quoteshellarg($v_domain) .
  351. " " .
  352. quoteshellarg($_POST["v_template"]) .
  353. " 'no'",
  354. $output,
  355. $return_var,
  356. );
  357. check_return_code($return_var, $output);
  358. unset($output);
  359. $restart_web = "yes";
  360. }
  361. // Change backend template
  362. if (
  363. !empty($_SESSION["WEB_BACKEND"]) &&
  364. $v_backend_template != $_POST["v_backend_template"] &&
  365. empty($_SESSION["error_msg"])
  366. ) {
  367. $v_backend_template = $_POST["v_backend_template"];
  368. exec(
  369. HESTIA_CMD .
  370. "v-change-web-domain-backend-tpl " .
  371. $user .
  372. " " .
  373. quoteshellarg($v_domain) .
  374. " " .
  375. quoteshellarg($v_backend_template),
  376. $output,
  377. $return_var,
  378. );
  379. check_return_code($return_var, $output);
  380. unset($output);
  381. }
  382. // Enable/Disable nginx cache
  383. if (empty($_POST["v_nginx_cache_check"])) {
  384. $_POST["v_nginx_cache_check"] = "";
  385. }
  386. if (
  387. ($_SESSION["WEB_SYSTEM"] == "nginx" &&
  388. $v_nginx_cache_check != $_POST["v_nginx_cache_check"]) ||
  389. ($v_nginx_cache_duration != $_POST["v_nginx_cache_duration"] &&
  390. ($_POST["v_nginx_cache"] = "yes") &&
  391. empty($_SESSION["error_msg"]))
  392. ) {
  393. if ($_POST["v_nginx_cache_check"] == "on") {
  394. if (empty($_POST["v_nginx_cache_duration"])) {
  395. $_POST["v_nginx_cache_duration"] = "2m";
  396. }
  397. exec(
  398. HESTIA_CMD .
  399. "v-add-fastcgi-cache " .
  400. $user .
  401. " " .
  402. quoteshellarg($v_domain) .
  403. " " .
  404. quoteshellarg($_POST["v_nginx_cache_duration"]),
  405. $output,
  406. $return_var,
  407. );
  408. check_return_code($return_var, $output);
  409. unset($output);
  410. } else {
  411. exec(
  412. HESTIA_CMD . "v-delete-fastcgi-cache " . $user . " " . quoteshellarg($v_domain),
  413. $output,
  414. $return_var,
  415. );
  416. check_return_code($return_var, $output);
  417. unset($output);
  418. }
  419. $restart_web = "yes";
  420. }
  421. // Delete proxy support
  422. if (
  423. !empty($_SESSION["PROXY_SYSTEM"]) &&
  424. !empty($v_proxy) &&
  425. empty($_POST["v_proxy"]) &&
  426. empty($_SESSION["error_msg"])
  427. ) {
  428. exec(
  429. HESTIA_CMD .
  430. "v-delete-web-domain-proxy " .
  431. $user .
  432. " " .
  433. quoteshellarg($v_domain) .
  434. " 'no'",
  435. $output,
  436. $return_var,
  437. );
  438. check_return_code($return_var, $output);
  439. unset($output);
  440. unset($v_proxy);
  441. $restart_web = "yes";
  442. }
  443. // Change proxy template / Update extension list
  444. if (
  445. !empty($_SESSION["PROXY_SYSTEM"]) &&
  446. !empty($v_proxy) &&
  447. !empty($_POST["v_proxy"]) &&
  448. empty($_SESSION["error_msg"])
  449. ) {
  450. $ext = preg_replace("/\n/", " ", $_POST["v_proxy_ext"]);
  451. $ext = preg_replace("/,/", " ", $ext);
  452. $ext = preg_replace("/\s+/", " ", $ext);
  453. $ext = trim($ext);
  454. $ext = str_replace(" ", ", ", $ext);
  455. if ($v_proxy_template != $_POST["v_proxy_template"] || $v_proxy_ext != $ext) {
  456. $ext = str_replace(", ", ",", $ext);
  457. if (!empty($_POST["v_proxy_template"])) {
  458. $v_proxy_template = $_POST["v_proxy_template"];
  459. }
  460. exec(
  461. HESTIA_CMD .
  462. "v-change-web-domain-proxy-tpl " .
  463. $user .
  464. " " .
  465. quoteshellarg($v_domain) .
  466. " " .
  467. quoteshellarg($v_proxy_template) .
  468. " " .
  469. quoteshellarg($ext) .
  470. " 'no'",
  471. $output,
  472. $return_var,
  473. );
  474. check_return_code($return_var, $output);
  475. $v_proxy_ext = str_replace(",", ", ", $ext);
  476. unset($output);
  477. $restart_proxy = "yes";
  478. }
  479. }
  480. // Add proxy support
  481. if (
  482. !empty($_SESSION["PROXY_SYSTEM"]) &&
  483. empty($v_proxy) &&
  484. !empty($_POST["v_proxy"]) &&
  485. empty($_SESSION["error_msg"])
  486. ) {
  487. $v_proxy_template = $_POST["v_proxy_template"];
  488. if (!empty($_POST["v_proxy_ext"])) {
  489. $ext = preg_replace("/\n/", " ", $_POST["v_proxy_ext"]);
  490. $ext = preg_replace("/,/", " ", $ext);
  491. $ext = preg_replace("/\s+/", " ", $ext);
  492. $ext = trim($ext);
  493. $ext = str_replace(" ", ",", $ext);
  494. $v_proxy_ext = str_replace(",", ", ", $ext);
  495. }
  496. exec(
  497. HESTIA_CMD .
  498. "v-add-web-domain-proxy " .
  499. $user .
  500. " " .
  501. quoteshellarg($v_domain) .
  502. " " .
  503. quoteshellarg($v_proxy_template) .
  504. " " .
  505. quoteshellarg($ext) .
  506. " 'no'",
  507. $output,
  508. $return_var,
  509. );
  510. check_return_code($return_var, $output);
  511. unset($output);
  512. $restart_proxy = "yes";
  513. }
  514. }
  515. // Change aliases
  516. if (empty($_SESSION["error_msg"])) {
  517. $waliases = preg_replace("/\n/", " ", $_POST["v_aliases"]);
  518. $waliases = preg_replace("/,/", " ", $waliases);
  519. $waliases = preg_replace("/\s+/", " ", $waliases);
  520. $waliases = trim($waliases);
  521. $aliases = explode(" ", $waliases);
  522. $v_aliases = str_replace(" ", "\n", $waliases);
  523. $result = array_diff($valiases, $aliases);
  524. foreach ($result as $alias) {
  525. if (empty($_SESSION["error_msg"]) && !empty($alias)) {
  526. $restart_web = "yes";
  527. $restart_proxy = "yes";
  528. exec(
  529. HESTIA_CMD .
  530. "v-delete-web-domain-alias " .
  531. $user .
  532. " " .
  533. quoteshellarg($v_domain) .
  534. " " .
  535. quoteshellarg($alias) .
  536. " 'no'",
  537. $output,
  538. $return_var,
  539. );
  540. check_return_code($return_var, $output);
  541. unset($output);
  542. if (empty($_SESSION["error_msg"])) {
  543. exec(
  544. HESTIA_CMD . "v-list-dns-domain " . $user . " " . quoteshellarg($v_domain),
  545. $output,
  546. $return_var,
  547. );
  548. unset($output);
  549. if ($return_var == 0) {
  550. exec(
  551. HESTIA_CMD .
  552. "v-delete-dns-on-web-alias " .
  553. $user .
  554. " " .
  555. quoteshellarg($v_domain) .
  556. " " .
  557. quoteshellarg($alias) .
  558. " 'no'",
  559. $output,
  560. $return_var,
  561. );
  562. check_return_code($return_var, $output);
  563. unset($output);
  564. $restart_dns = "yes";
  565. }
  566. }
  567. }
  568. }
  569. $result = array_diff($aliases, $valiases);
  570. foreach ($result as $alias) {
  571. if (empty($_SESSION["error_msg"]) && !empty($alias)) {
  572. $restart_web = "yes";
  573. $restart_proxy = "yes";
  574. exec(
  575. HESTIA_CMD .
  576. "v-add-web-domain-alias " .
  577. $user .
  578. " " .
  579. quoteshellarg($v_domain) .
  580. " " .
  581. quoteshellarg($alias) .
  582. " 'no'",
  583. $output,
  584. $return_var,
  585. );
  586. check_return_code($return_var, $output);
  587. unset($output);
  588. if (empty($_SESSION["error_msg"])) {
  589. exec(
  590. HESTIA_CMD . "v-list-dns-domain " . $user . " " . quoteshellarg($v_domain),
  591. $output,
  592. $return_var,
  593. );
  594. unset($output);
  595. if ($return_var == 0) {
  596. exec(
  597. HESTIA_CMD .
  598. "v-add-dns-on-web-alias " .
  599. $user .
  600. " " .
  601. quoteshellarg($alias) .
  602. " " .
  603. quoteshellarg($v_newip_public ?: $v_ip_public) .
  604. " no",
  605. $output,
  606. $return_var,
  607. );
  608. check_return_code($return_var, $output);
  609. unset($output);
  610. $restart_dns = "yes";
  611. }
  612. }
  613. }
  614. }
  615. // Regenerate LE if aliases are different
  616. if (
  617. !empty($_POST["v_ssl"]) &&
  618. $v_letsencrypt == "yes" &&
  619. !empty($_POST["v_letsencrypt"]) &&
  620. empty($_SESSION["error_msg"])
  621. ) {
  622. // If aliases are different from stored aliases
  623. if (array_diff($valiases, $aliases) || array_diff($aliases, $valiases)) {
  624. // Add certificate with new aliases
  625. $l_aliases = str_replace("\n", ",", $v_aliases);
  626. exec(
  627. HESTIA_CMD .
  628. "v-add-letsencrypt-domain " .
  629. $user .
  630. " " .
  631. quoteshellarg($v_domain) .
  632. " " .
  633. quoteshellarg($l_aliases) .
  634. " ''",
  635. $output,
  636. $return_var,
  637. );
  638. check_return_code($return_var, $output);
  639. unset($output);
  640. $v_letsencrypt = "yes";
  641. $v_ssl = "yes";
  642. $restart_web = "yes";
  643. $restart_proxy = "yes";
  644. exec(
  645. HESTIA_CMD .
  646. "v-list-web-domain-ssl " .
  647. $user .
  648. " " .
  649. quoteshellarg($v_domain) .
  650. " json",
  651. $output,
  652. $return_var,
  653. );
  654. $ssl_str = json_decode(implode("", $output), true);
  655. unset($output);
  656. $v_ssl_crt = $ssl_str[$v_domain]["CRT"];
  657. $v_ssl_key = $ssl_str[$v_domain]["KEY"];
  658. $v_ssl_ca = $ssl_str[$v_domain]["CA"];
  659. $v_ssl_subject = $ssl_str[$v_domain]["SUBJECT"];
  660. $v_ssl_aliases = $ssl_str[$v_domain]["ALIASES"];
  661. $v_ssl_not_before = $ssl_str[$v_domain]["NOT_BEFORE"];
  662. $v_ssl_not_after = $ssl_str[$v_domain]["NOT_AFTER"];
  663. $v_ssl_signature = $ssl_str[$v_domain]["SIGNATURE"];
  664. $v_ssl_pub_key = $ssl_str[$v_domain]["PUB_KEY"];
  665. $v_ssl_issuer = $ssl_str[$v_domain]["ISSUER"];
  666. }
  667. }
  668. if (!empty($v_stats) && $_POST["v_stats"] == $v_stats && empty($_SESSION["error_msg"])) {
  669. // Update statistics configuration when changing domain aliases
  670. $v_stats = quoteshellarg($_POST["v_stats"]);
  671. exec(
  672. HESTIA_CMD .
  673. "v-change-web-domain-stats " .
  674. $user .
  675. " " .
  676. quoteshellarg($v_domain) .
  677. " " .
  678. $v_stats,
  679. $output,
  680. $return_var,
  681. );
  682. check_return_code($return_var, $output);
  683. unset($output);
  684. }
  685. }
  686. // Change SSL certificate
  687. if (
  688. $v_letsencrypt == "no" &&
  689. empty($_POST["v_letsencrypt"]) &&
  690. $v_ssl == "yes" &&
  691. !empty($_POST["v_ssl"]) &&
  692. empty($_SESSION["error_msg"])
  693. ) {
  694. if (
  695. $v_ssl_crt != str_replace("\r\n", "\n", $_POST["v_ssl_crt"]) ||
  696. $v_ssl_key != str_replace("\r\n", "\n", $_POST["v_ssl_key"]) ||
  697. $v_ssl_ca != str_replace("\r\n", "\n", $_POST["v_ssl_ca"])
  698. ) {
  699. exec("mktemp -d", $mktemp_output, $return_var);
  700. $tmpdir = $mktemp_output[0];
  701. // Certificate
  702. if (!empty($_POST["v_ssl_crt"])) {
  703. $fp = fopen($tmpdir . "/" . $v_domain . ".crt", "w");
  704. fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_crt"]));
  705. fwrite($fp, "\n");
  706. fclose($fp);
  707. }
  708. // Key
  709. if (!empty($_POST["v_ssl_key"])) {
  710. $fp = fopen($tmpdir . "/" . $v_domain . ".key", "w");
  711. fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_key"]));
  712. fwrite($fp, "\n");
  713. fclose($fp);
  714. }
  715. // CA
  716. if (!empty($_POST["v_ssl_ca"])) {
  717. $fp = fopen($tmpdir . "/" . $v_domain . ".ca", "w");
  718. fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_ca"]));
  719. fwrite($fp, "\n");
  720. fclose($fp);
  721. }
  722. exec(
  723. HESTIA_CMD .
  724. "v-change-web-domain-sslcert " .
  725. $user .
  726. " " .
  727. quoteshellarg($v_domain) .
  728. " " .
  729. $tmpdir .
  730. " 'no'",
  731. $output,
  732. $return_var,
  733. );
  734. check_return_code($return_var, $output);
  735. unset($output);
  736. $restart_web = "yes";
  737. $restart_proxy = "yes";
  738. exec(
  739. HESTIA_CMD .
  740. "v-list-web-domain-ssl " .
  741. $user .
  742. " " .
  743. quoteshellarg($v_domain) .
  744. " json",
  745. $output,
  746. $return_var,
  747. );
  748. $ssl_str = json_decode(implode("", $output), true);
  749. unset($output);
  750. $v_ssl_crt = $ssl_str[$v_domain]["CRT"];
  751. $v_ssl_key = $ssl_str[$v_domain]["KEY"];
  752. $v_ssl_ca = $ssl_str[$v_domain]["CA"];
  753. $v_ssl_subject = $ssl_str[$v_domain]["SUBJECT"];
  754. $v_ssl_aliases = $ssl_str[$v_domain]["ALIASES"];
  755. $v_ssl_not_before = $ssl_str[$v_domain]["NOT_BEFORE"];
  756. $v_ssl_not_after = $ssl_str[$v_domain]["NOT_AFTER"];
  757. $v_ssl_signature = $ssl_str[$v_domain]["SIGNATURE"];
  758. $v_ssl_pub_key = $ssl_str[$v_domain]["PUB_KEY"];
  759. $v_ssl_issuer = $ssl_str[$v_domain]["ISSUER"];
  760. // Cleanup certificate tempfiles
  761. if (!empty($_POST["v_ssl_crt"])) {
  762. unlink($tmpdir . "/" . $v_domain . ".crt");
  763. }
  764. if (!empty($_POST["v_ssl_key"])) {
  765. unlink($tmpdir . "/" . $v_domain . ".key");
  766. }
  767. if (!empty($_POST["v_ssl_ca"])) {
  768. unlink($tmpdir . "/" . $v_domain . ".ca");
  769. }
  770. rmdir($tmpdir);
  771. }
  772. }
  773. // Delete Lets Encrypt support
  774. if (
  775. $v_letsencrypt == "yes" &&
  776. (empty($_POST["v_letsencrypt"]) || empty($_POST["v_ssl"])) &&
  777. empty($_SESSION["error_msg"])
  778. ) {
  779. exec(
  780. HESTIA_CMD .
  781. "v-delete-letsencrypt-domain " .
  782. $user .
  783. " " .
  784. quoteshellarg($v_domain) .
  785. " ''",
  786. $output,
  787. $return_var,
  788. );
  789. check_return_code($return_var, $output);
  790. unset($output);
  791. $v_ssl_crt = "";
  792. $v_ssl_key = "";
  793. $v_ssl_ca = "";
  794. $v_letsencrypt = "no";
  795. $v_letsencrypt_deleted = "yes";
  796. $v_ssl = "no";
  797. $restart_web = "yes";
  798. $restart_proxy = "yes";
  799. }
  800. // Delete SSL certificate
  801. if ($v_ssl == "yes" && empty($_POST["v_ssl"]) && empty($_SESSION["error_msg"])) {
  802. exec(
  803. HESTIA_CMD .
  804. "v-delete-web-domain-ssl " .
  805. $user .
  806. " " .
  807. quoteshellarg($v_domain) .
  808. " 'no'",
  809. $output,
  810. $return_var,
  811. );
  812. check_return_code($return_var, $output);
  813. unset($output);
  814. $v_ssl_crt = "";
  815. $v_ssl_key = "";
  816. $v_ssl_ca = "";
  817. $v_ssl = "no";
  818. $v_ssl_forcessl = "no";
  819. $v_ssl_hsts = "no";
  820. $restart_web = "yes";
  821. $restart_proxy = "yes";
  822. }
  823. // Add Lets Encrypt support
  824. if (
  825. !empty($_POST["v_ssl"]) &&
  826. $v_letsencrypt == "no" &&
  827. !empty($_POST["v_letsencrypt"]) &&
  828. empty($_SESSION["error_msg"])
  829. ) {
  830. $l_aliases = str_replace("\n", ",", $v_aliases);
  831. exec(
  832. HESTIA_CMD .
  833. "v-add-letsencrypt-domain " .
  834. $user .
  835. " " .
  836. quoteshellarg($v_domain) .
  837. " " .
  838. quoteshellarg($l_aliases) .
  839. " ''",
  840. $output,
  841. $return_var,
  842. );
  843. check_return_code($return_var, $output);
  844. unset($output);
  845. if ($return_var != 0) {
  846. $v_letsencrypt = "no";
  847. } else {
  848. $v_letsencrypt = "yes";
  849. }
  850. $v_ssl = "yes";
  851. if ($_POST["v_ssl_forcessl"] == "on") {
  852. $v_ssl_forcessl = "yes";
  853. } else {
  854. $v_ssl_forcessl = "no";
  855. }
  856. $restart_web = "yes";
  857. $restart_proxy = "yes";
  858. }
  859. // Add SSL certificate
  860. if (
  861. $v_ssl == "no" &&
  862. !empty($_POST["v_ssl"]) &&
  863. empty($v_letsencrypt_deleted) &&
  864. empty($_SESSION["error_msg"])
  865. ) {
  866. if (empty($_POST["v_ssl_crt"])) {
  867. $errors[] = "ssl certificate";
  868. }
  869. if (empty($_POST["v_ssl_key"])) {
  870. $errors[] = "ssl key";
  871. }
  872. if (empty($_POST["v_ssl_home"])) {
  873. $errors[] = "ssl home";
  874. }
  875. $v_ssl_home = quoteshellarg($_POST["v_ssl_home"]);
  876. if (!empty($errors[0])) {
  877. foreach ($errors as $i => $error) {
  878. if ($i == 0) {
  879. $error_msg = $error;
  880. } else {
  881. $error_msg = $error_msg . ", " . $error;
  882. }
  883. }
  884. $_SESSION["error_msg"] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
  885. } else {
  886. exec("mktemp -d", $mktemp_output, $return_var);
  887. $tmpdir = $mktemp_output[0];
  888. // Certificate
  889. if (!empty($_POST["v_ssl_crt"])) {
  890. $fp = fopen($tmpdir . "/" . $v_domain . ".crt", "w");
  891. fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_crt"]));
  892. fclose($fp);
  893. }
  894. // Key
  895. if (!empty($_POST["v_ssl_key"])) {
  896. $fp = fopen($tmpdir . "/" . $v_domain . ".key", "w");
  897. fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_key"]));
  898. fclose($fp);
  899. }
  900. // CA
  901. if (!empty($_POST["v_ssl_ca"])) {
  902. $fp = fopen($tmpdir . "/" . $v_domain . ".ca", "w");
  903. fwrite($fp, str_replace("\r\n", "\n", $_POST["v_ssl_ca"]));
  904. fclose($fp);
  905. }
  906. exec(
  907. HESTIA_CMD .
  908. "v-add-web-domain-ssl " .
  909. $user .
  910. " " .
  911. quoteshellarg($v_domain) .
  912. " " .
  913. $tmpdir .
  914. " " .
  915. $v_ssl_home .
  916. " 'no'",
  917. $output,
  918. $return_var,
  919. );
  920. check_return_code($return_var, $output);
  921. unset($output);
  922. $v_ssl = "yes";
  923. $restart_web = "yes";
  924. $restart_proxy = "yes";
  925. exec(
  926. HESTIA_CMD .
  927. "v-list-web-domain-ssl " .
  928. $user .
  929. " " .
  930. quoteshellarg($v_domain) .
  931. " json",
  932. $output,
  933. $return_var,
  934. );
  935. $ssl_str = json_decode(implode("", $output), true);
  936. unset($output);
  937. $v_ssl_crt = $ssl_str[$v_domain]["CRT"];
  938. $v_ssl_key = $ssl_str[$v_domain]["KEY"];
  939. $v_ssl_ca = $ssl_str[$v_domain]["CA"];
  940. $v_ssl_subject = $ssl_str[$v_domain]["SUBJECT"];
  941. $v_ssl_aliases = $ssl_str[$v_domain]["ALIASES"];
  942. $v_ssl_not_before = $ssl_str[$v_domain]["NOT_BEFORE"];
  943. $v_ssl_not_after = $ssl_str[$v_domain]["NOT_AFTER"];
  944. $v_ssl_signature = $ssl_str[$v_domain]["SIGNATURE"];
  945. $v_ssl_pub_key = $ssl_str[$v_domain]["PUB_KEY"];
  946. $v_ssl_issuer = $ssl_str[$v_domain]["ISSUER"];
  947. // Cleanup certificate tempfiles
  948. if (!empty($_POST["v_ssl_crt"])) {
  949. unlink($tmpdir . "/" . $v_domain . ".crt");
  950. }
  951. if (!empty($_POST["v_ssl_key"])) {
  952. unlink($tmpdir . "/" . $v_domain . ".key");
  953. }
  954. if (!empty($_POST["v_ssl_ca"])) {
  955. unlink($tmpdir . "/" . $v_domain . ".ca");
  956. }
  957. rmdir($tmpdir);
  958. }
  959. }
  960. // Add Force SSL
  961. if (
  962. !empty($_POST["v_ssl_forcessl"]) &&
  963. !empty($_POST["v_ssl"]) &&
  964. empty($_SESSION["error_msg"])
  965. ) {
  966. exec(
  967. HESTIA_CMD . "v-add-web-domain-ssl-force " . $user . " " . quoteshellarg($v_domain),
  968. $output,
  969. $return_var,
  970. );
  971. check_return_code($return_var, $output);
  972. unset($output);
  973. $v_ssl_forcessl = "yes";
  974. $restart_web = "yes";
  975. $restart_proxy = "yes";
  976. }
  977. // Add SSL HSTS
  978. if (!empty($_POST["v_ssl_hsts"]) && !empty($_POST["v_ssl"]) && empty($_SESSION["error_msg"])) {
  979. exec(
  980. HESTIA_CMD . "v-add-web-domain-ssl-hsts " . $user . " " . quoteshellarg($v_domain),
  981. $output,
  982. $return_var,
  983. );
  984. check_return_code($return_var, $output);
  985. unset($output);
  986. $v_ssl_hsts = "yes";
  987. $restart_web = "yes";
  988. $restart_proxy = "yes";
  989. }
  990. // Delete Force SSL
  991. if (
  992. $v_ssl_forcessl == "yes" &&
  993. empty($_POST["v_ssl_forcessl"]) &&
  994. empty($_SESSION["error_msg"])
  995. ) {
  996. exec(
  997. HESTIA_CMD . "v-delete-web-domain-ssl-force " . $user . " " . quoteshellarg($v_domain),
  998. $output,
  999. $return_var,
  1000. );
  1001. check_return_code($return_var, $output);
  1002. unset($output);
  1003. $v_ssl_forcessl = "no";
  1004. $restart_web = "yes";
  1005. $restart_proxy = "yes";
  1006. }
  1007. // Delete SSL HSTS
  1008. if ($v_ssl_hsts == "yes" && empty($_POST["v_ssl_hsts"]) && empty($_SESSION["error_msg"])) {
  1009. exec(
  1010. HESTIA_CMD . "v-delete-web-domain-ssl-hsts " . $user . " " . quoteshellarg($v_domain),
  1011. $output,
  1012. $return_var,
  1013. );
  1014. check_return_code($return_var, $output);
  1015. unset($output);
  1016. $v_ssl_hsts = "no";
  1017. $restart_web = "yes";
  1018. $restart_proxy = "yes";
  1019. }
  1020. // Delete web stats
  1021. if (!empty($v_stats) && $_POST["v_stats"] == "none" && empty($_SESSION["error_msg"])) {
  1022. exec(
  1023. HESTIA_CMD . "v-delete-web-domain-stats " . $user . " " . quoteshellarg($v_domain),
  1024. $output,
  1025. $return_var,
  1026. );
  1027. check_return_code($return_var, $output);
  1028. unset($output);
  1029. $v_stats = "";
  1030. }
  1031. // Change web stats engine
  1032. if (!empty($v_stats) && $_POST["v_stats"] != $v_stats && empty($_SESSION["error_msg"])) {
  1033. $v_stats = quoteshellarg($_POST["v_stats"]);
  1034. exec(
  1035. HESTIA_CMD .
  1036. "v-change-web-domain-stats " .
  1037. $user .
  1038. " " .
  1039. quoteshellarg($v_domain) .
  1040. " " .
  1041. $v_stats,
  1042. $output,
  1043. $return_var,
  1044. );
  1045. check_return_code($return_var, $output);
  1046. unset($output);
  1047. }
  1048. // Add web stats
  1049. if (empty($v_stats) && $_POST["v_stats"] != "none" && empty($_SESSION["error_msg"])) {
  1050. $v_stats = quoteshellarg($_POST["v_stats"]);
  1051. exec(
  1052. HESTIA_CMD .
  1053. "v-add-web-domain-stats " .
  1054. $user .
  1055. " " .
  1056. quoteshellarg($v_domain) .
  1057. " " .
  1058. $v_stats,
  1059. $output,
  1060. $return_var,
  1061. );
  1062. check_return_code($return_var, $output);
  1063. unset($output);
  1064. }
  1065. // Delete web stats authorization
  1066. if (!empty($v_stats_user) && empty($_POST["v_stats_auth"]) && empty($_SESSION["error_msg"])) {
  1067. exec(
  1068. HESTIA_CMD . "v-delete-web-domain-stats-user " . $user . " " . quoteshellarg($v_domain),
  1069. $output,
  1070. $return_var,
  1071. );
  1072. check_return_code($return_var, $output);
  1073. unset($output);
  1074. $v_stats_user = "";
  1075. $v_stats_password = "";
  1076. }
  1077. // Change web stats user or password
  1078. if (empty($v_stats_user) && !empty($_POST["v_stats_auth"]) && empty($_SESSION["error_msg"])) {
  1079. if (empty($_POST["v_stats_user"])) {
  1080. $errors[] = _("stats username");
  1081. }
  1082. if (!empty($errors[0])) {
  1083. foreach ($errors as $i => $error) {
  1084. if ($i == 0) {
  1085. $error_msg = $error;
  1086. } else {
  1087. $error_msg = $error_msg . ", " . $error;
  1088. }
  1089. }
  1090. $_SESSION["error_msg"] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
  1091. } else {
  1092. $v_stats_user = quoteshellarg($_POST["v_stats_user"]);
  1093. $v_stats_password = tempnam("/tmp", "vst");
  1094. $fp = fopen($v_stats_password, "w");
  1095. fwrite($fp, $_POST["v_stats_password"] . "\n");
  1096. fclose($fp);
  1097. exec(
  1098. HESTIA_CMD .
  1099. "v-add-web-domain-stats-user " .
  1100. $user .
  1101. " " .
  1102. quoteshellarg($v_domain) .
  1103. " " .
  1104. $v_stats_user .
  1105. " " .
  1106. $v_stats_password,
  1107. $output,
  1108. $return_var,
  1109. );
  1110. check_return_code($return_var, $output);
  1111. unset($output);
  1112. unlink($v_stats_password);
  1113. $v_stats_password = quoteshellarg($_POST["v_stats_password"]);
  1114. }
  1115. }
  1116. // Add web stats authorization
  1117. if (!empty($v_stats_user) && !empty($_POST["v_stats_auth"]) && empty($_SESSION["error_msg"])) {
  1118. if (empty($_POST["v_stats_user"])) {
  1119. $errors[] = _("stats user");
  1120. }
  1121. if (!empty($errors[0])) {
  1122. foreach ($errors as $i => $error) {
  1123. if ($i == 0) {
  1124. $error_msg = $error;
  1125. } else {
  1126. $error_msg = $error_msg . ", " . $error;
  1127. }
  1128. }
  1129. $_SESSION["error_msg"] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
  1130. }
  1131. if (
  1132. $v_stats_user != $_POST["v_stats_user"] ||
  1133. (!empty($_POST["v_stats_password"]) && empty($_SESSION["error_msg"]))
  1134. ) {
  1135. $v_stats_user = quoteshellarg($_POST["v_stats_user"]);
  1136. $v_stats_password = tempnam("/tmp", "vst");
  1137. $fp = fopen($v_stats_password, "w");
  1138. fwrite($fp, $_POST["v_stats_password"] . "\n");
  1139. fclose($fp);
  1140. exec(
  1141. HESTIA_CMD .
  1142. "v-add-web-domain-stats-user " .
  1143. $user .
  1144. " " .
  1145. quoteshellarg($v_domain) .
  1146. " " .
  1147. $v_stats_user .
  1148. " " .
  1149. $v_stats_password,
  1150. $output,
  1151. $return_var,
  1152. );
  1153. check_return_code($return_var, $output);
  1154. unset($output);
  1155. unlink($v_stats_password);
  1156. $v_stats_password = quoteshellarg($_POST["v_stats_password"]);
  1157. }
  1158. }
  1159. // Update ftp account
  1160. if (!empty($_POST["v_ftp_user"])) {
  1161. $v_ftp_users_updated = [];
  1162. foreach ($_POST["v_ftp_user"] as $i => $v_ftp_user_data) {
  1163. if (empty($v_ftp_user_data["v_ftp_user"])) {
  1164. continue;
  1165. }
  1166. $v_ftp_user_data["v_ftp_user"] = preg_replace(
  1167. "/^" . $user . "_/i",
  1168. "",
  1169. $v_ftp_user_data["v_ftp_user"],
  1170. );
  1171. if ($v_ftp_user_data["is_new"] == 1 && !empty($_POST["v_ftp"])) {
  1172. if (
  1173. !empty($v_ftp_user_data["v_ftp_email"]) &&
  1174. !filter_var($v_ftp_user_data["v_ftp_email"], FILTER_VALIDATE_EMAIL)
  1175. ) {
  1176. $_SESSION["error_msg"] = _("Please enter valid email address.");
  1177. }
  1178. if (empty($v_ftp_user_data["v_ftp_user"])) {
  1179. $errors[] = "ftp user";
  1180. }
  1181. if (!empty($errors[0])) {
  1182. foreach ($errors as $i => $error) {
  1183. if ($i == 0) {
  1184. $error_msg = $error;
  1185. } else {
  1186. $error_msg = $error_msg . ", " . $error;
  1187. }
  1188. }
  1189. $_SESSION["error_msg"] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
  1190. }
  1191. // Add ftp account
  1192. $v_ftp_username = $v_ftp_user_data["v_ftp_user"];
  1193. $v_ftp_username_full = $user . "_" . $v_ftp_user_data["v_ftp_user"];
  1194. $v_ftp_user = quoteshellarg($v_ftp_username);
  1195. $v_ftp_path = quoteshellarg(trim($v_ftp_user_data["v_ftp_path"]));
  1196. if (empty($_SESSION["error_msg"])) {
  1197. $v_ftp_password = tempnam("/tmp", "vst");
  1198. $fp = fopen($v_ftp_password, "w");
  1199. fwrite($fp, $v_ftp_user_data["v_ftp_password"] . "\n");
  1200. fclose($fp);
  1201. exec(
  1202. HESTIA_CMD .
  1203. "v-add-web-domain-ftp " .
  1204. $user .
  1205. " " .
  1206. quoteshellarg($v_domain) .
  1207. " " .
  1208. $v_ftp_user .
  1209. " " .
  1210. $v_ftp_password .
  1211. " " .
  1212. $v_ftp_path,
  1213. $output,
  1214. $return_var,
  1215. );
  1216. check_return_code($return_var, $output);
  1217. if (!empty($v_ftp_user_data["v_ftp_email"]) && empty($_SESSION["error_msg"])) {
  1218. $to = $v_ftp_user_data["v_ftp_email"];
  1219. $subject = _("FTP login credentials");
  1220. $hostname = get_hostname();
  1221. $from = "noreply@" . $hostname;
  1222. $from_name = _("Hestia Control Panel");
  1223. $mailtext = sprintf(
  1224. _("FTP_ACCOUNT_READY"),
  1225. $v_domain,
  1226. $user_plain,
  1227. $v_ftp_username,
  1228. $v_ftp_user_data["v_ftp_password"],
  1229. );
  1230. send_email($to, $subject, $mailtext, $from, $from_name);
  1231. unset($v_ftp_email);
  1232. }
  1233. unset($output);
  1234. unlink($v_ftp_password);
  1235. $v_ftp_password = quoteshellarg($v_ftp_user_data["v_ftp_password"]);
  1236. }
  1237. if ($return_var == 0) {
  1238. $v_ftp_password = "";
  1239. $v_ftp_user_data["is_new"] = 0;
  1240. } else {
  1241. $v_ftp_user_data["is_new"] = 1;
  1242. }
  1243. $v_ftp_users_updated[] = [
  1244. "is_new" => empty($_SESSION["error_msg"]) ? 0 : 1,
  1245. "v_ftp_user" => $v_ftp_username_full,
  1246. "v_ftp_password" => $v_ftp_password,
  1247. "v_ftp_path" => $v_ftp_user_data["v_ftp_path"],
  1248. "v_ftp_email" => $v_ftp_user_data["v_ftp_email"],
  1249. "v_ftp_pre_path" => $v_ftp_user_prepath,
  1250. ];
  1251. continue;
  1252. }
  1253. // Delete FTP account
  1254. if ($v_ftp_user_data["delete"] == 1) {
  1255. $v_ftp_username = $user_plain . "_" . $v_ftp_user_data["v_ftp_user"];
  1256. exec(
  1257. HESTIA_CMD .
  1258. "v-delete-web-domain-ftp " .
  1259. $user .
  1260. " " .
  1261. quoteshellarg($v_domain) .
  1262. " " .
  1263. quoteshellarg($v_ftp_username),
  1264. $output,
  1265. $return_var,
  1266. );
  1267. check_return_code($return_var, $output);
  1268. unset($output);
  1269. continue;
  1270. }
  1271. if (!empty($_POST["v_ftp"])) {
  1272. if (empty($v_ftp_user_data["v_ftp_user"])) {
  1273. $errors[] = _("ftp user");
  1274. }
  1275. if (!empty($errors[0])) {
  1276. foreach ($errors as $i => $error) {
  1277. if ($i == 0) {
  1278. $error_msg = $error;
  1279. } else {
  1280. $error_msg = $error_msg . ", " . $error;
  1281. }
  1282. }
  1283. $_SESSION["error_msg"] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
  1284. }
  1285. // Change FTP account path
  1286. $v_ftp_username_for_emailing = $v_ftp_user_data["v_ftp_user"];
  1287. $v_ftp_username = $user_plain . "_" . $v_ftp_user_data["v_ftp_user"]; //preg_replace("/^".$user."_/", "", $v_ftp_user_data['v_ftp_user']);
  1288. $v_ftp_username = quoteshellarg($v_ftp_username);
  1289. $v_ftp_path = quoteshellarg(trim($v_ftp_user_data["v_ftp_path"]));
  1290. if (quoteshellarg(trim($v_ftp_user_data["v_ftp_path_prev"])) != $v_ftp_path) {
  1291. exec(
  1292. HESTIA_CMD .
  1293. "v-change-web-domain-ftp-path " .
  1294. $user .
  1295. " " .
  1296. quoteshellarg($v_domain) .
  1297. " " .
  1298. $v_ftp_username .
  1299. " " .
  1300. $v_ftp_path,
  1301. $output,
  1302. $return_var,
  1303. );
  1304. check_return_code($return_var, $output);
  1305. unset($output);
  1306. }
  1307. // Change FTP account password
  1308. if (!empty($v_ftp_user_data["v_ftp_password"])) {
  1309. $v_ftp_password = tempnam("/tmp", "vst");
  1310. $fp = fopen($v_ftp_password, "w");
  1311. fwrite($fp, $v_ftp_user_data["v_ftp_password"] . "\n");
  1312. fclose($fp);
  1313. exec(
  1314. HESTIA_CMD .
  1315. "v-change-web-domain-ftp-password " .
  1316. $user .
  1317. " " .
  1318. quoteshellarg($v_domain) .
  1319. " " .
  1320. $v_ftp_username .
  1321. " " .
  1322. $v_ftp_password,
  1323. $output,
  1324. $return_var,
  1325. );
  1326. unlink($v_ftp_password);
  1327. $to = $v_ftp_user_data["v_ftp_email"];
  1328. $subject = _("FTP login credentials");
  1329. $hostname = get_hostname();
  1330. $from = "noreply@" . $hostname;
  1331. $from_name = _("Hestia Control Panel");
  1332. $mailtext = sprintf(
  1333. _("FTP_ACCOUNT_READY"),
  1334. quoteshellarg($_GET["domain"]),
  1335. $user,
  1336. $v_ftp_username_for_emailing,
  1337. $v_ftp_user_data["v_ftp_password"],
  1338. );
  1339. send_email($to, $subject, $mailtext, $from, $from_name);
  1340. unset($v_ftp_email);
  1341. }
  1342. if (empty($v_ftp_user_data["v_ftp_email"])) {
  1343. $v_ftp_user_data["v_ftp_email"] = "";
  1344. }
  1345. $v_ftp_users_updated[] = [
  1346. "is_new" => 0,
  1347. "v_ftp_user" => $v_ftp_username,
  1348. "v_ftp_password" => $v_ftp_user_data["v_ftp_password"],
  1349. "v_ftp_path" => $v_ftp_user_data["v_ftp_path"],
  1350. "v_ftp_email" => $v_ftp_user_data["v_ftp_email"],
  1351. "v_ftp_pre_path" => $v_ftp_user_prepath,
  1352. ];
  1353. }
  1354. }
  1355. }
  1356. //custom docoot with check box disabled
  1357. if (!empty($v_custom_doc_root) && empty($_POST["v_custom_doc_root_check"])) {
  1358. exec(
  1359. HESTIA_CMD .
  1360. "v-change-web-domain-docroot " .
  1361. $user .
  1362. " " .
  1363. quoteshellarg($v_domain) .
  1364. " default",
  1365. $output,
  1366. $return_var,
  1367. );
  1368. check_return_code($return_var, $output);
  1369. unset($output);
  1370. unset($_POST["v-custom-doc-domain"], $_POST["v-custom-doc-folder"]);
  1371. $restart_web = "yes";
  1372. $restart_proxy = "yes";
  1373. }
  1374. if (
  1375. !empty($_POST["v-custom-doc-domain"]) &&
  1376. !empty($_POST["v_custom_doc_root_check"]) &&
  1377. $v_custom_doc_root_prepath . $v_custom_doc_domain . "/public_html" . $v_custom_doc_folder !=
  1378. $v_custom_doc_root
  1379. ) {
  1380. if ($_POST["v-custom-doc-domain"] == $v_domain && empty($_POST["v-custom-doc-folder"])) {
  1381. exec(
  1382. HESTIA_CMD .
  1383. "v-change-web-domain-docroot " .
  1384. $user .
  1385. " " .
  1386. quoteshellarg($v_domain) .
  1387. " default",
  1388. $output,
  1389. $return_var,
  1390. );
  1391. check_return_code($return_var, $output);
  1392. unset($output);
  1393. } else {
  1394. $v_custom_doc_folder = quoteshellarg(rtrim($_POST["v-custom-doc-folder"], "/"));
  1395. $v_custom_doc_domain = quoteshellarg($_POST["v-custom-doc-domain"]);
  1396. exec(
  1397. HESTIA_CMD .
  1398. "v-change-web-domain-docroot " .
  1399. $user .
  1400. " " .
  1401. quoteshellarg($v_domain) .
  1402. " " .
  1403. $v_custom_doc_domain .
  1404. " " .
  1405. $v_custom_doc_folder .
  1406. " yes",
  1407. $output,
  1408. $return_var,
  1409. );
  1410. check_return_code($return_var, $output);
  1411. unset($output);
  1412. $v_custom_doc_root = 1;
  1413. }
  1414. $restart_web = "yes";
  1415. $restart_proxy = "yes";
  1416. } else {
  1417. unset($v_custom_doc_root);
  1418. }
  1419. if (!empty($v_redirect) && empty($_POST["v-redirect-checkbox"])) {
  1420. exec(
  1421. HESTIA_CMD . "v-delete-web-domain-redirect " . $user . " " . quoteshellarg($v_domain),
  1422. $output,
  1423. $return_var,
  1424. );
  1425. check_return_code($return_var, $output);
  1426. unset($output);
  1427. unset($_POST["v-redirect"]);
  1428. $restart_web = "yes";
  1429. $restart_proxy = "yes";
  1430. }
  1431. if (!empty($_POST["v-redirect"]) && !empty($_POST["v-redirect-checkbox"])) {
  1432. if (empty($v_redirect)) {
  1433. if ($_POST["v-redirect"] == "custom" && empty($_POST["v-redirect-custom"])) {
  1434. } else {
  1435. if ($_POST["v-redirect"] == "custom") {
  1436. $_POST["v-redirect"] = $_POST["v-redirect-custom"];
  1437. }
  1438. exec(
  1439. HESTIA_CMD .
  1440. "v-add-web-domain-redirect " .
  1441. $user .
  1442. " " .
  1443. quoteshellarg($v_domain) .
  1444. " " .
  1445. quoteshellarg($_POST["v-redirect"]) .
  1446. " " .
  1447. quoteshellarg($_POST["v-redirect-code"]),
  1448. $output,
  1449. $return_var,
  1450. );
  1451. check_return_code($return_var, $output);
  1452. unset($output);
  1453. $restart_web = "yes";
  1454. $restart_proxy = "yes";
  1455. }
  1456. } else {
  1457. if ($_POST["v-redirect"] == "custom") {
  1458. $_POST["v-redirect"] = $_POST["v-redirect-custom"];
  1459. }
  1460. if (
  1461. $_POST["v-redirect"] != $v_redirect ||
  1462. $_POST["v-redirect-code"] != $v_redirect_code
  1463. ) {
  1464. exec(
  1465. HESTIA_CMD .
  1466. "v-add-web-domain-redirect " .
  1467. $user .
  1468. " " .
  1469. quoteshellarg($v_domain) .
  1470. " " .
  1471. quoteshellarg($_POST["v-redirect"]) .
  1472. " " .
  1473. quoteshellarg($_POST["v-redirect-code"]),
  1474. $output,
  1475. $return_var,
  1476. );
  1477. check_return_code($return_var, $output);
  1478. unset($output);
  1479. $restart_web = "yes";
  1480. $restart_proxy = "yes";
  1481. }
  1482. }
  1483. }
  1484. // Restart web server
  1485. if (!empty($restart_web) && empty($_SESSION["error_msg"])) {
  1486. exec(HESTIA_CMD . "v-restart-web", $output, $return_var);
  1487. check_return_code($return_var, $output);
  1488. unset($output);
  1489. }
  1490. // Restart proxy server
  1491. if (
  1492. !empty($_SESSION["PROXY_SYSTEM"]) &&
  1493. !empty($restart_proxy) &&
  1494. empty($_SESSION["error_msg"])
  1495. ) {
  1496. exec(HESTIA_CMD . "v-restart-proxy", $output, $return_var);
  1497. check_return_code($return_var, $output);
  1498. unset($output);
  1499. }
  1500. // Restart dns server
  1501. if (!empty($restart_dns) && empty($_SESSION["error_msg"])) {
  1502. exec(HESTIA_CMD . "v-restart-dns", $output, $return_var);
  1503. check_return_code($return_var, $output);
  1504. unset($output);
  1505. }
  1506. // Set success message
  1507. if (empty($_SESSION["error_msg"])) {
  1508. $_SESSION["ok_msg"] = _("Changes has been saved.");
  1509. header("Location: /edit/web/?domain=" . $v_domain);
  1510. exit();
  1511. }
  1512. }
  1513. $v_ftp_users_raw = explode(":", $v_ftp_user);
  1514. $v_ftp_users_paths_raw = explode(":", $data[$v_domain]["FTP_PATH"]);
  1515. $v_ftp_users = [];
  1516. foreach ($v_ftp_users_raw as $v_ftp_user_index => $v_ftp_user_val) {
  1517. if (empty($v_ftp_user_val)) {
  1518. continue;
  1519. }
  1520. $v_ftp_users[] = [
  1521. "is_new" => 0,
  1522. "v_ftp_user" => preg_replace("/^" . $user_plain . "_/", "", $v_ftp_user_val),
  1523. "v_ftp_password" => $v_ftp_password,
  1524. "v_ftp_path" => isset($v_ftp_users_paths_raw[$v_ftp_user_index])
  1525. ? $v_ftp_users_paths_raw[$v_ftp_user_index]
  1526. : "",
  1527. "v_ftp_email" => $v_ftp_email,
  1528. "v_ftp_pre_path" => $v_ftp_user_prepath,
  1529. ];
  1530. }
  1531. if (empty($v_ftp_users)) {
  1532. $v_ftp_user = null;
  1533. $v_ftp_users[] = [
  1534. "is_new" => 1,
  1535. "v_ftp_user" => "",
  1536. "v_ftp_password" => "",
  1537. "v_ftp_path" => isset($v_ftp_users_paths_raw[$v_ftp_user_index])
  1538. ? $v_ftp_users_paths_raw[$v_ftp_user_index]
  1539. : "",
  1540. "v_ftp_email" => "",
  1541. "v_ftp_pre_path" => $v_ftp_user_prepath,
  1542. ];
  1543. }
  1544. // set default pre path for newly created users
  1545. $v_ftp_pre_path_new_user = $v_ftp_user_prepath;
  1546. if (isset($v_ftp_users_updated)) {
  1547. $v_ftp_users = $v_ftp_users_updated;
  1548. if (empty($v_ftp_users_updated)) {
  1549. $v_ftp_user = null;
  1550. $v_ftp_users[] = [
  1551. "is_new" => 1,
  1552. "v_ftp_user" => "",
  1553. "v_ftp_password" => "",
  1554. "v_ftp_path" => isset($v_ftp_users_paths_raw[$v_ftp_user_index])
  1555. ? $v_ftp_users_paths_raw[$v_ftp_user_index]
  1556. : "",
  1557. "v_ftp_email" => "",
  1558. "v_ftp_pre_path" => $v_ftp_user_prepath,
  1559. ];
  1560. }
  1561. }
  1562. // Render page
  1563. render_page($user, $TAB, "edit_web");
  1564. // Flush session messages
  1565. unset($_SESSION["error_msg"]);
  1566. unset($_SESSION["ok_msg"]);