index.php 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034
  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(HESTIA_CMD."v-list-web-domain ".$user." ".quoteshellarg($v_domain)." json", $output, $return_var);
  25. # Check if domain exists if not return /list/web/
  26. check_return_code_redirect($return_var, $output, '/list/web/');
  27. $data = json_decode(implode('', $output), true);
  28. unset($output);
  29. // Parse domain
  30. $v_ip = $data[$v_domain]['IP'];
  31. $v_template = $data[$v_domain]['TPL'];
  32. $v_aliases = str_replace(',', "\n", $data[$v_domain]['ALIAS']);
  33. $valiases = explode(",", $data[$v_domain]['ALIAS']);
  34. $v_ssl = $data[$v_domain]['SSL'];
  35. if (!empty($v_ssl)) {
  36. exec(HESTIA_CMD."v-list-web-domain-ssl ".$user." ".quoteshellarg($v_domain)." json", $output, $return_var);
  37. $ssl_str = json_decode(implode('', $output), true);
  38. unset($output);
  39. $v_ssl_crt = $ssl_str[$v_domain]['CRT'];
  40. $v_ssl_key = $ssl_str[$v_domain]['KEY'];
  41. $v_ssl_ca = $ssl_str[$v_domain]['CA'];
  42. $v_ssl_subject = $ssl_str[$v_domain]['SUBJECT'];
  43. $v_ssl_aliases = $ssl_str[$v_domain]['ALIASES'];
  44. $v_ssl_not_before = $ssl_str[$v_domain]['NOT_BEFORE'];
  45. $v_ssl_not_after = $ssl_str[$v_domain]['NOT_AFTER'];
  46. $v_ssl_signature = $ssl_str[$v_domain]['SIGNATURE'];
  47. $v_ssl_pub_key = $ssl_str[$v_domain]['PUB_KEY'];
  48. $v_ssl_issuer = $ssl_str[$v_domain]['ISSUER'];
  49. $v_ssl_forcessl = $data[$v_domain]['SSL_FORCE'];
  50. $v_ssl_hsts = $data[$v_domain]['SSL_HSTS'];
  51. }
  52. $v_letsencrypt = $data[$v_domain]['LETSENCRYPT'];
  53. if (empty($v_letsencrypt)) {
  54. $v_letsencrypt = 'no';
  55. }
  56. $v_ssl_home = $data[$v_domain]['SSL_HOME'];
  57. $v_backend_template = $data[$v_domain]['BACKEND'];
  58. $v_nginx_cache = $data[$v_domain]['FASTCGI_CACHE'];
  59. $v_nginx_cache_duration = $data[$v_domain]['FASTCGI_DURATION'];
  60. $v_nginx_cache_check = '';
  61. if (empty($v_nginx_cache_duration)) {
  62. $v_nginx_cache_duration = '2m';
  63. $v_nginx_cache_check = '';
  64. } else {
  65. $v_nginx_cache_check = 'on';
  66. }
  67. $v_proxy = $data[$v_domain]['PROXY'];
  68. $v_proxy_template = $data[$v_domain]['PROXY'];
  69. $v_proxy_ext = str_replace(',', ', ', $data[$v_domain]['PROXY_EXT']);
  70. $v_stats = $data[$v_domain]['STATS'];
  71. $v_stats_user = $data[$v_domain]['STATS_USER'];
  72. $v_stats_password = "";
  73. $v_custom_doc_root_prepath = '/home/'.$user_plain.'/web/';
  74. $v_custom_doc_root = '';
  75. $v_custom_doc_domain = '';
  76. $v_custom_doc_folder = '';
  77. if (!empty($data[$v_domain]['CUSTOM_DOCROOT'])) {
  78. $v_custom_doc_root = realpath($data[$v_domain]['CUSTOM_DOCROOT']) . DIRECTORY_SEPARATOR;
  79. }
  80. if (!empty($v_custom_doc_root) &&
  81. false !== preg_match('/\/home\/'.$user_plain.'\/web\/([[:alnum:]].*?)\/public_html\/([[:alnum:]].*)?/', $v_custom_doc_root, $matches)) {
  82. // Regex for extracting target web domain and custom document root. Regex test: https://regex101.com/r/2CLvIF/1
  83. if (!empty($matches[1])) {
  84. $v_custom_doc_domain = $matches[1];
  85. }
  86. if (!empty($matches[2])) {
  87. $v_custom_doc_folder = rtrim($matches[2], '/');
  88. }
  89. if ($v_custom_doc_domain && !in_array($v_custom_doc_domain, $user_domains)) {
  90. $v_custom_doc_domain = '';
  91. $v_custom_doc_folder = '';
  92. }
  93. }
  94. $redirect_code_options = array(301,302);
  95. $v_redirect = $data[$v_domain]['REDIRECT'];
  96. $v_redirect_code = $data[$v_domain]['REDIRECT_CODE'];
  97. if (!in_array($v_redirect, array('www.'.$v_domain, $v_domain))) {
  98. $v_redirect_custom = $v_redirect;
  99. }
  100. $v_ftp_user = $data[$v_domain]['FTP_USER'];
  101. $v_ftp_path = $data[$v_domain]['FTP_PATH'];
  102. if (!empty($v_ftp_user)) {
  103. $v_ftp_password = "";
  104. }
  105. if (isset($v_custom_doc_domain) && $v_custom_doc_domain != '') {
  106. $v_ftp_user_prepath = '/home/'.$user_plain.'/web/'.$v_custom_doc_domain;
  107. } else {
  108. $v_ftp_user_prepath = '/home/'.$user_plain.'/web/'.$v_domain;
  109. }
  110. //$v_ftp_email = $panel[$user]['CONTACT'];
  111. $v_ftp_email = '';
  112. $v_suspended = $data[$v_domain]['SUSPENDED'];
  113. if ($v_suspended == 'yes') {
  114. $v_status = 'suspended';
  115. } else {
  116. $v_status = 'active';
  117. }
  118. $v_time = $data[$v_domain]['TIME'];
  119. $v_date = $data[$v_domain]['DATE'];
  120. // List ip addresses
  121. exec(HESTIA_CMD."v-list-user-ips ".$user." json", $output, $return_var);
  122. $ips = json_decode(implode('', $output), true);
  123. unset($output);
  124. $v_ip_public = empty($ips[$v_ip]['NAT']) ? $v_ip : $ips[$v_ip]['NAT'];
  125. // List web templates
  126. exec(HESTIA_CMD."v-list-web-templates json", $output, $return_var);
  127. $templates = json_decode(implode('', $output), true);
  128. unset($output);
  129. // List backend templates
  130. if (!empty($_SESSION['WEB_BACKEND'])) {
  131. exec(HESTIA_CMD."v-list-web-templates-backend json", $output, $return_var);
  132. $backend_templates = json_decode(implode('', $output), true);
  133. unset($output);
  134. }
  135. // List proxy templates
  136. if (!empty($_SESSION['PROXY_SYSTEM'])) {
  137. exec(HESTIA_CMD."v-list-web-templates-proxy json", $output, $return_var);
  138. $proxy_templates = json_decode(implode('', $output), true);
  139. unset($output);
  140. }
  141. // List web stat engines
  142. exec(HESTIA_CMD."v-list-web-stats json", $output, $return_var);
  143. $stats = json_decode(implode('', $output), true);
  144. unset($output);
  145. // Check POST request
  146. if (!empty($_POST['save'])) {
  147. $v_domain = $_POST['v_domain'];
  148. if (!in_array($v_domain, $user_domains)) {
  149. check_return_code(3, ["Unknown domain"]);
  150. }
  151. // Check token
  152. verify_csrf($_POST);
  153. // Change web domain IP
  154. $v_newip='';
  155. $v_newip_public='';
  156. if (!empty($_POST['v_ip'])) {
  157. $v_newip = $_POST['v_ip'];
  158. $v_newip_public = empty($ips[$v_newip]['NAT']) ? $v_newip : $ips[$v_newip]['NAT'];
  159. }
  160. if (($v_ip != $_POST['v_ip']) && (empty($_SESSION['error_msg']))) {
  161. exec(HESTIA_CMD."v-change-web-domain-ip ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($_POST['v_ip'])." 'no'", $output, $return_var);
  162. check_return_code($return_var, $output);
  163. $restart_web = 'yes';
  164. $restart_proxy = 'yes';
  165. unset($output);
  166. }
  167. // Change dns domain IP
  168. if (($v_ip != $_POST['v_ip']) && (empty($_SESSION['error_msg']))) {
  169. exec(HESTIA_CMD."v-list-dns-domain ".$user." ".quoteshellarg($v_domain)." json", $output, $return_var);
  170. unset($output);
  171. if ($return_var == 0) {
  172. exec(HESTIA_CMD."v-change-dns-domain-ip ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($v_newip_public)." 'no'", $output, $return_var);
  173. check_return_code($return_var, $output);
  174. unset($output);
  175. $restart_dns = 'yes';
  176. }
  177. }
  178. // Change dns ip for each alias
  179. if (($v_ip != $_POST['v_ip']) && (empty($_SESSION['error_msg']))) {
  180. foreach ($valiases as $v_alias) {
  181. exec(HESTIA_CMD."v-list-dns-domain ".$user." ".quoteshellarg($v_alias)." json", $output, $return_var);
  182. unset($output);
  183. if ($return_var == 0) {
  184. exec(HESTIA_CMD."v-change-dns-domain-ip ".$user." ".quoteshellarg($v_alias)." ".quoteshellarg($v_newip_public), $output, $return_var);
  185. check_return_code($return_var, $output);
  186. unset($output);
  187. $restart_dns = 'yes';
  188. }
  189. }
  190. }
  191. // Change mail domain IP
  192. if (($v_ip != $_POST['v_ip']) && (empty($_SESSION['error_msg']))) {
  193. exec(HESTIA_CMD."v-list-mail-domain ".$user." ".quoteshellarg($v_domain)." json", $output, $return_var);
  194. unset($output);
  195. if ($return_var == 0) {
  196. exec(HESTIA_CMD."v-rebuild-mail-domain ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  197. check_return_code($return_var, $output);
  198. unset($output);
  199. $restart_email = 'yes';
  200. }
  201. }
  202. if (($_SESSION['POLICY_USER_EDIT_WEB_TEMPLATES'] == 'yes') || ($_SESSION['userContext'] === "admin")) {
  203. // Change template
  204. if (($v_template != $_POST['v_template']) && (empty($_SESSION['error_msg']))) {
  205. exec(HESTIA_CMD."v-change-web-domain-tpl ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($_POST['v_template'])." 'no'", $output, $return_var);
  206. check_return_code($return_var, $output);
  207. unset($output);
  208. $restart_web = 'yes';
  209. }
  210. // Change backend template
  211. if ((!empty($_SESSION['WEB_BACKEND'])) && ($v_backend_template != $_POST['v_backend_template']) && (empty($_SESSION['error_msg']))) {
  212. $v_backend_template = $_POST['v_backend_template'];
  213. exec(HESTIA_CMD."v-change-web-domain-backend-tpl ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($v_backend_template), $output, $return_var);
  214. check_return_code($return_var, $output);
  215. unset($output);
  216. }
  217. // Enable/Disable nginx cache
  218. if (empty($_POST['v_nginx_cache_check'])) {
  219. $_POST['v_nginx_cache_check'] = '';
  220. }
  221. if (($_SESSION['WEB_SYSTEM'] == 'nginx') && ($v_nginx_cache_check != $_POST['v_nginx_cache_check']) || ($v_nginx_cache_duration != $_POST['v_nginx_cache_duration'] && $_POST['v_nginx_cache'] = "yes") && (empty($_SESSION['error_msg']))) {
  222. if ($_POST['v_nginx_cache_check'] == 'on') {
  223. if (empty($_POST['v_nginx_cache_duration'])) {
  224. $_POST['v_nginx_cache_duration'] = "2m";
  225. }
  226. exec(HESTIA_CMD."v-add-fastcgi-cache ".$user." ".quoteshellarg($v_domain).' '. quoteshellarg($_POST['v_nginx_cache_duration']), $output, $return_var);
  227. check_return_code($return_var, $output);
  228. unset($output);
  229. } else {
  230. exec(HESTIA_CMD."v-delete-fastcgi-cache ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  231. check_return_code($return_var, $output);
  232. unset($output);
  233. }
  234. $restart_web = 'yes';
  235. }
  236. // Delete proxy support
  237. if ((!empty($_SESSION['PROXY_SYSTEM'])) && (!empty($v_proxy)) && (empty($_POST['v_proxy'])) && (empty($_SESSION['error_msg']))) {
  238. exec(HESTIA_CMD."v-delete-web-domain-proxy ".$user." ".quoteshellarg($v_domain)." 'no'", $output, $return_var);
  239. check_return_code($return_var, $output);
  240. unset($output);
  241. unset($v_proxy);
  242. $restart_web = 'yes';
  243. }
  244. // Change proxy template / Update extension list
  245. if ((!empty($_SESSION['PROXY_SYSTEM'])) && (!empty($v_proxy)) && (!empty($_POST['v_proxy'])) && (empty($_SESSION['error_msg']))) {
  246. $ext = preg_replace("/\n/", " ", $_POST['v_proxy_ext']);
  247. $ext = preg_replace("/,/", " ", $ext);
  248. $ext = preg_replace('/\s+/', ' ', $ext);
  249. $ext = trim($ext);
  250. $ext = str_replace(' ', ", ", $ext);
  251. if (($v_proxy_template != $_POST['v_proxy_template']) || ($v_proxy_ext != $ext)) {
  252. $ext = str_replace(', ', ",", $ext);
  253. if (!empty($_POST['v_proxy_template'])) {
  254. $v_proxy_template = $_POST['v_proxy_template'];
  255. }
  256. exec(HESTIA_CMD."v-change-web-domain-proxy-tpl ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($v_proxy_template)." ".quoteshellarg($ext)." 'no'", $output, $return_var);
  257. check_return_code($return_var, $output);
  258. $v_proxy_ext = str_replace(',', ', ', $ext);
  259. unset($output);
  260. $restart_proxy = 'yes';
  261. }
  262. }
  263. // Add proxy support
  264. if ((!empty($_SESSION['PROXY_SYSTEM'])) && (empty($v_proxy)) && (!empty($_POST['v_proxy'])) && (empty($_SESSION['error_msg']))) {
  265. $v_proxy_template = $_POST['v_proxy_template'];
  266. if (!empty($_POST['v_proxy_ext'])) {
  267. $ext = preg_replace("/\n/", " ", $_POST['v_proxy_ext']);
  268. $ext = preg_replace("/,/", " ", $ext);
  269. $ext = preg_replace('/\s+/', ' ', $ext);
  270. $ext = trim($ext);
  271. $ext = str_replace(' ', ",", $ext);
  272. $v_proxy_ext = str_replace(',', ', ', $ext);
  273. }
  274. exec(HESTIA_CMD."v-add-web-domain-proxy ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($v_proxy_template)." ".quoteshellarg($ext)." 'no'", $output, $return_var);
  275. check_return_code($return_var, $output);
  276. unset($output);
  277. $restart_proxy = 'yes';
  278. }
  279. }
  280. // Change aliases
  281. if (empty($_SESSION['error_msg'])) {
  282. $waliases = preg_replace("/\n/", " ", $_POST['v_aliases']);
  283. $waliases = preg_replace("/,/", " ", $waliases);
  284. $waliases = preg_replace('/\s+/', ' ', $waliases);
  285. $waliases = trim($waliases);
  286. $aliases = explode(" ", $waliases);
  287. $v_aliases = str_replace(' ', "\n", $waliases);
  288. $result = array_diff($valiases, $aliases);
  289. foreach ($result as $alias) {
  290. if ((empty($_SESSION['error_msg'])) && (!empty($alias))) {
  291. $restart_web = 'yes';
  292. $restart_proxy = 'yes';
  293. exec(HESTIA_CMD."v-delete-web-domain-alias ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($alias)." 'no'", $output, $return_var);
  294. check_return_code($return_var, $output);
  295. unset($output);
  296. if (empty($_SESSION['error_msg'])) {
  297. exec(HESTIA_CMD."v-list-dns-domain ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  298. unset($output);
  299. if ($return_var == 0) {
  300. exec(HESTIA_CMD."v-delete-dns-on-web-alias ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($alias)." 'no'", $output, $return_var);
  301. check_return_code($return_var, $output);
  302. unset($output);
  303. $restart_dns = 'yes';
  304. }
  305. }
  306. }
  307. }
  308. $result = array_diff($aliases, $valiases);
  309. foreach ($result as $alias) {
  310. if ((empty($_SESSION['error_msg'])) && (!empty($alias))) {
  311. $restart_web = 'yes';
  312. $restart_proxy = 'yes';
  313. exec(HESTIA_CMD."v-add-web-domain-alias ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($alias)." 'no'", $output, $return_var);
  314. check_return_code($return_var, $output);
  315. unset($output);
  316. if (empty($_SESSION['error_msg'])) {
  317. exec(HESTIA_CMD."v-list-dns-domain ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  318. unset($output);
  319. if ($return_var == 0) {
  320. exec(HESTIA_CMD."v-add-dns-on-web-alias ".$user." ".quoteshellarg($alias)." ".quoteshellarg($v_newip_public ?: $v_ip_public)." no", $output, $return_var);
  321. check_return_code($return_var, $output);
  322. unset($output);
  323. $restart_dns = 'yes';
  324. }
  325. }
  326. }
  327. }
  328. // Regenerate LE if aliases are different
  329. if ((!empty($_POST['v_ssl'])) && ($v_letsencrypt == 'yes') && (!empty($_POST['v_letsencrypt'])) && empty($_SESSION['error_msg'])) {
  330. // If aliases are different from stored aliases
  331. if (array_diff($valiases, $aliases) || array_diff($aliases, $valiases)) {
  332. // Add certificate with new aliases
  333. $l_aliases = str_replace("\n", ',', $v_aliases);
  334. exec(HESTIA_CMD."v-add-letsencrypt-domain ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($l_aliases)." ''", $output, $return_var);
  335. check_return_code($return_var, $output);
  336. unset($output);
  337. $v_letsencrypt = 'yes';
  338. $v_ssl = 'yes';
  339. $restart_web = 'yes';
  340. $restart_proxy = 'yes';
  341. exec(HESTIA_CMD."v-list-web-domain-ssl ".$user." ".quoteshellarg($v_domain)." json", $output, $return_var);
  342. $ssl_str = json_decode(implode('', $output), true);
  343. unset($output);
  344. $v_ssl_crt = $ssl_str[$v_domain]['CRT'];
  345. $v_ssl_key = $ssl_str[$v_domain]['KEY'];
  346. $v_ssl_ca = $ssl_str[$v_domain]['CA'];
  347. $v_ssl_subject = $ssl_str[$v_domain]['SUBJECT'];
  348. $v_ssl_aliases = $ssl_str[$v_domain]['ALIASES'];
  349. $v_ssl_not_before = $ssl_str[$v_domain]['NOT_BEFORE'];
  350. $v_ssl_not_after = $ssl_str[$v_domain]['NOT_AFTER'];
  351. $v_ssl_signature = $ssl_str[$v_domain]['SIGNATURE'];
  352. $v_ssl_pub_key = $ssl_str[$v_domain]['PUB_KEY'];
  353. $v_ssl_issuer = $ssl_str[$v_domain]['ISSUER'];
  354. }
  355. }
  356. if ((!empty($v_stats)) && ($_POST['v_stats'] == $v_stats) && (empty($_SESSION['error_msg']))) {
  357. // Update statistics configuration when changing domain aliases
  358. $v_stats = quoteshellarg($_POST['v_stats']);
  359. exec(HESTIA_CMD."v-change-web-domain-stats ".$user." ".quoteshellarg($v_domain)." ".$v_stats, $output, $return_var);
  360. check_return_code($return_var, $output);
  361. unset($output);
  362. }
  363. }
  364. // Change document root for ssl domain
  365. if (($v_ssl == 'yes') && (!empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
  366. if ($v_ssl_home != $_POST['v_ssl_home']) {
  367. $v_ssl_home = quoteshellarg($_POST['v_ssl_home']);
  368. exec(HESTIA_CMD."v-change-web-domain-sslhome ".$user." ".quoteshellarg($v_domain)." ".$v_ssl_home." 'no'", $output, $return_var);
  369. check_return_code($return_var, $output);
  370. $v_ssl_home = $_POST['v_ssl_home'];
  371. $restart_web = 'yes';
  372. $restart_proxy = 'yes';
  373. unset($output);
  374. }
  375. }
  376. // Change SSL certificate
  377. if (($v_letsencrypt == 'no') && (empty($_POST['v_letsencrypt'])) && ($v_ssl == 'yes') && (!empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
  378. if (($v_ssl_crt != str_replace("\r\n", "\n", $_POST['v_ssl_crt'])) || ($v_ssl_key != str_replace("\r\n", "\n", $_POST['v_ssl_key'])) || ($v_ssl_ca != str_replace("\r\n", "\n", $_POST['v_ssl_ca']))) {
  379. exec('mktemp -d', $mktemp_output, $return_var);
  380. $tmpdir = $mktemp_output[0];
  381. // Certificate
  382. if (!empty($_POST['v_ssl_crt'])) {
  383. $fp = fopen($tmpdir."/".$v_domain.".crt", 'w');
  384. fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_crt']));
  385. fwrite($fp, "\n");
  386. fclose($fp);
  387. }
  388. // Key
  389. if (!empty($_POST['v_ssl_key'])) {
  390. $fp = fopen($tmpdir."/".$v_domain.".key", 'w');
  391. fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_key']));
  392. fwrite($fp, "\n");
  393. fclose($fp);
  394. }
  395. // CA
  396. if (!empty($_POST['v_ssl_ca'])) {
  397. $fp = fopen($tmpdir."/".$v_domain.".ca", 'w');
  398. fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_ca']));
  399. fwrite($fp, "\n");
  400. fclose($fp);
  401. }
  402. exec(HESTIA_CMD."v-change-web-domain-sslcert ".$user." ".quoteshellarg($v_domain)." ".$tmpdir." 'no'", $output, $return_var);
  403. check_return_code($return_var, $output);
  404. unset($output);
  405. $restart_web = 'yes';
  406. $restart_proxy = 'yes';
  407. exec(HESTIA_CMD."v-list-web-domain-ssl ".$user." ".quoteshellarg($v_domain)." json", $output, $return_var);
  408. $ssl_str = json_decode(implode('', $output), true);
  409. unset($output);
  410. $v_ssl_crt = $ssl_str[$v_domain]['CRT'];
  411. $v_ssl_key = $ssl_str[$v_domain]['KEY'];
  412. $v_ssl_ca = $ssl_str[$v_domain]['CA'];
  413. $v_ssl_subject = $ssl_str[$v_domain]['SUBJECT'];
  414. $v_ssl_aliases = $ssl_str[$v_domain]['ALIASES'];
  415. $v_ssl_not_before = $ssl_str[$v_domain]['NOT_BEFORE'];
  416. $v_ssl_not_after = $ssl_str[$v_domain]['NOT_AFTER'];
  417. $v_ssl_signature = $ssl_str[$v_domain]['SIGNATURE'];
  418. $v_ssl_pub_key = $ssl_str[$v_domain]['PUB_KEY'];
  419. $v_ssl_issuer = $ssl_str[$v_domain]['ISSUER'];
  420. // Cleanup certificate tempfiles
  421. if (!empty($_POST['v_ssl_crt'])) {
  422. unlink($tmpdir."/".$v_domain.".crt");
  423. }
  424. if (!empty($_POST['v_ssl_key'])) {
  425. unlink($tmpdir."/".$v_domain.".key");
  426. }
  427. if (!empty($_POST['v_ssl_ca'])) {
  428. unlink($tmpdir."/".$v_domain.".ca");
  429. }
  430. rmdir($tmpdir);
  431. }
  432. }
  433. // Delete Lets Encrypt support
  434. if (($v_letsencrypt == 'yes') && (empty($_POST['v_letsencrypt']) || empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
  435. exec(HESTIA_CMD."v-delete-letsencrypt-domain ".$user." ".quoteshellarg($v_domain)." ''", $output, $return_var);
  436. check_return_code($return_var, $output);
  437. unset($output);
  438. $v_ssl_crt = '';
  439. $v_ssl_key = '';
  440. $v_ssl_ca = '';
  441. $v_letsencrypt = 'no';
  442. $v_letsencrypt_deleted = 'yes';
  443. $v_ssl = 'no';
  444. $restart_web = 'yes';
  445. $restart_proxy = 'yes';
  446. }
  447. // Delete SSL certificate
  448. if (($v_ssl == 'yes') && (empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
  449. exec(HESTIA_CMD."v-delete-web-domain-ssl ".$user." ".quoteshellarg($v_domain)." 'no'", $output, $return_var);
  450. check_return_code($return_var, $output);
  451. unset($output);
  452. $v_ssl_crt = '';
  453. $v_ssl_key = '';
  454. $v_ssl_ca = '';
  455. $v_ssl = 'no';
  456. $v_ssl_forcessl = 'no';
  457. $v_ssl_hsts = 'no';
  458. $restart_web = 'yes';
  459. $restart_proxy = 'yes';
  460. }
  461. // Add Lets Encrypt support
  462. if ((!empty($_POST['v_ssl'])) && ($v_letsencrypt == 'no') && (!empty($_POST['v_letsencrypt'])) && empty($_SESSION['error_msg'])) {
  463. $l_aliases = str_replace("\n", ',', $v_aliases);
  464. exec(HESTIA_CMD."v-add-letsencrypt-domain ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($l_aliases)." ''", $output, $return_var);
  465. check_return_code($return_var, $output);
  466. unset($output);
  467. if ($return_var != 0) {
  468. $v_letsencrypt = 'no';
  469. } else {
  470. $v_letsencrypt = 'yes';
  471. }
  472. $v_ssl = 'yes';
  473. if ($_POST['v_ssl_forcessl'] == 'on') {
  474. $v_ssl_forcessl = 'yes';
  475. } else {
  476. $v_ssl_forcessl = 'no';
  477. }
  478. $restart_web = 'yes';
  479. $restart_proxy = 'yes';
  480. }
  481. // Add SSL certificate
  482. if (($v_ssl == 'no') && (!empty($_POST['v_ssl'])) && (empty($v_letsencrypt_deleted)) && (empty($_SESSION['error_msg']))) {
  483. if (empty($_POST['v_ssl_crt'])) {
  484. $errors[] = 'ssl certificate';
  485. }
  486. if (empty($_POST['v_ssl_key'])) {
  487. $errors[] = 'ssl key';
  488. }
  489. if (empty($_POST['v_ssl_home'])) {
  490. $errors[] = 'ssl home';
  491. }
  492. $v_ssl_home = quoteshellarg($_POST['v_ssl_home']);
  493. if (!empty($errors[0])) {
  494. foreach ($errors as $i => $error) {
  495. if ($i == 0) {
  496. $error_msg = $error;
  497. } else {
  498. $error_msg = $error_msg.", ".$error;
  499. }
  500. }
  501. $_SESSION['error_msg'] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
  502. } else {
  503. exec('mktemp -d', $mktemp_output, $return_var);
  504. $tmpdir = $mktemp_output[0];
  505. // Certificate
  506. if (!empty($_POST['v_ssl_crt'])) {
  507. $fp = fopen($tmpdir."/".$v_domain.".crt", 'w');
  508. fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_crt']));
  509. fclose($fp);
  510. }
  511. // Key
  512. if (!empty($_POST['v_ssl_key'])) {
  513. $fp = fopen($tmpdir."/".$v_domain.".key", 'w');
  514. fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_key']));
  515. fclose($fp);
  516. }
  517. // CA
  518. if (!empty($_POST['v_ssl_ca'])) {
  519. $fp = fopen($tmpdir."/".$v_domain.".ca", 'w');
  520. fwrite($fp, str_replace("\r\n", "\n", $_POST['v_ssl_ca']));
  521. fclose($fp);
  522. }
  523. exec(HESTIA_CMD."v-add-web-domain-ssl ".$user." ".quoteshellarg($v_domain)." ".$tmpdir." ".$v_ssl_home." 'no'", $output, $return_var);
  524. check_return_code($return_var, $output);
  525. unset($output);
  526. $v_ssl = 'yes';
  527. $restart_web = 'yes';
  528. $restart_proxy = 'yes';
  529. exec(HESTIA_CMD."v-list-web-domain-ssl ".$user." ".quoteshellarg($v_domain)." json", $output, $return_var);
  530. $ssl_str = json_decode(implode('', $output), true);
  531. unset($output);
  532. $v_ssl_crt = $ssl_str[$v_domain]['CRT'];
  533. $v_ssl_key = $ssl_str[$v_domain]['KEY'];
  534. $v_ssl_ca = $ssl_str[$v_domain]['CA'];
  535. $v_ssl_subject = $ssl_str[$v_domain]['SUBJECT'];
  536. $v_ssl_aliases = $ssl_str[$v_domain]['ALIASES'];
  537. $v_ssl_not_before = $ssl_str[$v_domain]['NOT_BEFORE'];
  538. $v_ssl_not_after = $ssl_str[$v_domain]['NOT_AFTER'];
  539. $v_ssl_signature = $ssl_str[$v_domain]['SIGNATURE'];
  540. $v_ssl_pub_key = $ssl_str[$v_domain]['PUB_KEY'];
  541. $v_ssl_issuer = $ssl_str[$v_domain]['ISSUER'];
  542. // Cleanup certificate tempfiles
  543. if (!empty($_POST['v_ssl_crt'])) {
  544. unlink($tmpdir."/".$v_domain.".crt");
  545. }
  546. if (!empty($_POST['v_ssl_key'])) {
  547. unlink($tmpdir."/".$v_domain.".key");
  548. }
  549. if (!empty($_POST['v_ssl_ca'])) {
  550. unlink($tmpdir."/".$v_domain.".ca");
  551. }
  552. rmdir($tmpdir);
  553. }
  554. }
  555. // Add Force SSL
  556. if ((!empty($_POST['v_ssl_forcessl'])) && (!empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
  557. exec(HESTIA_CMD."v-add-web-domain-ssl-force ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  558. check_return_code($return_var, $output);
  559. unset($output);
  560. $v_ssl_forcessl = 'yes';
  561. $restart_web = 'yes';
  562. $restart_proxy = 'yes';
  563. }
  564. // Add SSL HSTS
  565. if ((!empty($_POST['v_ssl_hsts'])) && (!empty($_POST['v_ssl'])) && (empty($_SESSION['error_msg']))) {
  566. exec(HESTIA_CMD."v-add-web-domain-ssl-hsts ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  567. check_return_code($return_var, $output);
  568. unset($output);
  569. $v_ssl_hsts = 'yes';
  570. $restart_web = 'yes';
  571. $restart_proxy = 'yes';
  572. }
  573. // Delete Force SSL
  574. if (($v_ssl_forcessl == 'yes') && (empty($_POST['v_ssl_forcessl'])) && (empty($_SESSION['error_msg']))) {
  575. exec(HESTIA_CMD."v-delete-web-domain-ssl-force ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  576. check_return_code($return_var, $output);
  577. unset($output);
  578. $v_ssl_forcessl = 'no';
  579. $restart_web = 'yes';
  580. $restart_proxy = 'yes';
  581. }
  582. // Delete SSL HSTS
  583. if (($v_ssl_hsts == 'yes') && (empty($_POST['v_ssl_hsts'])) && (empty($_SESSION['error_msg']))) {
  584. exec(HESTIA_CMD."v-delete-web-domain-ssl-hsts ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  585. check_return_code($return_var, $output);
  586. unset($output);
  587. $v_ssl_hsts = 'no';
  588. $restart_web = 'yes';
  589. $restart_proxy = 'yes';
  590. }
  591. // Delete web stats
  592. if ((!empty($v_stats)) && ($_POST['v_stats'] == 'none') && (empty($_SESSION['error_msg']))) {
  593. exec(HESTIA_CMD."v-delete-web-domain-stats ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  594. check_return_code($return_var, $output);
  595. unset($output);
  596. $v_stats = '';
  597. }
  598. // Change web stats engine
  599. if ((!empty($v_stats)) && ($_POST['v_stats'] != $v_stats) && (empty($_SESSION['error_msg']))) {
  600. $v_stats = quoteshellarg($_POST['v_stats']);
  601. exec(HESTIA_CMD."v-change-web-domain-stats ".$user." ".quoteshellarg($v_domain)." ".$v_stats, $output, $return_var);
  602. check_return_code($return_var, $output);
  603. unset($output);
  604. }
  605. // Add web stats
  606. if ((empty($v_stats)) && ($_POST['v_stats'] != 'none') && (empty($_SESSION['error_msg']))) {
  607. $v_stats = quoteshellarg($_POST['v_stats']);
  608. exec(HESTIA_CMD."v-add-web-domain-stats ".$user." ".quoteshellarg($v_domain)." ".$v_stats, $output, $return_var);
  609. check_return_code($return_var, $output);
  610. unset($output);
  611. }
  612. // Delete web stats authorization
  613. if ((!empty($v_stats_user)) && (empty($_POST['v_stats_auth'])) && (empty($_SESSION['error_msg']))) {
  614. exec(HESTIA_CMD."v-delete-web-domain-stats-user ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  615. check_return_code($return_var, $output);
  616. unset($output);
  617. $v_stats_user = '';
  618. $v_stats_password = '';
  619. }
  620. // Change web stats user or password
  621. if ((empty($v_stats_user)) && (!empty($_POST['v_stats_auth'])) && (empty($_SESSION['error_msg']))) {
  622. if (empty($_POST['v_stats_user'])) {
  623. $errors[] = _('stats username');
  624. }
  625. if (!empty($errors[0])) {
  626. foreach ($errors as $i => $error) {
  627. if ($i == 0) {
  628. $error_msg = $error;
  629. } else {
  630. $error_msg = $error_msg.", ".$error;
  631. }
  632. }
  633. $_SESSION['error_msg'] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
  634. } else {
  635. $v_stats_user = quoteshellarg($_POST['v_stats_user']);
  636. $v_stats_password = tempnam("/tmp", "vst");
  637. $fp = fopen($v_stats_password, "w");
  638. fwrite($fp, $_POST['v_stats_password']."\n");
  639. fclose($fp);
  640. exec(HESTIA_CMD."v-add-web-domain-stats-user ".$user." ".quoteshellarg($v_domain)." ".$v_stats_user." ".$v_stats_password, $output, $return_var);
  641. check_return_code($return_var, $output);
  642. unset($output);
  643. unlink($v_stats_password);
  644. $v_stats_password = quoteshellarg($_POST['v_stats_password']);
  645. }
  646. }
  647. // Add web stats authorization
  648. if ((!empty($v_stats_user)) && (!empty($_POST['v_stats_auth'])) && (empty($_SESSION['error_msg']))) {
  649. if (empty($_POST['v_stats_user'])) {
  650. $errors[] = _('stats user');
  651. }
  652. if (!empty($errors[0])) {
  653. foreach ($errors as $i => $error) {
  654. if ($i == 0) {
  655. $error_msg = $error;
  656. } else {
  657. $error_msg = $error_msg.", ".$error;
  658. }
  659. }
  660. $_SESSION['error_msg'] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
  661. }
  662. if (($v_stats_user != $_POST['v_stats_user']) || (!empty($_POST['v_stats_password'])) && (empty($_SESSION['error_msg']))) {
  663. $v_stats_user = quoteshellarg($_POST['v_stats_user']);
  664. $v_stats_password = tempnam("/tmp", "vst");
  665. $fp = fopen($v_stats_password, "w");
  666. fwrite($fp, $_POST['v_stats_password']."\n");
  667. fclose($fp);
  668. exec(HESTIA_CMD."v-add-web-domain-stats-user ".$user." ".quoteshellarg($v_domain)." ".$v_stats_user." ".$v_stats_password, $output, $return_var);
  669. check_return_code($return_var, $output);
  670. unset($output);
  671. unlink($v_stats_password);
  672. $v_stats_password = quoteshellarg($_POST['v_stats_password']);
  673. }
  674. }
  675. // Update ftp account
  676. if (!empty($_POST['v_ftp_user'])) {
  677. $v_ftp_users_updated = array();
  678. foreach ($_POST['v_ftp_user'] as $i => $v_ftp_user_data) {
  679. if (empty($v_ftp_user_data['v_ftp_user'])) {
  680. continue;
  681. }
  682. $v_ftp_user_data['v_ftp_user'] = preg_replace("/^".$user."_/i", "", $v_ftp_user_data['v_ftp_user']);
  683. if ($v_ftp_user_data['is_new'] == 1 && !empty($_POST['v_ftp'])) {
  684. if ((!empty($v_ftp_user_data['v_ftp_email'])) && (!filter_var($v_ftp_user_data['v_ftp_email'], FILTER_VALIDATE_EMAIL))) {
  685. $_SESSION['error_msg'] = _('Please enter valid email address.');
  686. }
  687. if (empty($v_ftp_user_data['v_ftp_user'])) {
  688. $errors[] = 'ftp user';
  689. }
  690. if (!empty($errors[0])) {
  691. foreach ($errors as $i => $error) {
  692. if ($i == 0) {
  693. $error_msg = $error;
  694. } else {
  695. $error_msg = $error_msg.", ".$error;
  696. }
  697. }
  698. $_SESSION['error_msg'] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
  699. }
  700. // Add ftp account
  701. $v_ftp_username = $v_ftp_user_data['v_ftp_user'];
  702. $v_ftp_username_full = $user . '_' . $v_ftp_user_data['v_ftp_user'];
  703. $v_ftp_user = quoteshellarg($v_ftp_username);
  704. $v_ftp_path = quoteshellarg(trim($v_ftp_user_data['v_ftp_path']));
  705. if (empty($_SESSION['error_msg'])) {
  706. $v_ftp_password = tempnam("/tmp", "vst");
  707. $fp = fopen($v_ftp_password, "w");
  708. fwrite($fp, $v_ftp_user_data['v_ftp_password']."\n");
  709. fclose($fp);
  710. exec(HESTIA_CMD."v-add-web-domain-ftp ".$user." ".quoteshellarg($v_domain)." ".$v_ftp_user." ".$v_ftp_password . " " . $v_ftp_path, $output, $return_var);
  711. check_return_code($return_var, $output);
  712. if ((!empty($v_ftp_user_data['v_ftp_email'])) && (empty($_SESSION['error_msg']))) {
  713. $to = $v_ftp_user_data['v_ftp_email'];
  714. $subject = _("FTP login credentials");
  715. $hostname = get_hostname();
  716. $from = "noreply@".$hostname;
  717. $from_name = _('Hestia Control Panel');
  718. $mailtext = sprintf(_('FTP_ACCOUNT_READY'), $v_domain, $user_plain, $v_ftp_username, $v_ftp_user_data['v_ftp_password']);
  719. send_email($to, $subject, $mailtext, $from, $from_name);
  720. unset($v_ftp_email);
  721. }
  722. unset($output);
  723. unlink($v_ftp_password);
  724. $v_ftp_password = quoteshellarg($v_ftp_user_data['v_ftp_password']);
  725. }
  726. if ($return_var == 0) {
  727. $v_ftp_password = "";
  728. $v_ftp_user_data['is_new'] = 0;
  729. } else {
  730. $v_ftp_user_data['is_new'] = 1;
  731. }
  732. $v_ftp_users_updated[] = array(
  733. 'is_new' => empty($_SESSION['error_msg']) ? 0 : 1,
  734. 'v_ftp_user' => $v_ftp_username_full,
  735. 'v_ftp_password' => $v_ftp_password,
  736. 'v_ftp_path' => $v_ftp_user_data['v_ftp_path'],
  737. 'v_ftp_email' => $v_ftp_user_data['v_ftp_email'],
  738. 'v_ftp_pre_path' => $v_ftp_user_prepath
  739. );
  740. continue;
  741. }
  742. // Delete FTP account
  743. if ($v_ftp_user_data['delete'] == 1) {
  744. $v_ftp_username = $user_plain . '_' . $v_ftp_user_data['v_ftp_user'];
  745. exec(HESTIA_CMD."v-delete-web-domain-ftp ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($v_ftp_username), $output, $return_var);
  746. check_return_code($return_var, $output);
  747. unset($output);
  748. continue;
  749. }
  750. if (!empty($_POST['v_ftp'])) {
  751. if (empty($v_ftp_user_data['v_ftp_user'])) {
  752. $errors[] = _('ftp user');
  753. }
  754. if (!empty($errors[0])) {
  755. foreach ($errors as $i => $error) {
  756. if ($i == 0) {
  757. $error_msg = $error;
  758. } else {
  759. $error_msg = $error_msg.", ".$error;
  760. }
  761. }
  762. $_SESSION['error_msg'] = sprintf(_('Field "%s" can not be blank.'), $error_msg);
  763. }
  764. // Change FTP account path
  765. $v_ftp_username_for_emailing = $v_ftp_user_data['v_ftp_user'];
  766. $v_ftp_username = $user_plain . '_' . $v_ftp_user_data['v_ftp_user']; //preg_replace("/^".$user."_/", "", $v_ftp_user_data['v_ftp_user']);
  767. $v_ftp_username = quoteshellarg($v_ftp_username);
  768. $v_ftp_path = quoteshellarg(trim($v_ftp_user_data['v_ftp_path']));
  769. if (quoteshellarg(trim($v_ftp_user_data['v_ftp_path_prev'])) != $v_ftp_path) {
  770. exec(HESTIA_CMD."v-change-web-domain-ftp-path ".$user." ".quoteshellarg($v_domain)." ".$v_ftp_username." ".$v_ftp_path, $output, $return_var);
  771. check_return_code($return_var, $output);
  772. unset($output);
  773. }
  774. // Change FTP account password
  775. if (!empty($v_ftp_user_data['v_ftp_password'])) {
  776. $v_ftp_password = tempnam("/tmp", "vst");
  777. $fp = fopen($v_ftp_password, "w");
  778. fwrite($fp, $v_ftp_user_data['v_ftp_password']."\n");
  779. fclose($fp);
  780. exec(HESTIA_CMD."v-change-web-domain-ftp-password ".$user." ".quoteshellarg($v_domain)." ".$v_ftp_username." ".$v_ftp_password, $output, $return_var);
  781. unlink($v_ftp_password);
  782. $to = $v_ftp_user_data['v_ftp_email'];
  783. $subject = _("FTP login credentials");
  784. $hostname = get_hostname();
  785. $from = "noreply@".$hostname;
  786. $from_name = _('Hestia Control Panel');
  787. $mailtext = sprintf(_('FTP_ACCOUNT_READY'), quoteshellarg($_GET['domain']), $user, $v_ftp_username_for_emailing, $v_ftp_user_data['v_ftp_password']);
  788. send_email($to, $subject, $mailtext, $from, $from_name);
  789. unset($v_ftp_email);
  790. }
  791. if (empty($v_ftp_user_data['v_ftp_email'])) {
  792. $v_ftp_user_data['v_ftp_email'] = '';
  793. }
  794. $v_ftp_users_updated[] = array(
  795. 'is_new' => 0,
  796. 'v_ftp_user' => $v_ftp_username,
  797. 'v_ftp_password' => $v_ftp_user_data['v_ftp_password'],
  798. 'v_ftp_path' => $v_ftp_user_data['v_ftp_path'],
  799. 'v_ftp_email' => $v_ftp_user_data['v_ftp_email'],
  800. 'v_ftp_pre_path' => $v_ftp_user_prepath
  801. );
  802. }
  803. }
  804. }
  805. //custom docoot with check box disabled
  806. if (!empty($v_custom_doc_root) && empty($_POST['v_custom_doc_root_check'])) {
  807. exec(HESTIA_CMD."v-change-web-domain-docroot ".$user." ".quoteshellarg($v_domain)." default", $output, $return_var);
  808. check_return_code($return_var, $output);
  809. unset($output);
  810. unset($_POST['v-custom-doc-domain'], $_POST['v-custom-doc-folder']);
  811. $restart_web = 'yes';
  812. $restart_proxy = 'yes';
  813. }
  814. if (!empty($_POST['v-custom-doc-domain']) && !empty($_POST['v_custom_doc_root_check']) && $v_custom_doc_root_prepath.$v_custom_doc_domain.'/public_html'.$v_custom_doc_folder != $v_custom_doc_root) {
  815. if ($_POST['v-custom-doc-domain'] == $v_domain && empty($_POST['v-custom-doc-folder'])) {
  816. exec(HESTIA_CMD."v-change-web-domain-docroot ".$user." ".quoteshellarg($v_domain)." default", $output, $return_var);
  817. check_return_code($return_var, $output);
  818. unset($output);
  819. } else {
  820. $v_custom_doc_folder = quoteshellarg(rtrim($_POST['v-custom-doc-folder'], '/'));
  821. $v_custom_doc_domain = quoteshellarg($_POST['v-custom-doc-domain']);
  822. exec(HESTIA_CMD."v-change-web-domain-docroot ".$user." ".quoteshellarg($v_domain)." ".$v_custom_doc_domain." ".$v_custom_doc_folder ." yes", $output, $return_var);
  823. check_return_code($return_var, $output);
  824. unset($output);
  825. $v_custom_doc_root = 1;
  826. }
  827. $restart_web = 'yes';
  828. $restart_proxy = 'yes';
  829. } else {
  830. unset($v_custom_doc_root);
  831. }
  832. if (!empty($v_redirect) && empty($_POST['v-redirect-checkbox'])) {
  833. exec(HESTIA_CMD."v-delete-web-domain-redirect ".$user." ".quoteshellarg($v_domain), $output, $return_var);
  834. check_return_code($return_var, $output);
  835. unset($output);
  836. unset($_POST['v-redirect']);
  837. $restart_web = 'yes';
  838. $restart_proxy = 'yes';
  839. }
  840. if (!empty($_POST['v-redirect']) && !empty($_POST['v-redirect-checkbox'])) {
  841. if (empty($v_redirect)) {
  842. if ($_POST['v-redirect'] == 'custom' && empty($_POST['v-redirect-custom'])) {
  843. } else {
  844. if ($_POST['v-redirect'] == 'custom') {
  845. $_POST['v-redirect'] = $_POST['v-redirect-custom'];
  846. }
  847. exec(HESTIA_CMD."v-add-web-domain-redirect ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($_POST['v-redirect'])." ".quoteshellarg($_POST['v-redirect-code']), $output, $return_var);
  848. check_return_code($return_var, $output);
  849. unset($output);
  850. $restart_web = 'yes';
  851. $restart_proxy = 'yes';
  852. }
  853. } else {
  854. if ($_POST['v-redirect'] == 'custom') {
  855. $_POST['v-redirect'] = $_POST['v-redirect-custom'];
  856. }
  857. if ($_POST['v-redirect'] != $v_redirect || $_POST['v-redirect-code'] != $v_redirect_code) {
  858. exec(HESTIA_CMD."v-add-web-domain-redirect ".$user." ".quoteshellarg($v_domain)." ".quoteshellarg($_POST['v-redirect'])." ".quoteshellarg($_POST['v-redirect-code']), $output, $return_var);
  859. check_return_code($return_var, $output);
  860. unset($output);
  861. $restart_web = 'yes';
  862. $restart_proxy = 'yes';
  863. }
  864. }
  865. }
  866. // Restart web server
  867. if (!empty($restart_web) && (empty($_SESSION['error_msg']))) {
  868. exec(HESTIA_CMD."v-restart-web", $output, $return_var);
  869. check_return_code($return_var, $output);
  870. unset($output);
  871. }
  872. // Restart proxy server
  873. if ((!empty($_SESSION['PROXY_SYSTEM'])) && !empty($restart_proxy) && (empty($_SESSION['error_msg']))) {
  874. exec(HESTIA_CMD."v-restart-proxy", $output, $return_var);
  875. check_return_code($return_var, $output);
  876. unset($output);
  877. }
  878. // Restart dns server
  879. if (!empty($restart_dns) && (empty($_SESSION['error_msg']))) {
  880. exec(HESTIA_CMD."v-restart-dns", $output, $return_var);
  881. check_return_code($return_var, $output);
  882. unset($output);
  883. }
  884. // Set success message
  885. if (empty($_SESSION['error_msg'])) {
  886. $_SESSION['ok_msg'] = _('Changes has been saved.');
  887. header("Location: /edit/web/?domain=" . $v_domain);
  888. exit();
  889. }
  890. }
  891. $v_ftp_users_raw = explode(':', $v_ftp_user);
  892. $v_ftp_users_paths_raw = explode(':', $data[$v_domain]['FTP_PATH']);
  893. $v_ftp_users = array();
  894. foreach ($v_ftp_users_raw as $v_ftp_user_index => $v_ftp_user_val) {
  895. if (empty($v_ftp_user_val)) {
  896. continue;
  897. }
  898. $v_ftp_users[] = array(
  899. 'is_new' => 0,
  900. 'v_ftp_user' => preg_replace("/^".$user_plain."_/", "", $v_ftp_user_val),
  901. 'v_ftp_password' => $v_ftp_password,
  902. 'v_ftp_path' => (isset($v_ftp_users_paths_raw[$v_ftp_user_index]) ? $v_ftp_users_paths_raw[$v_ftp_user_index] : ''),
  903. 'v_ftp_email' => $v_ftp_email,
  904. 'v_ftp_pre_path' => $v_ftp_user_prepath
  905. );
  906. }
  907. if (empty($v_ftp_users)) {
  908. $v_ftp_user = null;
  909. $v_ftp_users[] = array(
  910. 'is_new' => 1,
  911. 'v_ftp_user' => '',
  912. 'v_ftp_password' => '',
  913. 'v_ftp_path' => (isset($v_ftp_users_paths_raw[$v_ftp_user_index]) ? $v_ftp_users_paths_raw[$v_ftp_user_index] : ''),
  914. 'v_ftp_email' => '',
  915. 'v_ftp_pre_path' => $v_ftp_user_prepath
  916. );
  917. }
  918. // set default pre path for newly created users
  919. $v_ftp_pre_path_new_user = $v_ftp_user_prepath;
  920. if (isset($v_ftp_users_updated)) {
  921. $v_ftp_users = $v_ftp_users_updated;
  922. if (empty($v_ftp_users_updated)) {
  923. $v_ftp_user = null;
  924. $v_ftp_users[] = array(
  925. 'is_new' => 1,
  926. 'v_ftp_user' => '',
  927. 'v_ftp_password' => '',
  928. 'v_ftp_path' => (isset($v_ftp_users_paths_raw[$v_ftp_user_index]) ? $v_ftp_users_paths_raw[$v_ftp_user_index] : ''),
  929. 'v_ftp_email' => '',
  930. 'v_ftp_pre_path' => $v_ftp_user_prepath
  931. );
  932. }
  933. }
  934. // Render page
  935. render_page($user, $TAB, 'edit_web');
  936. // Flush session messages
  937. unset($_SESSION['error_msg']);
  938. unset($_SESSION['ok_msg']);