OSDN Git Service

$blocklist['official/dev']
[pukiwiki/pukiwiki_sandbox.git] / spam / spam_pickup.php
index b0ecc99..1bd2a38 100644 (file)
@@ -1,10 +1,14 @@
 <?php
-// $Id: spam_pickup.php,v 1.66 2009/01/02 09:30:50 henoheno Exp $
+// $Id: spam_pickup.php,v 1.69 2009/01/02 10:45:50 henoheno Exp $
 // Copyright (C) 2006-2007 PukiWiki Developers Team
 // License: GPL v2 or (at your option) any later version
 //
 // Functions for Concept-work of spam-uri metrics
 //
+// (PHP 4 >= 4.3.0): preg_match_all(PREG_OFFSET_CAPTURE): $method['uri_XXX'] related feature
+//
+
+if (! defined('DOMAIN_INI_FILE')) define('DOMAIN_INI_FILE', 'domain.ini.php');
 
 // ---------------------
 // URI pickup
 // [OK] http://nasty.example.org:80/foo/xxx#nasty_string/bar
 // [OK] ftp://nasty.example.org:80/dfsdfs
 // [OK] ftp://cnn.example.com&story=breaking_news@10.0.0.1/top_story.htm (from RFC3986)
+// Not available for: IDN(ignored)
 function uri_pickup($string = '')
 {
        if (! is_string($string)) return array();
 
-       // Not available for: IDN(ignored)
        $array = array();
        preg_match_all(
                // scheme://userinfo@host:port/path/or/pathinfo/maybefile.and?query=string#fragment
@@ -34,7 +38,7 @@ function uri_pickup($string = '')
                        '[a-z0-9_-][a-z0-9_.-]+[a-z0-9_-]' .    // hostname(FQDN) : foo.example.org
                ')' .
                '(?::([0-9]*))?' .                                      // 4: Port
-               '((?:/+[^\s<>"\'\[\]/\#]+)*/+)?' .      // 5: Directory path
+               '((?:/+[^\s<>"\'\[\]/\#?]+)*/+)?' .     // 5: Directory path
                '([^\s<>"\'\[\]\#?]+)?' .                       // 6: File?
                '(?:\?([^\s<>"\'\[\]\#]+))?' .          // 7: Query string
                '(?:\#([a-z0-9._~%!$&\'()*+,;=:@-]*))?' .       // 8: Fragment
@@ -821,4 +825,76 @@ function spam_uri_pickup($string = '', $method = array())
        return $array;
 }
 
+// Rough hostname checker
+// TODO: Strict digit, 0x, CIDR, '999.999.999.999', ':', '::G'
+function is_ip($string = '')
+{
+       if (! is_string($string)) return FALSE;
+
+       if (strpos($string, ':') !== FALSE) {
+               return 6;       // Seems IPv6
+       }
+
+       if (preg_match('/^' .
+               '(?:[0-9]{1,3}\.){3}[0-9]{1,3}' . '|' .
+               '(?:[0-9]{1,3}\.){1,3}'         . '$/',
+               $string)) {
+               return 4;       // Seems IPv4(dot-decimal)
+       }
+
+       return FALSE;   // Seems not IP
+}
+
+// Check responsibility-root of the FQDN
+// 'foo.bar.example.com'        => 'example.com'        (.com        has the last whois for it)
+// 'foo.bar.example.au'         => 'example.au'         (.au         has the last whois for it)
+// 'foo.bar.example.edu.au'     => 'example.edu.au'     (.edu.au     has the last whois for it)
+// 'foo.bar.example.act.edu.au' => 'example.act.edu.au' (.act.edu.au has the last whois for it)
+function whois_responsibility($fqdn = 'foo.bar.example.com', $parent = FALSE, $implicit = TRUE)
+{
+       static $domain;
+
+       if ($fqdn === NULL) {
+               $domain = NULL; // Unset
+               return '';
+       }
+       if (! is_string($fqdn)) return '';
+
+       if (is_ip($fqdn)) return $fqdn;
+
+       if (! isset($domain)) {
+               $domain = array();
+               if (file_exists(DOMAIN_INI_FILE)) {
+                       include(DOMAIN_INI_FILE);       // Set
+               }
+       }
+
+       $result  = array();
+       $dcursor = & $domain;
+       $array   = array_reverse(explode('.', $fqdn));
+       $i = 0;
+       while(TRUE) {
+               if (! isset($array[$i])) break;
+               $acursor = $array[$i];
+               if (is_array($dcursor) && isset($dcursor[$acursor])) {
+                       $result[] = & $array[$i];
+                       $dcursor  = & $dcursor[$acursor];
+               } else {
+                       if (! $parent && isset($acursor)) {
+                               $result[] = & $array[$i];       // Whois servers must know this subdomain
+                       }
+                       break;
+               }
+               ++$i;
+       }
+
+       // Implicit responsibility: Top-Level-Domains must not be yours
+       // 'bar.foo.something' => 'foo.something'
+       if ($implicit && count($result) == 1 && count($array) > 1) {
+               $result[] = & $array[1];
+       }
+
+       return $result ? implode('.', array_reverse($result)) : '';
+}
+
 ?>