do not error out on basic auth
[grauphel.git] / lib / oauth.php
index 7cfd4e0..b7239ba 100644 (file)
@@ -98,7 +98,25 @@ class OAuth
 
     public function accessTokenHandler(\OAuthProvider $provider)
     {
 
     public function accessTokenHandler(\OAuthProvider $provider)
     {
-        $token = $this->tokens->load('access', $provider->token);
+        if ($provider->token == '') {
+            //conboy sends empty token when not authed yet
+            return OAUTH_PARAMETER_ABSENT;
+        }
+
+        try {
+            $token = $this->tokens->load('access', $provider->token);
+        } catch (OAuthException $e) {
+            if ($e->getCode() == OAUTH_TOKEN_REJECTED) {
+                return OAUTH_TOKEN_REJECTED;
+            }
+            throw $e;
+        }
+
+        if (time() - $token->lastuse > 60) {
+            //time to update lastuse after at least a minute
+            $this->tokens->updateLastUse($token->tokenKey);
+        }
+
         $provider->token_secret = $token->secret;
         return OAUTH_OK;
     }
         $provider->token_secret = $token->secret;
         return OAUTH_OK;
     }
@@ -106,7 +124,7 @@ class OAuth
     public function verifyOAuthUser($username, $url)
     {
         try {
     public function verifyOAuthUser($username, $url)
     {
         try {
-            $provider = new \OAuthProvider();
+            $provider = OAuth::getProvider();
             $this->registerHandler($provider);
             $this->registerAccessTokenHandler($provider);
             //do not use "user" in signature
             $this->registerHandler($provider);
             $this->registerAccessTokenHandler($provider);
             //do not use "user" in signature
@@ -131,5 +149,72 @@ class OAuth
         //var_dump($e);
         exit(1);
     }
         //var_dump($e);
         exit(1);
     }
+
+    /**
+     * Get a new oauth provider instance.
+     * Used to work around the fastcgi bug in oauthprovider.
+     *
+     * @return \OAuthProvider
+     */
+    public static function getProvider()
+    {
+        $params = array();
+        //$_SERVER['REDIRECT_HTTP_AUTHORIZATION'] = $_SERVER['HTTP_AUTHORIZATION'];
+
+        if (isset($_SERVER['HTTP_AUTHORIZATION'])
+            && strtolower(substr($_SERVER['HTTP_AUTHORIZATION'], 0, 6)) != 'oauth '
+        ) {
+            //work around bug https://bugs.php.net/bug.php?id=68168
+            //#68168: HTTP Basic auth and empty auth header reported
+            //        as "signature_method_rejected"
+            $params['oauth_signature_method'] = OAUTH_SIG_METHOD_PLAINTEXT;
+        }
+
+        if (!isset($_SERVER['HTTP_AUTHORIZATION'])
+            && isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])
+        ) {
+            //FastCgi puts the headers in REDIRECT_HTTP_AUTHORIZATION,
+            // but the oauth extension does not read that.
+            // we have to parse the parameters manually
+            $params = static::parseOAuthHeader(
+                $_SERVER['REDIRECT_HTTP_AUTHORIZATION']
+            );
+        }
+
+        //work around https://github.com/tomboy-notes/tomboy.osx/issues/39
+        //,oauth_signature="anyone%2526",oauth_signature_method="PLAINTEXT",
+        if (isset($_SERVER['HTTP_AUTHORIZATION'])
+            && strpos($_SERVER['HTTP_AUTHORIZATION'], '"anyone%2526"') !== false
+        ) {
+            $params = static::parseOAuthHeader($_SERVER['HTTP_AUTHORIZATION']);
+        }
+        if (isset($params['oauth_signature'])
+            && $params['oauth_signature'] == 'anyone%26'
+        ) {
+            //second if to catch the REDIRECT values
+            $params['oauth_signature']  ='anyone&';
+        }
+
+        return new \OAuthProvider($params);
+    }
+
+    /**
+     * Parse an OAuth HTTP header into an array
+     *
+     * @param string $headerValue HTTP header value (after "Authorization:")
+     *
+     * @return array Array of parameters
+     */
+    protected static function parseOAuthHeader($headerValue)
+    {
+        $regex = "/(oauth_[a-z_-]*)=(?:\"([^\"]*)\"|([^,]*))/";
+        preg_match_all($regex, $headerValue, $matches);
+
+        $params = array();
+        foreach ($matches[1] as $key => $paramName) {
+            $params[$paramName] = urldecode($matches[2][$key]);
+        }
+        return $params;
+    }
 }
 ?>
 }
 ?>