18ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen<?php 28ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen/** 38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * A "Hello world!" for the Chrome Web Store Licensing API, in PHP. This 48ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * program logs the user in with Google's Federated Login API (OpenID), fetches 58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * their license state with OAuth, and prints one of these greetings as 68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * appropriate: 78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * 88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * 1. This user has FREE_TRIAL access to this application ( appId: 1 ) 98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * 2. This user has FULL access to this application ( appId: 1 ) 108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * 3. This user has NO access to this application ( appId: 1 ) 118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * 128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * This code makes use of a popup ui extension to the OpenID protocol. Instead 138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * of the user being redirected to the Google login page, a popup window opens 148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * to the login page, keeping the user on the main application page. See 158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * popuplib.js 168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * 178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * Copyright 2010 the Chromium Authors 188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * 198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * Use of this source code is governed by a BSD-style license that can be found 208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * in the "LICENSE" file. 218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * 228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * Eric Bidelman <ericbidelman@chromium.org> 238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen */ 248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsensession_start(); 268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenrequire_once 'lib/oauth/OAuth.php'; 288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenrequire_once 'lib/lightopenid/openid.php'; 298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Full URL of the current application is running under. 318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen$scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on') ? 'http' : 328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 'https'; 338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen$selfUrl = "$scheme://{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}"; 348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen/** 378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * Wrapper class to make calls to the Chrome Web Store License Server. 388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen */ 398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass LicenseServerClient { 408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const LICENSE_SERVER_HOST = 'https://www.googleapis.com'; 428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const CONSUMER_KEY = 'anonymous'; 438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const CONSUMER_SECRET = 'anonymous'; 448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const APP_ID = '1'; // Change to the correct id of your application. 458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const TOKEN = '[REPLACE THIS WITH YOUR OAUTH TOKEN]'; 468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen const TOKEN_SECRET = '[REPLACE THIS WITH YOUR OAUTH TOKEN SECRET]'; 478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen public $consumer; 488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen public $token; 498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen public $signatureMethod; 508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen public function __construct() { 528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $this->consumer = new OAuthConsumer( 538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen self::CONSUMER_KEY, self::CONSUMER_SECRET, NULL); 548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $this->token = new OAuthToken(self::TOKEN, self::TOKEN_SECRET); 558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $this->signatureMethod = new OAuthSignatureMethod_HMAC_SHA1(); 568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen /** 598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * Makes an HTTP GET request to the specified URL. 608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * 618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * @param string $url Full URL of the resource to access 628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * @param string $request OAuthRequest containing the signed request to make. 638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * @param array $extraHeaders (optional) Array of headers. 648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * @param bool $returnResponseHeaders True if resp headers should be returned. 658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen * @return string Response body from the server. 668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen */ 678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen protected function send_signed_get($request, $extraHeaders=NULL, 688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $returnRequestHeaders=false, 698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $returnResponseHeaders=false) { 708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $url = explode('?', $request->to_url()); 718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $curl = curl_init($url[0]); 728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen curl_setopt($curl, CURLOPT_FAILONERROR, false); 748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Return request headers in the response. 778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen curl_setopt($curl, CURLINFO_HEADER_OUT, $returnRequestHeaders); 788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Return response headers in the response? 808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if ($returnResponseHeaders) { 818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen curl_setopt($curl, CURLOPT_HEADER, true); 828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $headers = array($request->to_header()); 858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (is_array($extraHeaders)) { 868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $headers = array_merge($headers, $extraHeaders); 878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Execute the request. If an error occurs fill the response body with it. 918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $response = curl_exec($curl); 928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (!$response) { 938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $response = curl_error($curl); 948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Add server's response headers to our response body 978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $response = curl_getinfo($curl, CURLINFO_HEADER_OUT) . $response; 988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen curl_close($curl); 1008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return $response; 1028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen public function checkLicense($userId) { 1058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $url = self::LICENSE_SERVER_HOST . '/chromewebstore/v1/licenses/' . 1068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen self::APP_ID . '/' . urlencode($userId); 1078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $request = OAuthRequest::from_consumer_and_token( 1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $this->consumer, $this->token, 'GET', $url, array()); 1108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $request->sign_request($this->signatureMethod, $this->consumer, 1128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $this->token); 1138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return $this->send_signed_get($request); 1158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsentry { 1198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $openid = new LightOpenID(); 1208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $userId = $openid->identity; 1218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (!isset($_GET['openid_mode'])) { 1228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // This section performs the OpenID dance with the normal redirect. Use it 1238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // if you want an alternative to the popup UI. 1248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (isset($_GET['login'])) { 1258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $openid->identity = 'https://www.google.com/accounts/o8/id'; 1268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $openid->required = array('namePerson/first', 'namePerson/last', 1278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 'contact/email'); 1288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen header('Location: ' . $openid->authUrl()); 1298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else if ($_GET['openid_mode'] == 'cancel') { 1318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen echo 'User has canceled authentication!'; 1328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $userId = $openid->validate() ? $openid->identity : ''; 1348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $_SESSION['userId'] = $userId; 1358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $attributes = $openid->getAttributes(); 1368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $_SESSION['attributes'] = $attributes; 1378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} catch(ErrorException $e) { 1398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen echo $e->getMessage(); 1408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen exit; 1418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenif (isset($_REQUEST['popup']) && !isset($_SESSION['redirect_to'])) { 1448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $_SESSION['redirect_to'] = $selfUrl; 1458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen echo '<script type = "text/javascript">window.close();</script>'; 1468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen exit; 1478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} else if (isset($_SESSION['redirect_to'])) { 1488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $redirect = $_SESSION['redirect_to']; 1498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen unset($_SESSION['redirect_to']); 1508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen header('Location: ' . $redirect); 1518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} else if (isset($_REQUEST['queryLicenseServer'])) { 1528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen $ls = new LicenseServerClient(); 1538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen echo $ls->checkLicense($_REQUEST['user_id']); 1548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen exit; 1558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} else if (isset($_GET['logout'])) { 1568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen unset($_SESSION['attributes']); 1578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen unset($_SESSION['userId']); 1588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen header('Location: ' . $selfUrl); 1598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen?> 1618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen<!DOCTYPE html> 1638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen<html> 1648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <head> 1658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <meta charset="utf-8" /> 1668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <link href="main.css" type="text/css" rel="stylesheet" /> 1678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <script type="text/javascript" src="popuplib.js"></script> 1688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <script type="text/html" id="ls_tmpl"> 1698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <div id="access-level"> 1708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <% if (result.toLowerCase() == 'yes') { %> 1718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen This user has <span class="<%= accessLevel.toLowerCase() %>"><%= accessLevel %></span> access to this application ( appId: <%= appId %> ) 1728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <% } else { %> 1738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen This user has <span class="<%= result.toLowerCase() %>"><%= result %></span> access to this application ( appId: <%= appId %> ) 1748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <% } %> 1758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen </div> 1768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen </script> 1778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen </head> 1788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <body> 1798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <nav> 1808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <?php if (!isset($_SESSION['userId'])): ?> 1818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <a href="javascript:" onclick="openPopup(450, 500, this);">Sign in</a> 1828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <?php else: ?> 1838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <span>Welcome <?php echo @$_SESSION['attributes']['namePerson/first'] ?> <?php echo @$_SESSION['attributes']['namePerson/last'] ?> ( <?php echo $_SESSION['attributes']['contact/email'] ?> )</span> 1848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <a href="?logout">Sign out</a> 1858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <?php endif; ?> 1868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen </nav> 1878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <?php if (isset($_SESSION['attributes'])): ?> 1888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <div id="container"> 1898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <form action="<?php echo "$selfUrl?queryLicenseServer" ?>" onsubmit="return queryLicenseServer(this);"> 1908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <input type="hidden" id="user_id" name="user_id" value="<?php echo $_SESSION['userId'] ?>" /> 1918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <input type="submit" value="Check user's access" /> 1928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen </form> 1938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <div id="license-server-response"></div> 1948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen </div> 1958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <?php endif; ?> 1968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen <script> 1978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Simple JavaScript Templating 1988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // John Resig - http://ejohn.org/ - MIT Licensed 1998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen (function(){ 2008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var cache = {}; 2018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen this.tmpl = function tmpl(str, data){ 2038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Figure out if we're getting a template, or if we need to 2048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // load the template - and be sure to cache the result. 2058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var fn = !/\W/.test(str) ? 2068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen cache[str] = cache[str] || 2078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen tmpl(document.getElementById(str).innerHTML) : 2088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Generate a reusable function that will serve as a template 2108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // generator (and which will be cached). 2118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen new Function("obj", 2128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "var p=[],print=function(){p.push.apply(p,arguments);};" + 2138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Introduce the data as local variables using with(){} 2158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "with(obj){p.push('" + 2168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Convert the template into pure JavaScript 2188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen str 2198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen .replace(/[\r\t\n]/g, " ") 2208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen .split("<%").join("\t") 2218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen .replace(/((^|%>)[^\t]*)'/g, "$1\r") 2228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen .replace(/\t=(.*?)%>/g, "',$1,'") 2238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen .split("\t").join("');") 2248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen .split("%>").join("p.push('") 2258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen .split("\r").join("\\'") 2268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen + "');}return p.join('');"); 2278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Provide some basic currying to the user 2298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return data ? fn( data ) : fn; 2308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 2318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen })(); 2328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen function queryLicenseServer(form) { 2348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var userId = form.user_id.value; 2358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (!userId) { 2378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen alert('No OpenID specified!'); 2388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return false; 2398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var req = new XMLHttpRequest(); 2428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen req.onreadystatechange = function(e) { 2438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (this.readyState == 4) { 2448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var resp = JSON.parse(this.responseText); 2458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var el = document.getElementById('license-server-response'); 2468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (resp.error) { 2478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen el.innerHTML = ['<div class="error">Error ', resp.error.code, 2488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ': ', resp.error.message, '</div>'].join(''); 2498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 2508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen el.innerHTML = tmpl('ls_tmpl', resp); 2518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 2548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var url = 2558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen [form.action, '&user_id=', encodeURIComponent(userId)].join(''); 2568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen req.open('GET', url, true); 2578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen req.send(null); 2588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return false; 2608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen function openPopup(w, h, link) { 2638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var extensions = { 2648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 'openid.ns.ext1': 'http://openid.net/srv/ax/1.0', 2658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 'openid.ext1.mode': 'fetch_request', 2668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 'openid.ext1.type.email': 'http://axschema.org/contact/email', 2678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 'openid.ext1.type.first': 'http://axschema.org/namePerson/first', 2688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 'openid.ext1.type.last': 'http://axschema.org/namePerson/last', 2698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 'openid.ext1.required': 'email,first,last', 2708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 'openid.ui.icon': 'true' 2718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 2728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen var googleOpener = popupManager.createPopupOpener({ 2748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen opEndpoint: 'https://www.google.com/accounts/o8/ud', 2758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen returnToUrl: '<?php echo "$selfUrl?popup=true" ?>', 2768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen onCloseHandler: function() { 2778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen window.location = '<?php echo $selfUrl ?>'; 2788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }, 2798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen shouldEncodeUrls: false, 2808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen extensions: extensions 2818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }); 2828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen link.parentNode.appendChild( 2838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen document.createTextNode('Authenticating...')); 2848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen link.parentNode.removeChild(link); 2858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen googleOpener.popup(w, h); 2868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen </script> 2888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen </body> 2898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen</html> 290