<?php /** * StatusNet - the distributed open-source microblogging tool * Copyright (C) 2010, StatusNet, Inc. * * WebFinger functions * * PHP version 5 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * @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 WebFinger { const PROFILEPAGE = 'http://webfinger.net/rel/profile-page'; /* * Reconstructs a WebFinger ID from data we know about the profile. * * @param Profile $profile The profile we want a WebFinger ID for * * @return string $acct acct:user@example.com URI */ public static function reconstruct(Profile $profile) { $acct = null; if (Event::handle('StartWebFingerReconstruction', array($profile, &$acct))) { // TODO: getUri may not always give us the correct host on remote users? $host = parse_url($profile->getUri(), PHP_URL_HOST); if (empty($profile->nickname) || empty($host)) { throw new WebFingerReconstructionException($profile); } $acct = sprintf('acct:%s@%s', $profile->nickname, $host); Event::handle('EndWebFingerReconstruction', array($profile, &$acct)); } return $acct; } /* * Gets all URI aliases for a Profile * * @param Profile $profile The profile we want aliases for * * @return array $aliases All the Profile's alternative URLs */ public static function getAliases(Profile $profile) { $aliases = array(); $aliases[] = $profile->getUri(); try { $aliases[] = $profile->getUrl(); } catch (InvalidUrlException $e) { common_debug('Profile id='.$profile->id.' has invalid profileurl: ' . var_export($profile->profileurl, true)); } return $aliases; } /* * Gets all identities for a Profile, includes WebFinger acct: if * available, as well as alias URLs. * * @param Profile $profile The profile we want aliases for * * @return array $uris WebFinger acct: URI and alias URLs */ public static function getIdentities(Profile $profile) { $uris = array(); try { $uris[] = self::reconstruct($profile); } catch (WebFingerReconstructionException $e) { common_debug('WebFinger reconstruction for Profile failed, ' . ' (id='.$profile->id.')'); } $uris = array_merge($uris, self::getAliases($profile)); return $uris; } }