/** * */ function onAction() { global $application; CCacheFactory::clearAll(); modApiFunc("Tools", "clearBackupSession"); modApiFunc("Tools", "setDBStat", modApiFunc("Modules_Manager", "getTablesAndRecordsCount")); modApiFunc("Tools", "setCurrentBackupTable", 0); modApiFunc("Tools", "setCurrentBackupTableLimit", 0); modApiFunc("Tools", "setDBRecordsExported", 0); $request = $application->getInstance('Request'); $filename = $request->getValueByKey('BackupFile'); if ($filename) { modApiFunc("Tools", "setRestoreStatus", 'BACKUP'); modApiFunc("Tools", "setRestoreFile", $filename); $filename = modApiFunc("Tools", "getRestoreFile"); $full_filename = $application->getAppIni('PATH_BACKUP_DIR') . $filename . "/dump.sql"; $handle = @fopen($full_filename, "rb"); $backup_file_content = @fread($handle, 1024); @fclose($handle); $error = ""; $backup_info = @_parse_ini_file($application->getAppIni('PATH_BACKUP_DIR') . $filename . "/info/backup.ini"); if (!isset($backup_info["asc_version"]) || $backup_info["asc_version"] != PRODUCT_VERSION) { $error = "BCP_RESTORE_ERR_003"; } elseif (!$backup_file_content) { $error = "BCP_RESTORE_ERR_001"; } elseif (_ml_strpos($backup_file_content, "-- HASH: ") === false) { $error = "BCP_RESTORE_ERR_002"; } else { $hash = _byte_substr($backup_file_content, 9, 32); // $handle = fopen($full_filename, "rb"); $md5_temp = ''; // $begin = _byte_strpos($backup_file_content, "\n") + _byte_strlen("\n"); fseek($handle, $begin); while (!feof($handle)) { $contents = fread($handle, 1048576); $md5_temp .= md5($contents); } $counted_file_hash = md5($md5_temp); fclose($handle); // : if ($hash != $counted_file_hash) { $error = "BCP_RESTORE_ERR_002"; } } if ($error) { modApiFunc("Tools", "setRestoreError", $error); } else { modApiFunc("Tools", "setStringsCountInRestoreFile", $filename); } } modApiFunc("Tools", "saveState"); }
/** * Converts the answer from the remote host to the array of headers, cookies * and body. * * @param $result answer from the remote host * @return array of headers, cookies and body */ function parseRequestResult($result) { $headers = array(); $cookies = array(); $body = ""; $dp = 4096; $delimiter = false; $dtrs = array("\n", "\r\n", "\n\r"); foreach ($dtrs as $v) { // trying to find a delimiter pair - headers/body border $tdp = _byte_strpos($result, $v . $v); if ($tdp != false && $dp > $tdp) { $dp = $tdp; $delimiter = $v; } } if ($delimiter == false) { CTrace::wrn('Failed to parse response, I cannot guess headers/body delimiter.'); return; } $headers = _byte_substr($result, 0, $dp); $hstr = explode($delimiter, $headers); foreach ($hstr as $key => $string) { if (preg_match("/^HTTP/", $string)) { continue; } if (trim($string) == "") { break; } $header_array = explode(": ", trim($string), 2); $header_array[0] = _ml_strtoupper($header_array[0]); $headers[$header_array[0]] = chop($header_array[1]); if ($header_array[0] == "SET-COOKIE") { array_push($cookies, $header_array[1]); } } $cookies = $this->parseCookies($cookies); $body = _byte_substr($result, $dp + _byte_strlen($delimiter) * 2); return array("headers" => $headers, "cookies" => $cookies, "body" => $body); }
/** * Logical Not * * Although integers can be converted to and from various bases with relative ease, there is one piece * of information that is lost during such conversions. The number of leading zeros that number had * or should have in any given base. Per that, if you convert 1 from decimal to binary, there's no * way to know just how many leading zero's there should be. In truth, there could be any number. * * Normally, the number of leading zero's is unimportant. When doing "not", however, it is. The "not" * of 1 on an 8-bit representation of 1 is 1111 1110. The "not" of 1 on a 16-bit representation of 1 is * 1111 1111 1111 1110. When doing it on a number that's preceeded by an infinite number of zero's, it's * infinite. * * This function assumes that there are no leading zero's - that the bit-representation being used is * equal to the minimum number of required bits, unless otherwise specified in the optional parameter, * where the optional parameter represents the bit-representation being used. If the specified * bit-representation is smaller than the minimum number of bits required to represent the number, the * latter will be used as the bit-representation. * * @param $bits Integer * @access public * @internal Implemented per a request by Lluis Pamies i Juarez <lluis _a_ pamies.cat> * @return Math_BigInteger */ function bitwise_not($bits = -1) { // calculuate "not" without regard to $bits $temp = ~$this->toBytes(); $msb = decbin(_byte_ord($temp[0])); $msb = _byte_substr($msb, _byte_strpos($msb, '0')); $temp[0] = _byte_chr(bindec($msb)); // see if we need to add extra leading 1's $current_bits = _byte_strlen($msb) + 8 * _byte_strlen($temp) - 8; $new_bits = $bits - $current_bits; if ($new_bits <= 0) { return new Math_BigInteger($temp, 256); } // generate as many leading 1's as we need to. $leading_ones = _byte_chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(_byte_chr(0xff), $new_bits >> 3); $this->_base256_lshift($leading_ones, $current_bits); $temp = str_pad($temp, ceil($bits / 8), _byte_chr(0), STR_PAD_LEFT); return new Math_BigInteger($leading_ones | $temp, 256); }
function submit($URI, $formvars = "", $formfiles = "") { unset($postdata); $postdata = $this->_prepare_post_body($formvars, $formfiles); $URI_PARTS = parse_url($URI); if (!empty($URI_PARTS["user"])) { $this->user = $URI_PARTS["user"]; } if (!empty($URI_PARTS["pass"])) { $this->pass = $URI_PARTS["pass"]; } if (empty($URI_PARTS["query"])) { $URI_PARTS["query"] = ''; } switch ($URI_PARTS["scheme"]) { case "http": $this->host = $URI_PARTS["host"]; if (!empty($URI_PARTS["port"])) { $this->port = $URI_PARTS["port"]; } if ($this->_connect($fp)) { if ($this->_isproxy) { // using proxy, send entire URI $this->_httprequest($URI, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata); } else { $path = $URI_PARTS["path"] . ($URI_PARTS["query"] ? "?" . $URI_PARTS["query"] : ""); // no proxy, send only the path $this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata); } $this->_disconnect($fp); if ($this->_redirectaddr) { /* url was redirected, check if we've hit the max depth */ if ($this->maxredirs > $this->_redirectdepth) { if (!preg_match("|^" . $URI_PARTS["scheme"] . "://|", $this->_redirectaddr)) { $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr, $URI_PARTS["scheme"] . "://" . $URI_PARTS["host"]); } // only follow redirect if it's on this site, or offsiteok is true if (preg_match("|^http://" . preg_quote($this->host) . "|i", $this->_redirectaddr) || $this->offsiteok) { /* follow the redirect */ $this->_redirectdepth++; $this->lastredirectaddr = $this->_redirectaddr; if (_byte_strpos($this->_redirectaddr, "?") > 0) { $this->fetch($this->_redirectaddr); } else { $this->submit($this->_redirectaddr, $formvars, $formfiles); } } } } if ($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) { $frameurls = $this->_frameurls; $this->_frameurls = array(); while (list(, $frameurl) = each($frameurls)) { if ($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; } else { break; } } } } else { return false; } return true; break; case "https": if (!$this->curl_path) { return false; } if (function_exists("is_executable")) { if (!is_executable($this->curl_path)) { return false; } } $this->host = $URI_PARTS["host"]; if (!empty($URI_PARTS["port"])) { $this->port = $URI_PARTS["port"]; } if ($this->_isproxy) { // using proxy, send entire URI $this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata); } else { $path = $URI_PARTS["path"] . ($URI_PARTS["query"] ? "?" . $URI_PARTS["query"] : ""); // no proxy, send only the path $this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata); } if ($this->_redirectaddr) { /* url was redirected, check if we've hit the max depth */ if ($this->maxredirs > $this->_redirectdepth) { if (!preg_match("|^" . $URI_PARTS["scheme"] . "://|", $this->_redirectaddr)) { $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr, $URI_PARTS["scheme"] . "://" . $URI_PARTS["host"]); } // only follow redirect if it's on this site, or offsiteok is true if (preg_match("|^http://" . preg_quote($this->host) . "|i", $this->_redirectaddr) || $this->offsiteok) { /* follow the redirect */ $this->_redirectdepth++; $this->lastredirectaddr = $this->_redirectaddr; if (_byte_strpos($this->_redirectaddr, "?") > 0) { $this->fetch($this->_redirectaddr); } else { $this->submit($this->_redirectaddr, $formvars, $formfiles); } } } } if ($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) { $frameurls = $this->_frameurls; $this->_frameurls = array(); while (list(, $frameurl) = each($frameurls)) { if ($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; } else { break; } } } return true; break; default: // not a valid protocol $this->error = 'Invalid protocol "' . $URI_PARTS["scheme"] . '"\\n'; return false; break; } return true; }