]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/WebFinger/WebFingerPlugin.php
Merge branch 'tagprofile-ajax-fix' into 'nightly'
[quix0rs-gnu-social.git] / plugins / WebFinger / WebFingerPlugin.php
index 8efce27d359b8eec6873596e3bcf6da308d43ade..6f8ec9397d34a72dc82cc45b903be947f0beff9f 100644 (file)
@@ -31,6 +31,17 @@ if (!defined('GNUSOCIAL')) { exit(1); }
 
 class WebFingerPlugin extends Plugin
 {
+    const OAUTH_ACCESS_TOKEN_REL    = 'http://apinamespace.org/oauth/access_token';
+    const OAUTH_REQUEST_TOKEN_REL   = 'http://apinamespace.org/oauth/request_token';
+    const OAUTH_AUTHORIZE_REL       = 'http://apinamespace.org/oauth/authorize';
+
+    public $http_alias = false;
+
+    public function initialize()
+    {
+        common_config_set('webfinger', 'http_alias', $this->http_alias);
+    }
+
     public function onRouterInitialized($m)
     {
         $m->connect('.well-known/host-meta', array('action' => 'hostmeta'));
@@ -58,6 +69,60 @@ class WebFingerPlugin extends Plugin
         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)); // 5 is strlen of 'acct:'
+            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 {
+                // try and get it by profile url
+                $profile = Profile::getKV('profileurl', $resource);
+            }
+        }
+
+        if ($profile instanceof Profile) {
+            $target = new WebFingerResource_Profile($profile);
+            return false;   // We got our target, stop handler execution
+        }
+
+        $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) {
@@ -66,6 +131,11 @@ class WebFingerPlugin extends Plugin
                             $type,
                             true);    // isTemplate
         }
+
+        // OAuth connections
+        $links[] = new XML_XRD_Element_link(self::OAUTH_ACCESS_TOKEN_REL,  common_local_url('ApiOAuthAccessToken'));
+        $links[] = new XML_XRD_Element_link(self::OAUTH_REQUEST_TOKEN_REL, common_local_url('ApiOAuthRequestToken'));
+        $links[] = new XML_XRD_Element_link(self::OAUTH_AUTHORIZE_REL,     common_local_url('ApiOAuthAuthorize'));
     }
 
     /**
@@ -86,7 +156,7 @@ class WebFingerPlugin extends Plugin
     public function onPluginVersion(&$versions)
     {
         $versions[] = array('name' => 'WebFinger',
-                            'version' => STATUSNET_VERSION,
+                            'version' => GNUSOCIAL_VERSION,
                             'author' => 'Mikael Nordfeldth',
                             'homepage' => 'http://www.gnu.org/software/social/',
                             // TRANS: Plugin description.