WordPress.org

Plugin Directory


Ignore:
Timestamp:
10/06/09 21:22:22 (5 years ago)
Author:
mark8barnes
Message:

0.43.5 - Improvements to handling of external URLs

Location:
sermon-browser/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • sermon-browser/trunk/sb-includes/php4compat.php

    r159840 r161052  
    1111if (!function_exists('get_headers')) { 
    1212    function get_headers($Url, $Format= 0, $Depth= 0) { 
    13         if ($Depth > 5) return; 
     13        if ($Depth > 5) 
     14            return; 
    1415        $Parts = parse_url($Url); 
    15         if (!array_key_exists('path', $Parts))   $Parts['path'] = '/'; 
    16         if (!array_key_exists('port', $Parts))   $Parts['port'] = 80; 
    17         if (!array_key_exists('scheme', $Parts)) $Parts['scheme'] = 'http'; 
     16        if (!array_key_exists('path', $Parts)) 
     17            $Parts['path'] = '/'; 
     18        if (!array_key_exists('port', $Parts)) 
     19            $Parts['port'] = 80; 
     20        if (!array_key_exists('scheme', $Parts)) 
     21            $Parts['scheme'] = 'http'; 
    1822 
    1923        $Return = array(); 
     
    2630            $Redirect = false; $RedirectUrl = ''; 
    2731            while (!feof($fp) && $InLine = fgets($fp, 1280)) { 
    28                 if ($InLine == "\r\n") break; 
     32                if ($InLine == "\r\n") 
     33                    break; 
    2934                $InLine = rtrim($InLine); 
    3035 
     
    3237                if ($Key == $InLine) { 
    3338                    if ($Format == 1) 
    34                             $Return[$Depth] = $InLine; 
    35                     else    $Return[] = $InLine; 
    36  
    37                     if (strpos($InLine, 'Moved') > 0) $Redirect = true; 
     39                        $Return[$Depth] = $InLine; 
     40                    else 
     41                        $Return[] = $InLine; 
     42                    if (strpos($InLine, 'Moved') > 0) 
     43                        $Redirect = true; 
    3844                } else { 
    39                     if ($Key == 'Location') $RedirectUrl = $Value; 
     45                    if ($Key == 'Location') 
     46                        $RedirectUrl = $Value; 
    4047                    if ($Format == 1) 
    41                             $Return[$Key] = $Value; 
    42                     else    $Return[] = $Key.': '.$Value; 
     48                        $Return[$Key] = $Value; 
     49                    else 
     50                        $Return[] = $Key.': '.$Value; 
    4351                } 
    4452            } 
     
    4654            if ($Redirect && !empty($RedirectUrl)) { 
    4755                $NewParts = parse_url($RedirectUrl); 
    48                 if (!array_key_exists('host', $NewParts))   $RedirectUrl = $Parts['host'].$RedirectUrl; 
    49                 if (!array_key_exists('scheme', $NewParts)) $RedirectUrl = $Parts['scheme'].'://'.$RedirectUrl; 
     56                if (!array_key_exists('host', $NewParts)) 
     57                    $RedirectUrl = $Parts['host'].$RedirectUrl; 
     58                if (!array_key_exists('scheme', $NewParts)) 
     59                    $RedirectUrl = $Parts['scheme'].'://'.$RedirectUrl; 
    5060                $RedirectHeaders = get_headers($RedirectUrl, $Format, $Depth+1); 
    51                 if ($RedirectHeaders) $Return = array_merge_recursive($Return, $RedirectHeaders); 
     61                if ($RedirectHeaders) 
     62                    $Return = array_merge_recursive($Return, $RedirectHeaders); 
    5263            } 
    5364            return $Return; 
  • sermon-browser/trunk/sb-includes/readme.txt

    r160038 r161052  
    5959 
    6060== Changelog == 
     61 
     62= 0.43.5 (6 October 2009) = 
     63* **Bug fix:** Fixed bug preventing some external URLs playing in AudioPlayer. 
    6164 
    6265= 0.43.4 (2 October 2009) = 
  • sermon-browser/trunk/sermon.php

    r160038 r161052  
    55Description: Add sermons to your Wordpress blog. Thanks to <a href="http://codeandmore.com/">Tien Do Xuan</a> for initial coding. 
    66Author: Mark Barnes 
    7 Version: 0.43.4 
     7Version: 0.43.5 
    88Author URI: http://www.4-14.org.uk/ 
    99 
     
    5454* @package common_functions 
    5555*/ 
    56 define('SB_CURRENT_VERSION', '0.43.4'); 
     56define('SB_CURRENT_VERSION', '0.43.5'); 
    5757define('SB_DATABASE_VERSION', '1.6'); 
    5858add_action ('plugins_loaded', 'sb_hijack'); 
     
    6060add_action ('widgets_init', 'sb_widget_sermon_init'); 
    6161 
     62if (version_compare(PHP_VERSION, '5.0.0', '<')) 
     63    require('sb-includes/php4compat.php'); 
     64 
    6265/** 
    6366* Display podcast, or download linked files 
     
    6871function sb_hijack() { 
    6972 
    70     global $filetypes, $wpdb; 
     73    global $filetypes, $wpdb, $sermon_domain; 
    7174    sb_define_constants(); 
    7275 
     
    7982        require('sb-includes/style.php'); 
    8083 
    81     if (version_compare(PHP_VERSION, '5.0.0', '<')) 
    82         require('sb-includes/php4compat.php'); 
    83  
    8484    //Forces sermon download of local file 
    85     if (isset($_REQUEST['download']) AND isset($_REQUEST['file_name'])) { 
    86         $file_name = urldecode($_GET['file_name']); 
     85    if (isset($_GET['download']) AND isset($_GET['file_name'])) { 
     86        $file_name = $wpdb->escape(urldecode($_GET['file_name'])); 
    8787        $file_name = $wpdb->get_var("SELECT name FROM {$wpdb->prefix}sb_stuff WHERE name='{$file_name}'"); 
    8888        if (!is_null($file_name)) { 
     
    100100            if ($filesize != 0) 
    101101                header("Content-Length: ".filesize($file_name)); 
    102             readfile_segments($file_name); 
    103         } 
    104         exit(); 
     102            output_file($file_name); 
     103            die(); 
     104        } else 
     105            wp_die(urldecode($_GET['file_name']).' '.__('not found', $sermon_domain), __('File not found', $sermon_domain), array('response' => 404)); 
    105106    } 
    106107 
     
    109110        $url = urldecode($_GET['url']); 
    110111        if(ini_get('allow_url_fopen')) { 
    111             $headers = array_change_key_case(get_headers($url, 1),CASE_LOWER); 
    112             $filesize = $headers['content-length']; 
    113             $cd =  $headers['content-disposition']; 
    114             $location =  $headers['location']; 
    115             if (is_array($location)) $location = $location[0]; 
    116             if ($location && substr($location,0,7) != "http://") { 
    117                 preg_match('@^(?:http://)?([^/]+)@i', $url, $matches); 
    118                 $location = "http://".$matches[1].'/'.$location; 
    119             } 
    120             if ($location) { 
    121                 header('Location: '.get_bloginfo('wpurl').'?download&url='.$location); 
    122                 die(); 
     112            $headers = @get_headers($url, 1); 
     113            if ($headers === FALSE || (isset($headers[0]) && strstr($headers[0], '404') !== FALSE)) 
     114                wp_die(urldecode($_GET['url']).' '.__('not found', $sermon_domain), __('URL not found', $sermon_domain), array('response' => 404)); 
     115            $headers = array_change_key_case($headers,CASE_LOWER); 
     116            if (isset($headers['location'])) { 
     117                $location =  $headers['location']; 
     118                if (is_array($location)) 
     119                    $location = $location[0]; 
     120                if ($location && substr($location,0,7) != "http://") { 
     121                    preg_match('@^(?:http://)?([^/]+)@i', $url, $matches); 
     122                    $location = "http://".$matches[1].'/'.$location; 
     123                } 
     124                if ($location) { 
     125                    header('Location: '.get_bloginfo('wpurl').'?download&url='.$location); 
     126                    die(); 
     127                } 
    123128            } 
    124129            header("Pragma: public"); 
     
    128133            header("Content-Type: application/octet-stream"); 
    129134            header("Content-Type: application/download"); 
    130             if ($cd) { 
    131                 header ("Content-Disposition: ".$cd); } 
    132             else { 
    133                 header('Content-Disposition: attachment; filename="'.basename($url).'";'); } 
     135            if (isset($headers['last-modified'])) 
     136                header('Last-Modified: '.$headers['last-modified']); 
     137            if (isset($headers['content-length'])) 
     138                header("Content-Length: ".$headers['content-length']); 
     139            if (isset($headers['content-disposition'])) 
     140                header ('Content-Disposition: '.$headers['content-disposition']); 
     141            else 
     142                header('Content-Disposition: attachment; filename="'.basename($url).'";'); 
    134143            header("Content-Transfer-Encoding: binary"); 
    135             if ($filesize) header("Content-Length: ".$filesize); 
     144            header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); 
    136145            sb_increase_download_count($url); 
    137             readfile_segments($url); 
    138             exit(); 
    139         } 
    140         else { 
     146            session_write_close(); 
     147            while (@ob_end_clean()); 
     148            output_file($url); 
     149            die(); 
     150        } else { 
    141151            sb_increase_download_count ($url); 
    142152            header('Location: '.$url); 
     153            die(); 
    143154        } 
    144155    } 
    145156     
    146157    //Returns local file (doesn't force download) 
    147     if (isset($_REQUEST['show']) AND isset($_REQUEST['file_name'])) { 
     158    if (isset($_GET['show']) AND isset($_GET['file_name'])) { 
    148159        global $filetypes; 
    149         $file_name = urldecode($_GET['file_name']); 
     160        $file_name = $wpdb->escape(urldecode($_GET['file_name'])); 
    150161        $file_name = $wpdb->get_var("SELECT name FROM {$wpdb->prefix}sb_stuff WHERE name='{$file_name}'"); 
    151162        if (!is_null($file_name)) { 
     
    153164            sb_increase_download_count ($file_name); 
    154165            header("Location: ".$url); 
    155         } 
    156         exit(); 
     166            die(); 
     167        } else 
     168            wp_die(urldecode($_GET['file_name']).' '.__('not found', $sermon_domain), __('File not found', $sermon_domain), array('response' => 404)); 
    157169    } 
    158170     
     
    162174        sb_increase_download_count ($url); 
    163175        header('Location: '.$url); 
     176        die(); 
    164177    } 
    165178} 
     
    832845 
    833846/** 
    834 * Safer readfile function for large files 
     847* Outputs a remote or local file 
    835848*  
    836849* @param string $filename 
    837 * @param bool $retbytes 
    838850* @return bool success or failure 
    839851*/ 
    840 function readfile_segments($filename,$retbytes=true) { 
    841     $segmentsize = 1048576; 
    842     $buffer = ''; 
    843     $cnt =0; 
     852function output_file($filename) { 
    844853    $handle = fopen($filename, 'rb'); 
    845     if ($handle === false) { 
     854    if ($handle === false) 
    846855        return false; 
    847     } 
     856    if (ob_get_level() == 0) 
     857        ob_start();  
    848858    while (!feof($handle)) { 
    849859        set_time_limit(ini_get('max_execution_time')); 
    850         $buffer = fread($handle, $segmentsize); 
     860        $buffer = fread($handle, 1048576); 
    851861        echo $buffer; 
    852862        ob_flush(); 
    853863        flush(); 
    854         if ($retbytes) { 
    855             $cnt += strlen($buffer); 
    856         } 
    857864    } 
    858     $status = fclose($handle); 
    859     if ($retbytes && $status) 
    860         return $cnt; 
    861     return $status; 
     865    return fclose($handle); 
    862866} 
    863867 
Note: See TracChangeset for help on using the changeset viewer.