109 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Zotlabs\Lib;
 | |
| 
 | |
| /**
 | |
|  * @brief Fetch and return a webfinger for a resource
 | |
|  *
 | |
|  * @param string $resource - The resource
 | |
|  * @return boolean|string false or associative array from result JSON
 | |
|  */
 | |
| 
 | |
| class Webfinger {
 | |
| 
 | |
| 	static private $server   = EMPTY_STR;
 | |
| 	static private $resource = EMPTY_STR;
 | |
| 
 | |
| 	static function exec($resource) {
 | |
| 
 | |
| 		if(! $resource) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		self::parse_resource($resource);
 | |
| 
 | |
| 		if(! ( self::$server && self::$resource)) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		if(! check_siteallowed(self::$server)) {
 | |
| 			logger('blacklisted: ' . self::$server);
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		btlogger('fetching resource: ' . self::$resource . ' from ' . self::$server, LOGGER_DEBUG, LOG_INFO);
 | |
| 
 | |
| 		$url = 'https://' . self::$server . '/.well-known/webfinger?f=&resource=' . self::$resource ;
 | |
| 
 | |
| 		$counter = 0;
 | |
| 		$s = z_fetch_url($url, false, $counter, [ 'headers' => [ 'Accept: application/jrd+json, */*' ] ]);
 | |
| 
 | |
| 		if($s['success']) {
 | |
| 			$j = json_decode($s['body'], true);
 | |
| 			return($j);
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	static function parse_resource($resource) {
 | |
| 
 | |
| 		self::$resource = urlencode($resource);
 | |
| 
 | |
| 		if(strpos($resource,'http') === 0) {
 | |
| 			$m = parse_url($resource);
 | |
| 			if($m) {
 | |
| 				if($m['scheme'] !== 'https') {
 | |
| 					return false;
 | |
| 				}
 | |
| 				self::$server = $m['host'] . (($m['port']) ? ':' . $m['port'] : '');
 | |
| 			}
 | |
| 			else {
 | |
| 				return false;
 | |
| 			}
 | |
| 		}
 | |
| 		elseif(strpos($resource,'tag:') === 0) {
 | |
| 			$arr = explode(':',$resource); // split the tag
 | |
| 			$h = explode(',',$arr[1]); // split the host,date
 | |
| 			self::$server = $h[0];
 | |
| 		}
 | |
| 		else {
 | |
| 			$x = explode('@',$resource);
 | |
| 			$username = $x[0];
 | |
| 			if(count($x) > 1) {
 | |
| 				self::$server = $x[1];
 | |
| 			}
 | |
| 			else {
 | |
| 				return false;
 | |
| 			}
 | |
| 			if(strpos($resource,'acct:') !== 0) {
 | |
| 				self::$resource = urlencode('acct:' . $resource);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @brief fetch a webfinger resource and return a zot6 discovery url if present
 | |
| 	 *
 | |
| 	 */ 
 | |
| 
 | |
| 	static function zot_url($resource) {
 | |
| 
 | |
| 		$arr = self::exec($resource);
 | |
| 
 | |
| 		if(is_array($arr) && array_key_exists('links',$arr)) {
 | |
| 			foreach($arr['links'] as $link) {
 | |
| 				if(array_key_exists('rel',$link) && $link['rel'] === PROTOCOL_ZOT6) {
 | |
| 					if(array_key_exists('href',$link) && $link['href'] !== EMPTY_STR) {
 | |
| 						return $link['href'];
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 
 | |
| } |