| 
									
										
										
										
											2013-10-20 15:32:56 +02:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * WebFinger resource for Profile objects | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package   GNUsocial | 
					
						
							|  |  |  |  * @author    Mikael Nordfeldth | 
					
						
							|  |  |  |  * @copyright 2013 Free Software Foundation, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WebFingerResource_Profile extends WebFingerResource | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-11-01 16:54:59 +01:00
										 |  |  |     const PROFILEPAGE = 'http://webfinger.net/rel/profile-page'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-20 15:32:56 +02:00
										 |  |  |     public function __construct(Profile $object) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // The type argument above verifies that it's our class
 | 
					
						
							|  |  |  |         parent::__construct($object); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function getAliases() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $aliases = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             // Try to create an acct: URI if we're dealing with a profile
 | 
					
						
							|  |  |  |             $aliases[] = $this->reconstructAcct(); | 
					
						
							|  |  |  |         } catch (WebFingerReconstructionException $e) { | 
					
						
							|  |  |  |             common_debug("WebFinger reconstruction for Profile failed (id={$this->object->id})"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return array_merge($aliases, parent::getAliases()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-28 18:26:00 +01:00
										 |  |  |     public function reconstructAcct() | 
					
						
							| 
									
										
										
										
											2013-10-20 15:32:56 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         $acct = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (Event::handle('StartWebFingerReconstruction', array($this->object, &$acct))) { | 
					
						
							|  |  |  |             // TODO: getUri may not always give us the correct host on remote users?
 | 
					
						
							|  |  |  |             $host = parse_url($this->object->getUri(), PHP_URL_HOST); | 
					
						
							|  |  |  |             if (empty($this->object->nickname) || empty($host)) { | 
					
						
							|  |  |  |                 throw new WebFingerReconstructionException($this->object); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2013-10-28 18:28:53 +01:00
										 |  |  |             $acct = mb_strtolower(sprintf('acct:%s@%s', $this->object->nickname, $host)); | 
					
						
							| 
									
										
										
										
											2013-10-20 15:32:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             Event::handle('EndWebFingerReconstruction', array($this->object, &$acct)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $acct; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function updateXRD(XML_XRD $xrd) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (Event::handle('StartWebFingerProfileLinks', array($xrd, $this->object))) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-01 16:54:59 +01:00
										 |  |  |             $xrd->links[] = new XML_XRD_Element_Link(self::PROFILEPAGE, | 
					
						
							|  |  |  |                                         $this->object->getUrl(), 'text/html'); | 
					
						
							| 
									
										
										
										
											2013-10-20 15:32:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // XFN
 | 
					
						
							|  |  |  |             $xrd->links[] = new XML_XRD_Element_Link('http://gmpg.org/xfn/11', | 
					
						
							|  |  |  |                                         $this->object->getUrl(), 'text/html'); | 
					
						
							|  |  |  |             // FOAF
 | 
					
						
							|  |  |  |             $xrd->links[] = new XML_XRD_Element_Link('describedby', | 
					
						
							|  |  |  |                                         common_local_url('foaf', | 
					
						
							|  |  |  |                                                         array('nickname' => $this->object->nickname)), | 
					
						
							|  |  |  |                                                                 'application/rdf+xml'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $link = new XML_XRD_Element_Link('http://apinamespace.org/atom', | 
					
						
							|  |  |  |                                         common_local_url('ApiAtomService', | 
					
						
							|  |  |  |                                                         array('id' => $this->object->nickname)), | 
					
						
							|  |  |  |                                                                 'application/atomsvc+xml'); | 
					
						
							|  |  |  | // XML_XRD must implement changing properties first           $link['http://apinamespace.org/atom/username'] = $this->object->nickname;
 | 
					
						
							|  |  |  |             $xrd->links[] = clone $link; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (common_config('site', 'fancy')) { | 
					
						
							|  |  |  |                 $apiRoot = common_path('api/', true); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $apiRoot = common_path('index.php/api/', true); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $link = new XML_XRD_Element_Link('http://apinamespace.org/twitter', $apiRoot); | 
					
						
							|  |  |  | // XML_XRD must implement changing properties first            $link['http://apinamespace.org/twitter/username'] = $this->object->nickname;
 | 
					
						
							|  |  |  |             $xrd->links[] = clone $link; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             Event::handle('EndWebFingerProfileLinks', array($xrd, $this->object)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |