'.sprintf(fs_r('Unexpected output: %s'),$output);
}
echo fs_json_encode($response);
}
else
{
$response['status']='error';
$response['message'] = 'Action not specified';
echo fs_json_encode($response);
}
function fs_ajax_update_wordpress_titles(&$response)
{
$res = fs_update_post_titles();
if ($res !== true)
{
ajax_error($response, "Error : " .$res);
}
}
function fs_ajax_addOrEditExcludedIP(&$response)
{
$sip = $_POST['start_ip'];
$eip = isset($_POST['end_ip']) ? $_POST['end_ip'] : null;
if (isset($_POST['edit_id']))
{
$res = fs_edit_excluded_ip($sip, $eip, $_POST['edit_id']);
}
else
{
$res = fs_add_excluded_ip($sip, $eip);
}
if ($res == '')
{
$response['fields']['exclude_ip_placeholder'] = addslashes(fs_get_excluded_ips_list());
$response['fields']['num_excluded'] = fs_get_num_excluded();
}
else
{
ajax_error($response, $res);
}
}
function fs_ajax_removeExcludedIP(&$response)
{
$res = fs_remove_excluded_ips($_POST['ids']);
if ($res == '')
{
$response['fields']['exclude_ip_placeholder'] = addslashes(fs_get_excluded_ips_list());
$response['fields']['num_excluded'] = fs_get_num_excluded();
}
else
{
ajax_error($response, $res);
}
}
function fs_ajax_saveOptions(&$response)
{
if (!fs_check_database($response)) return;
$dest = $_POST['dest'];
$list = $_POST['list'];
$pairs = explode(";",$list);
foreach($pairs as $pair)
{
$pp = explode(",",$pair);
if (count($pp) > 1)
{
$key = rawurldecode($pp[0]);
$value = rawurldecode($pp[1]);
$type = null;
if (count($pp) > 2)
{
$type = rawurldecode($pp[2]);
}
fs_ajax_saveSingleOption($response, $key,$value,$dest,$type);
}
}
fs_ajax_send_update($response);
}
function fs_ajax_saveOption(&$response)
{
if (!fs_check_database($response)) return;
$key = $_POST['key'];
$value = $_POST['value'];
$dest = $_POST['dest'];
$type = $_POST['type'];
fs_ajax_saveSingleOption($response, $key, $value, $dest, $type);
fs_ajax_send_update($response);
}
function fs_ajax_saveSingleOption(&$response, $key, $value, $dest, $type = null)
{
if ($type != null)
{
switch($type)
{
case 'boolean':
$value = $value == "true" || $value == "on" ? "true" : "false";
break;
case 'integer':
if (!is_numeric($value)) return ajax_error($response, sprintf(fs_r("Invalid integer : %s"),$value));
break;
case 'positive_integer':
if (!is_numeric($value) || (int)$value <= 0) return ajax_error($response, sprintf(fs_r("Invalid or none positive integer : %s"),$value));
break;
case 'regexp':
$res = fs_is_valid_regexp($value);
if ($res !== true) return ajax_error($response, $res);
break;
case 'ip_address':
$res = fs_ip2hex($value) === false ? fs_r("Invalid IP address") : true;
if ($res !== true) return ajax_error($response, $res);
break;
case 'string':
// nothing to validate
break;
default:
return ajax_error($response,"Unknown type $type");
}
}
switch($dest)
{
case 'firestats':
fs_update_option($key, $value);
break;
case 'local':
if (fs_check_is_demo($response)) return;
fs_update_local_option($key, $value);
break;
case 'system':
fs_update_system_option($key, $value);
break;
case 'session':
fs_update_option($key, $value, true);
break;
default:
return ajax_error($response,"Unknown dest id $dest");
}
}
function fs_ajax_get_all_stats(&$response)
{
if (!fs_check_database($response)) return;
$response['fields']['fs_browsers_tree'] = addslashes(fs_get_browsers_tree());
$response['fields']['fs_os_tree'] = addslashes(fs_get_os_tree());
$response['fields']['fs_recent_referers'] = addslashes(fs_get_recent_referers_table());
$response['fields']['fs_search_terms'] = addslashes(fs_get_search_terms_tree());
$response['type']['fs_browsers_tree']= 'tree';
$response['type']['fs_os_tree']= 'tree';
$response['type']['fs_search_terms']= 'tree';
$response['fields']['stats_total_count'] = fs_get_hit_count();
$response['fields']['stats_total_unique'] = fs_get_unique_hit_count();
$response['fields']['stats_total_count_last_day'] = fs_get_last_day_hits();
$response['fields']['stats_total_unique_last_day'] = fs_get_last_day_visits();
$response['fields']['records_table'] = fs_get_records_table();
$response['fields']['hits_table_page_number_indicator'] = fs_get_hits_table_page_number_indicator();
$response['fields']['popular_pages'] = fs_get_popular_pages_tree();
$response['fields']['countries_list'] = fs_get_countries_list();
fs_do_action("ajax_get_all_stats",array(&$response));
}
function fs_ajax_updateExcludedUser(&$response)
{
$user_id = $_POST['user_id'];
$selected = $_POST['selected'] === 'true';
$list = fs_get_local_option('firestats_excluded_users');
if (empty($list))
{
$excluded_users = array();
}
else
{
$excluded_users=explode(",",$list);
}
if($selected)
{
if (!in_array($user_id,$excluded_users))
{
$excluded_users[] = $user_id;
}
}
else
{
fs_array_remove($excluded_users,$user_id);
}
$list = implode(",",$excluded_users);
$res = fs_save_excluded_users($list);
if ($res == '')
{
$response['fields']['exclude_users_placeholder'] = addslashes(fs_get_excluded_users_list());
$response['message'] = fs_r('Excluded users list saved');
}
else
{
ajax_error($response, $res);
}
}
function fs_ajax_addBot(&$response)
{
$wildcard = $_POST['wildcard'];
if ($wildcard != '')
{
$res = fs_add_bot($wildcard);
if ($res == '')
{
$response['message'] = sprintf(fs_r('Added %s to bots list'),$wildcard);
$response['fields']['botlist_placeholder'] = addslashes(fs_get_bot_list());
$response['fields']['num_excluded'] = fs_get_num_excluded();
}
else
{
ajax_error($response, $res);
}
}
else
{
ajax_error($response, fs_r('Empty string is not allowed'));
}
}
function fs_ajax_removeBot(&$response)
{
$bot_ids = $_POST['bot_ids'];
$res = fs_remove_bots($bot_ids);
if ($res == '')
{
$response['message'] = sprintf(fs_r('Removed'));
$response['fields']['botlist_placeholder'] = addslashes(fs_get_bot_list());
$response['fields']['num_excluded'] = fs_get_num_excluded();
}
else
{
ajax_error($response, $res);
}
}
function fs_ajax_test_db_connection(&$response)
{
$host = $_POST['host'];
$user = $_POST['user'];
$pass = $_POST['pass'];
$dbname = $_POST['dbname'];
$table_prefix = $_POST['table_prefix'];
$res = fs_test_db_connection($host, $user, $pass,$dbname,$table_prefix);
$status = $res['status'];
$response['db_status'] = $status;
$response['styles']['advanced_feedback']['color'] = $res['color'];
$response['fields']['advanced_feedback'] = $res['message'];
$response['fields']['new_db_feedback'] = '';
$response['styles']['install_tables_id']['display'] = 'none';
$response['styles']['use_database_id']['display'] = 'none';
$response['styles']['create_db_id']['display'] = 'none';
switch ($status)
{
case 'other_db_detected':
$response['styles']['use_database_id']['display'] = 'block';
break;
case 'tables_missing':
$response['styles']['install_tables_id']['display'] = 'block';
break;
case'database_missing':
$response['styles']['create_db_id']['display'] = 'block';
break;
}
}
function fs_ajax_useWordpressDB(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
if (fs_get_db_config_type() != FS_DB_CONFIG_FILE)
{
$response['status']='error';
$response['message'] = fs_r('Not using configuration file');
return;
}
if (!fs_in_wordpress())
{
ajax_error($response, fs_r('Not installed inside Wordpress'));
return;
}
ob_start();
$res = unlink(FS_ABS_PATH.'/php/fs-config.php');
$output = ob_get_clean();
if (!$res)
{
ajax_error($response, sprintf(fs_r('Failed to delete fs-config.php : %s'), $output));
}
else
{
$response['db_status'] = 'ok';
fs_sendDBConfig($response);
$response['styles']['switch_to_external_system']['display'] = 'none';
}
}
function fs_ajax_attach_to_database(&$response)
{
$host = $_POST['host'];
$user = $_POST['user'];
$pass = $_POST['pass'];
$dbname = $_POST['dbname'];
$table_prefix = $_POST['table_prefix'];
$res = fs_save_config_file($host,$user,$pass,$dbname,$table_prefix);
if ($res != '')
{
ajax_error($response, $res);
return false;
}
else
{
$response['db_status'] = 'ok';
fs_sendDBConfig($response);
if(fs_should_show_use_wp_button())
{
$response['styles']['switch_to_external_system']['display'] = 'block';
}
return true;
}
}
function fs_ajax_upgrade_database(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
$fsdb = &fs_get_db_conn();
$res = fs_install_impl($fsdb, true, $response);
if ($res !== true)
{
ajax_error($response, fs_r('Error upgrading tables').': '.$res);
}
}
function fs_ajax_install_db_tables(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
if (!fs_ajax_attach_to_database($response))
{
return;
}
# force databae connection to be re-initialized
fs_get_db_conn(true);
$res = fs_install();
if ($res !== true)
{
ajax_error($response, fs_r('Error installing tables').': '.$res);
}
else
{
$response['db_status'] = 'ok';
fs_sendDBConfig($response);
}
}
function fs_ajax_create_new_database(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
$host = $_POST['host'];
$admin_user = $_POST['admin_user'];
$admin_pass = $_POST['admin_pass'];
$user = $_POST['user'];
$pass = $_POST['pass'];
$dbname = $_POST['dbname'];
$table_prefix = $_POST['table_prefix'];
$res = fs_create_new_database($host, $admin_user, $admin_pass, $user, $pass, $dbname, $table_prefix);
$status = $res['status'];
$response['db_status'] = $status;
$response['fields']['new_db_feedback'] = $res['message'];
$response['styles']['new_db_feedback']['color'] = '';
switch ($status)
{
case 'ok':
$response['styles']['new_db_feedback']['color'] = 'blue';
break;
case 'error':
$response['styles']['new_db_feedback']['color'] = 'red';
break;
default:
$response['fields']['new_db_feedback'] = "Unexpected status: ".$status;
$response['styles']['new_db_feedback']['color'] = 'red';
}
}
function fs_sendDBConfig(&$response)
{
fs_load_config();
global $fs_config;
$response['fields']['config_source'] = fs_get_config_source_desc();
$response['fields']['text_database_host'] = $fs_config['DB_HOST'];
$response['fields']['text_database_name'] = $fs_config['DB_NAME'];
$response['fields']['text_database_user'] = $fs_config['DB_USER'];
$response['fields']['text_database_pass'] = ''; // don't send password, its too risky.
$response['fields']['text_database_prefix'] = $fs_config['DB_PREFIX'];
// clear the fields
$response['fields']['advanced_feedback'] = '';
$response['fields']['new_db_feedback'] = '';
// hide the buttons
$response['styles']['install_tables_id']['display'] = 'none';
$response['styles']['use_database_id']['display'] = 'none';
$response['styles']['create_db_id']['display'] = 'none';
}
function fs_ajax_change_language(&$response)
{
if (fs_check_is_demo($response)) return;
$language = $_POST['language'];
$current = fs_get_option('current_language');
if ($current != $language)
{
fs_update_option('current_language', $language);
$response['refresh'] = 'true';
}
}
function fs_ajax_send_update(&$response)
{
if (!isset($_POST['update'])) return;
// commit pending hits if in the correct mode.
if (FS_AUTOMATIC_COMMIT_WHEN_USER_ACCESS_STATISTICS &&
fs_get_commit_strategy() == FS_COMMIT_AUTOMATIC)
{
require(FS_ABS_PATH."/php/commit-pending.php");
}
$update_blocks = explode(';',$_POST['update']);
// if we have no more blocks return.
if (count($update_blocks) == 0) return;
// pop the first block.
$update = array_shift($update_blocks);
if (count($update_blocks) > 0)
{
// push the remaining items to the response, so the client will be able to send antoher request with the rest.
$response['send_request'] = "action=updateFields&update=".implode(";", $update_blocks);
}
$updates = explode(',',$update);
foreach($updates as $update)
{
$handled = fs_do_action("ajax_send_update", array($update, &$response));
switch ($update)
{
case 'popular_pages':
$response['fields'][$update] = addslashes(fs_get_popular_pages_tree());
break;
case 'records_table':
$response['fields'][$update] = fs_get_records_table();
$response['fields']['hits_table_page_number_indicator'] = fs_get_hits_table_page_number_indicator();
break;
case 'countries_list':
$response['fields'][$update] = fs_get_countries_list();
break;
case 'fs_recent_referers':
$response['fields'][$update] = fs_get_recent_referers_table();
break;
case 'fs_browsers_tree':
$response['fields'][$update] = fs_get_browsers_tree();
$response['type'][$update]= 'tree';
break;
case 'fs_os_tree':
$response['fields'][$update] = fs_get_os_tree();
$response['type'][$update]= 'tree';
break;
case 'fs_search_terms':
$response['fields'][$update] = fs_get_search_terms_tree();
$response['type'][$update]= 'tree';
break;
case 'botlist_placeholder':
$response['fields']['botlist_placeholder'] = addslashes(fs_get_bot_list());
break;
case 'num_excluded':
$response['fields']['num_excluded'] = fs_get_num_excluded();
break;
case 'stats_total_count':
$response['fields']['stats_total_count'] = fs_get_hit_count();
break;
case 'stats_total_unique':
$response['fields']['stats_total_unique'] = fs_get_unique_hit_count();
break;
case 'stats_total_count_last_day':
$response['fields']['stats_total_count_last_day'] = fs_get_last_day_hits();
break;
case 'stats_total_unique_last_day':
$response['fields']['stats_total_unique_last_day'] = fs_get_last_day_visits();
break;
case 'fs_sites_table':
$response['fields']['fs_sites_table'] = fs_get_sites_manage_table();
break;
case 'fs_users_table':
$response['fields']['fs_users_table'] = fs_get_users_manage_table();
break;
case 'sites_filter_span':
$response['fields']['sites_filter_span'] = fs_get_sites_list();
break;
case 'fs_archive_status':
$response['fields']['fs_archive_status'] = sprintf(fs_r("%s days can be compacted, database size %s"),fs_get_num_old_days(), sprintf("%.1f MB",fs_get_database_size()/(1024*1024)));
break;
case 'last_day_page_views_label':
$response['fields']['last_day_page_views_label'] = fs_get_last_day_page_views_label();
break;
case 'last_day_visits_label':
$response['fields']['last_day_visits_label'] = fs_get_last_day_visits_label();
break;
case 'new_firestats_version_notification':
require_once(dirname(__FILE__).'/version-check.php');
$response['fields']['new_firestats_version_notification'] = fs_get_latest_firestats_version_message();
$response['styles']['new_firestats_version_notification']['display'] = "block";
break;
case 'new_ip2c_db_notification':
require_once(dirname(__FILE__).'/version-check.php');
$response['fields']['new_ip2c_db_notification'] = fs_get_latest_ip2c_db_version_message();
$response['styles']['new_ip2c_db_notification']['display'] = "block";
break;
}
}
}
function fs_ajax_update_ip_to_country(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
require_once(dirname(__FILE__).'/version-check.php');
$file_type = '';
$url = '';
$version = '';
$info = null;
$error = null;
$need_update = fs_is_ip2country_db_need_update($url,$file_type, $version, $info, $error);
if ($need_update)
{
require_once(dirname(__FILE__).'/ip2country.php');
$res = fs_update_ip2country_db($url,$file_type, $version);
$ok = $res['status'] == 'ok';
if ($ok)
{
$response['status'] = 'ok';
$response['message'] = $res['message'];
$response['fields']['ip2c_database_version'] = fs_get_current_ip2c_db_version();
$response['fields']['new_ip2c_db_notification'] = '';
}
else
{
ajax_error($response, $res['message']);
}
}
else
{
$response['status'] = 'ok';
$response['message'] = fs_r("IP-to-country database is already up-to-date");
}
if (!empty($error))
{
$response['status'] = 'error';
$ip2c_dir = FS_ABS_PATH.'/lib/ip2c/';
$response['message'] = fs_r('An error has occured while trying to update the IP-to-country database')."
";
if (isset($info['ip-to-country-db']['zip_url']))
{
$url = $info['ip-to-country-db']['zip_url'];
$href = sprintf("%s",fs_r('file'));
$response['message'] .=
sprintf(fs_r('You can update the database manually by downloading this %s and extracting it into %s'), $href,$ip2c_dir);
}
else
{
$url = FS_IP2COUNTRY_DB_VER_CHECK_URL;
$href = sprintf("%s",fs_r('this'));
$response['message'] .=
sprintf(fs_r('You can update the database manually by opening %s and downloading the zip_url, and extracting it into %s'), $href,$ip2c_dir);
}
$response['message'] .= '
'.fs_r('Error').': '.$error;
}
}
function fs_ajax_update_bots_list(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
require_once(dirname(__FILE__).'/version-check.php');
// don't use cached version
$force_check = true;
$user_initiated = true;
if (isset($_POST['user_initiated']))
{
$user_initiated = $_POST['user_initiated'] == 'true';
$force_check = $user_initiated;
}
$url = '';
$md5 = '';
$error = '';
$updated = fs_is_botlist_updated($url, $md5, $error,$force_check);
if (!empty($error))
{
$response['status'] = 'error';
$response['message'] = sprintf(fs_r("Error updating bots list: %s"),$error);
}
else
{
// if user initiated the request update regardless of current status.
if ($user_initiated || !$updated)
{
// don't replace exiting bots, just add new ones.
$remove_existing = false;
$res = fs_botlist_import_url($url, $remove_existing);
if ($res == '')
{
if ($user_initiated) $response['message'] = fs_r("Successfully updated bots list");
fs_update_system_option('botlist_version_hash',$md5);
fs_ajax_send_update($response);
}
else
{
ajax_error($response, sprintf(fs_r("Error updating bots list: %s"),$res));
}
}
}
}
function fs_ajax_purge_excluded_hits(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
$res = fs_purge_excluded_entries();
if ($res === false)
{
ajax_error($response, sprintf(fs_r('Error purging excluded records: %s'),fs_db_error()));
}
else
{
$response['message'] = fs_r('Purged excluded records');
$response['fields']['num_excluded'] = fs_get_num_excluded();
}
}
function fs_ajax_update_sites_filter(&$response)
{
$site_id = $_POST['sites_filter'];
if ($site_id != 'all') // all means : all the sites this user is allowed to access, so in this context it's true by definition.
{
$res = fs_current_user_allowed_to_access_site($site_id);
if (is_string($res)) return ajax_error($response, $res);
if (!$res)
{
return ajax_error($response, "User is not allowed to access site $site_id");
}
}
fs_update_local_option('firestats_sites_filter',$site_id);
fs_ajax_get_all_stats($response);
}
function fs_ajax_create_new_site(&$response)
{
if (fs_check_is_demo($response)) return;
$new_sid = $_POST['new_sid'];
$name = $_POST['name'];
$type = $_POST['type'];
$baseline_views = $_POST['baseline_views'];
$baseline_visitors = $_POST['baseline_visitors'];
$res = fs_create_new_site($new_sid, $name, $type, $baseline_views, $baseline_visitors);
if ($res === true)
{
fs_ajax_send_update($response);
}
else
{
ajax_error($response, $res);
}
}
function fs_ajax_update_sites_info(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
$new_sid = $_POST['new_sid'];
$orig_sid = $_POST['orig_sid'];
$name = $_POST['name'];
$type = $_POST['type'];
$baseline_views = $_POST['baseline_views'];
$baseline_visitors = $_POST['baseline_visitors'];
$res = fs_update_site_params($new_sid,$orig_sid, $name,$type, $baseline_views, $baseline_visitors);
if ($res === true)
{
fs_ajax_send_update($response);
}
else
{
ajax_error($response, $res);
}
}
function fs_ajax_delete_site(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
$sid = $_POST['site_id'];
$action = $_POST['action_code'];
$new_sid = isset($_POST['new_sid']) ? $_POST['new_sid'] : null;
$res = fs_delete_site($sid, $action, $new_sid);
if ($res === true)
{
// if the deleted site was selected in the filter, update the filter
$current_selected = fs_get_local_option('firestats_sites_filter');
if ($current_selected == $sid)
{
// reset filter to 'all'.
fs_update_local_option('firestats_sites_filter','all');
fs_ajax_get_all_stats($response);
}
// and also send whatever the client requested.
fs_ajax_send_update($response);
}
else
{
ajax_error($response, $res);
}
}
function fs_check_database(&$response)
{
$fsdb = &fs_get_db_conn();
if (!$fsdb->is_connected())
{
ajax_error($response, fs_r('Error connecting to database'));
return false;
}
return true;
}
function fs_ajax_assert_admin(&$response)
{
if (!fs_is_admin())
{
$action = $_POST['action'];
ajax_error($response, "Action \"$action\" requires admin priveleges"); /*not translated*/
return false;
}
return true;
}
function fs_check_is_demo(&$response)
{
if (fs_is_demo())
{
ajax_error($response, 'This operation is not permitted in demo mode'); /*not translated*/
return true;
}
return false;
}
function fs_ajax_archiveOldData(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
$days_remains = fs_get_num_old_days();
$new_archive_seesion = false;
if (!isset($_POST['num_old_days']))
{
$new_archive_seesion = true;
$num_old_days = $days_remains;
}
else
{
$num_old_days = $_POST['num_old_days'];
}
if (is_numeric($num_old_days))
{
$max_days_to_archive = $_POST['max_days_to_archive'];
$response['num_old_days'] = $num_old_days;
// quickly return a response to the client on the fist request
$DAY = 60 * 60 * 24;
$archive_older_than_days = fs_get_archive_older_than();
$archive_older_than = time() - $archive_older_than_days * $DAY;
if (!$new_archive_seesion)
{
$res = fs_archive_old_data($archive_older_than, $max_days_to_archive);
}
else
{
$res = 0;
}
if (is_numeric($res))
{
if ($res == 0 && !$new_archive_seesion)
{
$response['done'] = 'true';
}
else
{
$response['send_request'] = "action=archiveOldData&num_old_days=$num_old_days&max_days_to_archive=$max_days_to_archive";
}
$days_remains -= $res;
$done = $num_old_days - $days_remains;
if ($num_old_days > 0)
{
$p = $done / $num_old_days * 100;
}
else
{
$p = "100%";
}
$response['fields']['fs_archive_status'] = sprintf(fs_r("Compacting %s days, %s done, database size is %s"), $num_old_days, sprintf("%.1f%%",$p), sprintf("%.1f MB",fs_get_database_size()/(1024*1024)));
$response['status'] = 'ok';
fs_ajax_send_update($response);
}
else
{
ajax_error($response,"Error : $res");
}
}
else
{
ajax_error($response,"Error : $num_old_days");
}
}
function fs_ajax_searchterms_breakdown(&$response)
{
if (!is_var_set($response, "id")) return;
if (!is_var_set($response, "search_term")) return;
$id = $_POST['id'];
$search_term = $_POST['search_term'];
$response['fields']["$id"] = fs_get_search_term_breakdown($id,$search_term);
}
function ajax_error(&$response, $msg)
{
$response['status'] = 'error';
$response['message'] = $msg;
}
function fs_ajax_incremental_process(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
if (!is_var_set($response, "type")) return;
$type = $_POST['type'];
if (isset($_POST['file']))
{
// whitelist the allowed included files
$allowed_files = array
(
'php/upgrade/upgrade_13.php',
'php/upgrade/upgrade_12.php',
'php/rebuild-db.php',
'php/searchengines.php',
'php/ip2country.php',
);
$file = $_POST['file'];
if (array_search($file, $allowed_files) === false)
{
return ajax_error($response, "$file is not allowed when executing $type");
}
else
{
require_once(FS_ABS_PATH."/$file");
}
}
if (!isset($_POST['value']))
{
$start = time();
$val = 0;
$min = 0;
$max = fs_calculate_process_max($type);
if (!is_numeric($max))
{
ajax_error($response, $max);
return;
}
$performed = -1;
}
else
{
$start = $_POST['start'];
$val = $_POST['value'];
$min = $_POST['min'];
$max = $_POST['max'];
$now = time();
$performed = fs_execute_process_step($type, $val, $max);
if (!is_numeric($performed))
{
ajax_error($response, $performed);
return;
}
$val += $performed;
}
$response['start'] = $start;
$response['type'] = $type;
$response['min'] = $min;
$response['value'] = $val;
$response['max'] = $max;
if ($max > 0)
{
$desc = fs_get_step_description($type, $val, $max);
$p = ($val / ($max - $min)) * 100;
$percentage = sprintf("(%.1f%%)",$p);
$descText = ($desc != null ? "$desc" : sprintf(fs_r("%d of %d"),$val,$max)). " ".$percentage;
$response['progress_text'] = $descText;
}
if ($val < $max && $performed != 0)
{
$response['done'] = 'false';
$response['send_request'] = "action=incrementalProcess&type=$type&max=$max&min=$min&value=$val&start=$start";
$response['send_request'] .= (isset($_POST['file']) ? "&file=$file" : "");
}
else
if ($val == $max)
{
$res = fs_handle_process_done($type, $response);
}
else
if ($performed == 0)
{
ajax_error($response, "No progress in $type");
}
else
{
ajax_error($response, "Internal error 101 , VAL=$val, MAX=$max PERFORMED=$performed");
}
}
function is_var_set(&$response, $key)
{
if (!isset($_POST[$key]))
{
if ($response != null)
{
ajax_error($response,"$key not specified");
}
return false;
}
return true;
}
function fs_ajax_saveSentSysInfo(&$response)
{
if (!fs_ajax_assert_admin($response)) return;
$si = fs_get_sysinfo();
fs_update_system_option('last_sent_sysinfo',serialize($si));
}
function fs_ajax_get_window(&$response, $type = null)
{
if (!isset($type)) $type = $_POST['type'];
switch($type)
{
case 'ask_to_send_sysinfo':
if (!fs_ajax_assert_admin($response)) return;
$response['width'] = '600';
$response['height'] = '370';
$response['url'] = fs_js_url('php/window-do-you-agree-to-send-sysinfo.php');
break;
case 'ask_for_donation':
$response['width'] = '400';
$response['height'] = '370';
$response['url'] = fs_js_url('php/window-donation.php');
break;
case 'notify_about_archive':
if (!fs_ajax_assert_admin($response)) return;
$response['width'] = '600';
$response['height'] = '400';
$response['url'] = fs_js_url('php/window-archive-notification.php');
break;
default:
return ajax_error($response, "Unknown window type '$type'");
}
$response['new_floating_window'] = 'true';
if (!isset($response['top'])) $response['top'] = 'center';
if (!isset($response['left'])) $response['left'] = 'center';
if (!isset($response['width'])) $response['width'] = '400';
if (!isset($response['height'])) $response['height'] = '300';
}
function fs_ajax_getNextUserMessage(&$response)
{
require_once(FS_ABS_PATH.'/php/html-utils.php');
require_once(FS_ABS_PATH.'/php/utils.php');
// currently we don't show any user messages in demo mode.
if (fs_is_demo()) return;
if (fs_is_admin() && fs_get_system_option("user_agreed_to_send_system_information", '') == '')
{
fs_ajax_get_window($response,'ask_to_send_sysinfo');
}
else
if (fs_time_to_nag())
{
fs_ajax_get_window($response,'ask_for_donation');
}
else
if (fs_is_admin() && fs_mysql_newer_than("4.1.13") && fs_get_system_option('archive_method') == null && fs_get_num_old_days() > 0)
{
// if the user never selected archive method
fs_ajax_get_window($response,'notify_about_archive');
}
}
function fs_ajax_login(&$response)
{
$username = isset($_POST['username']) ? $_POST['username'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
$cookie_pass_md5 = isset($_COOKIE['FS_LAST_PASSWORD_MD5']) ? $_COOKIE['FS_LAST_PASSWORD_MD5'] : '';
$remember_me = $_POST['remember_me'];
require_once(FS_ABS_PATH.'/php/auth.php');
if ($cookie_pass_md5 !== $password) // if the cookie pass is the same as the form pass, its already md5, otherwise we convert it to md5
{
$password = md5($password);
}
$res = fs_login($username, $password, true);
if (is_string($res))
{
return ajax_error($response, $res);
}
else
if ($res)
{
global $FS_SESSION;
fs_create_cookie($response, 'FS_SESSION_ID', $FS_SESSION['sid'], 0);
if ($remember_me == 'on')
{
fs_create_cookie($response, 'FS_LAST_USERNAME', $username, 14);
fs_create_cookie($response, 'FS_LAST_PASSWORD_MD5', $password, 14);
fs_create_cookie($response, 'FS_REMEMBER_ME', 'on', 14);
}
else
{
// delete cookies
fs_delete_cookie($response, 'FS_LAST_USERNAME');
fs_delete_cookie($response, 'FS_LAST_PASSWORD_MD5');
fs_delete_cookie($response, 'FS_REMEMBER_ME');
}
$response['reload'] = 'true';
}
else
{
$response['message'] = fs_r('Incorrect user-name or password');
}
}
function fs_ajax_logout(&$response)
{
fs_delete_cookie($response, 'FS_SESSION_ID');
fs_delete_cookie($response, 'FS_LAST_USERNAME');
fs_delete_cookie($response, 'FS_LAST_PASSWORD_MD5');
fs_delete_cookie($response, 'FS_REMEMBER_ME');
$response['refresh'] = 'true';
}
function fs_ajax_create_user(&$response)
{
$username = $_POST['username'];
$pass1 = $_POST['pass1'];
$pass2 = $_POST['pass2'];
$email = $_POST['email'];
$security_level = $_POST['security_level'];
$can_access_all_sites = $_POST['can_access_all_sites'] == 'true';
$allowed_sites_list = $_POST['allowed_sites_list'];
if (empty($security_level)) return ajax_error($response, "Missing security level"); // not translated
if (empty($username)) return ajax_error($response, fs_r("User name not specified"));
if (empty($email)) return ajax_error($response, fs_r("Email not specified"));
if (empty($pass1)) return ajax_error($response, fs_r("Password not specified"));
if ($pass1 !== $pass2) return ajax_error($response, fs_r("Passwords did not match"));
require_once(FS_ABS_PATH.'/php/auth.php');
$user_id = fs_create_user($username, $email, $pass1, $security_level);
if (!is_numeric($user_id))
{
return ajax_error($response, $user_id);
}
$res = fs_update_user_sites_access($user_id, $can_access_all_sites, $allowed_sites_list);
if ($res !== true) return ajax_error($response, $res);
}
function fs_ajax_delete_user(&$response)
{
$id = $_POST['id'];
require_once(FS_ABS_PATH.'/php/auth.php');
$res = fs_delete_user($id);
if ($res !== true)
{
return ajax_error($response, $res);
}
}
function fs_ajax_update_user(&$response)
{
$id = $_POST['id'];
$username = $_POST['username'];
$pass1 = !empty($_POST['pass1']) ? $_POST['pass1'] : null;
$pass2 = !empty($_POST['pass2']) ? $_POST['pass2'] : null;
$email = $_POST['email'];
$security_level = $_POST['security_level'];
$can_access_all_sites = $_POST['can_access_all_sites'] == 'true';
$allowed_sites_list = $_POST['allowed_sites_list'];
if (empty($id)) return ajax_error($response, "Missing user id"); // not translated
if (empty($security_level)) return ajax_error($response, "Missing security level"); // not translated
if (empty($username)) return ajax_error($response, fs_r("User name not specified"));
if (empty($email)) return ajax_error($response, fs_r("Email not specified"));
if (!empty($pass1) || !empty($pass2))
{
if ($pass1 !== $pass2) return ajax_error($response, fs_r("Passwords did not match"));
}
require_once(FS_ABS_PATH.'/php/auth.php');
$res = fs_update_user($id,$username, $email, $pass1, $security_level);
if ($res !== true)
{
return ajax_error($response, $res);
}
$res = fs_update_user_sites_access($id, $can_access_all_sites, $allowed_sites_list);
if ($res !== true) return ajax_error($response, $res);
fs_ajax_send_update($response);
}
function fs_ajax_change_password(&$response)
{
$id = $_POST['id'];
$username = $_POST['username'];
$pass1 = !empty($_POST['pass1']) ? $_POST['pass1'] : null;
$pass2 = !empty($_POST['pass2']) ? $_POST['pass2'] : null;
if (empty($username)) return ajax_error($response, fs_r("User name not specified"));
if ($pass1 !== $pass2) return ajax_error($response, fs_r("Passwords did not match"));
if (empty($pass1)) return ajax_error($response, fs_r("Empty password")); // not translated
require_once(FS_ABS_PATH.'/php/auth.php');
$res = fs_change_password($id,$username, $pass1);
if ($res !== true)
{
return ajax_error($response, $res);
}
else
{
$base = fs_get_absolute_url(dirname(dirname($_SERVER['REQUEST_URI'])));
$response['redirect'] = $base;
}
}
function fs_ajax_handle_pending_maintanence(&$response)
{
$str = fs_get_system_option('pending_maintanence', '');
if ($str != '')
{
$jobs = explode(',',$str);
if (count($jobs) > 0)
{
$job = array_pop($jobs);
$s = explode(':',$job);
$id = $s[0];
$file = '';
if (count($s) > 1)
{
$file = $s[1];
}
$response['execute'] = "FS.executeProcess('$id', '$file')";
fs_update_system_option('pending_maintanence',implode(',',$jobs));
}
}
}
function fs_ajax_handle_add_excluded_url(&$response)
{
$url = $_POST['url'];
require_once(FS_ABS_PATH.'/php/db-sql.php');
$res = fs_add_excluded_url($url);
if ($res !== true)
{
return ajax_error($response, $res);
}
else
{
$response['fields']['exclude_urls_placeholder'] = addslashes(fs_get_excluded_urls_list());
$response['fields']['num_excluded'] = fs_get_num_excluded();
}
}
function fs_ajax_handle_edit_excluded_url(&$response)
{
$url = $_POST['url'];
$edit_id = $_POST['edit_id'];
require_once(FS_ABS_PATH.'/php/db-sql.php');
$res = fs_edit_excluded_url($url, $edit_id);
if ($res !== true)
{
return ajax_error($response, $res);
}
else
{
$response['fields']['exclude_urls_placeholder'] = addslashes(fs_get_excluded_urls_list());
$response['fields']['num_excluded'] = fs_get_num_excluded();
}
}
function fs_ajax_handle_remove_excluded_url(&$response)
{
$res = fs_remove_excluded_urls($_POST['ids']);
if ($res === true)
{
$response['fields']['exclude_urls_placeholder'] = addslashes(fs_get_excluded_urls_list());
$response['fields']['num_excluded'] = fs_get_num_excluded();
}
else
{
ajax_error($response, $res);
}
}
function fs_ajax_set_sites_table_page_number(&$response)
{
$page_number = $_POST['page_number'];
fs_update_option('current_selected_site_page',$page_number);
$response['fields']['fs_sites_table'] = fs_get_sites_manage_table();
}
function fs_ajax_change_hits_table_page(&$response)
{
$type = $_POST['type'];
$cur = (int)fs_get_option("current_hits_table_page", "0");
switch ($type)
{
case 'prev':
$cur = max(0,$cur-1);
break;
case 'next':
$hits = fs_get_num_hits_in_hits_table();
if ($hits === false) return ajax_error($response, fs_db_error());
$num_pages = ceil($hits / fs_get_num_hits_in_table());
$cur = min($cur+1, $num_pages-1);
break;
case 'date':
$cur = fs_hits_table_get_page_for_date($_POST['date']);
if (is_string($cur)) return ajax_error($response, $cur);
break;
default:
return ajax_error($response, "unknown type $type");
}
fs_update_option("current_hits_table_page", $cur, true);
$response['fields']['records_table'] = fs_get_records_table();
$response['fields']['hits_table_page_number_indicator'] = fs_get_hits_table_page_number_indicator();
}
function fs_delete_cookie(&$response, $name)
{
fs_create_cookie($response, $name, '', -1);
}
function fs_create_cookie(&$response, $name, $value, $days)
{
if(!isset($response['cookies']))
{
$response['cookies'] = array();
}
$cookie = new stdClass();
$cookie->name = $name;
$cookie->value = $value;
$cookie->days = $days;
$cookies = &$response['cookies'];
$cookies[] = $cookie;
}
function fs_json_encode($object)
{
if (function_exists("json_encode"))
{
return json_encode($object);
}
else
{
static $json;
if (!isset($json))
{
require_once(FS_ABS_PATH . "/lib/json/JSON.php");
$json = new fs_Services_JSON();
}
return $json->encode($object);
}
}
?>