From 7be13777491767920a76f854c8e8160fe04c4851 Mon Sep 17 00:00:00 2001 From: Robert Kaiser Date: Thu, 1 Dec 2016 20:17:22 +0100 Subject: [PATCH] move building the HTML into a function in utils, KaiRo bug 410 - Add Piwik support to the auth system --- app/authorize.php | 15 ++----------- app/authsystem.inc.php | 5 +++++ app/authsystem.js | 6 +++++- app/authutils.php-class | 48 +++++++++++++++++++++++++++++++++++++++++ app/index.php | 21 ++---------------- app/piwik.js | 12 +++++++++++ 6 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 app/piwik.js diff --git a/app/authorize.php b/app/authorize.php index e064080..c8f9b21 100644 --- a/app/authorize.php +++ b/app/authorize.php @@ -11,22 +11,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('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. diff --git a/app/authsystem.inc.php b/app/authsystem.inc.php index 39e43f0..17ff700 100644 --- a/app/authsystem.inc.php +++ b/app/authsystem.inc.php @@ -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 , diff --git a/app/authsystem.js b/app/authsystem.js index 1e5c1b0..6ab6a14 100644 --- a/app/authsystem.js +++ b/app/authsystem.js @@ -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) { diff --git a/app/authutils.php-class b/app/authutils.php-class index e5a080b..db5dd89 100755 --- a/app/authutils.php-class +++ b/app/authutils.php-class @@ -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'); diff --git a/app/index.php b/app/index.php index 90be17f..4b67f9b 100644 --- a/app/index.php +++ b/app/index.php @@ -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 index 0000000..ab41f9f --- /dev/null +++ b/app/piwik.js @@ -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 -- 2.43.0