/** * @group Core * @group IP * @dataProvider getIpsInRangeData */ public function testIsIpInRange($range, $test) { foreach ($test as $ip => $expected) { // range as a string $this->assertEquals($expected, Piwik_IP::isIpInRange(Piwik_IP::P2N($ip), array($range)), "{$ip} in {$range}"); // range as an array(low, high) $aRange = Piwik_IP::getIpsForRange($range); $aRange[0] = Piwik_IP::N2P($aRange[0]); $aRange[1] = Piwik_IP::N2P($aRange[1]); $this->assertEquals($expected, Piwik_IP::isIpInRange(Piwik_IP::P2N($ip), array($aRange)), "{$ip} in {$range}"); } }
/** * Logs the IntranetSubNetwork in the log_visit table */ public function logIntranetSubNetworkInfo($notification) { $visitorInfo =& $notification->getNotificationObject(); $ip = Piwik_IP::N2P($visitorInfo['location_ip']); // by default, we want the network name to be the IP address: $networkName = $ip; /** ********************************************************************************************* ****************** adopt the following lines according to your subnets ********************** **/ // Some default subnets: if (Piwik_IP::isIpInRange($visitorInfo['location_ip'], array('0.0.0.0/0'))) { $networkName = 'Global IPv4'; } // all IPv4 addresses if (Piwik_IP::isIpInRange($visitorInfo['location_ip'], array('::/0'))) { $networkName = 'Global IPv6'; } // IPv6 addresses if (Piwik_IP::isIpInRange($visitorInfo['location_ip'], array('::ffff:0:0/96'))) { $networkName = 'Global IPv4'; } // IPv4 mapped IPv6 addresses // You may include your custom subnets: //if (Piwik_IP::isIpInRange($visitorInfo['location_ip'], array('141.2.0.0/16'))) { $networkName = 'University Frankfurt'; } //if (Piwik_IP::isIpInRange($visitorInfo['location_ip'], array('192.0.2.0/24'))) { $networkName = 'TEST-NET'; } //if (Piwik_IP::isIpInRange($visitorInfo['location_ip'], array('198.51.100.0/24'))) { $networkName = 'TEST-NET-2'; } //if (Piwik_IP::isIpInRange($visitorInfo['location_ip'], array('2001:db8::/33', // '2001:db8:8000::/33'))) { $networkName = 'Doc-IPv6'; } /** ******************* end adopt here to your subnets ***************************************** ********************************************************************************************* **/ // add the IntranetSubNetwork value in the table log_visit $visitorInfo['location_IntranetSubNetwork'] = substr($networkName, 0, 100); }
} if (is_resource($f)) { $logMe = true; if (isset($_COOKIE['clickheat-admin'])) { echo 'OK, but click not logged as you selected it in the admin panel ("Log my clicks/Enregistrer mes clics")'; $logMe = false; } elseif (IS_PIWIK_MODULE === true) { $site = (string) (int) $site; // prevents path injection if (file_exists(PIWIK_INCLUDE_PATH . '/tmp/cache/tracker/' . $site . '.php')) { include PIWIK_INCLUDE_PATH . '/tmp/cache/tracker/' . $site . '.php'; if (isset($content['excluded_ips'])) { include PIWIK_INCLUDE_PATH . '/core/Common.php'; include PIWIK_INCLUDE_PATH . '/core/IP.php'; $ip = Piwik_IP::P2N(isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']); if (Piwik_IP::isIpInRange($ip, $content['excluded_ips']) === true) { echo 'OK, but click not logged as you prevent this IP to be tracked in Piwik\'s configuration'; $logMe = false; } } } } if ($logMe === true) { echo 'OK'; fputs($f, (int) $_GET['x'] . '|' . (int) $_GET['y'] . '|' . (int) $_GET['w'] . '|' . $browser . '|' . (int) $_GET['c'] . "\n"); } fclose($f); } else { echo 'KO, file not writable'; } /* Temporary debug for Labsmedia.com, don't worry about this :-) */
function test_isIpInRange() { $tests = array('192.168.1.10' => array('192.168.1.9' => false, '192.168.1.10' => true, '192.168.1.11' => false, '::ffff:192.168.1.10' => false), '::ffff:192.168.1.10' => array('::ffff:192.168.1.9' => false, '::ffff:192.168.1.10' => true, '::ffff:c0a8:010a' => true, '0000:0000:0000:0000:0000:ffff:c0a8:010a' => true, '::ffff:192.168.1.11' => false, '192.168.1.10' => false), '192.168.1.10/32' => array('192.168.1.9' => false, '192.168.1.10' => true, '192.168.1.11' => false), '192.168.1.10/31' => array('192.168.1.9' => false, '192.168.1.10' => true, '192.168.1.11' => true, '192.168.1.12' => false), '192.168.1.128/25' => array('192.168.1.127' => false, '192.168.1.128' => true, '192.168.1.255' => true, '192.168.2.0' => false), '192.168.1.10/24' => array('192.168.0.255' => false, '192.168.1.0' => true, '192.168.1.1' => true, '192.168.1.2' => true, '192.168.1.3' => true, '192.168.1.4' => true, '192.168.1.7' => true, '192.168.1.8' => true, '192.168.1.15' => true, '192.168.1.16' => true, '192.168.1.31' => true, '192.168.1.32' => true, '192.168.1.63' => true, '192.168.1.64' => true, '192.168.1.127' => true, '192.168.1.128' => true, '192.168.1.255' => true, '192.168.2.0' => false), '192.168.1.*' => array('192.168.0.255' => false, '192.168.1.0' => true, '192.168.1.1' => true, '192.168.1.2' => true, '192.168.1.3' => true, '192.168.1.4' => true, '192.168.1.7' => true, '192.168.1.8' => true, '192.168.1.15' => true, '192.168.1.16' => true, '192.168.1.31' => true, '192.168.1.32' => true, '192.168.1.63' => true, '192.168.1.64' => true, '192.168.1.127' => true, '192.168.1.128' => true, '192.168.1.255' => true, '192.168.2.0' => false)); // testing with a single range foreach ($tests as $range => $test) { foreach ($test as $ip => $expected) { // range as a string $this->assertEqual(Piwik_IP::isIpInRange(Piwik_IP::P2N($ip), array($range)), $expected, "{$ip} in {$range}"); // range as an array(low, high) $aRange = Piwik_IP::getIpsForRange($range); $aRange[0] = Piwik_IP::N2P($aRange[0]); $aRange[1] = Piwik_IP::N2P($aRange[1]); $this->assertEqual(Piwik_IP::isIpInRange(Piwik_IP::P2N($ip), array($aRange)), $expected, "{$ip} in {$range}"); } } }
/** * Checks if the visitor ip is in the excluded list * * @param string $ip Long IP * @return bool */ protected function isVisitorIpExcluded($ip) { $websiteAttributes = Piwik_Common::getCacheWebsiteAttributes($this->idsite); if (!empty($websiteAttributes['excluded_ips'])) { if (Piwik_IP::isIpInRange($ip, $websiteAttributes['excluded_ips'])) { printDebug('Visitor IP ' . Piwik_IP::N2P($ip) . ' is excluded from being tracked'); return true; } } return false; }