Page 1 of 1

Small patch for php safe mode

Posted: 19 Mar 2013, 00:24
by HeikoAdams
Hi there,
I've made some small modifications to ttrss to fix a problem if safe mode is activated. The only affected file is the includes/functions.php.

Since safe mode blocks CURLOPT_FOLLOWLOCATION the following function needs to be added:

Code: Select all

   function geturl($url){

      (function_exists('curl_init')) ? '' : die('cURL Must be installed for geturl function to work. Ask your host to enable it or uncomment extension=php_curl.dll in php.ini');

      $curl = curl_init();
      $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
      $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
      $header[] = "Cache-Control: max-age=0";
      $header[] = "Connection: keep-alive";
      $header[] = "Keep-Alive: 300";
      $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
      $header[] = "Accept-Language: en-us,en;q=0.5";
      $header[] = "Pragma: ";

      curl_setopt($curl, CURLOPT_URL, $url);
      curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0 Firefox/5.0');
      curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
      curl_setopt($curl, CURLOPT_HEADER, true);
      curl_setopt($curl, CURLOPT_REFERER, $url);
      curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
      curl_setopt($curl, CURLOPT_AUTOREFERER, true);
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($curl, CURLOPT_TIMEOUT, 60);

      $html = curl_exec($curl);

      $status = curl_getinfo($curl);
      curl_close($curl);

      if($status['http_code']!=200){
         if($status['http_code'] == 301 || $status['http_code'] == 302) {
            list($header) = explode("\r\n\r\n", $html, 2);
            $matches = array();
            preg_match("/(Location:|URI:)[^(\n)]*/", $header, $matches);
            $url = trim(str_replace($matches[1],"",$matches[0]));
            $url_parsed = parse_url($url);
            return (isset($url_parsed))? geturl($url, $referer):'';
         }
         $oline='';
         foreach($status as $key=>$eline){$oline.='['.$key.']'.$eline.' ';}
         $line =$oline." \r\n ".$url."\r\n-----------------\r\n";
         $handle = @fopen('./curl.error.log', 'a');
         fwrite($handle, $line);
         return FALSE;
      }
      return $url;
   }

The next step is to modify line 338 to look like this:

Code: Select all

$ch = curl_init(geturl($url));

That's all

Re: Small patch for php safe mode

Posted: 19 Mar 2013, 00:38
by fox
I'm not sure if that's the only thing that safe mode breaks, but thanks. Can you make that into a pull request?

Re: Small patch for php safe mode

Posted: 19 Mar 2013, 00:49
by HeikoAdams
This is the only problem I noticed in the error-logs.

I've attached my modifications as a patch

Re: Small patch for php safe mode

Posted: 19 Mar 2013, 01:11
by fox