session_start(); if (empty($_SESSION['user_id'])) { die('!user_id'); } define('DC', TRUE); define('ABSPATH', dirname(dirname(__FILE__)) . '/'); //require_once( ABSPATH . 'includes/errors.php' ); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; if (!empty($_SESSION['restricted'])) { die('Permission denied'); } $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); if (!check_input_data($_REQUEST['parent_id'], 'int')) { die('error parent_id'); } if (!check_input_data($_REQUEST['message_type'], 'int')) { die('error type'); } if (!check_input_data($_REQUEST['message_subtype'], 'int')) { die('error subtype'); } $parent_id = intval($_REQUEST['parent_id']); $message_type = intval($_REQUEST['message_type']); $message_subtype = intval($_REQUEST['message_subtype']); $subject = $db->escape($_REQUEST['subject']); $message = $db->escape($_REQUEST['message']); define('MY_PREFIX', get_my_prefix($db)); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "SET NAMES UTF8"); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tINSERT INTO `" . DB_PREFIX . MY_PREFIX . "my_admin_messages` (\n\t\t\t\t`parent_id`,\n\t\t\t\t`subject`,\n\t\t\t\t`message`,\n\t\t\t\t`message_type`,\n\t\t\t\t`message_subtype`,\n\t\t\t\t`decrypted`\n\t\t\t)\n\t\t\tVALUES (\n\t\t\t\t{$parent_id},\n\t\t\t\t'{$subject}',\n\t\t\t\t'{$message}',\n\t\t\t\t{$message_type},\n\t\t\t\t'{$message_subtype}',\n\t\t\t\t1\n\t\t\t)"); print $db->getInsertId();
$first_load_blockchain = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT `first_load_blockchain` FROM `' . DB_PREFIX . 'config` ', 'fetch_one'); // нужно узнать время последнего блока $confirmed_block_id = get_confirmed_block_id($db); $confirmed_block_id = $confirmed_block_id ? $confirmed_block_id : 1; // получим время из последнего подвержденного блока $last_block_bin = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `data`\n\t\t\tFROM `" . DB_PREFIX . "block_chain`\n\t\t\tWHERE `id` = {$confirmed_block_id}\n\t\t\tLIMIT 1\n\t\t\t", 'fetch_one'); ParseData::string_shift($last_block_bin, 5); // уберем тип и id блока $block_time = ParseData::binary_dec_string_shift($last_block_bin, 4); } else { require_once ABSPATH . 'includes/fns-main.php'; } if (isset($_REQUEST['tpl_name']) && check_input_data($_REQUEST['tpl_name'], 'tpl_name') && (!empty($_SESSION['user_id']) || preg_match("/^install_step_[0-9_]+\$/D", $_REQUEST['tpl_name']))) { $tpl_name = filter_var($_REQUEST['tpl_name'], FILTER_SANITIZE_STRING); } else { if (isset($db) && isset($install_progress) && $install_progress === 'complete' && empty($first_load_blockchain)) { // первый запуск, еще не загружен блокчейн $tpl_name = 'after_install'; } else { if (isset($db) && isset($install_progress) && $install_progress === 'complete') { $tpl_name = 'login'; } else { $tpl_name = 'install_step_0'; } } } // идет загрузка блокчейна if (isset($db) && $tpl_name != 'install_step_0' && time() - $block_time > 3600 * 2 && !empty($first_load_blockchain)) {
<?php define('DC', TRUE); define('ABSPATH', dirname(dirname(__FILE__)) . '/'); //require_once( ABSPATH . 'includes/errors.php' ); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); // Если в community не пусто, значит работаем в режиме пула. Авторизация по паролю запрещена. $community = get_community_users($db); if (!$community) { $hash_pass = filter_var($_POST['hash_pass'], FILTER_SANITIZE_STRING); if (check_input_data($hash_pass, 'hash_code')) { $private_key = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `private_key`\n\t\t\tFROM `" . DB_PREFIX . "my_keys`\n\t\t\tWHERE `block_id` = (SELECT max(`block_id`) FROM `" . DB_PREFIX . "my_keys` ) AND\n\t\t\t\t\t\t `password_hash` = '{$hash_pass}'\n\t\t\t", 'fetch_one'); if ($private_key) { session_start(); $my_user_id = get_my_user_id($db); $_SESSION['user_id'] = $my_user_id; if (!$_SESSION['user_id']) { $_SESSION['user_id'] = 'wait'; } if ($my_user_id == 1) { $_SESSION['ADMIN'] = 1; } print json_encode(array('result' => 1, 'key' => $private_key)); } else { print json_encode(array('result' => 0)); } } } else { print json_encode(array('result' => 0));
<?php define('DC', TRUE); define('ABSPATH', dirname(dirname(__FILE__)) . '/'); //require_once( ABSPATH . 'includes/errors.php' ); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); if (!check_input_data($_POST['sign'], 'hex_sign')) { json_encode(array('result' => 'bad hex_sign')); } if (!preg_match("/^[0-9a-z]{1,2048}\$/D", $_POST['e'])) { json_encode(array('result' => 'bad e')); } if (!preg_match("/^[0-9a-z]{1,2048}\$/D", $_POST['n'])) { json_encode(array('result' => 'bad n')); } $sign = hextobin($_POST['sign']); $tables_array = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSHOW TABLES\n\t\t\t", 'array'); $community = get_community_users($db); $result = 0; if ($community) { // в цикле проверяем, кому подойдет присланная подпись for ($i = 0; $i < sizeof($community); $i++) { $my_prefix = $community[$i] . '_'; if (!in_array("{$my_prefix}my_keys", $tables_array)) { continue; } // получим открытый ключ юзера $public_key = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `public_key`\n\t\t\t\tFROM `" . DB_PREFIX . "{$my_prefix}my_keys`\n\t\t\t\tWHERE `block_id` = (SELECT max(`block_id`) FROM `" . DB_PREFIX . "{$my_prefix}my_keys` )\n\t\t\t\t", 'fetch_one'); $ini_array = parse_ini_file(ABSPATH . "config.ini", true);
<?php session_start(); if (empty($_SESSION['user_id'])) { die('!user_id'); } define('DC', TRUE); define('ABSPATH', dirname(dirname(__FILE__)) . '/'); //require_once( ABSPATH . 'includes/errors.php' ); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); $user_id = intval($_REQUEST['user_id']); if (!check_input_data($user_id, 'int')) { die('error user_id'); } $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "SET NAMES UTF8"); $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT *\n\t\tFROM `" . DB_PREFIX . "abuses`\n\t\tWHERE `user_id` = {$user_id}\n\t\t"); $abuses = ''; while ($row = $db->fetchArray($res)) { $abuses .= 'from_user_id: ' . $row['from_user_id'] . '; time: ' . date('d-m-Y H:i:s', $row['time']) . '; comment: ' . $row['comment'] . "<br>"; } if (!$abuses) { $abuses = 'No'; } $reg_time = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `reg_time`\n\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\tWHERE `user_id` = {$user_id}\n\t\t", 'fetch_one'); $reg_time = date('d-m-Y H:i:s', $reg_time); echo json_encode(array('abuses' => $abuses, 'reg_time' => $reg_time));
// удаление юзера с пула $del_id = intval(@$_REQUEST['parameters']['del_id']); if ($del_id) { $tables_array = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSHOW TABLES\n\t\t\t", 'array'); foreach ($my_tables as $table) { if (in_array(DB_PREFIX . "{$del_id}_{$table}", $tables_array)) { $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tDROP TABLE `" . DB_PREFIX . "{$del_id}_{$table}`\n\t\t\t\t\t"); } } $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tDELETE FROM `" . DB_PREFIX . "community`\n\t\t\tWHERE `user_id` = {$del_id}\n\t\t\t"); } if (isset($_REQUEST['parameters']['pool_tech_works'])) { $pool_tech_works = intval($_REQUEST['parameters']['pool_tech_works']); $pool_max_users = intval($_REQUEST['parameters']['pool_max_users']); $commission = $_REQUEST['parameters']['commission']; if (!check_input_data($commission, 'commission')) { die('bad commission'); } $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tUPDATE `" . DB_PREFIX . "config`\n\t\t\tSET `pool_tech_works` = {$pool_tech_works},\n\t\t\t\t `pool_max_users` = {$pool_max_users},\n\t\t\t\t `commission` = '{$commission}'\n\t\t\t"); } $tables_array = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSHOW TABLES\n\t\t\t", 'array'); $tpl['users'] = array(); $community = get_community_users($db); for ($i = 0; $i < sizeof($community); $i++) { if ($community[$i] != $user_id) { if (in_array("{$community[$i]}_my_table", $tables_array)) { $tpl['users'][$community[$i]] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `miner_id`,\n\t\t\t\t\t\t\t\t `email`\n\t\t\t\t\tFROM `" . DB_PREFIX . "{$community[$i]}_my_table`\n\t\t\t\t\tLIMIT 1\n\t\t\t\t\t", 'fetch_array'); } } } $tpl['config'] = get_node_config();
<?php session_start(); if (empty($_SESSION['user_id'])) { die('!user_id'); } define('DC', TRUE); define('ABSPATH', dirname(dirname(__FILE__)) . '/'); //require_once( ABSPATH . 'includes/errors.php' ); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); if (!empty($_SESSION['restricted'])) { die('Permission denied'); } define('MY_PREFIX', get_my_prefix($db)); if (!check_input_data($_REQUEST['race'], 'int')) { die('error race'); } $race = intval($_REQUEST['race']); if (!check_input_data($_REQUEST['country'], 'int')) { die('error country'); } $country = intval($_REQUEST['country']); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tUPDATE `" . DB_PREFIX . MY_PREFIX . "my_table`\n\t\tSET `race` = {$race},\n\t\t\t\t`country` = {$country}\n\t\t");
require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); if (!empty($_SESSION['restricted'])) { die('Permission denied'); } $my_user_id = $_SESSION['user_id']; $min_amount = $db->escape($_REQUEST['min_amount']); $currency_id = $db->escape($_REQUEST['currency_id']); $ps_id = $db->escape($_REQUEST['payment_system_id']); if (!check_input_data($min_amount, 'amount')) { die('error min_amount'); } if (!check_input_data($currency_id, 'int')) { die('error currency_id'); } if (!check_input_data($ps_id, 'int')) { die('error payment_system_id'); } $max_promised_amounts = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `amount`\n\t\tFROM `" . DB_PREFIX . "max_promised_amounts`\n\t\tWHERE `currency_id` = {$currency_id}\n\t\tORDER BY `time` DESC\n\t\tLIMIT 1\n\t\t", 'fetch_one'); if ($ps_id) { $add_sql = " (`ps1` = {$ps_id} OR `ps2` = {$ps_id} OR `ps3` = {$ps_id} OR `ps4` = {$ps_id} OR `ps5` = {$ps_id}) AND"; } else { $add_sql = ""; } $print = ''; $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `amount`,\n\t\t\t\t\t `latitude`,\n\t\t\t\t\t `longitude`,\n\t\t\t\t\t `" . DB_PREFIX . "promised_amount`.`user_id`\n\t\tFROM `" . DB_PREFIX . "promised_amount`\n\t\tLEFT JOIN `" . DB_PREFIX . "miners_data` ON `" . DB_PREFIX . "miners_data`.`user_id` = `" . DB_PREFIX . "promised_amount`.`user_id`\n\t\tWHERE `" . DB_PREFIX . "promised_amount`.`status` = 'mining' AND\n\t\t\t\t\t `currency_id` = {$currency_id} AND\n\t\t\t\t\t {$add_sql}\n\t\t\t\t\t `" . DB_PREFIX . "promised_amount`.`user_id`!={$my_user_id} AND\n\t\t\t\t\t `del_block_id` = 0\n\t\t"); while ($row = $db->fetchArray($res)) { //print_R($row); $repaid = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `amount`\n\t\t\t\tFROM `" . DB_PREFIX . "promised_amount`\n\t\t\t\tWHERE `status` = 'repaid' AND\n\t\t\t\t\t\t\t `currency_id` = {$currency_id} AND\n\t\t\t\t\t\t\t `user_id` = {$row['user_id']} AND\n\t\t\t\t\t\t\t `del_block_id` = 0\n\t\t\t\t", 'fetch_one'); //print $max_promised_amounts."\n"; //print $repaid."\n";
define('ABSPATH', dirname(dirname(__FILE__)) . '/'); set_time_limit(0); //require_once( ABSPATH . 'includes/errors.php' ); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); if (!empty($_SESSION['restricted'])) { die('Permission denied'); } $_REQUEST['data'] = str_ireplace("\n", "<br>", $_REQUEST['data']); $data = json_decode($_REQUEST['data'], true); $id = intval($_REQUEST['id']); if (!check_input_data($data['parent_id'], 'int')) { die('error parent_id'); } if (!check_input_data($data['type'], 'int')) { die('error type'); } if (!check_input_data($data['subtype'], 'int')) { die('error subtype'); } $data['subject'] = filter_var($data['subject'], FILTER_SANITIZE_STRING); $data['subject'] = str_ireplace(array('\'', '"'), '', $data['subject']); $data['subject'] = $db->escape($data['subject']); $data['message'] = filter_var($data['message'], FILTER_SANITIZE_STRING); $data['message'] = str_ireplace(array('\'', '"'), '', $data['message']); $data['message'] = $db->escape($data['message']); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "SET NAMES UTF8"); $sql = "\n\t\tUPDATE `" . DB_PREFIX . MY_PREFIX . "my_admin_messages`\n\t\tSET `parent_id` = " . intval($data['parent_id']) . ",\n\t\t\t `subject` = '{$data['subject']}',\n\t\t\t `message` = '{$data['message']}',\n\t\t\t `message_type` = '{$data['type']}',\n\t\t\t `message_subtype` = '{$data['subtype']}',\n\t\t\t `decrypted` = 1\n\t\tWHERE `id` = {$id}\n\t\t"; $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, $sql); print json_encode(array('parent_id' => $data['parent_id']));
<?php session_start(); if (empty($_SESSION['user_id'])) { die('!user_id'); } define('DC', TRUE); define('ABSPATH', dirname(dirname(__FILE__)) . '/'); //require_once( ABSPATH . 'includes/errors.php' ); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); if (!empty($_SESSION['restricted'])) { die('Permission denied'); } define('MY_PREFIX', get_my_prefix($db)); $host = filter_var($_REQUEST['host'], FILTER_SANITIZE_URL); if (substr($host, strlen($host) - 1, strlen($host)) != '/') { $host .= '/'; } // если плохой возращаем error if (!check_input_data($_REQUEST['host'], 'host')) { print json_encode(array('error' => 1)); } else { $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' UPDATE `' . DB_PREFIX . MY_PREFIX . 'my_table` SET `host` = "' . $host . '" '); print json_encode(array('error' => 0)); }
if (@$_REQUEST['parameters'] == 'lang=42' || $_REQUEST['parameters']['lang_id'] == '42') { $lang = 42; setlang($lang); } else { if (@$_REQUEST['parameters'] == 'lang=1' || $_REQUEST['parameters']['lang_id'] == '1') { $lang = 1; setlang($lang); } } $lang = get_lang(); require_once ABSPATH . 'lang/' . $lang . '.php'; $tpl['cf_url'] = get_cf_url(); if (!$tpl['cf_url']) { die('content access denied'); } // проверим, не идут ли тех. работы на пуле $config = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT `pool_admin_user_id`, `pool_tech_works` FROM `' . DB_PREFIX . 'config` ', 'fetch_array'); if ($config['pool_admin_user_id'] && $config['pool_admin_user_id'] != $_SESSION['user_id'] && $config['pool_tech_works'] == 1) { require_once ABSPATH . 'content/pool_tech_works.php'; } else { if (isset($_REQUEST['tpl_name']) && check_input_data($_REQUEST['tpl_name'], 'tpl_name')) { $tpl_name = filter_var($_REQUEST['tpl_name'], FILTER_SANITIZE_STRING); require_once ABSPATH . 'content/' . $tpl_name . '.php'; } else { require_once ABSPATH . 'content/cf_catalog.php'; } }
if (empty($_SESSION['user_id'])) { die('!user_id'); } define('DC', TRUE); define('ABSPATH', dirname(dirname(__FILE__)) . '/'); //require_once( ABSPATH . 'includes/errors.php' ); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); if (!empty($_SESSION['restricted'])) { die('Permission denied'); } if (!check_input_data($_REQUEST['id'], 'int')) { die('error id'); } if (!empty($data['parent_id']) && !check_input_data($data['parent_id'], 'int')) { die('error parent_id'); } if ($_REQUEST['type'] !== 'dc_transactions' && $_REQUEST['type'] !== 'arbitrator' && $_REQUEST['type'] !== 'seller' && $_REQUEST['type'] !== 'cash_requests' && $_REQUEST['type'] !== 'comments') { die('error type'); } define('MY_PREFIX', get_my_prefix($db)); // == если мы майнер и это dc_transactions, то сюда прислан зашифрованный коммент, который можно расшифровать только нод-кдючем $miner_id = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `miner_id`\n\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\tWHERE `user_id` = {$_SESSION['user_id']}\n\t\tLIMIT 1\n\t\t", 'fetch_one'); if ($miner_id > 0 && ($_REQUEST['type'] == 'dc_transactions' || $_REQUEST['type'] == 'arbitrator' || $_REQUEST['type'] == 'seller')) { $node_private_key = get_node_private_key($db, MY_PREFIX); // расшифруем коммент $rsa = new Crypt_RSA(); $rsa->loadKey($node_private_key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $_REQUEST['comment'] = $rsa->decrypt(hextobin($_REQUEST['comment']));
/** Обработка данных (блоков или транзакций), пришедших с гейта. Только проверка. */ public function ParseData_gate($only_tx = false) { $count_transactions = 0; $this->DataPre(); $this->global_variables = self::get_variables($this->db, array('max_tx_size', 'max_tx_count', 'error_time', 'max_block_user_transactions', 'max_user_transactions')); $transaction_binary_data = $this->binary_data; // если это транзакции (type>0), а не блок (type==0) if ($this->type > 0) { // проверим, есть ли такой тип тр-ий $error = $this->checkTxType($this->type); if ($error) { return $error; } debug_print('TX', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $transaction_binary_data = dec_binary($this->type, 1) . $transaction_binary_data; $transaction_binary_data_full = $transaction_binary_data; // нет ли хэша этой тр-ии у нас в БД? $error = $this->checkLogTx($transaction_binary_data_full); if ($error) { return $error; } $this->tx_hash = md5($transaction_binary_data); // преобразуем бинарные данные транзакции в массив $this->transaction_array = $this->parse_transaction($transaction_binary_data); if (!is_array($this->transaction_array)) { return $this->transaction_array; } debug_print($this->transaction_array, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // время транзакции может быть немного больше, чем время на ноде. // у нода может быть просто не настроено время. // время транзакции используется только для борьбы с атаками вчерашними транзакциями. // А т.к. мы храним хэши в log_transaction за 36 часов, то боятся нечего. $my_time = time(); if ($this->transaction_array[2] - MAX_TX_FORW > $my_time || $this->transaction_array[2] < $my_time - MAX_TX_BACK) { debug_print("tr_time={$this->transaction_array[2]}\nmy_time={$my_time}\nMAX_TX_FORW=" . MAX_TX_FORW . "\nMAX_TX_BACK=" . MAX_TX_BACK . "", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); return "error tx time ({$this->transaction_array[2]})"; } // $this->transaction_array[3] могут подсунуть пустой $user_id = @$this->transaction_array[3]; if (!check_input_data($user_id, 'bigint')) { return 'bad user_id'; } /*// от 1 юзера не может быть более X запросов за 1 минуту. Для борьбы с досами. $count = $this->db->query( __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, " SELECT `count` FROM `".DB_PREFIX."log_minute` WHERE `user_id` = {$user_id} ", 'fetch_one'); if (!$count) $this->db->query( __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, " INSERT INTO `".DB_PREFIX."log_minute` ( `user_id`, `count` ) VALUES ( {$user_id}, 1) "); else $this->db->query( __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, " UPDATE `".DB_PREFIX."log_minute` SET `count` = count+1 WHERE `user_id` = {$user_id} "); if ( $count > $this->global_variables['max_user_transactions'] ) return 'max_user_transactions'; */ } // если это блок if ($this->type == 0) { $count_transactions = array(); debug_print('BLOCK', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $rate = 1; // если есть $only_tx=true, то значит идет восстановление уже проверенного блока и заголовок не требуется if (!$only_tx) { $error = $this->ParseBlock(); if ($error) { debug_print("[error] " . $error, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); return $error; } // проверим данные, указанные в заголовке блока debug_print("CheckBlockHeader", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $error = $this->CheckBlockHeader(); if ($error) { return $error; } } else { debug_print('<$only_tx>', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); } // если в ходе проверки тр-ий возникает ошибка, то вызываем откатчик всех занесенных тр-ий. Эта переменная для него $this->full_tx_binary_data = $this->binary_data; $i = 0; $tx_for_RollbackTo = ''; if ($this->binary_data) { do { // обработка тр-ий может занять много времени, нужно отметиться upd_deamon_time($this->db); $transaction_size = $this->decode_length($this->binary_data); if (!$this->binary_data) { debug_print("transaction_size = {$transaction_size}\nthis->full_tx_binary_data = {$this->full_tx_binary_data}", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); return 'null $this->binary_data TX'; } // отчекрыжим одну транзакцию от списка транзакций $transaction_binary_data = $this->string_shift($this->binary_data, $transaction_size); $transaction_binary_data_full = $transaction_binary_data; // добавляем взятую тр-ию в набор тр-ий для RollbackTo, в котором пойдем в обратном порядке $tx_for_RollbackTo .= $this->encode_length_plus_data($transaction_binary_data); // нет ли хэша этой тр-ии у нас в БД? $error = $this->checkLogTx($transaction_binary_data); if ($error) { debug_print('[error]' . $error, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $this->RollbackTo($tx_for_RollbackTo, true, true); return $error; } $this->tx_hash = md5($transaction_binary_data); $this->transaction_array = $this->parse_transaction($transaction_binary_data); if (!is_array($this->transaction_array)) { return $this->transaction_array; } // $this->transaction_array[3] могут подсунуть пустой $user_id = @$this->transaction_array[3]; if (!check_input_data($user_id, 'bigint')) { return 'bad user_id'; } // считаем по каждому юзеру, сколько в блоке от него транзакций $count_transactions[$user_id]++; // чтобы 1 юзер не смог прислать дос-блок размером в 10гб, который заполнит своими же транзакциями if ($count_transactions[$user_id] > $this->global_variables['max_block_user_transactions']) { debug_print($count_transactions, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print($user_id, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print($this->global_variables, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $this->RollbackTo($tx_for_RollbackTo, true, true); return 'max_block_user_transactions'; } // проверим, есть ли такой тип тр-ий $error = $this->checkTxType($this->transaction_array[1]); if ($error) { return $error; } $fns_name = self::$MainArray[$this->transaction_array[1]]; //print '$fns_name='.$fns_name; $fns_name_init = $fns_name . '_init'; $fns_name_front = $fns_name . '_front'; debug_print('>>>>>>>>>>>>parsedatagate = ' . $fns_name_front, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); unset($this->tx_data); $error = $this->{$fns_name_init}(); if ($error) { return $error; } debug_print($this->tx_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $error = $this->{$fns_name_front}(); if ($error) { debug_print('[error]=>' . $error, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); //if (substr_count($error, '[limit_requests]')>0) // $this->RollbackTo ($tx_for_RollbackTo, false, true); //else $this->RollbackTo($tx_for_RollbackTo, true, true); return $error; } // пишем хэш тр-ии в лог $this->insert_in_log_tx($transaction_binary_data_full, $this->tx_data['time']); // ===================>ради эксперимента /* $this->db->query( __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, " UPDATE `".DB_PREFIX."transactions` SET `verified` = 1 WHERE `hash` = 0x".md5($transaction_binary_data_full)." "); */ // ==================================== $i++; } while ($this->binary_data); } } else { debug_print('memory', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // / $rate = 10; // Оперативные транзакции $fns_name = self::$MainArray[$this->type]; $fns_name_init = $fns_name . '_init'; $fns_name_front = $fns_name . '_front'; unset($this->tx_data); $error = $this->{$fns_name_init}(); if ($error) { return $error; } debug_print($this->tx_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $error = $this->{$fns_name_front}(); if ($error) { return $error; } $this->insert_in_log_tx($transaction_binary_data_full, $this->tx_data['time']); } }
} else { if (isset($_REQUEST['col'], $_REQUEST['row'], $_REQUEST['table'])) { $table = filter_var($_REQUEST['table'], FILTER_SANITIZE_STRING); $row = filter_var($_REQUEST['row'], FILTER_SANITIZE_STRING); $col = filter_var($_REQUEST['col'], FILTER_SANITIZE_STRING); $all_tables = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSHOW TABLES\n\t\t\t", 'array'); if (!in_array($table, $all_tables)) { die('error table'); } if (preg_match('/(my_|_my|config|_refs)/i', $table)) { die('error table'); } if (!preg_match('/^\\-?[0-9]{1,10}$/D', $row)) { die('error row'); } if (!check_input_data($col, 'bigint')) { die('error col'); } if ($row == -1) { $data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSHOW TABLE STATUS LIKE '{$table}'\n\t\t\t\t", 'fetch_array'); $row = $data['Rows'] - 1; } $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT *\n\t\t\tFROM `" . DB_PREFIX . "{$table}`\n\t\t\tLIMIT {$row}, 1\n\t\t\t"); $data = $db->fetchArrayNum($res); print $data[$col]; } else { $all_counts = array(); $data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `current_version`,\n\t\t\t\t\t\t `block_id`\n\t\t\tFROM `" . DB_PREFIX . "info_block`\n\t\t\t", 'fetch_array'); $all_counts['time'] = time(); $all_counts['block_id'] = $data['block_id']; $all_counts['db_version'] = $data['current_version'];
function clear_incompatible_tx($binary_tx, $db, $my_tx) { $LOG_MARKER = md5($binary_tx); $fatal_error = ''; $wait_error = ''; $to_user_id = ''; // получим тип тр-ии и юзера list($type, $user_id, $third_var) = get_tx_type_and_user_id($binary_tx); if (!check_input_data($type, 'int')) { $fatal_error = 'error type'; } if (!check_input_data($user_id, 'int')) { $fatal_error = 'error user_id'; } if (!check_input_data($third_var, 'int')) { $fatal_error = 'error $third_var'; } if ($type == ParseData::findType('cash_request_out')) { $to_user_id = $third_var; } if ($type == ParseData::findType('new_pct') || $type == ParseData::findType('new_reduction') || $type == ParseData::findType('new_max_promised_amounts') || $type == ParseData::findType('new_max_other_currencies')) { // чтобы никому не слать эту тр-ю $for_self_use = 1; // $my_tx == true - это значит функция вызвана из pct_generator.php/reduction_generator.php // если же false, то она была спаршена query_tx или tesblock_generator и имела verified=0 // а т.к. new_pct/new_reduction актуальны только 1 блок, то нужно её удалять if (!$my_tx) { $fatal_error = 'old new_pct/new_reduction/new_max_promised_amounts/new_max_other_currencies'; $return = array($fatal_error, $wait_error, $for_self_use, $type, $user_id, $to_user_id); debug_print($return, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); return $return; } } else { $for_self_use = 0; } // две тр-ии одного типа от одного юзера не должны попасть в один блок // исключение - перевод DC между юзерами if (!$fatal_error) { clear_incompatible_tx_sql($db, $type, $user_id, $wait_error); // если новая тр-ия - это запрос на удаление или изменение обещанной суммы, то нужно проверить // нет ли запросов на получение обещанных сумм к данному юзеру // а также, нужно проверить, нет ли от данного юзера тр-ии cash_request_in if ($type == ParseData::findType('del_promised_amount') || $type == ParseData::findType('change_promised_amount')) { debug_print('если новая тр-ия - это запрос на удаление банкноты, то нужно проверить, нет ли запросов на получение банкнот к данному юзеру, а также, нужно проверить, нет от данного юзера тр-ии cash_request_in', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t FROM (\n\t\t\t\t SELECT `user_id`\n\t\t\t\t FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t WHERE (\n\t\t\t\t `third_var` = {$user_id} AND\n\t\t\t\t\t `verified`=1 AND\n\t\t\t\t\t `used` = 0\n\t\t\t\t\t )\n\t\t\t\t OR (\n\t\t\t\t\t `type` = " . ParseData::findType('cash_request_in') . " AND\n\t\t\t\t\t `user_id` = {$user_id}\n\t\t\t\t )\n\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\tWHERE (\n\t\t\t\t\t\t\t\t\t\t\t `third_var` = {$user_id}\n\t\t\t\t\t\t\t\t\t\t) OR (\n\t\t\t\t\t `type` = " . ParseData::findType('cash_request_in') . " AND\n\t\t\t\t\t `user_id` = {$user_id}\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) AS `x`\n\t\t\t\t\t\t", 'fetch_one'); debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if ($num) { $fatal_error = "`third_var` = {$user_id}"; } } // если новая тр-ия - это запрос на получение наличных, то нужно проверить // нет ли у получающего юзера запросов на удаление или изменение обещанных сумм if ($type == ParseData::findType('cash_request_out')) { debug_print('если новая тр-ия - это запрос на получение банкнот, то нужно проверить, нет ли у получающего юзера запросов на удаление банкнот', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $tx_data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT *\n\t\t\t FROM (\n\t\t\t\t SELECT `data`\n\t\t\t\t FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t WHERE `type` IN (" . ParseData::findType('del_promised_amount') . ", " . ParseData::findType('change_promised_amount') . ") AND\n\t\t\t\t `user_id` = {$to_user_id} AND\n\t\t\t\t `verified`=1 AND\n\t\t\t\t `used` = 0\n\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\tSELECT `data`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\tWHERE `type` IN (" . ParseData::findType('del_promised_amount') . ", " . ParseData::findType('change_promised_amount') . ") AND\n\t\t\t\t\t\t\t\t\t\t `user_id` = {$to_user_id}\n\t\t\t\t\t\t) AS `x`\n\t\t\t\t\t\t", 'fetch_one'); debug_print('$tx_data =' . $tx_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if ($tx_data) { // откатим фронтальные записи $parsedata = new ParseData(ParseData::encode_length_plus_data($tx_data), $db); $parsedata->ParseDataRollbackFront(); unset($parsedata); // Удаляем именно уже записанную тр-ию. При этом новая (cash_request_out) тр-ия успешно обработается $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\t\tDELETE\n\t\t\t FROM `" . DB_PREFIX . "transactions`\n\t\t\t WHERE `hash` = 0x" . md5($tx_data) . "\n\t\t\t\t\t\t\t"); /* * создает проблемы для tesblock_is_ready * * $db->query( __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, " DELETE FROM `".DB_PREFIX."transactions_testblock` WHERE `hash` = 0x".md5($tx_data)." ");*/ } } // если новая тр-ия - это запрос на получение банкнот, то нужно проверить // нет ли у отправителя запроса на отправку DC, т.к. после списания может не остаться средств if ($type == ParseData::findType('cash_request_out')) { clear_incompatible_tx_sql_set($db, array('send_dc', 'new_forex_order', 'cf_send_dc'), $user_id, $wait_error); } // и наоборот if (in_array($type, array(ParseData::findType('send_dc'), ParseData::findType('new_forex_order'), ParseData::findType('cf_send_dc')))) { clear_incompatible_tx_sql($db, 'cash_request_out', $user_id, $wait_error); } // на всякий случай не даем попасть в один блок holidays и тр-им, где holidays используются if ($type == ParseData::findType('new_holidays')) { clear_incompatible_tx_sql($db, 'mining', $user_id, $wait_error); } if ($type == ParseData::findType('mining')) { clear_incompatible_tx_sql($db, 'new_holidays', $user_id, $wait_error); } if ($type == ParseData::findType('new_holidays')) { clear_incompatible_tx_sql($db, 'cash_request_in', $user_id, $wait_error); } if ($type == ParseData::findType('cash_request_in')) { clear_incompatible_tx_sql($db, 'new_holidays', $user_id, $wait_error); } if ($type == ParseData::findType('cash_request_out')) { clear_incompatible_tx_sql($db, 'new_holidays', $to_user_id, $wait_error); } // не должно попадать в одни блок new_miner_update и new_miner if ($type == ParseData::findType('new_miner')) { clear_incompatible_tx_sql($db, 'new_miner_update', $user_id, $wait_error); } if ($type == ParseData::findType('new_miner_update')) { clear_incompatible_tx_sql($db, 'new_miner', $user_id, $wait_error); } // не должно попадать в один блок смена нодовского ключа и тр-ии которые этим ключем подписываются if ($type == ParseData::findType('change_node_key') || $type == ParseData::findType('new_miner')) { clear_incompatible_tx_sql($db, 'new_miner_update', $user_id, $wait_error); } if ($type == ParseData::findType('change_node_key') || $type == ParseData::findType('new_miner')) { clear_incompatible_tx_sql($db, 'new_pct', $user_id, $wait_error); } if ($type == ParseData::findType('new_miner_update')) { clear_incompatible_tx_sql_set($db, array('change_node_key', 'new_miner'), $user_id, $wait_error); } if ($type == ParseData::findType('new_pct')) { clear_incompatible_tx_sql_set($db, array('change_node_key', 'new_miner'), $user_id, $wait_error); } if ($type == ParseData::findType('change_node_key') || $type == ParseData::findType('new_miner')) { clear_incompatible_tx_sql($db, 'new_reduction', $user_id, $wait_error); } // восстановление ключа if ($type == ParseData::findType('change_key_request')) { clear_incompatible_tx_sql_set($db, array('change_key_active'), $third_var, $wait_error); } if ($type == ParseData::findType('change_key_active')) { clear_incompatible_tx_sql_set($db, array('change_key_request'), 0, $wait_error, $user_id); } // нельзя удалить/изменить обещанную сумму и затем создать запрос на её майнинг if ($type == ParseData::findType('mining')) { clear_incompatible_tx_sql_set($db, array('del_promised_amount', 'change_promised_amount'), $user_id, $wait_error); } if (in_array($type, array(ParseData::findType('del_promised_amount'), ParseData::findType('change_promised_amount')))) { clear_incompatible_tx_sql($db, 'mining', $user_id, $wait_error); } // в 1 блоке только 1 майнинг от юзера if ($type == ParseData::findType('mining')) { clear_incompatible_tx_sql($db, 'mining', $user_id, $wait_error); } if ($type == ParseData::findType('mining')) { clear_incompatible_tx_sql($db, 'admin_ban_miners', 0, $wait_error); } if ($type == ParseData::findType('cash_request_out')) { clear_incompatible_tx_sql($db, 'admin_ban_miners', 0, $wait_error); } if ($type == ParseData::findType('new_promised_amount')) { clear_incompatible_tx_sql($db, 'admin_ban_miners', 0, $wait_error); } if ($type == ParseData::findType('admin_ban_miners')) { rollback_incompatible_tx(array('cash_request_out', 'change_host', 'new_promised_amount', 'change_node_key', 'new_pct', 'mining', 'votes_miner', 'votes_node_new_miner', 'votes_promised_amount', 'abuses', 'new_promised_amount', 'votes_complex'), 0, $wait_error); } if ($type == ParseData::findType('votes_miner')) { clear_incompatible_tx_sql_set($db, array('admin_ban_miners'), 0, $wait_error); } if ($type == ParseData::findType('votes_complex')) { clear_incompatible_tx_sql_set($db, array('admin_ban_miners'), 0, $wait_error); } if ($type == ParseData::findType('abuses')) { // admin_ban_miners преоритетнее, abuses надо вытеснять clear_incompatible_tx_sql_set($db, array('admin_ban_miners'), 0, $wait_error); } // дополнить if ($type == ParseData::findType('votes_node_new_miner')) { clear_incompatible_tx_sql_set($db, array('admin_ban_miners'), 0, $wait_error); } if ($type == ParseData::findType('votes_promised_amount')) { clear_incompatible_tx_sql_set($db, array('admin_ban_miners'), 0, $wait_error); } // нельзя голосовать за обещанную сумму юзера $promised_amount_user_id, если он меняет свое местоположение, т.к. сменится статус if ($type == ParseData::findType('votes_promised_amount')) { $promised_amount_user_id = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\tFROM `" . DB_PREFIX . "promised_amount`\n\t\t\t\t\tWHERE `id` = {$third_var}\n\t\t\t\t\tLIMIT 1\n\t\t\t\t\t", 'fetch_one'); if ($promised_amount_user_id) { clear_incompatible_tx_sql_set($db, array('change_geolocation'), $promised_amount_user_id, $wait_error); } } // нельзя менять местоположение, если кто-то отдал голос за мою обещанную сумму if ($type == ParseData::findType('change_geolocation')) { $promised_amount_ids = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `id`\n\t\t\t\t\tFROM `" . DB_PREFIX . "promised_amount`\n\t\t\t\t\tWHERE `user_id` = {$user_id}\n\t\t\t\t\t", 'array'); $promised_amount_ids = implode(',', $promised_amount_ids); if ($promised_amount_ids) { $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t\t\t\t FROM (\n\t\t\t\t\t\t SELECT `user_id`\n\t\t\t\t\t\t FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t\t WHERE (\n\t\t\t\t\t\t `type` = " . ParseData::findType('votes_promised_amount') . " AND `third_var` IN ({$promised_amount_ids})\n\t\t\t\t\t\t ) AND\n\t\t\t\t\t\t `verified`=1 AND\n\t\t\t\t\t\t `used` = 0\n\t\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\t\tWHERE (\n\t\t\t\t\t\t `type` = " . ParseData::findType('votes_promised_amount') . " AND `third_var` IN ({$promised_amount_ids})\n\t\t\t\t\t\t )\n\t\t\t\t\t\t\t) AS `x`\n\t\t\t\t\t\t", 'fetch_one'); if ($num) { $wait_error = 'votes_promised_amount change_geolocation'; } } } // нельзя удалять CF-проект и в этом же блоке изменить его описание/профинансировать if ($type == ParseData::findType('del_cf_project')) { clear_incompatible_tx_sql_set($db, array('cf_comment', 'cf_send_dc', 'cf_project_change_category', 'cf_project_data'), 0, $wait_error, $third_var); } if (in_array($type, array(ParseData::findType('cf_comment'), ParseData::findType('cf_send_dc'), ParseData::findType('cf_project_change_category'), ParseData::findType('cf_project_data')))) { clear_incompatible_tx_sql_set($db, array('del_cf_project'), 0, $wait_error, $third_var); } // потом нужно сделать более тонко. но пока так. Если есть удаление проекта, тогда откатываем все тр-ии del_cf_funding if ($type == ParseData::findType('del_cf_project')) { rollback_incompatible_tx(array('del_cf_funding')); } // потом нужно сделать более тонко. но пока так. Если есть del_cf_funding, тогда откатываем все тр-ии удаления проектов if ($type == ParseData::findType('del_cf_funding')) { rollback_incompatible_tx(array('del_cf_project')); } // потом нужно сделать более тонко. но пока так. Если есть смена комиссии, то нельзя отправлять тр-ии, где указана комиссия if (in_array($type, array(ParseData::findType('cf_send_dc'), ParseData::findType('send_dc'), ParseData::findType('new_forex_order')))) { rollback_incompatible_tx(array('change_commission')); } if ($type == ParseData::findType('change_commission')) { clear_incompatible_tx_sql_set($db, array('cf_send_dc', 'send_dc', 'new_forex_order'), 0, $wait_error); } // Если есть смена коммиссий арбитров, то нельзя делать перевод монет, т.к. там может быть указана комиссия арбитра if (in_array($type, array(ParseData::findType('send_dc')))) { rollback_incompatible_tx(array('change_arbitrator_conditions')); } if ($type == ParseData::findType('change_arbitrator_conditions')) { clear_incompatible_tx_sql_set($db, array('send_dc'), 0, $wait_error); } // если идет смена списка арбитров, то у отправителя и у получателя может получиться нестыковка if (in_array($type, array(ParseData::findType('send_dc')))) { rollback_incompatible_tx(array('change_arbitrator_list')); } if ($type == ParseData::findType('change_arbitrator_list')) { clear_incompatible_tx_sql_set($db, array('send_dc'), 0, $wait_error); } // на всякий случай не даем попасть в один блок тр-ии отправки в CF-проект монет и другим тр-ям связанным с этим CF-проектом. Т.к. проект может завершиться и 2-я тр-я вызовет ошибку if ($type == ParseData::findType('cf_send_dc')) { clear_incompatible_tx_sql_set($db, array('cf_send_dc', 'cf_comment', 'del_cf_project', 'cf_project_change_category', 'cf_project_data'), 0, $wait_error, $third_var); } if (in_array($type, array(ParseData::findType('cf_send_dc'), ParseData::findType('cf_comment'), ParseData::findType('del_cf_project'), ParseData::findType('cf_project_change_category'), ParseData::findType('cf_project_data')))) { clear_incompatible_tx_sql_set($db, array('cf_send_dc'), 0, $wait_error, $third_var); } // нельзя удалять promised_amount и голосовать за него if ($type == ParseData::findType('del_promised_amount')) { clear_incompatible_tx_sql_set($db, array('votes_promised_amount'), 0, $wait_error, $third_var); } if ($type == ParseData::findType('votes_promised_amount')) { clear_incompatible_tx_sql_set($db, array('del_promised_amount'), 0, $wait_error, $third_var); } if ($type == ParseData::findType('new_max_promised_amounts')) { clear_incompatible_tx_sql_set($db, array('new_max_promised_amounts'), 0, $wait_error, $third_var); } if ($type == ParseData::findType('new_max_other_currencies')) { clear_incompatible_tx_sql_set($db, array('new_max_other_currencies'), 0, $wait_error, $third_var); } if ($type == ParseData::findType('new_pct')) { clear_incompatible_tx_sql_set($db, array('new_pct'), 0, $wait_error, $third_var); } if ($type == ParseData::findType('new_reductions')) { clear_incompatible_tx_sql_set($db, array('new_reductions'), 0, $wait_error, $third_var); } // в один блок должен попасть только один голос за один объект голосования. $third_var - объект голосования if (in_array($type, array(ParseData::findType('votes_promised_amount'), ParseData::findType('votes_miner'), ParseData::findType('votes_node_new_miner'), ParseData::findType('votes_complex')))) { $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t\t FROM (\n\t\t\t\t\t SELECT `user_id`\n\t\t\t\t\t FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t WHERE `type` IN (" . ParseData::findType('votes_promised_amount') . ", " . ParseData::findType('votes_miner') . ", " . ParseData::findType('votes_node_new_miner') . ", " . ParseData::findType('votes_complex') . ") AND\n\t\t\t\t\t `third_var` = {$third_var} AND\n\t\t\t\t\t `verified`=1 AND\n\t\t\t\t\t `used` = 0\n\t\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\t\tWHERE `type` IN (" . ParseData::findType('votes_promised_amount') . ", " . ParseData::findType('votes_miner') . ", " . ParseData::findType('votes_node_new_miner') . ", " . ParseData::findType('votes_complex') . ") AND\n\t\t\t\t\t `third_var` = {$third_var}\n\t\t\t\t\t\t\t) AS `x`\n\t\t\t\t\t\t", 'fetch_one'); debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if ($num) { $wait_error = 'only 1 vote'; } } // если новая тр-ия - это запрос, в котором юзер отдает наличные (cash_request_in) // то нужно проверить, не хочет ли юзер удалить или изменить одну из обещанных сумм if ($type == ParseData::findType('cash_request_in')) { debug_print('если новая тр-ия - это запрос, в котором юзер отдает банкноты (cash_request_in), то нужно проверить, не хочет ли юзер удалить одну из передаваемых банкнот', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $tx_data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT *\n\t\t\t FROM (\n\t\t\t\t SELECT `data`\n\t\t\t\t FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t WHERE `type` IN (" . ParseData::findType('del_promised_amount') . ", " . ParseData::findType('change_promised_amount') . ") AND\n\t\t\t\t `user_id` = {$user_id} AND\n\t\t\t\t `verified`=1 AND\n\t\t\t\t `used` = 0\n\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\tSELECT `data`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\tWHERE `type` IN (" . ParseData::findType('del_promised_amount') . ", " . ParseData::findType('change_promised_amount') . ") AND\n\t\t\t\t\t\t\t\t\t\t `user_id` = {$user_id}\n\t\t\t\t\t\t) AS `x`\n\t\t\t\t\t\t", 'fetch_one'); debug_print('$tx_data =' . $tx_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if ($tx_data) { // откатим фронтальные записи $parsedata = new ParseData(ParseData::encode_length_plus_data($tx_data), $db); $parsedata->ParseDataRollbackFront(); unset($parsedata); // Удаляем именно уже записанную тр-ию. При этом новая (cash_request_in) тр-ия успешно обработается $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\t\tDELETE\n\t\t\t FROM `" . DB_PREFIX . "transactions`\n\t\t\t WHERE `hash` = 0x" . md5($tx_data) . "\n\t\t\t\t\t\t\t"); /* * создает проблемы для tesblock_is_ready * $db->query( __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, " DELETE FROM `".DB_PREFIX."transactions_testblock` WHERE `hash` = 0x".md5($tx_data)." "); */ } } if ($type == ParseData::findType('change_primary_key')) { debug_print('если новая тр-я - это смена праймари ключа, то не должно быть никаких других тр-ий от этого юзера', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t\t FROM (\n\t\t\t\t\t SELECT `user_id`\n\t\t\t\t\t FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t WHERE `user_id` = {$user_id} AND\n\t\t\t\t\t `verified`=1 AND\n\t\t\t\t\t `used` = 0\n\t\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\t\tWHERE `user_id` = {$user_id}\n\t\t\t\t\t\t\t) AS `x`\n\t\t\t\t\t\t", 'fetch_one'); debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if ($num) { $wait_error = 'there are other tr-s'; } } if ($type == ParseData::findType('admin_change_primary_key')) { debug_print('если новая тр-я - это смена праймари ключа, то не должно быть никаких других тр-ий от юзера, которому меняем ключ', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t\t FROM (\n\t\t\t\t\t SELECT `user_id`\n\t\t\t\t\t FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t WHERE `user_id` = {$third_var} AND\n\t\t\t\t\t `verified`=1 AND\n\t\t\t\t\t `used` = 0\n\t\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\t\tWHERE `user_id` = {$third_var}\n\t\t\t\t\t\t\t) AS `x`\n\t\t\t\t\t\t", 'fetch_one'); debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if ($num) { $wait_error = 'there are other tr-s'; } } // любая тр-я от юзера не должна проходить, если уже есть тр-я со сменой праймари ключа или new_pct или new_reduction $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\tSELECT count(*)\n\t\t\t\t FROM (\n\t\t\t\t\t SELECT `user_id`\n\t\t\t\t\t FROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t WHERE (\n\t\t\t\t\t\t (`type` = " . ParseData::findType('change_primary_key') . " AND `user_id` = {$user_id})\n\t\t\t\t\t\t OR\n\t\t\t\t\t\t (type IN (" . ParseData::findType('new_pct') . ", " . ParseData::findType('new_reduction') . ") )\n\t\t\t\t\t ) AND\n\t\t\t\t\t `verified`=1 AND\n\t\t\t\t\t `used` = 0\n\t\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\t\tWHERE (\n\t\t\t\t\t\t (`type` = " . ParseData::findType('change_primary_key') . " AND `user_id` = {$user_id})\n\t\t\t\t\t\t OR\n\t\t\t\t\t\t (type IN (" . ParseData::findType('new_pct') . ", " . ParseData::findType('new_reduction') . ") )\n\t\t\t\t\t )\n\t\t\t\t\t\t\t) AS `x`\n\t\t\t\t\t\t", 'fetch_one'); debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if ($num) { $wait_error = 'have change_primary_key tx'; } // если пришло new_pct, то нужно откатить следующие тр-ии if ($type == ParseData::findType('new_pct')) { rollback_incompatible_tx(array('new_reduction', 'change_node_key', 'new_miner', 'votes_promised_amount', 'send_dc', 'cash_request_in', 'mining', 'cf_send_dc', 'del_cf_project', 'new_forex_order', 'del_forex_order', 'for_repaid_fix', 'actualization_promised_amounts', 'del_cf_funding', 'admin_unban_miners', 'admin_ban_miners')); } // если пришло new_reduction, то нужно откатить следующие тр-ии if ($type == ParseData::findType('new_reduction')) { rollback_incompatible_tx(array('new_pct', 'change_node_key', 'new_miner', 'votes_promised_amount', 'send_dc', 'cash_request_in', 'mining', 'cf_send_dc', 'del_cf_project', 'new_forex_order', 'del_forex_order', 'for_repaid_fix', 'actualization_promised_amounts', 'del_cf_funding', 'admin_unban_miners', 'admin_ban_miners')); } // временно запрещаем 2 тр-ии любого типа от одного юзера, а то затрахался уже. $num = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT count(*)\n\t\t\t\t FROM (\n\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions`\n\t\t\t\t\t\t\tWHERE `user_id` = {$user_id} AND\n\t\t\t\t `verified`=1 AND\n\t\t\t\t `used` = 0\n\t\t\t\t\t\t\tUNION\n\t\t\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t\t\t\t\t\tWHERE `user_id` = {$user_id}\n\t\t\t\t\t) AS `x`\n\t\t\t\t", 'fetch_one'); debug_print('$num =' . $num, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if ($num) { $wait_error = 'only 1 tx'; } } if ($fatal_error) { debug_print('fatal[error] ==' . $fatal_error, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); } if ($wait_error) { debug_print('wait[error] ==' . $wait_error, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); } $return = array($fatal_error, $wait_error, $for_self_use, $type, $user_id, $third_var); debug_print($return, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); return $return; }
require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; require_once ABSPATH . 'includes/errors.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); $data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT *\n\t\t\tFROM `" . DB_PREFIX . "testblock`\n\t\t\tLIMIT 1\n\t\t\t", 'fetch_array'); $response_binary_data = dec_binary($data['block_id'], 4) . dec_binary($data['time'], 4) . dec_binary($data['user_id'], 5) . encode_length(strlen($data['signature'])) . $data['signature']; // разбираем присланные данные $binary_data = $_POST['data']; $add_sql = ''; if ($binary_data) { $tr_array = array(); // получим хэши тр-ий, которые надо исключить do { list(, $tr) = unpack("H*", ParseData::string_shift($binary_data, 16)); // проверим if (!check_input_data($tr, 'md5')) { die('error md5 (' . $tr . ')'); } $add_sql .= $tr . ','; } while ($binary_data); $add_sql = substr($add_sql, 0, -1); $add_sql = "WHERE `id` NOT IN ({$add_sql})"; } // сами тр-ии $transactions = ''; $res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT `data`\n\t\tFROM `" . DB_PREFIX . "transactions_testblock`\n\t\t{$add_sql}\n\t\t"); while ($row = $db->fetchArray($res)) { $length = encode_length(strlen($row['data'])); $transactions .= $length . $row['data']; } $response_binary_data .= encode_length(strlen($transactions)) . $transactions;
$new_testblock['user_id'] = ParseData::binary_dec_string_shift($new_testblock_binary, 5); list(, $new_testblock['mrkl_root']) = unpack("H*", string_shift($new_testblock_binary, 32)); $sign_size = ParseData::decode_length($new_testblock_binary); $new_testblock['signature'] = ParseData::string_shift($new_testblock_binary, $sign_size); $new_testblock['signature_hex'] = bin2hex($new_testblock['signature']); debug_print("new_testblock: " . print_r_hex($new_testblock), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if (!check_input_data($new_testblock['block_id'], 'int')) { die('[error] gate_tetblock.php 1 block_id'); } if (!check_input_data($new_testblock['user_id'], 'int')) { die('[error] gate_tetblock.php user_id'); } if (!check_input_data($new_testblock['time'], 'int')) { die('[error] gate_tetblock.php time'); } if (!check_input_data($new_testblock['mrkl_root'], 'sha256')) { die('[error] gate_tetblock.php mrkl_root'); } //if ( !check_input_data ($new_testblock['signature'] , 'sha256') ) // die('error signature'); main_lock(); $testBlock = new testblock($db, true); if (!isset($testBlock->block_info)) { main_unlock(); die('block_info error'); } // получим id майнеров, которые на нашем уровне $nodes_ids = $testBlock->getOurLevelNodes(); // временно для теста выключим // проверим, верный ли ID блока if ($new_testblock['block_id'] != $testBlock->block_info['block_id'] + 1) {
<?php session_start(); if (empty($_SESSION['user_id'])) { die('!user_id'); } define('DC', TRUE); define('ABSPATH', dirname(dirname(__FILE__)) . '/'); set_time_limit(0); //require_once( ABSPATH . 'includes/errors.php' ); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); require_once ABSPATH . 'lang/' . get_lang() . '.php'; $project_currency_name = $db->escape($_REQUEST['project_currency_name']); if (!check_input_data($project_currency_name, 'cf_currency_name')) { die(json_encode(array('error' => $lng['incorrect_currency_name']))); } // проверим, не занято ли имя валюты $currency = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `id`\n\t\t\t\tFROM `" . DB_PREFIX . "cf_projects`\n\t\t\t\tWHERE `project_currency_name` = '{$project_currency_name}' AND\n\t\t\t\t\t\t\t `close_block_id` = 0 AND\n\t\t\t\t\t\t\t `del_block_id` = 0\n\t\t\t\tLIMIT 1\n\t\t\t\t", 'fetch_one'); if ($currency) { die(json_encode(array('error' => $lng['currency_name_busy']))); } // проверим, не занято ли имя валюты $currency = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `id`\n\t\t\t\tFROM `" . DB_PREFIX . "cf_currency`\n\t\t\t\tWHERE `name` = '{$project_currency_name}'\n\t\t\t\tLIMIT 1\n\t\t\t\t", 'fetch_one'); if ($currency) { die(json_encode(array('error' => $lng['currency_name_busy']))); } print json_encode(array('success' => $lng['name_is_not_occupied']));
$pool_commission = json_decode($pool_commission, true); } foreach ($commission_decode as $currency_id => $data) { if (!check_input_data($currency_id, 'bigint')) { die('bad $currency_id'); } // % от 0 до 10 if (!check_input_data($data[0], 'currency_commission') || $data[0] > 10) { die('bad pct'); } // минимальная комиссия от 0. При 0% будет = 0 if (!check_input_data($data[1], 'currency_commission')) { die('bad currency_min_commission'); } // макс. комиссия. 0 - значит, считается по % if (!check_input_data($data[2], 'currency_commission')) { die('bad currency_max_commission'); } if ($data[1] > $data[2] && $data[2]) { die('bad currency_max_commission'); } // и если в пуле, то if ($pool_commission) { // нельзя допустить, чтобы блок подписал майнер, у которого комиссия больше той, что разрешана в пуле, // т.к. это приведет к попаднию в блок некорректной тр-ии, что приведет к сбою пула if ($data[0] > @$pool_commission[$currency_id][0]) { die($data[0] . ' > ' . @$pool_commission[$currency_id][0]); } if ($data[1] > @$pool_commission[$currency_id][1]) { die($data[1] . ' > ' . @$pool_commission[$currency_id][1]); }
} if (!check_input_data($_REQUEST['in_connections_ip_limit'], 'int')) { die('error in_connections_ip_limit'); } $in_connections_ip_limit = intval($_REQUEST['in_connections_ip_limit']); if (!check_input_data($_REQUEST['in_connections'], 'int')) { die('error in_connections'); } $in_connections = intval($_REQUEST['in_connections']); if (!check_input_data($_REQUEST['out_connections'], 'int')) { die('error out_connections'); } $out_connections = intval($_REQUEST['out_connections']); if (!check_input_data($_REQUEST['auto_reload'], 'int')) { die('error auto_reload'); } $auto_reload = intval($_REQUEST['auto_reload']); if (!check_input_data($_REQUEST['pool_admin_user_id'], 'int')) { die('error pool_admin_user_id'); } $pool_admin_user_id = intval($_REQUEST['pool_admin_user_id']); $cf_url = $db->escape($_REQUEST['cf_url']); $pool_url = $db->escape($_REQUEST['pool_url']); $exchange_api_url = $db->escape($_REQUEST['exchange_api_url']); define('MY_PREFIX', get_my_prefix($db)); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tUPDATE `" . DB_PREFIX . "config`\n\t\tSET `in_connections_ip_limit` = {$in_connections_ip_limit},\n\t\t\t\t`in_connections` = {$in_connections},\n\t\t\t\t`out_connections` = {$out_connections},\n\t\t\t\t`cf_url` = '{$cf_url}',\n\t\t\t\t`pool_url` = '{$pool_url}',\n\t\t\t\t`pool_admin_user_id` = {$pool_admin_user_id},\n\t\t\t\t`exchange_api_url` = '{$exchange_api_url}',\n\t\t\t\t`auto_reload` = {$auto_reload}\n\t\t"); $config_ini = $_POST['config_ini']; if (!parse_ini_string($config_ini)) { die('error config_ini'); } @file_put_contents(ABSPATH . 'config.ini', $config_ini);
<?php if (!defined('DC')) { die("!defined('DC')"); } if (isset($_REQUEST['first_load_blockchain']) && !isset($_REQUEST['parameters']['lang'])) { if ($_REQUEST['first_load_blockchain'] == 'nodes') { $type = 'nodes'; } else { $type = 'file'; } $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tUPDATE `" . DB_PREFIX . "config`\n\t\t\tSET`first_load_blockchain` = '{$type}'\n\t\t\t"); } if (isset($_REQUEST['public_key']) && !isset($_REQUEST['parameters']['lang'])) { $public_key = $_REQUEST['public_key']; if (!check_input_data($public_key, 'hex')) { die('public_key not hex'); } $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tINSERT INTO `" . DB_PREFIX . "my_keys`(\n\t\t\t`public_key`,\n\t\t\t`status`\n\t\t)\n\t\tVALUES (\n\t\t\t0x{$public_key},\n\t\t\t'approved'\n\t\t)"); } require_once ABSPATH . 'templates/after_install.tpl';
<?php define('DC', TRUE); define('ABSPATH', dirname(dirname(__FILE__)) . '/'); set_time_limit(30); require_once ABSPATH . 'db_config.php'; require_once ABSPATH . 'includes/autoload.php'; $db = new MySQLidb(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT); $start = intval(@$_REQUEST['start']); $block_id = intval(@$_REQUEST['block_id']); if (!empty($start) && !check_input_data($start, 'bigint')) { die('bad input data'); } if (!empty($block_id) && !check_input_data($block_id, 'bigint')) { die('bad input data'); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <html> <head> <title>Block explorer</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link href="../css/bootstrap.min.css" rel="stylesheet"> <link href="../css/sb-admin.css" rel="stylesheet"> <style type="text/css"> body { padding: 10px 10px 10px 10px; } </style> </head> <body>
if (!check_input_data($tpl['head_img'], 'img_url')) { $tpl['head_img'] = $img_blank; } if (!check_input_data($tpl['description_img'], 'img_url')) { $tpl['description_img'] = $img_blank; } if (!check_input_data($tpl['picture'], 'img_url')) { $tpl['picture'] = $img_blank; } if (!check_input_data($tpl['news_img'], 'img_url')) { $tpl['news_img'] = $img_blank; } if (!check_input_data($tpl['video_type'], 'video_type')) { $tpl['video_type'] = ''; } if (!check_input_data($tpl['video_url_id'], 'video_url_id')) { $tpl['video_url_id'] = ''; } $tpl['project'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\tSELECT *\n\t\tFROM `" . DB_PREFIX . "cf_projects`\n\t\tWHERE `id` = {$tpl['project_id']}\n\t\t", 'fetch_array'); // сколько дней осталось $tpl['project']['days'] = round(($tpl['project']['end_time'] - time()) / (3600 * 24)); if ($tpl['project']['days'] <= 0) { $tpl['project']['days'] = 0; } if ($tpl['project']['close_block_id'] || $tpl['project']['del_block_id']) { $tpl['project']['ended'] = 1; } // дата старта $tpl['project']['start_date'] = date('d-m-Y H:i', $tpl['project']['start_time']); // в какой валюте идет сбор $currency_list = get_currency_list($db);