get_country($ip); if ($ip2c_res != false) { $ccode = $ip2c_res['id2']; if ($ccode == null) return null; if ($as_int) { $c1 = ord($ccode[0]); $c2 = ord($ccode[1]); $intcode = ($c1 << 8) | $c2; return $intcode; } else { return $ccode; } } } return false; } function fs_get_country_name($country_code, $is_int = false) { if (isset($GLOBALS['fs_ip2c_country_cache'])) { $cache = $GLOBALS['fs_ip2c_country_cache']; if ($is_int) { $c = chr(($country_code >> 8) & 0xFF).chr(($country_code) & 0xFF); $country_code = $c; } $res = isset($cache[$country_code]) ? $cache[$country_code] : false; if (!$res) { $ip2c = $GLOBALS['fs_ip2c']; $res = $ip2c->find_country($country_code); $cache[$country_code] = $res; } return $res['name']; } else { return ''; } } function fs_get_country_flag_url($country_code, $is_int = false) { if ($is_int && $country_code != NULL) { $c = chr(($country_code >> 8) & 0xFF).chr(($country_code) & 0xFF); $country_code = $c; } if (!$country_code) return ""; $code = strtolower($country_code); $flag_url = fs_url("img/flags/$code.png"); $name = fs_get_country_name($code); return fs_get_flag_img_tag($name, $flag_url); } function fs_get_flag_img_tag($name, $img_url) { return "$name"; } function fs_echo_country_flag_url($country_code) { echo fs_get_country_flag_url($country_code); } /** * Downloads a zip file containing the ip2country database and import it. */ function fs_update_ip2country_db($url, $file_type, $new_version, $output_stars = true) { $cant_write = fs_ip2c_database_writeable(); if ($cant_write != '') { return array('status'=>'error','message'=>$cant_write); } require_once(FS_ABS_PATH.'/php/utils.php'); $dir = $GLOBALS['FS_TEMP_DIR']; $tempName = @tempnam($dir,"fs_ip2c_"); if (!$tempName) return array('status'=>'error','message'=>fs_r('Error creating temporary file')); $temp = @fopen($tempName,"w"); if (!$tempName) return array('status'=>'error','message'=>fs_r('Error creating temporary file')); $res = fs_create_http_conn($url); $http = $res['http']; $args = $res['args']; $error=$http->Open($args); if (!empty($error)) { return array('status'=>'error','message'=>sprintf(fs_r('Error opening connection to %s'),$url)); } $error = $http->SendRequest($args); if (!empty($error)) { return array('status'=>'error','message'=>sprintf(fs_r('Error sending request to %s'),$url)); } $http->ReadReplyHeadersResponse($headers); if ($http->response_status != '200') { return array('status'=>'error','message'=>sprintf(fs_r("Server returned error %s for %s"),"$http->response_status", "$url")); } $output = ob_get_clean(); // this is a little hack to keep outputing stuff while we download, it should help // with the server killing the script due to inactivity. if ($output_stars) echo "/* Downloading IP-to-country database. if you see this, your server didn't give this script enough time to complete.
"; $content = ''; for(;;) { $body = ""; $error=$http->ReadReplyBody($body,10000); if($error != "") return array('status'=>'error','message'=>sprintf(fs_r('Error reading data from %s : %s'),$url, $error)); if ($output_stars) echo "*"; if ($body == '') break; fwrite($temp, $body); } if ($output_stars) echo "*/"; ob_start(); echo $output; if ($file_type == 'bin') { return fs_install_bin_ip2c_database($new_version,$temp); } else if ($file_type == 'zip') { $bin_file = ''; $res = fs_extract_zip_ip2c_database($tempName,$bin_file); if ($res == '') { $ok = fs_install_bin_ip2c_database($new_version, $bin_file); fs_clean_ip2c_temp(); return $ok; } else { return array('status'=>'error','message'=>sprintf(fs_r("Error extracting IP-to-country database: %s"),$res)); } } else { return array('status'=>'error','message'=>sprintf(fs_r('Unsupported file type : %s'), $file_type)); } } function fs_clean_ip2c_temp() { $dir = $GLOBALS['FS_TEMP_DIR']; fs_unlink($dir, "fs_ip2c_*"); unlink("$dir/db.version"); unlink("$dir/ip-to-country.bin"); } function fs_ip2c_database_writeable() { $ip2c_dir = FS_ABS_PATH.'/lib/ip2c/'; $bin_file = FS_ABS_PATH.'/lib/ip2c/ip-to-country.bin'; $ver_file = FS_ABS_PATH.'/lib/ip2c/db.version'; if (!is_writable($ip2c_dir)) return sprintf(fs_r("can't update ip-to-country database, read-only directory : %s"),$ip2c_dir); if (file_exists($bin_file) && !is_writable($bin_file)) return sprintf(fs_r("can't update ip-to-country database, read-only file : %s"),$bin_file); if (file_exists($ver_file) && !is_writable($ver_file)) return sprintf(fs_r("can't update ip-to-country database, read-only file : %s"),$ver_file); return ''; } function fs_install_bin_ip2c_database($version, $new_bin_file) { $ip2c_dir = FS_ABS_PATH.'/lib/ip2c/'; $bin_file = FS_ABS_PATH.'/lib/ip2c/ip-to-country.bin'; $ver_file = FS_ABS_PATH.'/lib/ip2c/db.version'; if (file_exists($bin_file)) unlink($bin_file); if (file_exists($ver_file)) unlink($ver_file); if (copy($new_bin_file, $bin_file) === false) { return array('status'=>'error','message'=>fs_r("Error installing new IP-to-country database")); } $res = fs_set_current_ip2c_db_version($version); if ($res == '') { return array('status'=>'ok','message'=>fs_r("Successfuly updated IP-to-country database")); } else { return array('status'=>'error','message'=>sprintf(fs_r("Error updating version file : %s"),$res)); } } function fs_extract_zip_ip2c_database($zipFile,&$bin_file) { require_once(FS_ABS_PATH."/lib/unzip/dUnzip2.inc.php"); ob_start(); $zip = new dUnzip2($zipFile); $dir = $GLOBALS['FS_TEMP_DIR']; $zip->unzipAll($dir); $tempName2 = tempnam($dir,"fs_ip2c_"); if (!$tempName2) return fs_r('Error creating temporary file'); $zip->unzip("ip-to-country.bin", $tempName2); $output = ob_get_clean(); if ($output != '') { return $output; } $bin_file = $tempName2; return ''; } function fs_rebuild_country_codes($value, $max) { $reset = $value == 0; $num_to_build = 500; $fsdb = &fs_get_db_conn(); $hits = fs_hits_table(); if ($reset) { if (false === $fsdb->get_results("UPDATE `$hits` SET `country_code` = '0'")) { return fs_db_error(); } } $res = $fsdb->get_results("SELECT DISTINCT HEX(`ip_int1`) a ,HEX(`ip_int2`) b FROM `$hits` WHERE `country_code` = '0' LIMIT $num_to_build"); if ($res === false) { return fs_db_error(); } else { $chunk_size = 100; $c = count($res); $index = 0; if ($c > 0) { while($index < $c) { $ii = 0; $sql = "UPDATE `$hits` SET `country_code` = CASE "; $ips = ''; while ($ii < $chunk_size && $index < $c) { $record = $res[$index++]; $ii++; $ipstr = fs_ip_to_string($record->a,$record->b); $intcode = fs_ip2c($ipstr, true); $ip = $record->a.$record->b; if ($ips == '') $ips .= "0x$ip"; else $ips .= ", 0x$ip"; if ($intcode != 0) { $sql .= "WHEN (ip_int1=0x$record->a AND ip_int2=0x$record->b) THEN '$intcode' "; } else { $sql .= "WHEN (ip_int1=0x$record->a AND ip_int2=0x$record->b) THEN NULL "; } } $sql .= " ELSE country_code END WHERE 0x$record->a$record->b IN ($ips)"; $r2 = $fsdb->query($sql); if ($r2 === false) { return fs_db_error(); } } } return $index; } } function fs_rebuild_countries_calc_max() { $fsdb = &fs_get_db_conn(); $hits = fs_hits_table(); $count = $fsdb->get_var("SELECT COUNT(DISTINCT `ip_int1`,`ip_int2`) c FROM `$hits`"); if ($count === false) { return fs_db_error(); } else { return $count; } } function fs_ensure_ip2c_db_updated() { require_once(dirname(__FILE__).'/version-check.php'); fs_initialize_session_dir(); $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) { return fs_update_ip2country_db($url,$file_type, $version, false); } else { return array('status'=>'ok','message'=>fs_r("IP-to-country database is already up-to-date")); } } ?>