Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4593)

Unified Diff: chrome/common/extensions/docs/examples/apps/hello-php/index.php

Issue 3122030: Adding Chrome Web Store PHP Hello World (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
+ *

Powered by Google App Engine
This is Rietveld 408576698