관리-도구
편집 파일: sitepad_functions2.php
<?php /** * Part of sitemush DB changing * This is just below $wpdb connection * By Default we connect to sitemush DB to verify session */ // We need the ABSPATH if (!defined('ABSPATH')) exit; global $sitepad, $globals, $l, $SESS; function cleanpath($path){ $path = str_replace('\\\\', '/', $path); $path = str_replace('\\', '/', $path); $path = str_replace('//', '/', $path); return rtrim($path, '/'); } function r_print($array){ echo '<pre>'; print_r($array); echo '</pre>'; } // Generate a random string function generateRandStr($length = 10){ $characters = '0123456789abcdefghijklmnopqrstuvwxyz'; $charactersLength = strlen($characters); $randomString = ''; for($i = 0; $i < $length; $i++){ $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } // Connect to the database function soft_mysql_connect($host, $user, $pass, $newlink = false){ // Error handling for php8.1 try{ if(extension_loaded('mysqli')){ //echo 'mysqli'; $sconn = @mysqli_connect($host, $user, $pass); }else{ //echo 'mysql'; $sconn = @mysql_connect($host, $user, $pass, $newlink); } }catch(Exception $e){ return false; } return $sconn; } // Select the DB function soft_mysql_select_db($db, $conn){ // Error handling for php8.1 try{ if(extension_loaded('mysqli')){ $return = @mysqli_select_db($conn, $db); }else{ $return = @mysql_select_db($db, $conn); } }catch(Exception $e){ return false; } return $return; } // Verifies an email function emailvalidation($email){ if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\+._-])*@([a-zA-Z0-9_-])+([.])+([a-zA-Z0-9\._-]+)+$/", $email)){ return false; }else{ return true; } } function _unserialize($str){ $var = @unserialize($str); if(empty($var)){ $str = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $str); $var = @unserialize($str); } //If it is still empty false if(empty($var)){ return false; }else{ return $var; } } // Presently takes care of Slashes function inputsec($string){ //get_magic_quotes_gpc is depricated in php 7.4 if(version_compare(PHP_VERSION, '7.4', '<')){ if(!get_magic_quotes_gpc()){ $string = addslashes($string); }else{ $string = stripslashes($string); $string = addslashes($string); } }else{ $string = addslashes($string); } // This is to replace ` which can cause the command to be executed in exec() $string = str_replace('`', '\`', $string); return $string; } // Takes care of characters function htmlizer($string){ global $globals; $charset = !empty($globals['charset']) ? $globals['charset'] : null; $string = htmlentities($string, ENT_QUOTES | ENT_IGNORE, $charset); //$string = preg_replace('/(&#(\d{1,7}|x[0-9a-fA-F]{1,6});)/e', 'entity_check(\\2);', $string); return $string; } ///////////////////// // POSTING Functions ///////////////////// function POST($name, $e, $isset = 1){ global $error; //Check the POSTED NAME was posted if(($isset && (!isset($_POST[$name]) || strlen(trim($_POST[$name])) < 1)) || (empty($isset) && empty($_POST[$name]))){ $error[$name] = $e; }else{ return inputsec(htmlizer(trim($_POST[$name]))); } } // No htmlizer post - Dont use in SQL Queries function iPOST($name, $e, $isset = 1){ global $error; //Check the POSTED NAME was posted if(($isset && (!isset($_POST[$name]) || strlen(trim($_POST[$name])) < 1)) || (empty($isset) && empty($_POST[$name]))){ $error[$name] = $e; }else{ return inputsec(trim($_POST[$name])); } } //OPTIONAL Post function optPOST($name, $default = ''){ global $error; //Check the POSTED NAME was posted if(isset($_POST[$name])){ return inputsec(htmlizer(trim($_POST[$name]))); }else{ return $default; } } /** * Return the value of the POSTED key i.e. $_POST[$key]. Is mainly used for Themes to fill the forms again automatically. * * @package forms * @subpackage post * @author Pulkit Gupta * @param string $name The key of the $_POST array i.e. the name of the input / textarea / select text * @param string $default (Optional) Default value when the POST is empty * @return string The value of the POSTED Key or the $default value when the POST is empty * @since 1.0 */ function POSTval($name, $default = ''){ return (!empty($_POST) ? (empty($_POST[$name]) ? '' : inputsec(htmlizer(trim($_POST[$name])))) : $default); } /** * Return the value of the POSTED key i.e. $_POST[$key]. Is mainly used for Themes to fill the forms again automatically. * The difference betweern aPOSTval() and POSTval() is that aPOSTval() just trims the value while POSTval will do * inputsec(htmlizer(trim($_POST[$name])))) * * @package forms * @subpackage post * @author Pulkit Gupta * @param string $name The key of the $_POST array i.e. the name of the input / textarea / select text * @param string $default (Optional) Default value when the POST is empty * @return string The value of the POSTED Key or the $default value when the POST is empty * @since 1.0 */ function aPOSTval($name, $default = ''){ return (!empty($_POST) ? (empty($_POST[$name]) ? '' : trim($_POST[$name])) : $default); } //OPTIONAL REQUEST function optREQ($name, $default = ''){ global $error; //Check the POSTED NAME was posted if(isset($_REQUEST[$name])){ return inputsec(htmlizer(trim($_REQUEST[$name]))); }else{ return $default; } } // Clean FOR var directly function optInput($val){ global $error; return inputsec(htmlizer(trim($val))); } //Check if isset in REQUEST Array else return error lang function REQUEST($name, $e){ global $error; //Check the REQUEST NAME was sent if(!isset($_REQUEST[$name]) || strlen(trim($_REQUEST[$name])) < 1){ $error[$name] = $e; }else{ return inputsec(htmlizer(trim($_REQUEST[$name]))); } } //Checkbox function checkbox($name){ global $error; //Check the Checkbox posted if(isset($_POST[$name])){ return true; }else{ return false; } } function GET($name, $e){ global $error; //Check the POSTED NAME was posted if(!isset($_GET[$name]) || strlen(trim($_GET[$name])) < 1){ $error[$name] = $e; }else{ return inputsec(htmlizer(trim($_GET[$name]))); } } //OPTIONAL GET function optGET($name, $default = ''){ global $error; //Check the GETED NAME was GETed if(isset($_GET[$name])){ return inputsec(htmlizer(trim($_GET[$name]))); }else{ return $default; } } // Strips slashes if GPC was on function rawGPC($v){ //get_magic_quotes_gpc is depricated in php 7.4 if(version_compare(PHP_VERSION, '7.4', '<')){ if(get_magic_quotes_gpc()){ $v = stripslashes($v); } } return $v; } // Make a curl call function curl_call($url, $post = array()){ // Set the curl parameters. $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); // Connection Time OUT curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, (!empty($GLOBALS['globals']['curl_timeout']) ? $GLOBALS['globals']['curl_timeout'] : 10)); // You can timeout in one hour max curl_setopt($ch, CURLOPT_TIMEOUT, 3600); // Turn off the server and peer verification (TrustManager Concept). curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // UserAgent and Cookies curl_setopt($ch, CURLOPT_USERAGENT, 'Softaculous'); if(!empty($post)){ curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Get response from the server. $resp = curl_exec($ch); $curl_err = curl_error($ch); $meta = curl_getinfo($ch); curl_close($ch); if($meta['http_code'] == 405){ return curl_call($url); } if(empty($resp)){ return false; } return $resp; } /** * phpMyAdmin SPLIT SQL function which splits the SQL data into seperate chunks that can be passed as QUERIES. * * @package database * @author Pulkit Gupta * @param string $data The SQL RAW data * @returns array The chunks of SQL Queries * @since 1.0 */ function sqlsplit($data){ $ret = array(); $buffer = ''; // Defaults for parser $sql = ''; $start_pos = 0; $i = 0; $len= 0; $big_value = 200000000; $sql_delimiter = ';'; $finished = false; while (!($finished && $i >= $len)) { if ($data === FALSE) { // subtract data we didn't handle yet and stop processing //$offset -= strlen($buffer); break; } elseif ($data === TRUE) { // Handle rest of buffer } else { // Append new data to buffer $buffer .= $data; // free memory $data = false; // Do not parse string when we're not at the end and don't have ; inside if ((strpos($buffer, $sql_delimiter, $i) === FALSE) && !$finished) { continue; } } // Current length of our buffer $len = strlen($buffer); // Grab some SQL queries out of it while ($i < $len) { $found_delimiter = false; // Find first interesting character $old_i = $i; // this is about 7 times faster that looking for each sequence i // one by one with strpos() if (preg_match('/(\'|"|#|-- |\/\*|`|(?i)DELIMITER)/', $buffer, $matches, PREG_OFFSET_CAPTURE, $i)) { // in $matches, index 0 contains the match for the complete // expression but we don't use it $first_position = $matches[1][1]; } else { $first_position = $big_value; } /** * @todo we should not look for a delimiter that might be * inside quotes (or even double-quotes) */ // the cost of doing this one with preg_match() would be too high $first_sql_delimiter = strpos($buffer, $sql_delimiter, $i); if ($first_sql_delimiter === FALSE) { $first_sql_delimiter = $big_value; } else { $found_delimiter = true; } // set $i to the position of the first quote, comment.start or delimiter found $i = min($first_position, $first_sql_delimiter); if ($i == $big_value) { // none of the above was found in the string $i = $old_i; if (!$finished) { break; } // at the end there might be some whitespace... if (trim($buffer) == '') { $buffer = ''; $len = 0; break; } // We hit end of query, go there! $i = strlen($buffer) - 1; } // Grab current character $ch = $buffer[$i]; // Quotes if (strpos('\'"`', $ch) !== FALSE) { $quote = $ch; $endq = FALSE; while (!$endq) { // Find next quote $pos = strpos($buffer, $quote, $i + 1); // No quote? Too short string if ($pos === FALSE) { // We hit end of string => unclosed quote, but we handle it as end of query if ($finished) { $endq = TRUE; $i = $len - 1; } $found_delimiter = false; break; } // Was not the quote escaped? $j = $pos - 1; while ($buffer[$j] == '\\') $j--; // Even count means it was not escaped $endq = (((($pos - 1) - $j) % 2) == 0); // Skip the string $i = $pos; if ($first_sql_delimiter < $pos) { $found_delimiter = false; } } if (!$endq) { break; } $i++; // Aren't we at the end? if ($finished && $i == $len) { $i--; } else { continue; } } // Not enough data to decide if ((($i == ($len - 1) && ($ch == '-' || $ch == '/')) || ($i == ($len - 2) && (($ch == '-' && $buffer[$i + 1] == '-') || ($ch == '/' && $buffer[$i + 1] == '*')))) && !$finished) { break; } // Comments if ($ch == '#' || ($i < ($len - 1) && $ch == '-' && $buffer[$i + 1] == '-' && (($i < ($len - 2) && $buffer[$i + 2] <= ' ') || ($i == ($len - 1) && $finished))) || ($i < ($len - 1) && $ch == '/' && $buffer[$i + 1] == '*') ) { // Copy current string to SQL if ($start_pos != $i) { $sql .= substr($buffer, $start_pos, $i - $start_pos); } // Skip the rest $j = $i; $i = strpos($buffer, $ch == '/' ? '*/' : "\n", $i); // didn't we hit end of string? if ($i === FALSE) { if ($finished) { $i = $len - 1; } else { break; } } // Skip * if ($ch == '/') { // Check for MySQL conditional comments and include them as-is if ($buffer[$j + 2] == '!') { $comment = substr($buffer, $j + 3, $i - $j - 3); if (preg_match('/^[0-9]{5}/', $comment, $version)) { if ($version[0] <= 50000000) { $sql .= substr($comment, 5); } } else { $sql .= $comment; } } $i++; } // Skip last char $i++; // Next query part will start here $start_pos = $i; // Aren't we at the end? if ($i == $len) { $i--; } else { continue; } } // Change delimiter, if redefined, and skip it (don't send to server!) if (strtoupper(substr($buffer, $i, 9)) == "DELIMITER" && ($buffer[$i + 9] <= ' ') && ($i < $len - 11) && strpos($buffer, "\n", $i + 11) !== FALSE) { $new_line_pos = strpos($buffer, "\n", $i + 10); $sql_delimiter = substr($buffer, $i + 10, $new_line_pos - $i - 10); $i = $new_line_pos + 1; // Next query part will start here $start_pos = $i; continue; } // End of SQL if ($found_delimiter || ($finished && ($i == $len - 1))) { $tmp_sql = $sql; if ($start_pos < $len) { $length_to_grab = $i - $start_pos; if (! $found_delimiter) { $length_to_grab++; } $tmp_sql .= substr($buffer, $start_pos, $length_to_grab); unset($length_to_grab); } // Do not try to execute empty SQL if (! preg_match('/^([\s]*;)*$/', trim($tmp_sql))) { $sql = $tmp_sql; $ret[] = $sql; $buffer = substr($buffer, $i + strlen($sql_delimiter)); // Reset parser: $len = strlen($buffer); $sql = ''; $i = 0; $start_pos = 0; // Any chance we will get a complete query? //if ((strpos($buffer, ';') === FALSE) && !$finished) { if ((strpos($buffer, $sql_delimiter) === FALSE) && !$finished) { break; } } else { $i++; $start_pos = $i; } } } // End of parser loop } // End of import loop return $ret; } function resetfilelist(){ global $directorylist; $directorylist = array(); } function rmdir_recursive_fn($path){ //if(!is_safe_file($path)) return false; $path = (substr($path, -1) == '/' || substr($path, -1) == '\\' ? $path : $path.'/'); resetfilelist(); $files = filelist_fn($path, 1, 0, 'all'); $files = (!is_array($files) ? array() : $files); //First delete the files only foreach($files as $k => $v){ //if(is_safe_file($k)){ // Security Fix @chmod($k, 0777); //} if(file_exists($k) && is_file($k) && @filetype($k) == "file"){ @unlink($k); } } @clearstatcache(); $folders = filelist_fn($path, 1, 1, 'all'); $folders = (!is_array($folders) ? array() : $folders); @krsort($folders); //Now Delete the FOLDERS foreach($folders as $k => $v){ //if(is_safe_file($k)){ // Security Fix @chmod($k, 0777); //} if(is_dir($k)){ @rmdir($k); } } @rmdir($path); @clearstatcache(); } function filelist_fn($startdir="./", $searchSubdirs=1, $directoriesonly=0, $maxlevel="all", $level=1, $reset = 1) { //list the directory/file names that you want to ignore $ignoredDirectory[] = "."; $ignoredDirectory[] = ".."; $ignoredDirectory[] = "_vti_cnf"; global $directorylist; //initialize global array if(substr($startdir, -1) != '/'){ $startdir = $startdir.'/'; } if (is_dir($startdir)) { if ($dh = opendir($startdir)) { while (($file = readdir($dh)) !== false) { if (!(array_search($file,$ignoredDirectory) > -1)) { if (@filetype($startdir . $file) == "dir") { //build your directory array however you choose; //add other file details that you want. $directorylist[$startdir . $file]['level'] = $level; $directorylist[$startdir . $file]['dir'] = 1; $directorylist[$startdir . $file]['name'] = $file; $directorylist[$startdir . $file]['path'] = $startdir; if ($searchSubdirs) { if ((($maxlevel) == "all") or ($maxlevel > $level)) { filelist_fn($startdir . $file . "/", $searchSubdirs, $directoriesonly, $maxlevel, ($level + 1), 0); } } } else { if (!$directoriesonly) { // echo substr(strrchr($file, "."), 1); //if you want to include files; build your file array //however you choose; add other file details that you want. $directorylist[$startdir . $file]['level'] = $level; $directorylist[$startdir . $file]['dir'] = 0; $directorylist[$startdir . $file]['name'] = $file; $directorylist[$startdir . $file]['path'] = $startdir; } } } } closedir($dh); } } if(!empty($reset)){ $r = $directorylist; $directorylist = array(); return($r); } } /** * Get a web file but add little Softaculous information like the license key, unique, panel, is_vps, env, soft_email as * arguments to the $url given. This is mainly used to FETCH FILES from Softaculous.com and related softaculous websites. * * @package files * @author Pulkit Gupta * @param string $url The URL from which the DATA is to be fetched * @param string $path (Optional) If given the FETCHED data is saved in the file instead of having it returned * @return string The FETCHED DATA * @since 1.0 */ function get_softaculous_file($url, $return_url = 0){ global $sitepad; $license = (!empty($sitepad['license']) ? $sitepad['license']['license'] : $sitepad['server_license']['license']); if(strstr($url, '?')){ $url = $url.'&license='.$license; }else{ $url = $url.'?license='.$license; } if(!empty($return_url)){ return $url; } return curl_call($url); } /** * This function will preg_match the pattern and return the respective values in $var * @package Softaculous * @author Brijesh Kothari * @param $pattern This should be the pattern to be matched * @param $file This should have the data to search from * @param $var This will be the variable which will have the preg matched data * @param $valuenum This should be the no of regular expression to be returned in $var * @param $stripslashes 0 or 1 depending upon whether the stripslashes function is to be applied (1) or not (0) * @return string Will pass value by reference in $var * @since 4.5.4 */ function soft_preg_replace($pattern, $file, &$var, $valuenum, $stripslashes = ''){ preg_match($pattern, $file, $matches); if(empty($stripslashes)){ $var = @trim($matches[$valuenum]); }else{ $var = @stripslashes(trim($matches[$valuenum])); } } function makedate($date, $format = 'd/m/Y'){ if(empty($date)) return false; $year = substr($date, 0, 4); $month = substr($date, 4, 2); $day = substr($date, 6, 2); if($format == 'd/m/Y'){ // Check the Max DAY possible $maxday = (int) date('t', mktime(0, 0, 0, $month, 1, $year)); return ($day > $maxday ? $maxday : $day).'/'.$month.'/'.$year; } return date($format, mktime(0, 0, 0, $month, $day, $year)); } /** * Copies Recrsively a File / Folder and also maintains the PERMISSIONS and UID and GID * * @package softaculous * @subpackage settings * @author Pulkit Gupta * @param string $path The Source Path * @param string $dest The Destination Path * @return bool * @since 1.0 */ function copy_r($path, $dest, $exclude = array()){ global $__settings; foreach($exclude as $skip){ //echo 'Skip path : '.$skip.'<br />'; if(preg_match('#'.preg_quote($skip, '/').'#', $path)){ //echo 'Skipping : '.$path.'<br />'; return true; } } // Is it a Directory ? if( is_dir($path) ){ // Create the Destination Dir @mkdir($dest); $stat = stat($path); // Set the mode of the destination if(!empty($stat['mode'])){ @chmod($dest, $stat['mode']); } // Set the UID if(!empty($stat['uid'])){ @chown($dest, $stat['uid']); } // Set the GID if(!empty($stat['gid'])){ @chgrp($dest, $stat['gid']); } // Start reading the current directory $objects = scandir($path); if( sizeof($objects) > 0 ){ foreach( $objects as $file ) { if( $file == "." || $file == ".." ){ continue; } // Go on copy_r( $path.'/'.$file, $dest.'/'.$file, $exclude); } } return true; }elseif( is_file($path) ){ $ret = copy($path, $dest); $stat = stat($path); // Set the mode of the destination if(!empty($stat['mode'])){ @chmod($dest, $stat['mode']); } // Set the UID if(!empty($stat['uid'])){ @chown($dest, $stat['uid']); } // Set the GID if(!empty($stat['gid'])){ @chgrp($dest, $stat['gid']); } return $ret; }else{ return false; } } function error_handle($error, $table_width = '100%', $center = false, $return = false){ global $l; $str = ""; $table_width = preg_match('/%/is', $table_width) ? $table_width : $table_width.'px'; //on error call the form if(!empty($error)){ $str .= '<script language="javascript" type="text/javascript"><!-- // --><![CDATA[ </script>'; $str .= '<div class="alert alert-danger " style="width:'.$table_width.';'.(($center) ? 'margin:auto' : '').'"><a href="#" class="close" data-dismiss="alert">×</a><div>'; $str .= '<p style="margin-top:4px; font-size:16px;"> '.__('The following errors were found').' :</p> <ul type="square" style="margin-top:-4px;">'; foreach($error as $ek => $ev){ $str .= '<li style="font-size:13px;">'.$ev.'</li>'; } $str .= '</ul> </div></div>'; if(empty($return)){ echo $str; }else{ return $str; } } } /** * Checks if a file is symlink or hardlink * @package softaculous * @author Pulkit Gupta * @returns bool false if file is a symlink or a hardlink else true * @since 4.4.3 */ function is_safe_file($path){ // Is it a symlink ? if(is_link($path)) return false; // Is it a file and is a link ? $stat = @stat($path); if(!is_dir($path) && $stat['nlink'] > 1) return false; return true; } function mkdir_recursive($pathname, $mode){ is_dir(dirname($pathname)) || mkdir_recursive(dirname($pathname), $mode); return is_dir($pathname) || @mkdir($pathname, $mode); }