123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <?php
- if (!defined('GNUSOCIAL')) { exit(1); }
- class WebFingerPlugin extends Plugin
- {
- public function onRouterInitialized($m)
- {
- $m->connect('.well-known/host-meta', array('action' => 'hostmeta'));
- $m->connect('.well-known/host-meta.:format',
- array('action' => 'hostmeta',
- 'format' => '(xml|json)'));
-
- $m->connect('.well-known/webfinger', array('action' => 'webfinger'));
- $m->connect('.well-known/webfinger.:format',
- array('action' => 'webfinger',
- 'format' => '(xml|json)'));
- $m->connect('main/ownerxrd', array('action' => 'ownerxrd'));
- return true;
- }
- public function onLoginAction($action, &$login)
- {
- switch ($action) {
- case 'hostmeta':
- case 'webfinger':
- $login = true;
- return false;
- }
-
- return true;
- }
- public function onStartGetProfileAcctUri(Profile $profile, &$acct)
- {
- $wfr = new WebFingerResource_Profile($profile);
- try {
- $acct = $wfr->reconstructAcct();
- } catch (Exception $e) {
- return true;
- }
- return false;
- }
- public function onEndGetWebFingerResource($resource, WebFingerResource &$target=null, array $args=array())
- {
- $profile = null;
- if (Discovery::isAcct($resource)) {
- $parts = explode('@', substr(urldecode($resource), 5));
- if (count($parts) == 2) {
- list($nick, $domain) = $parts;
- if ($domain === common_config('site', 'server')) {
- $nick = common_canonical_nickname($nick);
- $user = User::getKV('nickname', $nick);
- if (!($user instanceof User)) {
- throw new NoSuchUserException(array('nickname'=>$nick));
- }
- $profile = $user->getProfile();
- } else {
- throw new Exception(_('Remote profiles not supported via WebFinger yet.'));
- }
- }
- } else {
- $user = User::getKV('uri', $resource);
- if ($user instanceof User) {
- $profile = $user->getProfile();
- } else {
-
- $profile = Profile::getKV('profileurl', $resource);
- }
- }
- if ($profile instanceof Profile) {
- $target = new WebFingerResource_Profile($profile);
- return false;
- }
- $notice = Notice::getKV('uri', $resource);
- if ($notice instanceof Notice) {
- $target = new WebFingerResource_Notice($notice);
- return false;
- }
- return true;
- }
- public function onStartHostMetaLinks(array &$links)
- {
- foreach (Discovery::supportedMimeTypes() as $type) {
- $links[] = new XML_XRD_Element_Link(Discovery::LRDD_REL,
- common_local_url('webfinger') . '?resource={uri}',
- $type,
- true);
- }
- }
-
- public function onStartShowHTML($action)
- {
- if ($action instanceof ShowstreamAction) {
- $acct = 'acct:'. $action->profile->nickname .'@'. common_config('site', 'server');
- $url = common_local_url('webfinger') . '?resource='.$acct;
- foreach (array(Discovery::JRD_MIMETYPE, Discovery::XRD_MIMETYPE) as $type) {
- header('Link: <'.$url.'>; rel="'. Discovery::LRDD_REL.'"; type="'.$type.'"');
- }
- }
- }
- public function onPluginVersion(&$versions)
- {
- $versions[] = array('name' => 'WebFinger',
- 'version' => GNUSOCIAL_VERSION,
- 'author' => 'Mikael Nordfeldth',
- 'homepage' => 'http://www.gnu.org/software/social/',
-
- 'rawdescription' => _m('Adds WebFinger lookup to GNU Social'));
- return true;
- }
- }
|