mirror of
https://github.com/fusionpbx/fusionpbx.git
synced 2025-12-30 00:53:50 +00:00
remove all $_SESSION references and use single database object (#7095)
Updates: - use config object to find and load config file - use single database object with config passed in constructor - use settings object with database passed in constructor - parse command line options with for loop so order no longer matters - store all passed options in the super global $_REQUEST array for easy reference and debugging - add debug and debug_level options for command line - allow dumping the command line arguments when debug_level is 3 or higher - add config option in command line to set location of config file - add a shutdown function to allow for the exit command to be used but still output to either console or file - add extra checks for options that are needed during runtime - remove old PHP version 4 code - add is_file check when checking for a valid .tiff file because file_exists returns true if it's a directory or file
This commit is contained in:
@@ -26,7 +26,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
//file or console
|
//file or console
|
||||||
$output_type = "file";
|
$output_type = "file";
|
||||||
|
|
||||||
//only allow command line
|
//only allow command line
|
||||||
if (!defined('STDIN')) {
|
if (!defined('STDIN')) {
|
||||||
@@ -92,11 +92,11 @@ if (!function_exists('tiff2pdf')) {
|
|||||||
//convert the tif to a pdf
|
//convert the tif to a pdf
|
||||||
//Ubuntu: apt-get install libtiff-tools
|
//Ubuntu: apt-get install libtiff-tools
|
||||||
|
|
||||||
global $IS_WINDOWS;
|
global $settings, $IS_WINDOWS;
|
||||||
|
|
||||||
if (!file_exists($tiff_file_name)) {
|
if (!file_exists($tiff_file_name) || !is_file($tiff_file_name)) {
|
||||||
echo "tiff file does not exists";
|
echo "tiff file does not exist\n";
|
||||||
return false; // "tiff file does not exists";
|
return false; // "tiff file does not exist";
|
||||||
}
|
}
|
||||||
|
|
||||||
$GS = $IS_WINDOWS ? 'gswin32c' : 'gs';
|
$GS = $IS_WINDOWS ? 'gswin32c' : 'gs';
|
||||||
@@ -109,22 +109,22 @@ if (!function_exists('tiff2pdf')) {
|
|||||||
return $pdf_file_name;
|
return $pdf_file_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
$dir_fax_temp = $_SESSION['server']['temp']['dir'];
|
$dir_fax_temp = $settings->get('server', 'temp', sys_get_temp_dir());
|
||||||
if (!$dir_fax_temp) {
|
if (!$dir_fax_temp) {
|
||||||
$dir_fax_temp = path_join(dirname($dir_fax), 'temp');
|
$dir_fax_temp = path_join(dirname($dir_fax), 'temp');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file_exists($dir_fax_temp)) {
|
if (!file_exists($dir_fax_temp)) {
|
||||||
echo "can not create temporary directory";
|
echo "cannot create temporary directory\n";
|
||||||
return false; //
|
return false; //cannot create temporary directory
|
||||||
}
|
}
|
||||||
|
|
||||||
$cmd = "tiffinfo " . correct_path($tiff_file_name) . ' | grep "Resolution:"';
|
$cmd = "tiffinfo " . correct_path($tiff_file_name) . ' | grep "Resolution:"';
|
||||||
$ok = false;
|
$ok = false;
|
||||||
$resp = exec_in_dir($dir_fax, $cmd, $ok);
|
$resp = exec_in_dir($dir_fax, $cmd, $ok);
|
||||||
if (!$ok) {
|
if (!$ok) {
|
||||||
echo "can not find fax resoulution";
|
echo "cannot find fax resoulution\n";
|
||||||
return false; // "can not find fax resoulution"
|
return false; // "cannot find fax resoulution"
|
||||||
}
|
}
|
||||||
|
|
||||||
$ppi_w = 0;
|
$ppi_w = 0;
|
||||||
@@ -172,7 +172,7 @@ if (!function_exists('tiff2pdf')) {
|
|||||||
$page_width = sprintf('%.4f', $page_width);
|
$page_width = sprintf('%.4f', $page_width);
|
||||||
$page_height = sprintf('%.4f', $page_height);
|
$page_height = sprintf('%.4f', $page_height);
|
||||||
|
|
||||||
$cmd = implode(' ', array('tiff2pdf',
|
$cmd = implode(' ', array('tiff2pdf',
|
||||||
'-o', correct_path($pdf_file_name),
|
'-o', correct_path($pdf_file_name),
|
||||||
correct_path($tiff_file_name),
|
correct_path($tiff_file_name),
|
||||||
));
|
));
|
||||||
@@ -209,73 +209,95 @@ if (!function_exists('fax_split_dtmf')) {
|
|||||||
ini_set('max_execution_time', 900); //15 minutes
|
ini_set('max_execution_time', 900); //15 minutes
|
||||||
ini_set('memory_limit', '96M');
|
ini_set('memory_limit', '96M');
|
||||||
|
|
||||||
//start the to cache the output
|
//add a delimeter to the log
|
||||||
|
echo "\n---------------------------------\n";
|
||||||
|
|
||||||
|
//get the parameters and save them as variables in the request superglobal
|
||||||
|
if (empty($_REQUEST)) {
|
||||||
|
foreach ($_SERVER['argv'] as $arg) {
|
||||||
|
if (strpos($arg, '=') !== false) {
|
||||||
|
[$key, $value] = explode('=', $arg, 2);
|
||||||
|
$_REQUEST[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//use a foreach loop so order doesn't matter
|
||||||
|
foreach ($_REQUEST as $key => $value) {
|
||||||
|
if (strpos($value, '=') !== false) {
|
||||||
|
$arg = explode('=', $value);
|
||||||
|
if (count($arg) > 1) {
|
||||||
|
$key = $arg[0];
|
||||||
|
$value = $arg[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch($key) {
|
||||||
|
case 'email':
|
||||||
|
$fax_email = $value;
|
||||||
|
break;
|
||||||
|
case 'extension':
|
||||||
|
$fax_extension = $value;
|
||||||
|
break;
|
||||||
|
case 'name':
|
||||||
|
$fax_file = $value;
|
||||||
|
break;
|
||||||
|
case 'messages':
|
||||||
|
$fax_messages = $value;
|
||||||
|
break;
|
||||||
|
case 'domain':
|
||||||
|
//domain_name is global for all functions
|
||||||
|
$domain_name = $value;
|
||||||
|
break;
|
||||||
|
case 'retry':
|
||||||
|
$fax_relay = $value;
|
||||||
|
break;
|
||||||
|
case 'mailfrom_address':
|
||||||
|
$mail_from_address = $value;
|
||||||
|
break;
|
||||||
|
case 'debug':
|
||||||
|
$output_type = 'console';
|
||||||
|
break;
|
||||||
|
case 'config':
|
||||||
|
$config_file = $value;
|
||||||
|
break;
|
||||||
|
case 'caller_id_name':
|
||||||
|
case 'caller_id_number':
|
||||||
|
case 'fax_relay':
|
||||||
|
case 'fax_prefix':
|
||||||
|
case 'domain_name':
|
||||||
|
case 'mail_from_address':
|
||||||
|
case 'output_type':
|
||||||
|
case 'fax_extension':
|
||||||
|
case 'debug_level':
|
||||||
|
case 'config_file':
|
||||||
|
//tansform the name of the key into the name of the variable using $$
|
||||||
|
$$key = $value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//mark global variables for all functions
|
||||||
|
global $output_type, $config, $database, $domain_name, $domains, $settings, $domain_uuid, $debug_level;
|
||||||
|
|
||||||
|
//run shutdown function on exit
|
||||||
|
register_shutdown_function('shutdown');
|
||||||
|
|
||||||
|
//start to cache the output
|
||||||
if ($output_type == "file") {
|
if ($output_type == "file") {
|
||||||
ob_end_clean();
|
ob_end_clean();
|
||||||
ob_start();
|
ob_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
//add a delimeter to the log
|
//find and load the config file
|
||||||
echo "\n---------------------------------\n";
|
$config = config::load($config_file ?? ''); //use the config_file option from command line if available
|
||||||
|
|
||||||
//get the parameters and save them as variables
|
//stop if no config
|
||||||
$php_version = substr(phpversion(), 0, 1);
|
if ($config->is_empty()) {
|
||||||
if ($php_version == '4') {
|
exit("Unable to find config file\n");
|
||||||
$domain_name = $_REQUEST["domain"];
|
|
||||||
$fax_email = $_REQUEST["email"];
|
|
||||||
$fax_extension = $_REQUEST["extension"];
|
|
||||||
$fax_file = $_REQUEST["name"];
|
|
||||||
$fax_messages = $_REQUEST["messages"];
|
|
||||||
$caller_id_name = $_REQUEST["caller_id_name"];
|
|
||||||
$caller_id_number = $_REQUEST["caller_id_number"];
|
|
||||||
$fax_relay = $_REQUEST["retry"];
|
|
||||||
$mail_from_address = $_REQUEST["mailfrom_address"];
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
$tmp_array = explode("=", $_SERVER["argv"][1]);
|
|
||||||
$fax_email = $tmp_array[1];
|
|
||||||
unset($tmp_array);
|
|
||||||
|
|
||||||
$tmp_array = explode("=", $_SERVER["argv"][2]);
|
//create a single database object
|
||||||
$fax_extension = $tmp_array[1];
|
$database = database::new(['config' => $config]);
|
||||||
unset($tmp_array);
|
|
||||||
|
|
||||||
$tmp_array = explode("=", $_SERVER["argv"][3]);
|
|
||||||
$fax_file = $tmp_array[1];
|
|
||||||
unset($tmp_array);
|
|
||||||
|
|
||||||
$tmp_array = explode("=", $_SERVER["argv"][4]);
|
|
||||||
$fax_messages = $tmp_array[1];
|
|
||||||
unset($tmp_array);
|
|
||||||
|
|
||||||
$tmp_array = explode("=", $_SERVER["argv"][5]);
|
|
||||||
$domain_name = $tmp_array[1];
|
|
||||||
unset($tmp_array);
|
|
||||||
|
|
||||||
$tmp_array = explode("=", $_SERVER["argv"][6]);
|
|
||||||
$caller_id_name = $tmp_array[1];
|
|
||||||
unset($tmp_array);
|
|
||||||
|
|
||||||
$tmp_array = explode("=", $_SERVER["argv"][7]);
|
|
||||||
$caller_id_number = $tmp_array[1];
|
|
||||||
unset($tmp_array);
|
|
||||||
|
|
||||||
$tmp_array = explode("=", $_SERVER["argv"][8]);
|
|
||||||
$fax_relay = $tmp_array[1];
|
|
||||||
unset($tmp_array);
|
|
||||||
|
|
||||||
$tmp_array = explode("=", $_SERVER["argv"][9]);
|
|
||||||
$fax_prefix = $tmp_array[1];
|
|
||||||
unset($tmp_array);
|
|
||||||
|
|
||||||
$tmp_array = explode("=", $_SERVER["argv"][10]);
|
|
||||||
$mail_from_address = $tmp_array[1];
|
|
||||||
unset($tmp_array);
|
|
||||||
|
|
||||||
//$tmp_array = explode("=", $_SERVER["argv"][10]);
|
|
||||||
//$destination_number = $tmp_array[1];
|
|
||||||
//unset($tmp_array);
|
|
||||||
}
|
|
||||||
|
|
||||||
//get the fax file name (only) if a full path
|
//get the fax file name (only) if a full path
|
||||||
$fax_path = pathinfo($fax_file);
|
$fax_path = pathinfo($fax_file);
|
||||||
@@ -283,34 +305,37 @@ if (!function_exists('fax_split_dtmf')) {
|
|||||||
$fax_file_name = $fax_path['filename'];
|
$fax_file_name = $fax_path['filename'];
|
||||||
$dir_fax = $fax_path['dirname'];
|
$dir_fax = $fax_path['dirname'];
|
||||||
|
|
||||||
//get the domain_uuid from the database
|
//get the enabled domains from the database
|
||||||
$sql = "select * from v_domains ";
|
//$domains = domains::fetch($database);
|
||||||
$sql .= "where domain_name = :domain_name ";
|
$domains = [];
|
||||||
$parameters['domain_name'] = $domain_name;
|
$result = $database->select("select domain_uuid, domain_name from v_domains where domain_enabled = 'true'");
|
||||||
$database = new database;
|
|
||||||
$result = $database->select($sql, $parameters, 'all');
|
|
||||||
if (is_array($result) && @sizeof($result) != 0) {
|
if (is_array($result) && @sizeof($result) != 0) {
|
||||||
foreach ($result as &$row) {
|
foreach ($result as $row) {
|
||||||
//set the domain variables
|
//set the domain variables
|
||||||
$domain_uuid = $row["domain_uuid"];
|
$domains[$row["domain_uuid"]] = $row["domain_name"];
|
||||||
$_SESSION["domain_uuid"] = $row["domain_uuid"];
|
|
||||||
$_SESSION["domain_name"] = $domain_name;
|
|
||||||
//set the setting arrays
|
|
||||||
$domain = new domains();
|
|
||||||
$domain->set();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
unset($sql, $parameters, $result);
|
unset($result, $row);
|
||||||
|
|
||||||
|
//set the global variable domain_uuid using domain_name passed on command line
|
||||||
|
$domain_uuid = array_search($domain_name, $domains);
|
||||||
|
|
||||||
|
//ensure we have a domain_uuid
|
||||||
|
if (empty($domain_uuid)) {
|
||||||
|
exit("Domain '$domain_name' not found\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//ensure we have a fax extension
|
||||||
|
if (empty($fax_extension)) {
|
||||||
|
exit("No fax extension set\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
//now that we have the domain_name and uuid, create a settings object for the domain
|
||||||
|
$settings = new settings(['database' => $database, 'domain_uuid' => $domain_uuid]);
|
||||||
|
|
||||||
//prepare smtp server settings
|
//prepare smtp server settings
|
||||||
$email_from_address = $_SESSION['email']['smtp_from']['text'];
|
$email_from_address = $settings->get('fax','smtp_from', $settings->get('email', 'smtp_from', ''));
|
||||||
$email_from_name = $_SESSION['email']['smtp_from_name']['text'];
|
$email_from_name = $settings->get('fax', 'smtp_from_name', $settings->get('email', 'smtp_from_name', $email_from_address));
|
||||||
if (isset($_SESSION['fax']['smtp_from']['text']) && !empty($_SESSION['fax']['smtp_from']['text'])) {
|
|
||||||
$email_from_address = $_SESSION['fax']['smtp_from']['text'];
|
|
||||||
}
|
|
||||||
if (isset($_SESSION['fax']['smtp_from_name']['text']) && !empty($_SESSION['fax']['smtp_from_name']['text'])) {
|
|
||||||
$email_from_name = $_SESSION['fax']['smtp_from_name']['text'];
|
|
||||||
}
|
|
||||||
|
|
||||||
//get the fax settings from the database
|
//get the fax settings from the database
|
||||||
$sql = "select * from v_fax ";
|
$sql = "select * from v_fax ";
|
||||||
@@ -318,7 +343,6 @@ if (!function_exists('fax_split_dtmf')) {
|
|||||||
$sql .= "and fax_extension = :fax_extension ";
|
$sql .= "and fax_extension = :fax_extension ";
|
||||||
$parameters['domain_uuid'] = $domain_uuid;
|
$parameters['domain_uuid'] = $domain_uuid;
|
||||||
$parameters['fax_extension'] = $fax_extension;
|
$parameters['fax_extension'] = $fax_extension;
|
||||||
$database = new database;
|
|
||||||
$row = $database->select($sql, $parameters, 'row');
|
$row = $database->select($sql, $parameters, 'row');
|
||||||
if (is_array($row) && @sizeof($row) != 0) {
|
if (is_array($row) && @sizeof($row) != 0) {
|
||||||
$fax_email = $row["fax_email"];
|
$fax_email = $row["fax_email"];
|
||||||
@@ -337,9 +361,10 @@ if (!function_exists('fax_split_dtmf')) {
|
|||||||
|
|
||||||
//set the fax directory
|
//set the fax directory
|
||||||
if (!file_exists($dir_fax) || !file_exists(path_join($dir_fax, $fax_file_only))) {
|
if (!file_exists($dir_fax) || !file_exists(path_join($dir_fax, $fax_file_only))) {
|
||||||
$dir_fax = $_SESSION['switch']['storage']['dir'].'/fax/'.$domain_name.'/'.$fax_extension.'/inbox';
|
$switch_dir = $settings->get('switch', 'storage', '/var/lib/freeswitch/storage');
|
||||||
|
$dir_fax = "$switch_dir/fax/$domain_name/$fax_extension/inbox";
|
||||||
if (!file_exists($dir_fax) || !file_exists(path_join($dir_fax, $fax_file_only))) {
|
if (!file_exists($dir_fax) || !file_exists(path_join($dir_fax, $fax_file_only))) {
|
||||||
$dir_fax = $_SESSION['switch']['storage']['dir'].'/fax/'.$fax_extension.'/inbox';
|
$dir_fax = "$switch_dir/fax/$fax_extension/inbox";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$fax_file = path_join($dir_fax, $fax_file_only);
|
$fax_file = path_join($dir_fax, $fax_file_only);
|
||||||
@@ -356,16 +381,17 @@ if (!function_exists('fax_split_dtmf')) {
|
|||||||
$pdf_file = tiff2pdf($fax_file);
|
$pdf_file = tiff2pdf($fax_file);
|
||||||
echo "file: $pdf_file \n";
|
echo "file: $pdf_file \n";
|
||||||
if (!$pdf_file) {
|
if (!$pdf_file) {
|
||||||
$fax_file_warning = 'warning: Fax image not available on server.';
|
$fax_file_warning = "warning: Fax image not available on server.";
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
$fax_file_warning = '';
|
$fax_file_warning = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
echo "fax file warning(s): $fax_file_warning\n";
|
||||||
echo "pdf file: $pdf_file\n";
|
echo "pdf file: $pdf_file\n";
|
||||||
|
|
||||||
//forward the fax
|
//forward the fax
|
||||||
if (file_exists($fax_file)) {
|
if (file_exists($fax_file) && is_file($fax_file)) {
|
||||||
if (strpos($fax_file_name,'#') !== false) {
|
if (strpos($fax_file_name,'#') !== false) {
|
||||||
$tmp = explode("#",$fax_file_name);
|
$tmp = explode("#",$fax_file_name);
|
||||||
$fax_forward_number = $fax_prefix.$tmp[0];
|
$fax_forward_number = $fax_prefix.$tmp[0];
|
||||||
@@ -397,14 +423,13 @@ if (!function_exists('fax_split_dtmf')) {
|
|||||||
$p->add('fax_queue_add', 'temp');
|
$p->add('fax_queue_add', 'temp');
|
||||||
|
|
||||||
//save the data
|
//save the data
|
||||||
$database = new database;
|
$database->app_name = 'fax_queue';
|
||||||
$database->app_name = 'fax queue';
|
|
||||||
$database->app_uuid = '3656287f-4b22-4cf1-91f6-00386bf488f4';
|
$database->app_uuid = '3656287f-4b22-4cf1-91f6-00386bf488f4';
|
||||||
$database->save($array);
|
$database->save($array);
|
||||||
|
|
||||||
//remove temporary permisison
|
//remove temporary permisison
|
||||||
$p->delete('fax_queue_add', 'temp');
|
$p->delete('fax_queue_add', 'temp');
|
||||||
|
|
||||||
//add message to show in the browser
|
//add message to show in the browser
|
||||||
message::add($text['confirm-queued']);
|
message::add($text['confirm-queued']);
|
||||||
|
|
||||||
@@ -415,10 +440,10 @@ if (!function_exists('fax_split_dtmf')) {
|
|||||||
if (!empty($fax_email) && file_exists($fax_file)) {
|
if (!empty($fax_email) && file_exists($fax_file)) {
|
||||||
|
|
||||||
//get the language code
|
//get the language code
|
||||||
$language_code = $_SESSION['domain']['language']['code'];
|
$language_code = $settings->get('domain', 'language', 'en-us');
|
||||||
|
|
||||||
//get the template subcategory
|
//get the template subcategory
|
||||||
if ($fax_relay == 'true') {
|
if (!empty($fax_relay) && $fax_relay == 'true') {
|
||||||
$template_subcategory = 'relay';
|
$template_subcategory = 'relay';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -426,7 +451,7 @@ if (!function_exists('fax_split_dtmf')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//get the email template from the database
|
//get the email template from the database
|
||||||
if (isset($fax_email) && !empty($fax_email)) {
|
if (!empty($fax_email) && !empty($domain_uuid)) {
|
||||||
$sql = "select template_subject, template_body from v_email_templates ";
|
$sql = "select template_subject, template_body from v_email_templates ";
|
||||||
$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
|
$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
|
||||||
$sql .= "and template_language = :template_language ";
|
$sql .= "and template_language = :template_language ";
|
||||||
@@ -439,7 +464,6 @@ if (!function_exists('fax_split_dtmf')) {
|
|||||||
$parameters['template_category'] = 'fax';
|
$parameters['template_category'] = 'fax';
|
||||||
$parameters['template_subcategory'] = $template_subcategory;
|
$parameters['template_subcategory'] = $template_subcategory;
|
||||||
$parameters['template_type'] = 'html';
|
$parameters['template_type'] = 'html';
|
||||||
$database = new database;
|
|
||||||
$row = $database->select($sql, $parameters, 'row');
|
$row = $database->select($sql, $parameters, 'row');
|
||||||
if (is_array($row)) {
|
if (is_array($row)) {
|
||||||
$email_subject = $row['template_subject'];
|
$email_subject = $row['template_subject'];
|
||||||
@@ -515,17 +539,36 @@ if (!function_exists('fax_split_dtmf')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//open the file for writing
|
//when the exit is called, capture the statements
|
||||||
|
function shutdown() {
|
||||||
|
//bring variables in to function scope
|
||||||
|
global $output_type, $settings, $debug_level;
|
||||||
|
|
||||||
|
//open the file for writing
|
||||||
if ($output_type == "file") {
|
if ($output_type == "file") {
|
||||||
|
//ensure we can access the settings object
|
||||||
|
if (class_exists('settings') && $settings instanceof settings) {
|
||||||
|
//temporary directory in default settings or use the system temp directory
|
||||||
|
$temp_dir = $settings->get('server', 'temp', sys_get_temp_dir());
|
||||||
|
} else {
|
||||||
|
//settings is not available
|
||||||
|
$temp_dir = sys_get_temp_dir();
|
||||||
|
}
|
||||||
//open the file
|
//open the file
|
||||||
$fp = fopen($_SESSION['server']['temp']['dir']."/fax_to_email.log", "w");
|
$fp = fopen("$temp_dir/fax_to_email.log", "w");
|
||||||
//get the output from the buffer
|
//get the output from the buffer
|
||||||
$content = ob_get_contents();
|
$content = ob_get_contents();
|
||||||
//clean the buffer
|
//clean the buffer
|
||||||
ob_end_clean();
|
ob_end_clean();
|
||||||
//write the contents of the buffer
|
//write the contents of the buffer
|
||||||
fwrite($fp, $content);
|
fwrite($fp, $content);
|
||||||
fclose($fp);
|
//close the file pointer
|
||||||
|
fclose($fp);
|
||||||
|
} else {
|
||||||
|
if ($debug_level > 2) {
|
||||||
|
var_dump($_REQUEST);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|||||||
Reference in New Issue
Block a user