Author: chabotc
Date: Tue Nov  4 12:13:47 2008
New Revision: 711378

URL: http://svn.apache.org/viewvc?rev=711378&view=rev
Log:
Part one of the REST OAuth support patch by Joseph Smarr, this supports both 
2-legged and 3-legged oauth on the rest interface

Modified:
    incubator/shindig/trunk/php/config/container.php
    incubator/shindig/trunk/php/src/gadgets/servlet/GadgetRenderingServlet.php
    incubator/shindig/trunk/php/src/social/servlet/ApiServlet.php
    incubator/shindig/trunk/php/src/social/servlet/DataServiceServlet.php

Modified: incubator/shindig/trunk/php/config/container.php
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/php/config/container.php?rev=711378&r1=711377&r2=711378&view=diff
==============================================================================
--- incubator/shindig/trunk/php/config/container.php (original)
+++ incubator/shindig/trunk/php/config/container.php Tue Nov  4 12:13:47 2008
@@ -33,7 +33,9 @@
  *     'people_service' => 'MyPeopleService',
  *     'activity_service' => 'MyActivitiesService',
  *     'app_data_service' => 'MyAppDataService',
- *     'messages_service' => 'MyMessagesDataService'
+ *     'app_data_service' => 'MyAppDataService',
+ *     'oauth_lookup_service' => 'MyOAuthLookupService'
+ *     'xrds_location' => 'http://www.mycontainer.com/xrds'
  * );
  *  
  */
@@ -52,6 +54,9 @@
        'default_js_prefix' => '/gadgets/js/', 
        'default_iframe_prefix' => '/gadgets/ifr?', 
        
+       // The X-XRDS-Location value for your implementing container, if any, 
see http://code.google.com/p/partuza/source/browse/trunk/Library/XRDS.php for 
an example
+       'xrds_location' => '',
+       
        // The encryption keys for encrypting the security token, and the 
expiration of it. Make sure these match the keys used in your container/site
        'token_cipher_key' => 'INSECURE_DEFAULT_KEY',
        'token_hmac_key' => 'INSECURE_DEFAULT_KEY', 
@@ -83,15 +88,18 @@
        'remote_content' => 'BasicRemoteContent', 
        'security_token_signer' => 'BasicSecurityTokenDecoder', 
        'security_token' => 'BasicSecurityToken', 
+       'oauth_lookup_service' => 'BasicOAuthLookupService',
+
        // Caching back-end to use. Shindig ships with CacheFile and 
CacheMemcache out of the box
        'data_cache' => 'CacheFile',
-       // Old-style wire format data handler, this is being depreciated 
-       'handlers' => '',
-       // New RESTful API data service classes to use
+
+       // RESTful API data service classes to use
+       // See 
http://code.google.com/p/partuza/source/browse/#svn/trunk/Shindig for a MySql 
powered example
        'person_service' => 'JsonDbOpensocialService',
        'activity_service' => 'JsonDbOpensocialService',
        'app_data_service' => 'JsonDbOpensocialService',
        'messages_service' => 'JsonDbOpensocialService',
+
        // Also scan these directories when looking for <Class>.php files. You 
can include multiple paths by seperating them with a , 
        'extension_class_paths' => '',
        

Modified: 
incubator/shindig/trunk/php/src/gadgets/servlet/GadgetRenderingServlet.php
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/gadgets/servlet/GadgetRenderingServlet.php?rev=711378&r1=711377&r2=711378&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/gadgets/servlet/GadgetRenderingServlet.php 
(original)
+++ incubator/shindig/trunk/php/src/gadgets/servlet/GadgetRenderingServlet.php 
Tue Nov  4 12:13:47 2008
@@ -131,7 +131,8 @@
         */
        private function outputHtmlGadget($gadget, $context, $view)
        {
-               $externJs = "";
+               $content = '';
+               $externJs = '';
                $externFmt = "<script src=\"%s\"></script>";
                $forcedLibs = $context->getForcedJsLibs();
                // allow the &libs=.. param to override our forced js libs 
configuration value
@@ -154,15 +155,15 @@
                        header("P3P: " . Config::get('P3P'));
                }
                if (! $view->getQuirks()) {
-                       echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 
4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\";>\n";
+                       $content .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 
4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\";>\n";
                }
