move building the HTML into a function in utils, KaiRo bug 410 - Add Piwik support...
authorRobert Kaiser <kairo@kairo.at>
Thu, 1 Dec 2016 19:17:22 +0000 (20:17 +0100)
committerRobert Kaiser <kairo@kairo.at>
Thu, 1 Dec 2016 19:17:22 +0000 (20:17 +0100)
app/authorize.php
app/authsystem.inc.php
app/authsystem.js
app/authutils.php-class
app/index.php
app/piwik.js [new file with mode: 0644]

index e0640800166c54d0ac009fbf87baeb79fab46e8a..c8f9b2153d46261041b1223343d3eabc533c757f 100644 (file)
 // Include the common auth system files (including the OAuth2 Server object).
 require_once(__DIR__.'/authsystem.inc.php');
 
-// Start HTML document as a DOM object.
-extract(ExtendedDocument::initHTML5()); // sets $document, $html, $head, $title, $body
-$document->formatOutput = true; // we want a nice output
-$style = $head->appendElement('link');
-$style->setAttribute('rel', 'stylesheet');
-$style->setAttribute('href', 'authsystem.css');
-$head->appendJSFile('authsystem.js');
-$title->appendText('Authorization Request | KaiRo.at');
-$h1 = $body->appendElement('h1', 'KaiRo.at Authentication Server');
-
 $errors = $utils->checkForSecureConnection();
 $utils->sendSecurityHeaders();
 
