| Index: chrome/common/extensions/docs/examples/apps/hello-php/index.php
|
| ===================================================================
|
| --- chrome/common/extensions/docs/examples/apps/hello-php/index.php (revision 0)
|
| +++ chrome/common/extensions/docs/examples/apps/hello-php/index.php (revision 0)
|
| @@ -0,0 +1,289 @@
|
| +<?php
|
| +/**
|
| + * A "Hello world!" for the Chrome Web Store Licensing API, in PHP. This
|
| + * program logs the user in with Google's Federated Login API (OpenID), fetches
|
| + * their license state with OAuth, and prints one of these greetings as
|
| + * appropriate:
|
| + *
|
| + * 1. This user has FREE_TRIAL access to this application ( appId: 1 )
|
| + * 2. This user has FULL access to this application ( appId: 1 )
|
| + * 3. This user has NO access to this application ( appId: 1 )
|
| + *
|
| + * This code makes use of a popup ui extension to the OpenID protocol. Instead
|
| + * of the user being redirected to the Google login page, a popup window opens
|
| + * to the login page, keeping the user on the main application page. See
|
| + * popuplib.js
|
| + *
|
| + * Copyright 2010 the Chromium Authors
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be found
|
| + * in the "LICENSE" file.
|
| + *
|
| + * Eric Bidelman <ericbidelman@chromium.org>
|
| + */
|
| +
|
| +session_start();
|
| +
|
| +require_once 'lib/oauth/OAuth.php';
|
| +require_once 'lib/lightopenid/openid.php';
|
| +
|
| +// Full URL of the current application is running under.
|
| +$scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on') ? 'http' :
|
| + 'https';
|
| +$selfUrl = "$scheme://{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}";
|
| +
|
| +
|
| +/**
|
| + * Wrapper class to make calls to the Chrome Web Store License Server.
|
| + */
|
| +class LicenseServerClient {
|
| +
|
| + const LICENSE_SERVER_HOST = 'https://www.googleapis.com';
|
| + const CONSUMER_KEY = 'anonymous';
|
| + const CONSUMER_SECRET = 'anonymous';
|
| + const APP_ID = '1'; // Change to the correct id of your application.
|
| + const TOKEN = '[REPLACE THIS WITH YOUR OAUTH TOKEN]';
|
| + const TOKEN_SECRET = '[REPLACE THIS WITH YOUR OAUTH TOKEN SECRET]';
|
| + public $consumer;
|
| + public $token;
|
| + public $signatureMethod;
|
| +
|
| + public function __construct() {
|
| + $this->consumer = new OAuthConsumer(
|
| + self::CONSUMER_KEY, self::CONSUMER_SECRET, NULL);
|
| + $this->token = new OAuthToken(self::TOKEN, self::TOKEN_SECRET);
|
| + $this->signatureMethod = new OAuthSignatureMethod_HMAC_SHA1();
|
| + }
|
| +
|
| + /**
|
| + * Makes an HTTP GET request to the specified URL.
|
| + *
|
| + * @param string $url Full URL of the resource to access
|
| + * @param string $request OAuthRequest containing the signed request to make.
|
| + * @param array $extraHeaders (optional) Array of headers.
|
| + * @param bool $returnResponseHeaders True if resp headers should be returned.
|
| + * @return string Response body from the server.
|
| + */
|
| + protected function send_signed_get($request, $extraHeaders=NULL,
|
| + $returnRequestHeaders=false,
|
| + $returnResponseHeaders=false) {
|
| + $url = explode('?', $request->to_url());
|
| + $curl = curl_init($url[0]);
|
| + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
| + curl_setopt($curl, CURLOPT_FAILONERROR, false);
|
| + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
|
| +
|
| + // Return request headers in the response.
|
| + curl_setopt($curl, CURLINFO_HEADER_OUT, $returnRequestHeaders);
|
| +
|
| + // Return response headers in the response?
|
| + if ($returnResponseHeaders) {
|
| + curl_setopt($curl, CURLOPT_HEADER, true);
|
| + }
|
| +
|
| + $headers = array($request->to_header());
|
| + if (is_array($extraHeaders)) {
|
| + $headers = array_merge($headers, $extraHeaders);
|
| + }
|
| + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
|
| +
|
| + // Execute the request. If an error occurs fill the response body with it.
|
| + $response = curl_exec($curl);
|
| + if (!$response) {
|
| + $response = curl_error($curl);
|
| + }
|
| +
|
| + // Add server's response headers to our response body
|
| + $response = curl_getinfo($curl, CURLINFO_HEADER_OUT) . $response;
|
| +
|
| + curl_close($curl);
|
| +
|
| + return $response;
|
| + }
|
| +
|
| + public function checkLicense($userId) {
|
| + $url = self::LICENSE_SERVER_HOST . '/chromewebstore/v1/licenses/' .
|
| + self::APP_ID . '/' . urlencode($userId);
|
| +
|
| + $request = OAuthRequest::from_consumer_and_token(
|
| + $this->consumer, $this->token, 'GET', $url, array());
|
| +
|
| + $request->sign_request($this->signatureMethod, $this->consumer,
|
| + $this->token);
|
| +
|
| + return $this->send_signed_get($request);
|
| + }
|
| +}
|
| +
|
| +try {
|
| + $openid = new LightOpenID();
|
| + $userId = $openid->identity;
|
| + if (!isset($_GET['openid_mode'])) {
|
| + // This section performs the OpenID dance with the normal redirect. Use it
|
| + // if you want an alternative to the popup UI.
|
| + if (isset($_GET['login'])) {
|
| + $openid->identity = 'https://www.google.com/accounts/o8/id';
|
| + $openid->required = array('namePerson/first', 'namePerson/last',
|
| + 'contact/email');
|
| + header('Location: ' . $openid->authUrl());
|
| + }
|
| + } else if ($_GET['openid_mode'] == 'cancel') {
|
| + echo 'User has canceled authentication!';
|
| + } else {
|
| + $userId = $openid->validate() ? $openid->identity : '';
|
| + $_SESSION['userId'] = $userId;
|
| + $attributes = $openid->getAttributes();
|
| + $_SESSION['attributes'] = $attributes;
|
| + }
|
| +} catch(ErrorException $e) {
|
| + echo $e->getMessage();
|
| + exit;
|
| +}
|
| +
|
| +if (isset($_REQUEST['popup']) && !isset($_SESSION['redirect_to'])) {
|
| + $_SESSION['redirect_to'] = $selfUrl;
|
| + echo '<script type = "text/javascript">window.close();</script>';
|
| + exit;
|
| +} else if (isset($_SESSION['redirect_to'])) {
|
| + $redirect = $_SESSION['redirect_to'];
|
| + unset($_SESSION['redirect_to']);
|
| + header('Location: ' . $redirect);
|
| +} else if (isset($_REQUEST['queryLicenseServer'])) {
|
| + $ls = new LicenseServerClient();
|
| + echo $ls->checkLicense($_REQUEST['user_id']);
|
| + exit;
|
| +} else if (isset($_GET['logout'])) {
|
| + unset($_SESSION['attributes']);
|
| + unset($_SESSION['userId']);
|
| + header('Location: ' . $selfUrl);
|
| +}
|
| +?>
|
| +
|
| +<!DOCTYPE html>
|
| +<html>
|
| + <head>
|
| + <meta charset="utf-8" />
|
| + <link href="main.css" type="text/css" rel="stylesheet" />
|
| + <script type="text/javascript" src="popuplib.js"></script>
|
| + <script type="text/html" id="ls_tmpl">
|
| + <div id="access-level">
|
| + <% if (result.toLowerCase() == 'yes') { %>
|
| + This user has <span class="<%= accessLevel.toLowerCase() %>"><%= accessLevel %></span> access to this application ( appId: <%= appId %> )
|
| + <% } else { %>
|
| + This user has <span class="<%= result.toLowerCase() %>"><%= result %></span> access to this application ( appId: <%= appId %> )
|
| + <% } %>
|
| + </div>
|
| + </script>
|
| + </head>
|
| + <body>
|
| + <nav>
|
| + <?php if (!isset($_SESSION['userId'])): ?>
|
| + <a href="javascript:" onclick="openPopup(450, 500, this);">Sign in</a>
|
| + <?php else: ?>
|
| + <span>Welcome <?php echo @$_SESSION['attributes']['namePerson/first'] ?> <?php echo @$_SESSION['attributes']['namePerson/last'] ?> ( <?php echo $_SESSION['attributes']['contact/email'] ?> )</span>
|
| + <a href="?logout">Sign out</a>
|
| + <?php endif; ?>
|
| + </nav>
|
| + <?php if (isset($_SESSION['attributes'])): ?>
|
| + <div id="container">
|
| + <form action="<?php echo "$selfUrl?queryLicenseServer" ?>" onsubmit="return queryLicenseServer(this);">
|
| + <input type="hidden" id="user_id" name="user_id" value="<?php echo $_SESSION['userId'] ?>" />
|
| + <input type="submit" value="Check user's access" />
|
| + </form>
|
| + <div id="license-server-response"></div>
|
| + </div>
|
| + <?php endif; ?>
|
| + <script>
|
| + // Simple JavaScript Templating
|
| + // John Resig - http://ejohn.org/ - MIT Licensed
|
| + (function(){
|
| + var cache = {};
|
| +
|
| + this.tmpl = function tmpl(str, data){
|
| + // Figure out if we're getting a template, or if we need to
|
| + // load the template - and be sure to cache the result.
|
| + var fn = !/\W/.test(str) ?
|
| + cache[str] = cache[str] ||
|
| + tmpl(document.getElementById(str).innerHTML) :
|
| +
|
| + // Generate a reusable function that will serve as a template
|
| + // generator (and which will be cached).
|
| + new Function("obj",
|
| + "var p=[],print=function(){p.push.apply(p,arguments);};" +
|
| +
|
| + // Introduce the data as local variables using with(){}
|
| + "with(obj){p.push('" +
|
| +
|
| + // Convert the template into pure JavaScript
|
| + str
|
| + .replace(/[\r\t\n]/g, " ")
|
| + .split("<%").join("\t")
|
| + .replace(/((^|%>)[^\t]*)'/g, "$1\r")
|
| + .replace(/\t=(.*?)%>/g, "',$1,'")
|
| + .split("\t").join("');")
|
| + .split("%>").join("p.push('")
|
| + .split("\r").join("\\'")
|
| + + "');}return p.join('');");
|
| +
|
| + // Provide some basic currying to the user
|
| + return data ? fn( data ) : fn;
|
| + };
|
| + })();
|
| +
|
| + function queryLicenseServer(form) {
|
| + var userId = form.user_id.value;
|
| +
|
| + if (!userId) {
|
| + alert('No OpenID specified!');
|
| + return false;
|
| + }
|
| +
|
| + var req = new XMLHttpRequest();
|
| + req.onreadystatechange = function(e) {
|
| + if (this.readyState == 4) {
|
| + var resp = JSON.parse(this.responseText);
|
| + var el = document.getElementById('license-server-response');
|
| + if (resp.error) {
|
| + el.innerHTML = ['<div class="error">Error ', resp.error.code,
|
| + ': ', resp.error.message, '</div>'].join('');
|
| + } else {
|
| + el.innerHTML = tmpl('ls_tmpl', resp);
|
| + }
|
| + }
|
| + };
|
| + var url =
|
| + [form.action, '&user_id=', encodeURIComponent(userId)].join('');
|
| + req.open('GET', url, true);
|
| + req.send(null);
|
| +
|
| + return false;
|
| + }
|
| +
|
| + function openPopup(w, h, link) {
|
| + var extensions = {
|
| + 'openid.ns.ext1': 'http://openid.net/srv/ax/1.0',
|
| + 'openid.ext1.mode': 'fetch_request',
|
| + 'openid.ext1.type.email': 'http://axschema.org/contact/email',
|
| + 'openid.ext1.type.first': 'http://axschema.org/namePerson/first',
|
| + 'openid.ext1.type.last': 'http://axschema.org/namePerson/last',
|
| + 'openid.ext1.required': 'email,first,last',
|
| + 'openid.ui.icon': 'true'
|
| + };
|
| +
|
| + var googleOpener = popupManager.createPopupOpener({
|
| + opEndpoint: 'https://www.google.com/accounts/o8/ud',
|
| + returnToUrl: '<?php echo "$selfUrl?popup=true" ?>',
|
| + onCloseHandler: function() {
|
| + window.location = '<?php echo $selfUrl ?>';
|
| + },
|
| + shouldEncodeUrls: false,
|
| + extensions: extensions
|
| + });
|
| + link.parentNode.appendChild(
|
| + document.createTextNode('Authenticating...'));
|
| + link.parentNode.removeChild(link);
|
| + googleOpener.popup(w, h);
|
| + }
|
| + </script>
|
| + </body>
|
| +</html>
|
|
|
| Property changes on: chrome/common/extensions/docs/examples/apps/hello-php/index.php
|
| ___________________________________________________________________
|
| Added: svn:executable
|
| + *
|
|
|
|
|