15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<?php 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2012 The Chromium Authors. All rights reserved. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A "Hello world!" for the Chrome Web Store Licensing API, in PHP. This 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * program logs the user in with Google's Federated Login API (OpenID), fetches 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * their license state with OAuth, and prints one of these greetings as 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * appropriate: 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1. This user has FREE_TRIAL access to this application ( appId: 1 ) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. This user has FULL access to this application ( appId: 1 ) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3. This user has NO access to this application ( appId: 1 ) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code makes use of a popup ui extension to the OpenID protocol. Instead 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the user being redirected to the Google login page, a popup window opens 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to the login page, keeping the user on the main application page. See 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * popuplib.js 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Eric Bidelman <ericbidelman@chromium.org> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)session_start(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)require_once 'lib/oauth/OAuth.php'; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)require_once 'lib/lightopenid/openid.php'; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Full URL of the current application is running under. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on') ? 'http' : 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'https'; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)$selfUrl = "$scheme://{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}"; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wrapper class to make calls to the Chrome Web Store License Server. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LicenseServerClient { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LICENSE_SERVER_HOST = 'https://www.googleapis.com'; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CONSUMER_KEY = 'anonymous'; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CONSUMER_SECRET = 'anonymous'; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const APP_ID = '1'; // Change to the correct id of your application. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TOKEN = '[REPLACE THIS WITH YOUR OAUTH TOKEN]'; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TOKEN_SECRET = '[REPLACE THIS WITH YOUR OAUTH TOKEN SECRET]'; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public $consumer; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public $token; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public $signatureMethod; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public function __construct() { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $this->consumer = new OAuthConsumer( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self::CONSUMER_KEY, self::CONSUMER_SECRET, NULL); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $this->token = new OAuthToken(self::TOKEN, self::TOKEN_SECRET); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $this->signatureMethod = new OAuthSignatureMethod_HMAC_SHA1(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Makes an HTTP GET request to the specified URL. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param string $url Full URL of the resource to access 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param string $request OAuthRequest containing the signed request to make. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param array $extraHeaders (optional) Array of headers. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param bool $returnResponseHeaders True if resp headers should be returned. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return string Response body from the server. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected function send_signed_get($request, $extraHeaders=NULL, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $returnRequestHeaders=false, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $returnResponseHeaders=false) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $url = explode('?', $request->to_url()); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $curl = curl_init($url[0]); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curl_setopt($curl, CURLOPT_FAILONERROR, false); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return request headers in the response. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curl_setopt($curl, CURLINFO_HEADER_OUT, $returnRequestHeaders); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return response headers in the response? 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ($returnResponseHeaders) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curl_setopt($curl, CURLOPT_HEADER, true); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $headers = array($request->to_header()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_array($extraHeaders)) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $headers = array_merge($headers, $extraHeaders); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute the request. If an error occurs fill the response body with it. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $response = curl_exec($curl); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!$response) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $response = curl_error($curl); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add server's response headers to our response body 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $response = curl_getinfo($curl, CURLINFO_HEADER_OUT) . $response; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curl_close($curl); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return $response; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public function checkLicense($userId) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $url = self::LICENSE_SERVER_HOST . '/chromewebstore/v1/licenses/' . 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self::APP_ID . '/' . urlencode($userId); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $request = OAuthRequest::from_consumer_and_token( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $this->consumer, $this->token, 'GET', $url, array()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $request->sign_request($this->signatureMethod, $this->consumer, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $this->token); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return $this->send_signed_get($request); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)try { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $openid = new LightOpenID(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $userId = $openid->identity; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!isset($_GET['openid_mode'])) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This section performs the OpenID dance with the normal redirect. Use it 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if you want an alternative to the popup UI. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isset($_GET['login'])) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $openid->identity = 'https://www.google.com/accounts/o8/id'; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $openid->required = array('namePerson/first', 'namePerson/last', 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'contact/email'); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header('Location: ' . $openid->authUrl()); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ($_GET['openid_mode'] == 'cancel') { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo 'User has canceled authentication!'; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $userId = $openid->validate() ? $openid->identity : ''; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $_SESSION['userId'] = $userId; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $attributes = $openid->getAttributes(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $_SESSION['attributes'] = $attributes; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} catch(ErrorException $e) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo $e->getMessage(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if (isset($_REQUEST['popup']) && !isset($_SESSION['redirect_to'])) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $_SESSION['redirect_to'] = $selfUrl; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo '<script type = "text/javascript">window.close();</script>'; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} else if (isset($_SESSION['redirect_to'])) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $redirect = $_SESSION['redirect_to']; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unset($_SESSION['redirect_to']); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header('Location: ' . $redirect); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} else if (isset($_REQUEST['queryLicenseServer'])) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $ls = new LicenseServerClient(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo $ls->checkLicense($_REQUEST['user_id']); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} else if (isset($_GET['logout'])) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unset($_SESSION['attributes']); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unset($_SESSION['userId']); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header('Location: ' . $selfUrl); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)?> 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<!DOCTYPE html> 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<html> 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <head> 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <meta charset="utf-8" /> 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <link href="main.css" type="text/css" rel="stylesheet" /> 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <script type="text/javascript" src="popuplib.js"></script> 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <script type="text/html" id="ls_tmpl"> 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <div id="access-level"> 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <% if (result.toLowerCase() == 'yes') { %> 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) This user has <span class="<%= accessLevel.toLowerCase() %>"><%= accessLevel %></span> access to this application ( appId: <%= appId %> ) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <% } else { %> 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) This user has <span class="<%= result.toLowerCase() %>"><%= result %></span> access to this application ( appId: <%= appId %> ) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <% } %> 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) </div> 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) </script> 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) </head> 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <body> 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <nav> 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <?php if (!isset($_SESSION['userId'])): ?> 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <a href="javascript:" onclick="openPopup(450, 500, this);">Sign in</a> 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <?php else: ?> 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <span>Welcome <?php echo @$_SESSION['attributes']['namePerson/first'] ?> <?php echo @$_SESSION['attributes']['namePerson/last'] ?> ( <?php echo $_SESSION['attributes']['contact/email'] ?> )</span> 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <a href="?logout">Sign out</a> 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <?php endif; ?> 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) </nav> 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <?php if (isset($_SESSION['attributes'])): ?> 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <div id="container"> 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <form action="<?php echo "$selfUrl?queryLicenseServer" ?>" onsubmit="return queryLicenseServer(this);"> 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <input type="hidden" id="user_id" name="user_id" value="<?php echo $_SESSION['userId'] ?>" /> 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <input type="submit" value="Check user's access" /> 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) </form> 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <div id="license-server-response"></div> 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) </div> 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <?php endif; ?> 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) <script> 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simple JavaScript Templating 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // John Resig - http://ejohn.org/ - MIT Licensed 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (function(){ 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var cache = {}; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this.tmpl = function tmpl(str, data){ 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Figure out if we're getting a template, or if we need to 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // load the template - and be sure to cache the result. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var fn = !/\W/.test(str) ? 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache[str] = cache[str] || 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmpl(document.getElementById(str).innerHTML) : 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate a reusable function that will serve as a template 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // generator (and which will be cached). 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new Function("obj", 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var p=[],print=function(){p.push.apply(p,arguments);};" + 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Introduce the data as local variables using with(){} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "with(obj){p.push('" + 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert the template into pure JavaScript 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .replace(/[\r\t\n]/g, " ") 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .split("<%").join("\t") 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .replace(/((^|%>)[^\t]*)'/g, "$1\r") 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .replace(/\t=(.*?)%>/g, "',$1,'") 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .split("\t").join("');") 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .split("%>").join("p.push('") 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .split("\r").join("\\'") 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) + "');}return p.join('');"); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provide some basic currying to the user 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data ? fn( data ) : fn; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) })(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function queryLicenseServer(form) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var userId = form.user_id.value; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!userId) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alert('No OpenID specified!'); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var req = new XMLHttpRequest(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.onreadystatechange = function(e) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (this.readyState == 4) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var resp = JSON.parse(this.responseText); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var el = document.getElementById('license-server-response'); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (resp.error) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.innerHTML = ['<div class="error">Error ', resp.error.code, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ': ', resp.error.message, '</div>'].join(''); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.innerHTML = tmpl('ls_tmpl', resp); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var url = 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [form.action, '&user_id=', encodeURIComponent(userId)].join(''); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.open('GET', url, true); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) req.send(null); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function openPopup(w, h, link) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var extensions = { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'openid.ns.ext1': 'http://openid.net/srv/ax/1.0', 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'openid.ext1.mode': 'fetch_request', 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'openid.ext1.type.email': 'http://axschema.org/contact/email', 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'openid.ext1.type.first': 'http://axschema.org/namePerson/first', 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'openid.ext1.type.last': 'http://axschema.org/namePerson/last', 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'openid.ext1.required': 'email,first,last', 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'openid.ui.icon': 'true' 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var googleOpener = popupManager.createPopupOpener({ 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opEndpoint: 'https://www.google.com/accounts/o8/ud', 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) returnToUrl: '<?php echo "$selfUrl?popup=true" ?>', 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onCloseHandler: function() { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.location = '<?php echo $selfUrl ?>'; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shouldEncodeUrls: false, 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions: extensions 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link.parentNode.appendChild( 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document.createTextNode('Authenticating...')); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link.parentNode.removeChild(link); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) googleOpener.popup(w, h); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) </script> 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) </body> 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</html> 289