-               echo "<html><head><style type=\"text/css\">" . 
Config::get('gadget_css') . "</style></head><body>\n";
+               $content .= "<html><head><meta http-equiv=\"Content-Type\" 
content=\"text/html; charset=utf-8\"/><style type=\"text/css\">" . 
Config::get('gadget_css') . "</style></head><body>\n";
                // Forced libs first.
                if (! empty($forcedLibs)) {
                        $libs = explode(':', $forcedLibs);
                        echo sprintf($externFmt, 
Config::get('default_js_prefix') . $this->getJsUrl($libs, $gadget) . 
"&container=" . $context->getContainer()) . "\n";
                }
-               echo "<script>\n";
+               $content .= "<script>\n"; 
                
                if (! empty($forcedLibs)) {
                        // if some of the feature libraries are externalized 
(through a browser cachable <script 
src="/gadgets/js/opensocial-0.7:settitle.js">
@@ -180,20 +181,20 @@
                                $externJs .= sprintf($externFmt, 
$library->getContent()) . "\n";
                                // else check if there are no forcedLibs, or if 
it wasn't included in their dep chain
                        } elseif (empty($forcedLibs) || ! 
in_array($library->getFeatureName(), $forcedLibsArray)) {
-                               echo $library->getContent();
+                               $content .= $library->getContent();
                        }
                        // otherwise it was already included by 
config.forceJsLibs.
                }
