Viewing file:      GadgetHrefRenderer.php (7.13 KB)      -rwxr-xr-x Select action/file-type:    (+) |   (+) |   (+) | Code (+) | Session (+) |   (+) | SDB (+) |   (+) |   (+) |   (+) |   (+) |   (+) |
 
<?php /**  * Licensed to the Apache Software Foundation (ASF) under one  * or more contributor license agreements.  See the NOTICE file  * distributed with this work for additional information  * regarding copyright ownership.  The ASF licenses this file  * to you under the Apache License, Version 2.0 (the  * "License"); you may not use this file except in compliance  * with the License.  You may obtain a copy of the License at  *  *     http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing,  * software distributed under the License is distributed on an  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY  * KIND, either express or implied.  See the License for the  * specific language governing permissions and limitations  * under the License.  */
  /*  * TODO Dynamically evaluate the limited EL subset expressions on the following tags:  * Any attribute on os:DataRequest other than @key and @method  * @userId  * @groupId  * @fields  * @startIndex  * @count  * @sortBy  * @sortOrder  * @filterBy  * @filterOp  * @filterValue  * @activityIds  * @href  * @params  * Example:  * <os:PeopleRequest key="PagedFriends" userId="@owner" groupId="@friends" startIndex="${ViewParams.first}" count="20"/>  * <os:HttpRequest href="http://developersite.com/api?ids=${PagedFriends.ids}"/>  */
  require_once 'GadgetBaseRenderer.php';
  class GadgetHrefRenderer extends GadgetBaseRenderer {
    /**    * Renders a 'proxied content' view, for reference see:    * http://opensocial-resources.googlecode.com/svn/spec/draft/OpenSocial-Data-Pipelining.xml    *    * @param Gadget $gadget    * @param array $view    */   public function renderGadget(Gadget $gadget, $view) {     $this->setGadget($gadget);     if (Config::get('P3P') != '') {       header("P3P: " . Config::get('P3P'));     }     /* TODO      * We should really re-add OAuth fetching support some day, uses these view atributes:      * $view['oauthServiceName'], $view['oauthTokenName'], $view['oauthRequestToken'], $view['oauthRequestTokenSecret'];     */     $authz = $this->getAuthz($view);     $refreshInterval = $this->getRefreshInterval($view);     $href = $this->buildHref($view, $authz);     if (count($view['dataPipelining'])) {       $request = new RemoteContentRequest($href, "Content-type: application/json\n");       $request->setMethod('POST');       $request->getOptions()->ignoreCache = $gadget->gadgetContext->getIgnoreCache();     } else {       // no data-pipelining set, use GET and set cache/refresh interval options       $request = new RemoteContentRequest($href);       $request->setMethod('GET');       $request->setRefreshInterval($refreshInterval);       $request->getOptions()->ignoreCache = $gadget->gadgetContext->getIgnoreCache();     }     $signingFetcherFactory = $gadgetSigner = false;     if ($authz != 'none') {       $gadgetSigner = Config::get('security_token_signer');       $gadgetSigner = new $gadgetSigner();       $token = $gadget->gadgetContext->extractAndValidateToken($gadgetSigner);       $request->setToken($token);       $request->setAuthType($authz);       $request->getOptions()->ownerSigned = $this->getSignOwner($view);       $request->getOptions()->viewerSigned = $this->getSignViewer($view);       $signingFetcherFactory = new SigningFetcherFactory(Config::get("private_key_file"));     }     $remoteFetcherClass = Config::get('remote_content_fetcher');     $remoteFetcher = new $remoteFetcherClass();     $basicRemoteContent = new BasicRemoteContent($remoteFetcher, $signingFetcherFactory, $gadgetSigner);     // Cache POST's as if they were GET's, since we don't want to re-fetch and repost the social data for each view     $basicRemoteContent->setCachePostRequest(true);     if (($response = $basicRemoteContent->getCachedRequest($request)) == false) {       // Don't fetch the data-pipelining social data unless we don't have a cached version of the gadget's content       $dataPipeliningResults = DataPipelining::fetch($view['dataPipelining'], $this->context);       // spec stats that the proxied content data-pipelinging data is *not* available to templates (to avoid duplicate posting       // of the data to the gadget dev's server and once to js space), so we don't assign it to the data context, and just       // post the json encoded results to the remote url.       $request->setPostBody(json_encode($dataPipeliningResults));       $response = $basicRemoteContent->fetch($request);     }     if ($response->getHttpCode() != '200') {       // an error occured fetching the proxied content's gadget content       $content = '<html><body><h1>An error occured fetching the gadget content</h1><p>http error code: '.$response->getHttpCode().'</p><p>'.$response->getResponseContent().'</body></html>';     } else {       // fetched ok, build the response document and output it       $content = $response->getResponseContent();       $content = $this->parseTemplates($content);       $content = $this->rewriteContent($content);       $content = $this->addTemplates($content);     }     echo $content;   }
    /**    * Builds the outgoing URL by taking the href attribute of the view and appending    * the country, lang, and opensocial query params to it    *    * @param array $view    * @param SecurityToken $token    * @return string the url    */   private function buildHref($view, $authz) {     $href = $view['href'];     if (empty($href)) {       throw new Exception("Invalid empty href in the gadget view");     } // add the required country and lang param to the URL     $lang = isset($_GET['lang']) ? $_GET['lang'] : 'en';     $country = isset($_GET['country']) ? $_GET['country'] : 'US';     $firstSeperator = strpos($href, '?') === false ? '?' : '&';     $href .= $firstSeperator . 'lang=' . urlencode($lang);     $href .= '&country=' . urlencode($country);     if ($authz != 'none') {       $href .= '&opensocial_proxied_content=1';     }     return $href;   }
    /**    * Returns the requested refreshInterval (cache time) of the view, or if none is specified    * it will return the configured default_refresh_interval value    *    * @param array $view    * @return int refresh interval    */   private function getRefreshInterval($view) {     return ! empty($view['refreshInterval']) && is_numeric($view['refreshInterval']) ? $view['refreshInterval'] : Config::get('default_refresh_interval');   }
    /**    * Returns the authz attribute of the view, can be 'none', 'signed' or 'oauth'    *    * @param array $view    * @return string authz attribute    */   private function getAuthz($view) {     return ! empty($view['authz']) ? strtolower($view['authz']) : 'none';   }
 
    /**    * Returns the signOwner attribute of the view (true or false, default is true)    *    * @param array $view    * @return string signOwner attribute    */   private function getSignOwner($view) {     return ! empty($view['signOwner']) && strcasecmp($view['signOwner'], 'false') == 0 ? false : true;   }
    /**    * Returns the signViewer attribute of the view (true or false, default is true)    *    * @param array $view    * @return string signViewer attribute    */   private function getSignViewer($view) {     return ! empty($view['signViewer']) && strcasecmp($view['signViewer'], 'false') == 0 ? false : true;   }
  } 
  |