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);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								?>
							 |