IPv6 padding cleanup - removed trailing ':'
[lhc/web/wiklou.git] / includes / LinkFilter.php
index e03b59d..dc4c125 100644 (file)
@@ -14,7 +14,7 @@ class LinkFilter {
        /**
         * @static
         */
-       function matchEntry( $text, $filterEntry ) {
+       static function matchEntry( $text, $filterEntry ) {
                $regex = LinkFilter::makeRegex( $filterEntry );
                return preg_match( $regex, $text );
        }
@@ -22,10 +22,10 @@ class LinkFilter {
        /**
         * @static
         */
-       function makeRegex( $filterEntry ) {
+       private static function makeRegex( $filterEntry ) {
                $regex = '!http://';
                if ( substr( $filterEntry, 0, 2 ) == '*.' ) {
-                       $regex .= '([A-Za-z0-9.-]+\.|)';
+                       $regex .= '(?:[A-Za-z0-9.-]+\.|)';
                        $filterEntry = substr( $filterEntry, 2 );
                }
                $regex .= preg_quote( $filterEntry, '!' ) . '!Si';
@@ -47,8 +47,11 @@ class LinkFilter {
         * Asterisks in any other location are considered invalid.
         * 
         * @static
+        * @param $filterEntry String: domainparts
+        * @param $prot        String: protocol
         */
-       function makeLike( $filterEntry ) {
+        public static function makeLike( $filterEntry , $prot = 'http://' ) {
+               $db = wfGetDB( DB_MASTER );
                if ( substr( $filterEntry, 0, 2 ) == '*.' ) {
                        $subdomains = true;
                        $filterEntry = substr( $filterEntry, 2 );
@@ -74,19 +77,32 @@ class LinkFilter {
                        $path = '/';
                        $host = $filterEntry;
                }
-               $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
-               if ( substr( $host, -1, 1 ) !== '.' ) {
-                       $host .= '.';
-               }
-               $like = "http://$host";
-               
-               if ( $subdomains ) {
-                       $like .= '%';
-               }
-               if ( !$subdomains || $path !== '/' ) {
-                       $like .= $path . '%';
+               // Reverse the labels in the hostname, convert to lower case
+               // For emails reverse domainpart only
+               if ( $prot == 'mailto:' && strpos($host, '@') ) {
+                       // complete email adress 
+                       $mailparts = explode( '@', $host );
+                       $domainpart = strtolower( implode( '.', array_reverse( explode( '.', $mailparts[1] ) ) ) );
+                       $host = $domainpart . '@' . $mailparts[0];
+                       $like = $db->escapeLike( "$prot$host" ) . "%";
+               } elseif ( $prot == 'mailto:' ) {
+                       // domainpart of email adress only. do not add '.'
+                       $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );   
+                       $like = $db->escapeLike( "$prot$host" ) . "%";                  
+               } else {
+                       $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );   
+                       if ( substr( $host, -1, 1 ) !== '.' ) {
+                               $host .= '.';
+                       }
+                       $like = $db->escapeLike( "$prot$host" );
+
+                       if ( $subdomains ) {
+                               $like .= '%';
+                       }
+                       if ( !$subdomains || $path !== '/' ) {
+                               $like .= $db->escapeLike( $path ) . '%';
+                       }
                }
                return $like;
        }
 }
-?>