-               echo $this->appendJsConfig($context, $gadget, ! 
empty($forcedLibs)) . $this->appendMessages($gadget) . 
$this->appendPreloads($gadget, $context) . "</script>";
+               $content .= $this->appendJsConfig($context, $gadget, ! 
empty($forcedLibs)) . $this->appendMessages($gadget) . 
$this->appendPreloads($gadget, $context) . "</script>";
                if (strlen($externJs) > 0) {
-                       echo $externJs;
+                       $content .= $externJs;
                }
                $gadgetExceptions = array();
                $rewriter = new ContentRewriter();
                if ($rewriter->rewriteGadgetView($gadget, $view)) {
-                       $content = 
$gadget->getSubstitutions()->substitute($view->getRewrittenContent());
+                       $content .= 
$gadget->getSubstitutions()->substitute($view->getRewrittenContent());
                } else {
-                       $content = 
$gadget->getSubstitutions()->substitute($view->getContent());
+                       $content .= 
$gadget->getSubstitutions()->substitute($view->getContent());
                }
                if (empty($content)) {
                        // Unknown view
@@ -202,8 +203,9 @@
                if (count($gadgetExceptions)) {
                        throw new GadgetException(print_r($gadgetExceptions, 
true));
                }
-               echo $content . 
"\n<script>gadgets.util.runOnLoadHandlers();</script></body>\n</html>";
-       }
+               $content .= 
"\n<script>gadgets.util.runOnLoadHandlers();</script></body>\n</html>";
+               echo $content;
+               }
 
        /**
         * Output's a URL content type gadget, it adds 
libs=<list:of:js:libraries>.js and user preferences

Modified: incubator/shindig/trunk/php/src/social/servlet/ApiServlet.php
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/social/servlet/ApiServlet.php?rev=711378&r1=711377&r2=711378&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/social/servlet/ApiServlet.php (original)
+++ incubator/shindig/trunk/php/src/social/servlet/ApiServlet.php Tue Nov  4 
12:13:47 2008
@@ -21,6 +21,7 @@
 require 'src/common/SecurityTokenDecoder.php';
 require 'src/common/SecurityToken.php';
 require 'src/common/BlobCrypter.php';
+require 'src/common/OAuthLookupService.php';
 require 'src/social/model/Activity.php';
 require 'src/social/model/Address.php';
 require 'src/social/model/ApiCollection.php';
@@ -55,6 +56,7 @@
 require 'src/social/converters/InputAtomConverter.php';
 require 'src/social/converters/InputJsonConverter.php';
 require 'src/social/converters/InputXmlConverter.php';
+require 'src/social/oauth/OAuth.php';
 
 /**
  * Common base class for API servlets.
@@ -79,6 +81,26 @@
 
        public function getSecurityToken()
        {
+               // see if we have an OAuth request
+               $request = OAuthRequest::from_request();
+               $appUrl = $request->get_parameter('oauth_consumer_key');
+               $userId = $request->get_parameter('xoauth_requestor_id'); // 
from Consumer Request extension (2-legged OAuth)
+               $signature = $request->get_parameter('oauth_signature');
+               
+               // TODO: also allow userId to be specified via oauth token 
and/or in URL?
+               if ($appUrl && $signature) {
+                       //if ($appUrl && $signature && $userId) {
+                       // look up the user and perms for this oauth request
+                       $oauthLookupService = 
Config::get('oauth_lookup_service');
+                       $oauthLookupService = new $oauthLookupService();
+                       if 
($oauthLookupService->thirdPartyHasAccessToUser($request, $appUrl, $userId)) {
+                               return 
$oauthLookupService->getSecurityToken($appUrl, $userId);
+                       } else {
+                               return null; // invalid oauth request
+                       }
+               } // else, not a valid oauth request, so don't bother
+
+               // look for encrypted security token
                $token = isset($_POST['st']) ? $_POST['st'] : 
(isset($_GET['st']) ? $_GET['st'] : '');
                if (empty($token)) {
                        // no security token, continue anonymously, remeber to 
check

Modified: incubator/shindig/trunk/php/src/social/servlet/DataServiceServlet.php
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/social/servlet/DataServiceServlet.php?rev=711378&r1=711377&r2=711378&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/social/servlet/DataServiceServlet.php 
(original)
+++ incubator/shindig/trunk/php/src/social/servlet/DataServiceServlet.php Tue 
Nov  4 12:13:47 2008
@@ -45,6 +45,10 @@
 
        public function doPost()
        {
+               $xrdsLocation = Config::get('xrds_location');
+               if ($xrdsLocation) {
+                       header("X-XRDS-Location: $xrdsLocation", false);
+               }
                try {
                        $token = $this->getSecurityToken();
                        if ($token == null) {
@@ -57,7 +61,7 @@
                } catch (Exception $e) {
                        $code = '500 Internal Server Error';
                        header("HTTP/1.0 $code", true);
-                       echo "<h1>$code - Internal Server Error</h1>\n". 
$e->getMessage();
+                       echo "<h1>$code - Internal Server Error</h1>\n" . 
$e->getMessage();
                        if (Config::get('debug')) {
                                echo "\n\n<br>\nDebug 
backtrace:\n<br>\n<pre>\n";
                                echo $e->getTraceAsString();
@@ -68,6 +72,7 @@
 
        public function sendError(ResponseItem $responseItem)
        {
+               $unauthorized = false;
                $errorMessage = $responseItem->getErrorMessage();
                switch ($responseItem->getError()) {
                        case ResponseError::$BAD_REQUEST:
@@ -75,6 +80,7 @@
                                break;
                        case ResponseError::$UNAUTHORIZED:
                                $code = '401 Unauthorized';
+                               $unauthorized = true;
                                break;
                        case ResponseError::$FORBIDDEN:
                                $code = '403 Forbidden';
@@ -91,6 +97,8 @@
                                break;
                }
                header("HTTP/1.0 $code", true);
+               if ($unauthorized)
+                       header("WWW-Authenticate: OAuth realm", true);
                echo "$code - $errorMessage";
                die();
        }
@@ -101,8 +109,7 @@
        private function handleSingleRequest(SecurityToken $token, 
$inputConverter, $outputConverter)
        {
                $servletRequest = array(
-                               'url' => substr($_SERVER["REQUEST_URI"], 
strlen(Config::get('web_prefix') . '/social/rest'))
-               );
+                               'url' => substr($_SERVER["REQUEST_URI"], 
strlen(Config::get('web_prefix') . '/social/rest')));
                if (isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
                        $servletRequest['postData'] = 
$GLOBALS['HTTP_RAW_POST_DATA'];
                        if (get_magic_quotes_gpc()) {
@@ -149,8 +156,10 @@
                                }
                                break;
                }
+               // just to satisfy the code scanner, code is actually 
unreachable
+               return null;
        }
-       
+
        /**
         * Returns the input converter to use
         *
@@ -197,6 +206,8 @@
                        // if that isn't set either, we assume json
                        return strtolower(trim(! 
empty($_POST[self::$FORMAT_PARAM]) ? $_POST[self::$FORMAT_PARAM] : (! 
empty($_GET[self::$FORMAT_PARAM]) ? $_GET[self::$FORMAT_PARAM] : 'json')));
                }
+               // just to satisfy the code scanner, code is actually 
unreachable
+               return null;
        }
 
        /**


Reply via email to