function bbc_marker() { if (_BBC_PHP < 410) { global $HTTP_SERVER_VARS; } global $BBC_CACHE_PATH, $BBC_COUNTER_PREFIX, $BBC_COUNTER_SUFFIX, $BBC_IGNORE_IP, $BBC_SEP, $BBC_TIMESTAMP, $BBC_TIME_OFFSET, $DOCUMENT_ROOT, $HTTP_HOST, $HTTP_X_REMOTECLIENT_IP, $LOCAL_ADDR, $PATH_INFO, $PHP_SELF, $SCRIPT_FILENAME, $SERVER_NAME; $this->sep = $BBC_SEP; $this->ignored = false; $this->filename = $this->bbc_counter_file($BBC_CACHE_PATH, $BBC_COUNTER_PREFIX, $BBC_COUNTER_SUFFIX); $time = $BBC_TIMESTAMP + $BBC_TIME_OFFSET * 60; // loads of initialisations $hdr = array("DOCUMENT_ROOT", "HTTP_USER_AGENT", "LOCAL_ADDR", "REMOTE_HOST", "REMOTE_ADDR", "HTTP_HOST", "HTTP_REFERER", "HTTP_X_REMOTECLIENT_IP", "ORIG_PATH_INFO", "ORIG_PATH_TRANSLATED", "ORIG_SCRIPT_FILENAME", "PATH_INFO", "PATH_TRANSLATED", "HTTP_PC_REMOTE_ADDR", "PHP_SELF", "SCRIPT_FILENAME", "SERVER_NAME", "SERVER_ADDR"); foreach ($hdr as $str) { ${$str} = _BBC_PHP < 410 ? !empty($HTTP_SERVER_VARS[$str]) : !empty($_SERVER[$str]) ? bbc_clean(_BBC_PHP < 410 ? $HTTP_SERVER_VARS[$str] : $_SERVER[$str], $BBC_SEP) : false; } // determine whether we got the "ORIG_" prefix foreach (array("PATH_INFO", "PATH_TRANSLATED", "SCRIPT_FILENAME") as $env) { ${$env} = !empty(${"ORIG_" . $env}) ? ${"ORIG_" . $env} : ${$env}; } $filename = empty($PATH_TRANSLATED) || $PATH_TRANSLATED == $DOCUMENT_ROOT ? basename($SCRIPT_FILENAME) : basename($PATH_TRANSLATED); $REMOTE_ADDR = stristr(PHP_OS, "darwin") !== false && !empty($HTTP_PC_REMOTE_ADDR) ? $HTTP_PC_REMOTE_ADDR : $REMOTE_ADDR; $REQUEST_URI = $this->bbc_filter_uri($filename, $PATH_INFO, $PHP_SELF); $SERVER_ADDR = empty($SERVER_ADDR) ? $LOCAL_ADDR : $SERVER_ADDR; $SERVER_ADDR = $this->bbc_valid_ip($SERVER_ADDR) ? $SERVER_ADDR : "127.0.0.1"; $HTTP_USER_AGENT = empty($HTTP_USER_AGENT) ? "unknown" : $HTTP_USER_AGENT; $HTTP_REFERER = empty($HTTP_REFERER) ? "unknown" : $this->bbc_filter_ref($HTTP_HOST, $HTTP_REFERER, $SERVER_NAME, $SERVER_ADDR); // Use a page name even if the user didn't specify it $page = defined("_BBC_PAGE_NAME") ? bbc_clean(_BBC_PAGE_NAME, $BBC_SEP) : $this->bbc_auto_page_name($REQUEST_URI); $prx = $this->bbc_parse_headers(); if (!empty($prx)) { $prx_addr = $this->bbc_get_remote_addr($REMOTE_ADDR, $HTTP_X_REMOTECLIENT_IP); if (($this->ignored = $this->bbc_is_ignored($BBC_IGNORE_IP, $prx_addr)) !== false) { return; } else { $REMOTE_ADDR = bbc_clean($prx, $BBC_SEP); } } else { $prx_addr = "unknown"; $REMOTE_ADDR = $this->bbc_get_remote_addr($REMOTE_ADDR, $HTTP_X_REMOTECLIENT_IP); } if (($this->ignored = $this->bbc_is_ignored($BBC_IGNORE_IP, $REMOTE_ADDR)) !== false) { return; } // "unknown" is meant as a placeholder for the hostname, which will be processed at a different location $this->string = $time . $this->sep . $prx_addr . $this->sep . $REMOTE_ADDR . $this->sep . "unknown" . $this->sep . $HTTP_USER_AGENT . $this->sep . $HTTP_REFERER . $this->sep . $REQUEST_URI . $this->sep . $page . "\n"; }
function bbc_get_keywords($ref) { global $BBC_CUSTOM_CHARSET, $access; $var_sep = array("&", "|"); $word_sep = array("+", " ", "/"); $match = array("ara", "busca", "pesquis", "search", "srch", "seek", "zoek", "result", "szuka", "cherch", "such", "find", "trouve", "trova", "pursuit", "keres", "katalogus", "alltheinternet.com", "mamma.com", "baidu.com", "heureka.hu", "kartoo.com", "ask.com", "aport.ru", "google", "yahoo"); foreach ($match as $key) { // if string occurs at the beginning strpos() returns integer 0, if it can't be // found at all, however, it returns boolean false => definition required which // considers 0 as true $is_search = strpos(strtolower($ref), $key) !== false ? true : false; if ($is_search) { break; } } if (!$is_search) { return false; } $ref = str_replace("&", "&", urldecode($ref)); $is_query = strrpos($ref, "?"); $ref = $is_query !== false ? substr($ref, ++$is_query) : substr($ref, strpos($ref, "://") + 3); $get_vars = bbc_get_sep($ref, $var_sep); $raw_search = bbc_get_search($get_vars); if ($raw_search === false) { return false; } // Conversion of keywords, if applicable $from = extension_loaded("mbstring") ? bbc_get_encoding($raw_search) : false; $char = !empty($BBC_CUSTOM_CHARSET) ? $BBC_CUSTOM_CHARSET : false; $raw_search = $from !== false || extension_loaded("recode") ? bbc_convert_lang($raw_search, $from, $char) : $raw_search; $flt_search = bbc_get_sep($raw_search, $word_sep); for ($i = 0, $j = count($flt_search); $i < $j; $i++) { // Filter search engine cache indicator if (strlen($flt_search[$i]) > 50 || strlen($flt_search[$i]) < 2 || preg_match("#^(cache|tbn)\\:[a-z0-9_\\-]{8,16}\\:#", $flt_search[$i])) { unset($flt_search[$i]); continue; } // strtolower messes up UTF-8 so we leave things case sensitive if it's // requested as charset $flt_search[$i] = !$char || stristr($char, "UTF") === false ? strtolower(bbc_clean($flt_search[$i])) : bbc_clean($flt_search[$i]); $access['key'][$flt_search[$i]] = !isset($access['key'][$flt_search[$i]]) ? 1 : ++$access['key'][$flt_search[$i]]; } return !empty($flt_search) ? $flt_search : false; }
function bbc_add_new_connections_to_old() { global $BBC_IGNORE_AGENT, $BBC_IGNORE_BOTS, $BBC_MAXTIME, $BBC_MAXVISIBLE, $BBC_NO_DNS, $BBC_NO_HITS, $BBC_PURGE_SINGLE, $access, $last; // Checking whether we have new connections if (!($new_access = bbc_counter_to_array())) { return false; } // cleanup if requested !empty($BBC_PURGE_SINGLE) ? bbc_purge_single() : ""; !empty($access['time']) && is_array($access['time']) ? bbc_time_offset() : ""; // Upgrade from older versions. We need to erase the "last" data. if (isset($access['last'])) { unset($access['last']); } //check for broken 0.4.2 referrer counting and apply fix if necessary if (isset($access) && !isset($access['bugs']['ref_fix']) && isset($access['referer']['not_specified'])) { bbc_fix_refer_stat(array_sum($access['referer'])); } // fix wrong browser assignments foreach (array("java", "wwwc", "libwww") as $what) { if (isset($access) && isset($access['stat']['browser'][$what])) { $access['stat']['robot'][$what] = $access['stat']['browser'][$what]; $access['stat']['os']['other'] -= $access['stat']['robot'][$what]; unset($access['stat']['browser'][$what]); } } $nb_new_access = !empty($new_access) && is_array($new_access) ? count($new_access) : 0; $nb_last_access = !empty($last['traffic']) && is_array($last['traffic']) ? count($last['traffic']) : 0; foreach ($new_access as $connect) { $connect = bbc_update_connect($connect); // the "last reset on" flag initialisation if (!isset($access['time']) && !isset($access['time']['reset'])) { $access['time']['reset'] = $connect['time']; } // Stop processing if bots are completely ignored if (!empty($BBC_IGNORE_BOTS) && $BBC_IGNORE_BOTS == 2) { if (!empty($connect['robot'])) { --$nb_new_access; continue; } } // Omit referrers coming from robots $connect['referer'] = !empty($connect['robot']) ? "unknown" : $connect['referer']; $this_connect = $connect['time']; $last_connect = !empty($access['time']['last']) ? $access['time']['last'] : 0; // Hits as base for time stats if desired if (empty($BBC_NO_HITS)) { bbc_update_time_stat($this_connect, $last_connect); } // The script viewed $connect = isset($connect['page']) ? bbc_update_page_stats($connect) : $connect; $prev_recorded = 0; // Check if a similar connection has been recorded yet for ($l = $nb_last_access - 1; $l >= 0 && $connect['time'] - $last['traffic'][$l]['time'] < $BBC_MAXTIME; $l--) { if (!empty($BBC_IGNORE_AGENT) ? $connect['ip'] == $last['traffic'][$l]['ip'] : $connect['ip'] == $last['traffic'][$l]['ip'] && $connect['agent'] == $last['traffic'][$l]['agent']) { $last['traffic'][$l]['page'] = $connect['page']; $last['traffic'][$l]['time'] = $this_connect; $last['traffic'][$l]['visits']++; $access['stat']['totalvisits']++; $BBC_MAXVISIBLE > 0 ? bbc_update_visits($connect['time'], $connect['page'], $l) : ""; $prev_recorded = 1; break; } } // Add new connection if it hasn't been recorded yet if (!$prev_recorded) { if (empty($access['stat']['totalvisits'])) { $access['stat']['totalvisits'] = 0; } if (empty($access['stat']['totalcount'])) { $access['stat']['totalcount'] = 0; } $connect['dns'] = !empty($BBC_NO_DNS) ? $connect['ip'] : bbc_clean(gethostbyaddr($connect['ip'])); $connect['ext'] = bbc_get_extension($connect['dns'], $connect['ip']); $last['traffic'][$nb_last_access] = bbc_update_access($connect); // Visit stats $last['traffic'][$nb_last_access]['views'][] = $last['traffic'][$nb_last_access]['time'] . "|" . $last['traffic'][$nb_last_access]['page'] . "|1"; // Unique visits as base for time stats if desired if (!empty($BBC_NO_HITS)) { bbc_update_time_stat($this_connect, $last_connect); } // Referrers collection will be updated all along with the keywords if available if (isset($connect['referer'])) { bbc_update_referer_stat($connect['referer']); $flt_search = bbc_get_keywords($connect['referer']); } // The search as a whole in $last $last['traffic'][$nb_last_access]['search'] = $flt_search !== false ? implode(" ", $flt_search) : "-"; // The host listing if (isset($connect['dns']) && isset($connect['ip'])) { bbc_update_host_stat($last['traffic'][$nb_last_access]); } $access['stat']['totalvisits']++; $access['stat']['totalcount']++; $nb_last_access++; } } return $nb_new_access; }