<?
    
# (c) 2002-2006 Morten Frederiksen
    # License: http://www.gnu.org/licenses/gpl

    
include_once('Throttle.php');

    if (
preg_match('|inktomisearch.com$|',@$_SERVER['REMOTE_HOST'])
            ||
preg_match('|betaspider.com$|',@$_SERVER['REMOTE_HOST'])) {
        
header('HTTP/1.1 403 Slow Down');
        exit;
    }

    include_once(
'curl.php');

    
# Check for cookie functions.
    
$_GET=array_merge($_POST,$_GET);
    if (((
$aggregator=@$_POST['aggregator'])!='')
            && (@
$_COOKIE['aggregator']==''))
    {
        
# Set cookie.
        
if ($aggregator=='custom')
            
$aggregator=@$_POST['custom'];
        if (!
headers_sent()
                && @
setcookie('aggregator',$aggregator,time()+86400*365,'/'))
            
$_COOKIE['aggregator']=$aggregator;
    }
    elseif ((@
$_POST['noaggregator'])!='')
    {
        
# Remove cookie.
        
if (!headers_sent()
                &&
setcookie('aggregator',"",time()-86400,'/'))
            
$_COOKIE['aggregator']='';
    };
    if ((@
$_GET['rss']!='') && (@$_COOKIE['aggregator']!=''))
    {
        
# Bypass aggregator selection, immediate redirect.
        
header('Location: '.$_COOKIE['aggregator'].$_GET['rss']);
        exit;
    };

    
# Initialize variables.
    
header('Connection: close');
    
$feedtrans='feed-rss1.0.xsl';
    
$xslt=xslt_create();
    
xslt_set_error_handler($xslt,'xsltError');
    
$xslterror='';
    
$error='';
    
$feed='';
    
$list='';

    
# Try to convert feed to RSS 1.0.
    
if (@$_GET['rss']!='')
    {
        if (!(
$rss=curl_get(@$_GET['rss'], 'http://purl.org/net/syndication/subscribe/', 'application/rdf+xml')))
            
$feed='<error type="notfound"/>';
        else
        {
if (
$_SERVER['REMOTE_ADDR']='192.168.1.16') {
#$feedtrans='identity-utf-8.xsl';
#$rss=join('',file('identity-utf-8.xsl',1));
}
            if (
preg_match('|^\xEF\xBB\xBF|',$rss))
                
$rss=preg_replace('|^\xEF\xBB\xBF|','',$rss);
            if (!(
$xsl=@file($feedtrans,1)))
                
$error='Unable to find feed transformation.';
            elseif (!(
$feed=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
                    array(
'/_xsl'=>join('',$xsl),'/_xml'=>$rss),
                    array(
'rss'=>@$_GET['rss']))))
            {
                
xslt_free($xslt);
                
$xslt=xslt_create();
                
$feed='<warning type="notwellformed">'.$xslterror.'</warning>';
            }
            elseif (!
preg_match('|<rss:channel\s+|',$feed)
                    && !
preg_match('|version="Redirected"|',$feed)
                    && !
preg_match('|version="Dead"|',$feed))
                
$feed.='<warning type="unknownformat"/>';
        };
if (
$_SERVER['REMOTE_ADDR']='192.168.1.16')
{
#print("[$error]");
#print("[".join('',$xsl)."]");
#print("[$feed]");
#print_r($rss);
#exit;
}
    };
    
$feed='<?xml version="1.0" encoding="UTF-8"?><feed>'.$feed.'</feed>';

    
# Try to convert subscription list to OCS 0.5.
    
if (@$_GET['list']!='')
    {
        if (!(
$list=curl_get(@$_GET['list'], 'http://purl.org/net/syndication/subscribe/', 'application/rdf+xml')))
            
$list='<error type="notfound"/>';
        elseif (!(
$xsl=@file('list-ocs0.5.xsl')))
            
$error='Unable to find list transformation.';
        elseif (!(
$list=xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
                array(
'/_xsl'=>join('',$xsl),'/_xml'=>$list),
                array(
'list'=>@$_GET['list']))))
        {
            
xslt_free($xslt);
            
$xslt=xslt_create();
            
$list='<error type="notwellformed">'.$xslterror.'</error>';
        }
        elseif (!
preg_match('|<ocs:channel\s+|',$list))
            
$list.='<error type="unknownformat"/>';
    };
    
$list='<?xml version="1.0" encoding="UTF-8"?><list>'.$list.'</list>';

    
# Create page.
    
if ($error!='')
        
$error='500 Internal Server Error ['.$error.']';
    elseif (!(
$rdf=@file('syn-sub.rdf')))
        
$error='500 Internal Server Error [Missing metadata.]';
    elseif (!(
$xsl=@file('syn-sub.xsl')))
        
$error='500 Internal Server Error [Missing transformation.]';
    elseif (!(
$html=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
                array(
'/_xsl'=>join('',$xsl),'/_xml'=>join('',$rdf),
                
'/feed'=>$feed,'/list'=>$list),array('rss'=>@$_GET['rss'],
                
'list'=>@$_GET['list'],'cookie'=>@$_COOKIE['aggregator']))))
        
$error='500 Internal Server Error [Unable to transform ('.$xslterror.').]';
    else
    {
        
$metafoot=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
                array(
'/_xsl'=>join('',file('metafoot.xsl',1)),'/_xml'=>join('',file('syn-sub.rdf'))));
        
$metafoot=str_replace('/images/','',$metafoot);
        
$html=str_replace('<!--syn-sub-footer-->',$metafoot,$html);
        print(
$html);
        exit;
    };

        
$title='Error';
        if (
preg_match('|(\d{3})\s+(\S[^\[]+)\s+\[(.+)\]|s',
                
$error,$M))
        {
            list(,
$code,$message,$error)=$M;
            if (!
headers_sent())
                
header('HTTP/1.1 '.$code.' '.$message);
            
$title=$message;
        };
        print(
'<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><title>'
.$title.'</title></head>
<body><h1>'
.$title.'</h1><p>'.$error.'</p></body>');
        exit;

    function
xsltError($x,$e,$l,$f)
    {
        global
$xslterror;
        
$xslterror='Sablotron XSLT transformation error';
        
reset($f);
        while(list(
$key,$val)=each($f))
        {
            if (
$key=='line')
                
$xslterror.=' on line '.$val;
            if (
$key=='msg')
                
$xslterror.=': <strong>'.$val.'</strong>';
        };
        
$xslterror.='.';
    };

?>