-$para = $body->appendElement('p', _('This login system does not work without JavaScript. Please activate JavaScript for this site to log in.'));
-$para->setAttribute('id', 'jswarning');
-$para->setAttribute('class', 'warn');
+// Initialize the HTML document with our basic elements.
+extract($utils->initHTMLDocument('Authorization Request | KaiRo.at', 'KaiRo.at Authentication Server')); // sets $document, $html, $head, $title, $body
 
 if (!count($errors)) {
   $session = $utils->initSession(); // Read session or create new session and set cookie.
index 39e43f00a2f6945ceda991dc532aa17c90ab1f19..17ff7002557bf2ab0efcbe4b31c6a40cd54f42a5 100644 (file)
@@ -45,6 +45,11 @@ bindtextdomain($textdomain, '../locale');
 bind_textdomain_codeset($textdomain, 'utf-8');
 textdomain($textdomain);
 
+// Sanitize settings.
+$settings['piwik_enabled'] = (@$settings['piwik_enabled']) ? true : false;
+$settings['piwik_site_id'] = intval(@$settings['piwik_site_id']);
+$settings['piwik_url'] = strlen($settings['piwik_url']) ? $settings['piwik_url'] : '/piwik/';
+
 /* Creating the DB tables:
 CREATE TABLE `auth_sessions` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
index 1e5c1b0fbe60d48922c5c79c6231c95385905174..6ab6a14e9564e34ea772dd9030ec1886b096de78 100644 (file)
@@ -2,7 +2,11 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-window.onload = function() {
+// Call initElements at the earliest possible stage after parsing the document.
+if (window.addEventListener) { window.addEventListener("DOMContentLoaded", initElements, false); }
+else { window.onload = initElements(); }
+
+function initElements() {
   var jsWarning = document.getElementById("jswarning");
   if (jsWarning) {
     if (jsWarning.classList) {
index e5a080b0c6c77ffd6c8e2b3545348ab625eb4ef6..db5dd891a27754f1bf906ed8f6464f031c575d41 100755 (executable)
@@ -88,6 +88,11 @@ class AuthUtils {
   // function getGroupedEmails($group_id, [$exclude_email])
   //   Return all emails grouped in the specified group ID, optionally exclude a specific email (e.g. because you only want non-current entries)
   //
+  // function initHTMLDocument($titletext, [$headlinetext]) {
+  //   initialize the HTML document for the auth system, with some elements we always use, esp. all the scripts and stylesheet.
+  //     Sets the title of the document to the given title, the main headline will be the same as the title if not set explicitly.
+  //     Returns an associative array with the following elements: 'document', 'html', 'head', 'title', 'body'.
+  //
   // function appendLoginForm($dom_element, $session, $user, [$addfields])
   //   Append a login form for the given session to the given DOM element, possibly prefilling the email from the given user info array.
   //     The optional $addfields parameter is an array of name=>value pairs of hidden fields to add to the form.
@@ -392,6 +397,49 @@ class AuthUtils {
     return $emails;
   }
 
+  function initHTMLDocument($titletext, $headlinetext = null) {
+    global $settings;
+    if (is_null($headlinetext)) { $headlinetext = $titletext; }
+    // Start HTML document as a DOM object.
+    extract(ExtendedDocument::initHTML5()); // sets $document, $html, $head, $title, $body
+    $document->formatOutput = true; // we want a nice output
+
+    $style = $head->appendElement('link');
+    $style->setAttribute('rel', 'stylesheet');
+    $style->setAttribute('href', 'authsystem.css');
+    $head->appendJSFile('authsystem.js');
+    if ($settings['piwik_enabled']) {
+      $head->setAttribute('data-piwiksite', $settings['piwik_site_id']);
+      $head->setAttribute('data-piwikurl', $settings['piwik_url']);
+      $head->appendJSFile('piwik.js', true, true);
+    }
+    $title->appendText($titletext);
+    $h1 = $body->appendElement('h1', $headlinetext);
+
+    if ($settings['piwik_enabled']) {
+      // Piwik noscript element
+      $noscript = $body->appendElement('noscript');
+      $para = $noscript->appendElement('p');
+      $img = $para->appendImage($settings['piwik_url'].'piwik.php?idsite='.$settings['piwik_site_id']);
+      $img->setAttribute('style', 'border:0;');
+    }
+
+    // Make the document not be scaled on mobile devices.
+    $vpmeta = $head->appendElement('meta');
+    $vpmeta->setAttribute('name', 'viewport');
+    $vpmeta->setAttribute('content', 'width=device-width, height=device-height');
+
+    $para = $body->appendElement('p', _('This login system does not work without JavaScript. Please activate JavaScript for this site to log in.'));
+    $para->setAttribute('id', 'jswarning');
+    $para->setAttribute('class', 'warn');
+
+    return array('document' => $document,
+                 'html' => $html,
+                 'head' => $head,
+                 'title' => $title,
+                 'body' => $body);
+  }
+
   function appendLoginForm($dom_element, $session, $user, $addfields = array()) {
     $form = $dom_element->appendForm('./', 'POST', 'loginform');
     $form->setAttribute('id', 'loginform');
index 90be17fe99ce2579a08d6c96e049cab82fb85075..4b67f9b0637d286df4a55b2e645500377104364b 100644 (file)
@@ -6,28 +6,11 @@
 // Include the common auth system files (including the OAuth2 Server object).
 require_once(__DIR__.'/authsystem.inc.php');
 
-// Start HTML document as a DOM object.
-extract(ExtendedDocument::initHTML5()); // sets $document, $html, $head, $title, $body
-$document->formatOutput = true; // we want a nice output
-
-$style = $head->appendElement('link');
-$style->setAttribute('rel', 'stylesheet');
-$style->setAttribute('href', 'authsystem.css');
-$head->appendJSFile('authsystem.js');
-$title->appendText('KaiRo.at Authentication Server');
-$h1 = $body->appendElement('h1', 'KaiRo.at Authentication Server');
-
-// Make the document not be scaled on mobile devices.
-$vpmeta = $head->appendElement('meta');
-$vpmeta->setAttribute('name', 'viewport');
-$vpmeta->setAttribute('content', 'width=device-width, height=device-height');
-
 $errors = $utils->checkForSecureConnection();
 $utils->sendSecurityHeaders();
 
-$para = $body->appendElement('p', _('This login system does not work without JavaScript. Please activate JavaScript for this site to log in.'));
-$para->setAttribute('id', 'jswarning');
-$para->setAttribute('class', 'warn');
+// Initialize the HTML document with our basic elements.
+extract($utils->initHTMLDocument('KaiRo.at Authentication Server')); // sets $document, $html, $head, $title, $body
 
 if (!count($errors)) {
   $session = $utils->initSession(); // Read session or create new session and set cookie.
diff --git a/app/piwik.js b/app/piwik.js
new file mode 100644 (file)
index 0000000..ab41f9f
--- /dev/null
@@ -0,0 +1,12 @@
+// Piwik code - licensed under Public Domain.
+  var _paq = _paq || [];
+  _paq.push(['trackPageView']);
+  _paq.push(['enableLinkTracking']);
+  (function() {
+    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+    var u=s.parentNode.dataset.piwikurl;
+    _paq.push(['setTrackerUrl', u+'piwik.php']);
+    _paq.push(['setSiteId', s.parentNode.dataset.piwiksite]);
+    g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
+  })();
+// End Piwik code