Portions created by the Initial Developer are Copyright (C) 2008-2025 the Initial Developer. All Rights Reserved. Contributor(s): Mark J Crane James Rose */ //includes files require_once dirname(__DIR__, 2) . "/resources/require.php"; require_once "resources/check_auth.php"; //check permissions if (!permission_exists('edit_save')) { echo "access denied"; exit; } //add multi-lingual support $language = new text; $text = $language->get(); //compare the tokens $key_name = '/app/edit/'.$_POST['mode']; $hash = hash_hmac('sha256', $key_name, $_SESSION['keys'][$key_name]); if (!hash_equals($hash, $_POST['token'])) { echo "access denied"; exit; } //get the directory if (!isset($_SESSION)) { session_start(); } switch ($_SESSION["app"]["edit"]["dir"]) { case 'scripts': $edit_directory = $settings->get('switch','scripts'); break; case 'php': $edit_directory = $_SERVER["DOCUMENT_ROOT"].'/'.PROJECT_PATH; break; case 'grammar': $edit_directory = $settings->get('switch','grammar'); break; case 'provision': switch (PHP_OS) { case "Linux": if (file_exists('/usr/share/fusionpbx/templates/provision')) { $edit_directory = '/usr/share/fusionpbx/templates/provision'; } elseif (file_exists('/etc/fusionpbx/resources/templates/provision')) { $edit_directory = '/etc/fusionpbx/resources/templates/provision'; } else { $edit_directory = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/resources/templates/provision"; } break; case "FreeBSD": if (file_exists('/usr/local/share/fusionpbx/templates/provision')) { $edit_directory = '/usr/share/fusionpbx/templates/provision'; } elseif (file_exists('/usr/local/etc/fusionpbx/resources/templates/provision')) { $edit_directory = '/usr/local/etc/fusionpbx/resources/templates/provision'; } else { $edit_directory = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/resources/templates/provision"; } break; case "NetBSD": if (file_exists('/usr/local/share/fusionpbx/templates/provision')) { $edit_directory = '/usr/share/fusionpbx/templates/provision'; } else { $edit_directory = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/resources/templates/provision"; } break; case "OpenBSD": if (file_exists('/usr/local/share/fusionpbx/templates/provision')) { $edit_directory = '/usr/share/fusionpbx/templates/provision'; } else { $edit_directory = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/resources/templates/provision"; } break; default: $edit_directory = $_SERVER["DOCUMENT_ROOT"].PROJECT_PATH."/resources/templates/provision/"; } break; case 'xml': $edit_directory = $settings->get('switch','conf'); break; } if (!isset($edit_directory) && is_array($_SESSION['editor']['path'])) { foreach ($_SESSION['editor']['path'] as $path) { if ($_SESSION["app"]["edit"]["dir"] == $path) { $edit_directory = $path; break; } } } //set the file variable $file_path = $_POST["filepath"]; //remove attempts to change the directory $file_path = str_replace('..', '', $file_path); $file_path = str_replace ("\\", "/", $file_path); //break the path into an array $path_array = pathinfo($file_path); $path_prefix = substr($path_array['dirname'], 0, strlen($edit_directory)); //validate the path if (realpath($path_prefix) == realpath($edit_directory)) { if ($file_path != '') { try { //save file content $file_path = realpath($file_path); $file_path = str_replace ('//', '/', $file_path); $file_path = str_replace ("\\", "/", $file_path); if (file_exists($file_path)) { //create a file handle $handle = fopen($file_path, 'wb'); if (!$handle) { throw new Exception('Write Failed - Check File Owner & Permissions'); } //build a array of the content $lines = explode("\n", str_replace ("\r\n", "\n", $_POST["content"])); $file_content = ''; //remove trailing spaces on each line foreach ($lines as $line) { $file_content .= rtrim($line) . "\n"; } //save the file with single empty line fwrite($handle, rtrim($file_content) . "\n"); //close the file handle fclose($handle); } //set the reload_xml value to true $_SESSION["reload_xml"] = true; //alert user of success echo "Changes Saved"; } catch(Exception $e) { //alert error echo $e->getMessage(); } } }