Changeset 3627

Show
Ignore:
Timestamp:
03/07/06 01:47:45 (3 years ago)
Author:
ryan
Message:

Security back ports from masquerade and MarkJaquith?.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/1.5/wp-admin/admin.php

    r2592 r3627  
    5656         
    5757        if (! file_exists(ABSPATH . "wp-content/plugins/$plugin_page")) 
    58             die(sprintf(__('Cannot load %s.'), $plugin_page)); 
     58            die(sprintf(__('Cannot load %s.'), htmlentities($plugin_page))); 
    5959 
    6060        if (! isset($_GET['noheader'])) 
  • branches/1.5/wp-admin/post.php

    r2780 r3627  
    3030switch($action) { 
    3131case 'post': 
    32  
     32    check_admin_referer(); 
    3333    if ( !user_can_create_draft($user_ID) ) 
    3434        die( __('You are not allowed to create posts or drafts on this blog.') ); 
     
    269269 
    270270case 'editpost': 
     271    check_admin_referer(); 
    271272    // die(var_dump('<pre>', $_POST)); 
    272273    if (!isset($blog_ID)) { 
     
    496497 
    497498case 'confirmdeletecomment': 
    498  
     499    check_admin_referer(); 
    499500    require_once('./admin-header.php'); 
    500501 
     
    591592 
    592593case 'mailapprovecomment': 
    593  
     594    check_admin_referer(); 
    594595    $comment = (int) $_GET['comment']; 
    595596 
     
    611612 
    612613case 'approvecomment': 
    613  
     614    check_admin_referer(); 
    614615    $comment = (int) $_GET['comment']; 
    615616    $p = (int) $_GET['p']; 
     
    640641 
    641642case 'editedcomment': 
    642  
     643    check_admin_referer(); 
    643644    $comment_ID = (int) $_POST['comment_ID']; 
    644645    $comment_post_ID = (int) $_POST['comment_post_ID']; 
  • branches/1.5/wp-admin/profile.php

    r2439 r3627  
    6565        if ( $pass1 != $pass2 ) 
    6666            die (__("<strong>ERROR</strong>: you typed two different passwords. Go back to correct that.")); 
    67         $newuser_pass = $pass1
     67        $newuser_pass = $wpdb->escape($pass1)
    6868        $updatepassword = "user_pass=MD5('$newuser_pass'), "; 
    6969        wp_clearcookie(); 
    70         wp_setcookie($user_login, $newuser_pass); 
     70        wp_setcookie($user_login, $pass1); 
    7171    } 
    7272 
  • branches/1.5/wp-admin/user-edit.php

    r2489 r3627  
    2424switch ($action) { 
    2525case 'update': 
     26 
     27check_admin_referer(); 
    2628 
    2729get_currentuserinfo(); 
  • branches/1.5/wp-comments-post.php

    r2580 r3627  
    5858header('Pragma: no-cache'); 
    5959 
    60 $location = (empty($_POST['redirect_to'])) ? $_SERVER["HTTP_REFERER"] : $_POST['redirect_to'];  
     60$location = ( empty( $_POST['redirect_to'] ) ) ? get_permalink( $comment_post_ID ) : $_POST['redirect_to'];  
    6161 
    6262wp_redirect($location); 
  • branches/1.5/wp-includes/class-snoopy.php

    r2053 r3627  
    66Author: Monte Ohrt <monte@ispi.net> 
    77Copyright (c): 1999-2000 ispi, all rights reserved 
    8 Version: 1.0 
     8Version: 1.01 
    99 
    1010 * This library is free software; you can redistribute it and/or 
     
    3232 
    3333The latest version of Snoopy can be obtained from: 
    34 http://snoopy.sourceforge.net 
     34http://snoopy.sourceforge.net/ 
    3535 
    3636*************************************************/ 
     
    4040{ 
    4141    /**** Public variables ****/ 
    42      
     42 
    4343    /* user definable vars */ 
    4444 
     
    4747    var $proxy_host     =   "";                 // proxy host to use 
    4848    var $proxy_port     =   "";                 // proxy port to use 
    49     var $agent          =   "Snoopy v1.0";      // agent we masquerade as 
     49    var $proxy_user     =   "";                 // proxy user to use 
     50    var $proxy_pass     =   "";                 // proxy password to use 
     51 
     52    var $agent          =   "Snoopy v1.2.3";    // agent we masquerade as 
    5053    var $referer        =   "";                 // referer info to pass 
    5154    var $cookies        =   array();            // array of cookies to pass 
     
    6063    var $expandlinks    =   true;               // expand links to fully qualified URLs. 
    6164                                                // this only applies to fetchlinks() 
    62                                                 // or submitlinks() 
     65                                                // submitlinks(), and submittext() 
    6366    var $passcookies    =   true;               // pass set cookies back through redirects 
    6467                                                // NOTE: this currently does not respect 
    6568                                                // dates, domains or paths. 
    66      
     69 
    6770    var $user           =   "";                 // user for http authentication 
    6871    var $pass           =   "";                 // password for http authentication 
    69      
     72 
    7073    // http accept types 
    7174    var $accept         =   "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; 
    72      
     75 
    7376    var $results        =   "";                 // where the content is put 
    74          
     77 
    7578    var $error          =   "";                 // error messages sent here 
    7679    var $response_code  =   "";                 // response code returned from server 
     
    8285    var $timed_out      =   false;              // if a read operation timed out 
    8386    var $status         =   0;                  // http request status 
    84      
    85     var $curl_path      =   "/usr/bin/curl"; 
     87 
     88    var $temp_dir       =   "/tmp";             // temporary directory that the webserver 
     89                                                // has permission to write to. 
     90                                                // under Windows, this should be C:\temp 
     91 
     92    var $curl_path      =   "/usr/local/bin/curl"; 
    8693                                                // Snoopy will use cURL for fetching 
    8794                                                // SSL content if a full system path to 
     
    94101                                                // as these functions are not stable 
    95102                                                // as of this Snoopy release. 
    96      
    97     // send Accept-encoding: gzip? 
    98     var $use_gzip       = true;  
    99      
    100     /**** Private variables ****/    
    101      
     103 
     104    /**** Private variables ****/ 
     105 
    102106    var $_maxlinelen    =   4096;               // max line length (headers) 
    103      
     107 
    104108    var $_httpmethod    =   "GET";              // default http request method 
    105109    var $_httpversion   =   "HTTP/1.0";         // default http request version 
     
    111115    var $_frameurls     =   array();            // frame src urls 
    112116    var $_framedepth    =   0;                  // increments on frame depth 
    113      
     117 
    114118    var $_isproxy       =   false;              // set if using a proxy server 
    115119    var $_fp_timeout    =   30;                 // timeout for socket connection 
     
    126130    function fetch($URI) 
    127131    { 
    128      
     132 
    129133        //preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS); 
    130134        $URI_PARTS = parse_url($URI); 
     
    133137        if (!empty($URI_PARTS["pass"])) 
    134138            $this->pass = $URI_PARTS["pass"]; 
    135                  
    136         switch($URI_PARTS["scheme"]) 
     139        if (empty($URI_PARTS["query"])) 
     140            $URI_PARTS["query"] = ''; 
     141        if (empty($URI_PARTS["path"])) 
     142            $URI_PARTS["path"] = ''; 
     143 
     144        switch(strtolower($URI_PARTS["scheme"])) 
    137145        { 
    138146            case "http": 
     
    149157                    else 
    150158                    { 
    151                         $path = $URI_PARTS["path"].(isset($URI_PARTS["query"]) ? "?".$URI_PARTS["query"] : ""); 
     159                        $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); 
    152160                        // no proxy, send only the path 
    153161                        $this->_httprequest($path, $fp, $URI, $this->_httpmethod); 
    154162                    } 
    155                      
     163 
    156164                    $this->_disconnect($fp); 
    157165 
     
    176184                        $frameurls = $this->_frameurls; 
    177185                        $this->_frameurls = array(); 
    178                          
     186 
    179187                        while(list(,$frameurl) = each($frameurls)) 
    180188                        { 
     
    187195                                break; 
    188196                        } 
    189                     }                   
     197                    } 
    190198                } 
    191199                else 
     
    193201                    return false; 
    194202                } 
    195                 return true;                    
     203                return true; 
    196204                break; 
    197205            case "https": 
    198                 if(!$this->curl_path || (!is_executable($this->curl_path))) { 
    199                     $this->error = "Bad curl ($this->curl_path), can't fetch HTTPS \n"; 
     206                if(!$this->curl_path) 
    200207                    return false; 
    201                 } 
     208                if(function_exists("is_executable")) 
     209                    if (!is_executable($this->curl_path)) 
     210                        return false; 
    202211                $this->host = $URI_PARTS["host"]; 
    203212                if(!empty($URI_PARTS["port"])) 
     
    246255                            break; 
    247256                    } 
    248                 }                   
    249                 return true;                    
     257                } 
     258                return true; 
    250259                break; 
    251260            default: 
     
    254263                return false; 
    255264                break; 
    256         }       
     265        } 
    257266        return true; 
    258267    } 
    259268 
     269/*======================================================================*\ 
     270    Function:   submit 
     271    Purpose:    submit an http form 
     272    Input:      $URI    the location to post the data 
     273                $formvars   the formvars to use. 
     274                    format: $formvars["var"] = "val"; 
     275                $formfiles  an array of files to submit 
     276                    format: $formfiles["var"] = "/dir/filename.ext"; 
     277    Output:     $this->results  the text output from the post 
     278\*======================================================================*/ 
     279 
     280    function submit($URI, $formvars="", $formfiles="") 
     281    { 
     282        unset($postdata); 
     283 
     284        $postdata = $this->_prepare_post_body($formvars, $formfiles); 
     285 
     286        $URI_PARTS = parse_url($URI); 
     287        if (!empty($URI_PARTS["user"])) 
     288            $this->user = $URI_PARTS["user"]; 
     289        if (!empty($URI_PARTS["pass"])) 
     290            $this->pass = $URI_PARTS["pass"]; 
     291        if (empty($URI_PARTS["query"])) 
     292            $URI_PARTS["query"] = ''; 
     293        if (empty($URI_PARTS["path"])) 
     294            $URI_PARTS["path"] = ''; 
     295 
     296        switch(strtolower($URI_PARTS["scheme"])) 
     297        { 
     298            case "http": 
     299                $this->host = $URI_PARTS["host"]; 
     300                if(!empty($URI_PARTS["port"])) 
     301                    $this->port = $URI_PARTS["port"]; 
     302                if($this->_connect($fp)) 
     303                { 
     304                    if($this->_isproxy) 
     305                    { 
     306                        // using proxy, send entire URI 
     307                        $this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata); 
     308                    } 
     309                    else 
     310                    { 
     311                        $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); 
     312                        // no proxy, send only the path 
     313                        $this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata); 
     314                    } 
     315 
     316                    $this->_disconnect($fp); 
     317 
     318                    if($this->_redirectaddr) 
     319                    { 
     320                        /* url was redirected, check if we've hit the max depth */ 
     321                        if($this->maxredirs > $this->_redirectdepth) 
     322                        { 
     323                            if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) 
     324                                $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); 
     325 
     326                            // only follow redirect if it's on this site, or offsiteok is true 
     327                            if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) 
     328                            { 
     329                                /* follow the redirect */ 
     330                                $this->_redirectdepth++; 
     331                                $this->lastredirectaddr=$this->_redirectaddr; 
     332                                if( strpos( $this->_redirectaddr, "?" ) > 0 ) 
     333                                    $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get 
     334                                else 
     335                                    $this->submit($this->_redirectaddr,$formvars, $formfiles); 
     336                            } 
     337                        } 
     338                    } 
     339 
     340                    if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) 
     341                    { 
     342                        $frameurls = $this->_frameurls; 
     343                        $this->_frameurls = array(); 
     344 
     345                        while(list(,$frameurl) = each($frameurls)) 
     346                        { 
     347                            if($this->_framedepth < $this->maxframes) 
     348                            { 
     349                                $this->fetch($frameurl); 
     350                                $this->_framedepth++; 
     351                            } 
     352                            else 
     353                                break; 
     354                        } 
     355                    } 
     356 
     357                } 
     358                else 
     359                { 
     360                    return false; 
     361                } 
     362                return true; 
     363                break; 
     364            case "https": 
     365                if(!$this->curl_path) 
     366                    return false; 
     367                if(function_exists("is_executable")) 
     368                    if (!is_executable($this->curl_path)) 
     369                        return false; 
     370                $this->host = $URI_PARTS["host"]; 
     371                if(!empty($URI_PARTS["port"])) 
     372                    $this->port = $URI_PARTS["port"]; 
     373                if($this->_isproxy) 
     374                { 
     375                    // using proxy, send entire URI 
     376                    $this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata); 
     377                } 
     378                else 
     379                { 
     380                    $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); 
     381                    // no proxy, send only the path 
     382                    $this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata); 
     383                } 
     384 
     385                if($this->_redirectaddr) 
     386                { 
     387                    /* url was redirected, check if we've hit the max depth */ 
     388                    if($this->maxredirs > $this->_redirectdepth) 
     389                    { 
     390                        if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) 
     391                            $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); 
     392 
     393                        // only follow redirect if it's on this site, or offsiteok is true 
     394                        if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) 
     395                        { 
     396                            /* follow the redirect */ 
     397                            $this->_redirectdepth++; 
     398                            $this->lastredirectaddr=$this->_redirectaddr; 
     399                            if( strpos( $this->_redirectaddr, "?" ) > 0 ) 
     400                                $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get 
     401                            else 
     402                                $this->submit($this->_redirectaddr,$formvars, $formfiles); 
     403                        } 
     404                    } 
     405                } 
     406 
     407                if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) 
     408                { 
     409                    $frameurls = $this->_frameurls; 
     410                    $this->_frameurls = array(); 
     411 
     412                    while(list(,$frameurl) = each($frameurls)) 
     413                    { 
     414                        if($this->_framedepth < $this->maxframes) 
     415                        { 
     416                            $this->fetch($frameurl); 
     417                            $this->_framedepth++; 
     418                        } 
     419                        else 
     420                            break; 
     421                    } 
     422                } 
     423                return true; 
     424                break; 
     425 
     426            default: 
     427                // not a valid protocol 
     428                $this->error    =   'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; 
     429                return false; 
     430                break; 
     431        } 
     432        return true; 
     433    } 
     434 
     435/*======================================================================*\ 
     436    Function:   fetchlinks 
     437    Purpose:    fetch the links from a web page 
     438    Input:      $URI    where you are fetching from 
     439    Output:     $this->results  an array of the URLs 
     440\*======================================================================*/ 
     441 
     442    function fetchlinks($URI) 
     443    { 
     444        if ($this->fetch($URI)) 
     445        { 
     446            if($this->lastredirectaddr) 
     447                $URI = $this->lastredirectaddr; 
     448            if(is_array($this->results)) 
     449            { 
     450                for($x=0;$x<count($this->results);$x++) 
     451                    $this->results[$x] = $this->_striplinks($this->results[$x]); 
     452            } 
     453            else 
     454                $this->results = $this->_striplinks($this->results); 
     455 
     456            if($this->expandlinks) 
     457                $this->results = $this->_expandlinks($this->results, $URI); 
     458            return true; 
     459        } 
     460        else 
     461            return false; 
     462    } 
     463 
     464/*======================================================================*\ 
     465    Function:   fetchform 
     466    Purpose:    fetch the form elements from a web page 
     467    Input:      $URI    where you are fetching from 
     468    Output:     $this->results  the resulting html form 
     469\*======================================================================*/ 
     470 
     471    function fetchform($URI) 
     472    { 
     473 
     474        if ($this->fetch($URI)) 
     475        { 
     476 
     477            if(is_array($this->results)) 
     478            { 
     479                for($x=0;$x<count($this->results);$x++) 
     480                    $this->results[$x] = $this->_stripform($this->results[$x]); 
     481            } 
     482            else 
     483                $this->results = $this->_stripform($this->results); 
     484 
     485            return true; 
     486        } 
     487        else 
     488            return false; 
     489    } 
     490 
     491 
     492/*======================================================================*\ 
     493    Function:   fetchtext 
     494    Purpose:    fetch the text from a web page, stripping the links 
     495    Input:      $URI    where you are fetching from 
     496    Output:     $this->results  the text from the web page 
     497\*======================================================================*/ 
     498 
     499    function fetchtext($URI) 
     500    { 
     501        if($this->fetch($URI)) 
     502        { 
     503            if(is_array($this->results)) 
     504            { 
     505                for($x=0;$x<count($this->results);$x++) 
     506                    $this->results[$x] = $this->_striptext($this->results[$x]); 
     507            } 
     508            else 
     509                $this->results = $this->_striptext($this->results); 
     510            return true; 
     511        } 
     512        else 
     513            return false; 
     514    } 
     515 
     516/*======================================================================*\ 
     517    Function:   submitlinks 
     518    Purpose:    grab links from a form submission 
     519    Input:      $URI    where you are submitting from 
     520    Output:     $this->results  an array of the links from the post 
     521\*======================================================================*/ 
     522 
     523    function submitlinks($URI, $formvars="", $formfiles="") 
     524    { 
     525        if($this->submit($URI,$formvars, $formfiles)) 
     526        { 
     527            if($this->lastredirectaddr) 
     528                $URI = $this->lastredirectaddr; 
     529            if(is_array($this->results)) 
     530            { 
     531                for($x=0;$x<count($this->results);$x++) 
     532                { 
     533                    $this->results[$x] = $this->_striplinks($this->results[$x]); 
     534                    if($this->expandlinks) 
     535                        $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); 
     536                } 
     537            } 
     538            else 
     539            { 
     540                $this->results = $this->_striplinks($this->results); 
     541                if($this->expandlinks) 
     542                    $this->results = $this->_expandlinks($this->results,$URI); 
     543            } 
     544            return true; 
     545        } 
     546        else 
     547            return false; 
     548    } 
     549 
     550/*======================================================================*\ 
     551    Function:   submittext 
     552    Purpose:    grab text from a form submission 
     553    Input:      $URI    where you are submitting from 
     554    Output:     $this->results  the text from the web page 
     555\*======================================================================*/ 
     556 
     557    function submittext($URI, $formvars = "", $formfiles = "") 
     558    { 
     559        if($this->submit($URI,$formvars, $formfiles)) 
     560        { 
     561            if($this->lastredirectaddr) 
     562                $URI = $this->lastredirectaddr; 
     563            if(is_array($this->results)) 
     564            { 
     565                for($x=0;$x<count($this->results);$x++) 
     566                { 
     567                    $this->results[$x] = $this->_striptext($this->results[$x]); 
     568                    if($this->expandlinks) 
     569                        $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); 
     570                } 
     571            } 
     572            else 
     573            { 
     574                $this->results = $this->_striptext($this->results); 
     575                if($this->expandlinks) 
     576                    $this->results = $this->_expandlinks($this->results,$URI); 
     577            } 
     578            return true; 
     579        } 
     580        else 
     581            return false; 
     582    } 
     583 
     584 
     585 
     586/*======================================================================*\ 
     587    Function:   set_submit_multipart 
     588    Purpose:    Set the form submission content type to 
     589                multipart/form-data 
     590\*======================================================================*/ 
     591    function set_submit_multipart() 
     592    { 
     593        $this->_submit_type = "multipart/form-data"; 
     594    } 
     595 
     596 
     597/*======================================================================*\ 
     598    Function:   set_submit_normal 
     599    Purpose:    Set the form submission content type to 
     600                application/x-www-form-urlencoded 
     601\*======================================================================*/ 
     602    function set_submit_normal() 
     603    { 
     604        $this->_submit_type = "application/x-www-form-urlencoded"; 
     605    } 
     606 
     607 
    260608 
    261609 
     
    263611    Private functions 
    264612\*======================================================================*/ 
    265      
    266      
     613 
     614 
    267615/*======================================================================*\ 
    268616    Function:   _striplinks 
     
    273621 
    274622    function _striplinks($document) 
    275     {   
    276         preg_match_all("'<\s*a\s+.*href\s*=\s*            # find <a href= 
     623    { 
     624        preg_match_all("'<\s*a\s.*?href\s*=\s*            # find <a href= 
    277625                        ([\"\'])?                   # find single or double quote 
    278626                        (?(1) (.*?)\\1 | ([^\s\>]+))        # if quote found, match up to next matching 
    279627                                                    # quote, otherwise match up to next space 
    280628                        'isx",$document,$links); 
    281                          
     629 
    282630 
    283631        // catenate the non-empty matches from the conditional subpattern 
     
    287635            if(!empty($val)) 
    288636                $match[] = $val; 
    289         }               
    290          
     637        } 
     638 
    291639        while(list($key,$val) = each($links[3])) 
    292640        { 
    293641            if(!empty($val)) 
    294642                $match[] = $val; 
    295         }       
    296          
     643        } 
     644 
    297645        // return the links 
    298646        return $match; 
     
    307655 
    308656    function _stripform($document) 
    309     {   
     657    { 
    310658        preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements); 
    311          
     659 
    312660        // catenate the matches 
    313661        $match = implode("\r\n",$elements[0]); 
    314                  
     662 
    315663        // return the links 
    316664        return $match; 
    317665    } 
    318666 
    319      
    320      
     667 
     668 
    321669/*======================================================================*\ 
    322670    Function:   _striptext 
     
    328676    function _striptext($document) 
    329677    { 
    330          
     678 
    331679        // I didn't use preg eval (//e) since that is only available in PHP 4.0. 
    332680        // so, list your entities one by one here. I included some of the 
    333681        // more common ones. 
    334                                  
     682 
    335683        $search = array("'<script[^>]*?>.*?</script>'si",   // strip out javascript 
    336684                        "'<[\/\!]*?[^<>]*?>'si",            // strip out html tags 
    337685                        "'([\r\n])[\s]+'",                  // strip out white space 
    338                         "'&(quote|#34);'i",                   // replace html entities 
    339                         "'&(amp|#38);'i", 
    340                         "'&(lt|#60);'i", 
    341                         "'&(gt|#62);'i", 
    342                         "'&(nbsp|#160);'i", 
     686                        "'&(quot|#34|#034|#x22);'i",      // replace html entities 
     687                        "'&(amp|#38|#038|#x26);'i",            // added hexadecimal values 
     688                        "'&(lt|#60|#060|#x3c);'i", 
     689                        "'&(gt|#62|#062|#x3e);'i", 
     690                        "'&(nbsp|#160|#xa0);'i", 
    343691                        "'&(iexcl|#161);'i", 
    344692                        "'&(cent|#162);'i", 
    345693                        "'&(pound|#163);'i", 
    346                         "'&(copy|#169);'i" 
    347                         );               
     694                        "'&(copy|#169);'i", 
     695                        "'&(reg|#174);'i", 
     696                        "'&(deg|#176);'i", 
     697                        "'&(#39|#039|#x27);'", 
     698                        "'&(euro|#8364);'i",                // europe 
     699                        "'&a(uml|UML);'",                   // german 
     700                        "'&o(uml|UML);'", 
     701                        "'&u(uml|UML);'", 
     702                        "'&A(uml|UML);'", 
     703                        "'&O(uml|UML);'", 
     704                        "'&U(uml|UML);'", 
     705                        "'&szlig;'i", 
     706                        ); 
    348707        $replace = array(   "", 
    349708                            "", 
     
    357716                            chr(162), 
    358717                            chr(163), 
    359                             chr(169)); 
    360                      
     718                            chr(169), 
     719                            chr(174), 
     720                            chr(176), 
     721                            chr(39), 
     722                            chr(128), 
     723                            "� 
     724                            "�                          "�                  "�, 
     725                            "�, 
     726                            "�, 
     727                            "�, 
     728                        ); 
     729 
    361730        $text = preg_replace($search,$replace,$document); 
    362                                  
     731 
    363732        return $text; 
    364733    } 
     
    374743    function _expandlinks($links,$URI) 
    375744    { 
    376          
     745 
    377746        preg_match("/^[^\?]+/",$URI,$match); 
    378747 
    379748        $match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]); 
    380                  
     749        $match = preg_replace("|/$|","",$match); 
     750        $match_part = parse_url($match); 
     751        $match_root = 
     752        $match_part["scheme"]."://".$match_part["host"]; 
     753 
    381754        $search = array(    "|^http://".preg_quote($this->host)."|i", 
    382                             "|^(?!http://)(\/)?(?!mailto:)|i", 
     755                            "|^(\/)|i", 
     756                            "|^(?!http://)(?!mailto:)|i", 
    383757                            "|/\./|", 
    384758                            "|/[^\/]+/\.\./|" 
    385759                        ); 
    386                          
     760 
    387761        $replace = array(   "", 
     762                            $match_root."/", 
    388763                            $match."/", 
    389764                            "/", 
    390765                            "/" 
    391                         );          
    392                  
     766                        ); 
     767 
    393768        $expandedLinks = preg_replace($search,$replace,$links); 
    394769 
     
    403778                $URI        the full URI 
    404779                $body       body contents to send if any (POST) 
    405     Output:         
    406 \*======================================================================*/ 
    407      
     780    Output: 
     781\*======================================================================*/ 
     782 
    408783    function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="") 
    409784    { 
     785        $cookie_headers = ''; 
    410786        if($this->passcookies && $this->_redirectaddr) 
    411787            $this->setcookies(); 
    412              
     788 
    413789        $URI_PARTS = parse_url($URI); 
    414790        if(empty($url)) 
    415791            $url = "/"; 
    416         $headers = $http_method." ".$url." ".$this->_httpversion."\r\n";        
     792        $headers = $http_method." ".$url." ".$this->_httpversion."\r\n"; 
    417793        if(!empty($this->agent)) 
    418794            $headers .= "User-Agent: ".$this->agent."\r\n"; 
    419         if(!empty($this->host) && !isset($this->rawheaders['Host'])) 
    420             $headers .= "Host: ".$this->host."\r\n"; 
     795        if(!empty($this->host) && !isset($this->rawheaders['Host'])) { 
     796            $headers .= "Host: ".$this->host; 
     797            if(!empty($this->port)) 
     798                $headers .= ":".$this->port; 
     799            $headers .= "\r\n"; 
     800        } 
    421801        if(!empty($this->accept)) 
    422802            $headers .= "Accept: ".$this->accept."\r\n"; 
    423          
    424         if($this->use_gzip) { 
    425             // make sure PHP was built with --with-zlib 
    426             // and we can handle gzipp'ed data 
    427             if ( function_exists(gzinflate) ) { 
    428                $headers .= "Accept-encoding: gzip\r\n"; 
    429             } 
    430             else { 
    431                trigger_error( 
    432                 "use_gzip is on, but PHP was built without zlib support.". 
    433                 "  Requesting file(s) without gzip encoding.",  
    434                 E_USER_NOTICE); 
    435             } 
    436         } 
    437          
    438803        if(!empty($this->referer)) 
    439804            $headers .= "Referer: ".$this->referer."\r\n"; 
    440805        if(!empty($this->cookies)) 
    441         {           
     806        { 
    442807            if(!is_array($this->cookies)) 
    443808                $this->cookies = (array)$this->cookies; 
    444      
     809 
    445810            reset($this->cookies); 
    446811            if ( count($this->cookies) > 0 ) { 
     
    465830            $headers .= "\r\n"; 
    466831        } 
    467         if(!empty($body))   
     832        if(!empty($body)) 
    468833            $headers .= "Content-length: ".strlen($body)."\r\n"; 
    469         if(!empty($this->user) || !empty($this->pass))   
    470             $headers .= "Authorization: BASIC ".base64_encode($this->user.":".$this->pass)."\r\n"; 
     834        if(!empty($this->user) || !empty($this->pass)) 
     835            $headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n"; 
     836 
     837        //add proxy auth headers 
     838        if(!empty($this->proxy_user)) 
     839        &n