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