<?
    
# A PHP based web service for SHA-1 (useful for Friend-of-a-Friend).
    # - /?mbox=mailto:someone@example.com
    #     Return, in the body of the response, the SHA-1 sum of the mbox.
    # - /?foaf=http://example.com/file.rdf
    #     Return the RDF at URI, with all occurences of
    #     <foaf:mbox rdf:resource="mailto:someone@example.com"/> converted to
    #     <foaf:mbox_sha1sum rdf:value="5a9...845"/>.
    # The service is namespace aware, with the foaf prefix tied to the
    # namespace of http://xmlns.com/foaf/0.1/.

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

    
$path=$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
        
$path=preg_replace('|\?.+|','',$path);
    
$sha1ify='sha1ify.xsl';
    
$metadata='sha1ify.rdf';
    
$xhtml='';

    
# Create XSLT parser.
    
$xslt=xslt_create();
    
xslt_set_error_handler($xslt,'xsltError');
    
$xslterror='';

    if (@
$_GET['mbox']!='')
    {
        
# Return hash of mailto: URI.
        
header('Content-Type: text/plain');
        print(
bin2hex(mhash(MHASH_SHA1,$_GET['mbox'])));
        exit;
    };

    if (@
$_GET['foaf']!='')
    {
        
# Retrieve FoaF RDF.
        
$foaf=$_GET['foaf'];
        
$foafdata=@file($foaf);
        if (
$foafdata)
            
$foafdata=join('',$foafdata);
        if (!
$foafdata)
            
# Flag non-retrievable RDF.
            
$xhtml='<p>Unable to find or read FoaF ('.$foaf.').</p>';
        elseif (
$rdf=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
                array(
'/_xsl'=>join('',file($sha1ify)),'/_xml'=>$foafdata)))
        {
            
# Modify transformed RDF and output results.
            
header('Content-Type: application/rdf+xml');
            print(
preg_replace('/sha1ify\(([^\)]+)\)/e',"bin2hex(mhash(MHASH_SHA1,'$1'))",$rdf));
            exit;
        }
        else
            
# Flag un-parsable RDF.
            
$xhtml='<p>Unable to parse FoaF ('.$foaf.').</p><p>'.$xslterror.'</p>';
        
$xhtml='<h1>Error</h1>'.$xhtml;
    };

    if (
$xhtml=='')
    {
        
# Create service forms.
        
if (!($xhtml=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
                array(
'/_xsl'=>join('',@file('services-xhtml.xsl',1)),'/_xml'=>join('',@file($metadata))),
                array(
'path'=>$path))))
            
$xhtml='<p>Unable to parse metadata.</p><p>'.$xslterror.'</p>';
    };

    
# Transform metadata into header and footer.
    
if (!($metahead=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
            array(
'/_xsl'=>join('',@file('metahead.xsl',1)),'/_xml'=>join('',@file($metadata))))))
        
$metahead='<head><title>?</title></head>';
    if (!(
$metatop=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
            array(
'/_xsl'=>join('',@file('metatop.xsl',1)),'/_xml'=>join('',@file($metadata))),
                        array(
'path'=>$path,'uri'=>''))))
        
$metatop='<p>Unable to parse metadata.</p><p>'.$xslterror.'</p>';
    if (!(
$metafoot=@xslt_process($xslt,'arg:/_xml','arg:/_xsl',NULL,
            array(
'/_xsl'=>join('',@file('metafoot.xsl',1)),'/_xml'=>join('',@file($metadata))))))
        
$metafoot='<p>Unable to parse metadata.</p><p>'.$xslterror.'</p>';

    
# Display page.
    
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>
'
.$metahead.'
</head>
<body style="margin: 0; padding: 0">
'
.$metatop.'
  <div style="padding: 1em">
  <div style="float: right; padding: 0.5em">
<script type="text/javascript"><!--
google_ad_client = "pub-2944687592158127";
google_ad_width = 160;
google_ad_height = 600;
google_ad_format = "160x600_as";
google_ad_type = "text";
google_ad_channel ="";
google_color_border = "80D080";
google_color_bg = "D0F0D0";
google_color_border = "80D080";
google_color_bg = "D0F0D0";
google_color_link = "0000CC";
google_color_url = "00A000";
google_color_text = "6F6F6F";
//--></script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
  </div>
'
.$xhtml.'
  </div>
'
.$metafoot.'
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-62237-5";
urchinTracker();
</script>
</body>
</html>'
);

    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.='.';
    };

?>