forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * Code for using a proxy XRI resolver.
 | 
						|
 */
 | 
						|
 | 
						|
require_once 'Auth/Yadis/XRDS.php';
 | 
						|
require_once 'Auth/Yadis/XRI.php';
 | 
						|
 | 
						|
class Auth_Yadis_ProxyResolver {
 | 
						|
    function Auth_Yadis_ProxyResolver($fetcher, $proxy_url = null)
 | 
						|
    {
 | 
						|
        $this->fetcher = $fetcher;
 | 
						|
        $this->proxy_url = $proxy_url;
 | 
						|
        if (!$this->proxy_url) {
 | 
						|
            $this->proxy_url = Auth_Yadis_getDefaultProxy();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function queryURL($xri, $service_type = null)
 | 
						|
    {
 | 
						|
        // trim off the xri:// prefix
 | 
						|
        $qxri = substr(Auth_Yadis_toURINormal($xri), 6);
 | 
						|
        $hxri = $this->proxy_url . $qxri;
 | 
						|
        $args = array(
 | 
						|
                      '_xrd_r' => 'application/xrds+xml'
 | 
						|
                      );
 | 
						|
 | 
						|
        if ($service_type) {
 | 
						|
            $args['_xrd_t'] = $service_type;
 | 
						|
        } else {
 | 
						|
            // Don't perform service endpoint selection.
 | 
						|
            $args['_xrd_r'] .= ';sep=false';
 | 
						|
        }
 | 
						|
 | 
						|
        $query = Auth_Yadis_XRIAppendArgs($hxri, $args);
 | 
						|
        return $query;
 | 
						|
    }
 | 
						|
 | 
						|
    function query($xri, $service_types, $filters = array())
 | 
						|
    {
 | 
						|
        $services = array();
 | 
						|
        $canonicalID = null;
 | 
						|
        foreach ($service_types as $service_type) {
 | 
						|
            $url = $this->queryURL($xri, $service_type);
 | 
						|
            $response = $this->fetcher->get($url);
 | 
						|
            if ($response->status != 200 and $response->status != 206) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            $xrds = Auth_Yadis_XRDS::parseXRDS($response->body);
 | 
						|
            if (!$xrds) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            $canonicalID = Auth_Yadis_getCanonicalID($xri,
 | 
						|
                                                         $xrds);
 | 
						|
 | 
						|
            if ($canonicalID === false) {
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
 | 
						|
            $some_services = $xrds->services($filters);
 | 
						|
            $services = array_merge($services, $some_services);
 | 
						|
            // TODO:
 | 
						|
            //  * If we do get hits for multiple service_types, we're
 | 
						|
            //    almost certainly going to have duplicated service
 | 
						|
            //    entries and broken priority ordering.
 | 
						|
        }
 | 
						|
        return array($canonicalID, $services);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 |