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