Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cookie consent #99

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions classes/cookie_consent_allocation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

namespace theme_wwu2019;

use core\persistent;

class cookie_consent_allocation extends persistent {

const TABLE = "theme_wwu2019_cookie_consent";

protected static function define_properties() {
return array(
'userid' => array(
'type' => PARAM_INT,
'message' => new \lang_string('invaliduserid', 'error')
),
'consentdate' => array(
'type' => PARAM_INT,
'message' => new \lang_string('invalidconsentdate', 'theme_wwu2019')
)
);
}
}
3 changes: 3 additions & 0 deletions classes/output/core_renderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -1014,6 +1014,9 @@ public function get_footer_context() {
if (!empty($CFG->sitepolicyhandler) && $CFG->sitepolicyhandler == 'tool_policy') {
$elements['policyurl'] = (new moodle_url('/admin/tool/policy/view.php', ['policyid' => 1]))->out();
}
if ($cookiepolicy = get_config('theme_wwu2019', 'cookie_policy_url')) {
$elements['cookiepolicyurl'] = $cookiepolicy;
}
return $elements;

}
Expand Down
21 changes: 21 additions & 0 deletions db/install.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="theme/wwu2019/db" VERSION="20210101" COMMENT="XMLDB file for Moodle theme/wwu2019"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd">
<TABLES>
<TABLE NAME="theme_wwu2019_cookie_consent" COMMENT="Stores data when the user consented to cookies">
<FIELDS>
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="consentdate" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="usermodified" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
<FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
<KEY NAME="userid" TYPE="foreign" FIELDS="userid" REFTABLE="user" REFFIELDS="id"/>
</KEYS>
</TABLE>
</TABLES>
</XMLDB>
40 changes: 40 additions & 0 deletions db/upgrade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

function xmldb_theme_wwu2019_upgrade ($oldversion) {
global $DB;
$dbman = $DB->get_manager();
if ($oldversion < 2022010100) {

$table = new xmldb_table('theme_wwu2019_cookie_consent');

$table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
$table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('consentdate', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('usermodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);
$table->add_field('timemodified', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null);

$table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
$table->add_key('userid', XMLDB_KEY_FOREIGN, array('userid'), 'user', array('id'));

if (!$dbman->table_exists($table)) {
$dbman->create_table($table);
}

upgrade_plugin_savepoint(true, 2022010100, 'theme', 'wwu2019');
}
}
41 changes: 40 additions & 1 deletion lang/de/theme_wwu2019.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
/* Settings */
$string['helpurl'] = 'Hilfe-URL';
$string['helpurl_desc'] = 'URL zu einer Hilfeseite, die im Usermenü verlinkt ist.';
$string['cookie_policy_url'] = 'Cookie policy URL';
$string['cookie_policy_url_desc'] = 'URL zu einer Cookie Policy die im Footer verlinkt wird';
$string['matomo_siteurl'] = 'Analytics-URL';
$string['matomo_siteurl_desc'] = 'Ihre "Matomo Analytics"-URL, aber ohne http(s) oder Slash am Ende. Beispiel: "mysite.com/analytics".';
$string['matomo_siteid'] = 'Analytics-Site-ID';
Expand Down Expand Up @@ -90,9 +92,46 @@

$string['viewfullsection'] = 'Kompletten Abschnitt anschauen';

// Theme switcher
// Theme switcher.
$string['choosetheme'] = 'Theme auswählen';
$string['light'] = 'Hell';
$string['dark'] = 'Dunkel';
$string['ostheme'] = 'Systemfarben';
$string['ostheme_help'] = 'Wechselt zwischen hellem und dunklem Theme basierend auf den Systemeinstellungen.';

$string['cookiepolicy'] = "Cookie Datenschutzrichtlinie";

// Cookie consent.
$string['cookie_consent_title'] = "Zustimmung zur Verwendung von Cookies";
$string['cookie_consent_title_one'] = "Diese Website verwendet Cookies";
$string['cookie_consent_body_one'] = "Das Learnweb braucht Cookies um zu funktionieren." .
" Da wir kein Interesse am Verkauf deiner Daten haben setzen wir nur solche Cookies ein, die zum Betrieb der Website notwendig sind.";
$string['cookie_explanation_title'] = "Was sind Cookies?";
$string['cookie_explanation_body'] = "Cookies sind kleine Textdateien die das Learnweb auf Ihrem PC speichert."
. " In dieser Textdatei wird dann ein Wert und ein Ablaufdatum gespeichert."
. " Der Name dieser Textdatei, sowie ihr Inhalt werden dann immer an das Learnweb gesendet wenn Sie es besuchen."
. " Wenn das gespeicherte Ablaufdatum erreicht ist wird der Cookie automatisch von ihrem PC gelöscht.";
$string['cookie_classes_title'] = "Was für Arten von Cookies gibt es?";
$string['cookie_classes_body'] = "Grundsätzlich unterscheidet man vier Arten von Cookies:" .
" <br> <ul>" .
"<li><p class='text-bold'>Essentielle Cookies</p> sind Cookies die zum Betrieb einer Website unbedingt nötig sind." .
" Außerdem ist bei diesen Cookies sicherzustellen, dass sie nur an den Betreiber einer Website gesendet werden.</li>" .
"<li><p class='text-bold'>Funktionale Cookies</p> sind Cookies die dazu dienen eine Website um Funktionen zu bereichern." .
" Beispielsweise kann so die Sprache eines Nutzers gespeichert werden und die Website auf dieser Sprache angezeigt werden." .
" Die informationen die in Funktionalen Cookies gespeichert sind müssen anonymisiert werden.</li>" .
"<li><p class='text-bold'>Performance Cookies</p> sind Cookies die dazu genutzt werden die Performance einer Webseite zu analysieren." .
" Sie speichern Beispielsweise welche Unterseiten ein Nutzer besonders oft besucht oder welchen Text er besonders lang und aufmerksam durchgelesen hat.</li>" .
"<li><p class='text-bold'>Marketing Cookies</p> sind alle Cookies deren Informationen primär dazu genutzt werden um " .
" (personalisierte) Werbung für den Nutzer anzuzeigen.</li>" .
"</ul>";

$string['cookie_reason_title'] = "Wofür benutzt das Learnweb Cookies?";
$string['cookie_reason_body'] = "Das Learnweb setzt Cookies für verschiedene Zwecke ein. Wenn Sie sich Beispielsweise einloggen "
. "speichert das Learnweb einen Cookie der einen Zugangscode für Sie enthält. Wenn sie dann eine andere Seite des Learnwebs aufrufen "
. "kann das Learnweb sie anhand dieses Codes identifizieren und Sie müssen sich nicht erneut einloggen. <br> "
. "Ein anderer Anwendungsbereich sind einige Texteditoren des Learnwebs. Wenn sie einen Text schreiben so speichert ihr PC diesen Text "
. "während des Schreibens immer wieder in einem Cookie. Somit ist sichergestellt, dass sie auch bei Verbindungsabbruch oder zwischenzeitlichem "
. "Verlassen des Learnwebs keinen Verlust ihres Textes befürchten müssen.";
$string['agree'] = "Zustimmung erteilen";

$string['invalidconsentdate'] = "Ungültiges Datum für Zustimmungserteilung";
39 changes: 39 additions & 0 deletions lang/en/theme_wwu2019.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
/* Settings */
$string['helpurl'] = 'Help URL';
$string['helpurl_desc'] = 'URL to helppage that will be linked to in the usermenu';
$string['cookie_policy_url'] = 'Cookie policy URL';
$string['cookie_policy_url_desc'] = 'URL to a cookie policy that will be linked to in the footer';
$string['matomo_siteurl'] = 'Analytics URL';
$string['matomo_siteurl_desc'] = 'Enter your "Matomo Analytics" URL without http(s) or a trailing slash. For example "mysite.com/analytics".';
$string['matomo_siteid'] = 'Analytics Site ID';
Expand Down Expand Up @@ -97,3 +99,40 @@
$string['ostheme'] = 'System colors';
$string['ostheme_help'] = 'Switches between light and dark theme depending on the OS settings.';

$string['cookiepolicy'] = "Cookie policy";

// Cookie consent.
$string['cookie_consent_title'] = "Zustimmung zur Verwendung von Cookies";
$string['cookie_consent_title_one'] = "Diese Website verwendet Cookies";
$string['cookie_consent_body_one'] = "Das Learnweb braucht Cookies um zu funktionieren." .
" Da wir kein Interesse am Verkauf deiner Daten haben setzen wir nur solche Cookies ein, die zum Betrieb der Website notwendig sind.";
$string['cookie_explanation_title'] = "Was sind Cookies?";
$string['cookie_explanation_body'] = "Cookies sind kleine Textdateien die das Learnweb auf Ihrem PC speichert."
. " In dieser Textdatei wird dann ein Wert und ein Ablaufdatum gespeichert."
. " Der Name dieser Textdatei, sowie ihr Inhalt werden dann immer an das Learnweb gesendet wenn Sie es besuchen."
. " Wenn das gespeicherte Ablaufdatum erreicht ist wird der Cookie automatisch von ihrem PC gelöscht.";
$string['cookie_classes_title'] = "Was für Arten von Cookies gibt es?";
$string['cookie_classes_body'] = "Grundsätzlich unterscheidet man vier Arten von Cookies:" .
" <br> <ul>" .
"<li><p class='text-bold'>Essentielle Cookies</p> sind Cookies die zum Betrieb einer Website unbedingt nötig sind." .
" Außerdem ist bei diesen Cookies sicherzustellen, dass sie nur an den Betreiber einer Website gesendet werden.</li>" .
"<li><p class='text-bold'>Funktionale Cookies</p> sind Cookies die dazu dienen eine Website um Funktionen zu bereichern." .
" Beispielsweise kann so die Sprache eines Nutzers gespeichert werden und die Website auf dieser Sprache angezeigt werden." .
" Die informationen die in Funktionalen Cookies gespeichert sind müssen anonymisiert werden.</li>" .
"<li><p class='text-bold'>Performance Cookies</p> sind Cookies die dazu genutzt werden die Performance einer Webseite zu analysieren." .
" Sie speichern Beispielsweise welche Unterseiten ein Nutzer besonders oft besucht oder welchen Text er besonders lang und aufmerksam durchgelesen hat.</li>" .
"<li><p class='text-bold'>Marketing Cookies</p> sind alle Cookies deren Informationen primär dazu genutzt werden um " .
" (personalisierte) Werbung für den Nutzer anzuzeigen.</li>" .
"</ul>";

$string['cookie_reason_title'] = "Wofür benutzt das Learnweb Cookies?";
$string['cookie_reason_body'] = "Das Learnweb setzt Cookies für verschiedene Zwecke ein. Wenn Sie sich Beispielsweise einloggen "
. "speichert das Learnweb einen Cookie der einen Zugangscode für Sie enthält. Wenn sie dann eine andere Seite des Learnwebs aufrufen "
. "kann das Learnweb sie anhand dieses Codes identifizieren und Sie müssen sich nicht erneut einloggen. <br> "
. "Ein anderer Anwendungsbereich sind einige Texteditoren des Learnwebs. Wenn sie einen Text schreiben so speichert ihr PC diesen Text "
. "während des Schreibens immer wieder in einem Cookie. Somit ist sichergestellt, dass sie auch bei Verbindungsabbruch oder zwischenzeitlichem "
. "Verlassen des Learnwebs keinen Verlust ihres Textes befürchten müssen.";

$string['agree'] = "Zustimmung erteilen";

$string['invalidconsentdate'] = "Invalid date for consentdate";
69 changes: 69 additions & 0 deletions lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,72 @@ function theme_wwu2019_extend_navigation_course($navigation, $course, $context)

$navigation->add_node($node);
}

const CONSENT_COOKIE = "cookie_policy_consent";
function theme_wwu2019_before_standard_top_of_body_html() {
global $USER, $OUTPUT;
if (isloggedin()) {
if (isset($_COOKIE[CONSENT_COOKIE])) {
$consentdataraw = $_COOKIE[CONSENT_COOKIE];
$consentdata = json_decode($consentdataraw, true);
$userid = $USER->id;
$useridhash = md5($userid);
foreach ($consentdata as $consenteduser => $consentdate) {
if ($consenteduser == $useridhash) {
$consentexpirydate = strtotime("+1 year", $consentdate);
if ($consentexpirydate > time()) {
return null;
}
}
}
}

$consentpersistent = \theme_wwu2019\cookie_consent_allocation::get_record(["userid" => $USER->id]);
if ($consentpersistent) {
$consentdate = $consentpersistent->get('consentdate');
$consentexpirydate = strtotime("+1 year", $consentdate);
if ($consentexpirydate > time()) {
add_consent_cooke($consentpersistent);
}
return null;
}

$consentgiven = optional_param('theme_wwu2019_cookie_consent_given', false, PARAM_BOOL);
if ($consentgiven) {
if ($consentpersistent) {
$consentpersistent->set('consentdate', time());
$consentpersistent->save();
add_consent_cooke($consentpersistent);
} else {
$data = new stdClass();
$data->userid = $USER->id;
$data->consentdate = time();
$consentpersistent = new \theme_wwu2019\cookie_consent_allocation(0, $data);
$consentpersistent->create();
add_consent_cooke($consentpersistent);
}
return null;
}

$consentdialog = $OUTPUT->render_from_template("theme_wwu2019/cookie_consent", []);

return $consentdialog;
}
return null;
}

function add_consent_cooke($consentpersistent) {
global $CFG;
if (isset($_COOKIE[CONSENT_COOKIE])) {
$consentdata = json_decode($_COOKIE[CONSENT_COOKIE], true);
} else {
$consentdata = [];
}

$consentdate = $consentpersistent->get('consentdate');
$hashedid = md5($consentpersistent->get('userid'));
$consentdata[$hashedid] = $consentdate;
$encodeddata = json_encode($consentdata);
$consentexpirydate = strtotime("+1 year", $consentdate);
setcookie(CONSENT_COOKIE, $encodeddata, $consentexpirydate, $CFG->sessioncookiepath);
}
89 changes: 89 additions & 0 deletions scss/wwu2019/general.scss
Original file line number Diff line number Diff line change
Expand Up @@ -374,4 +374,93 @@ a:not([class]):focus,
margin-top: 1em;
margin-bottom: 1em;
}
}

#theme_wwu2019_cookie_consent_overlay {
position: fixed;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.5);
z-index: 2000; // to be above nav
}

#theme_wwu2019_cookie_consent_dialog_header {
background-color: $primary;
}

.theme_wwu2019_cookie_consent_body {
text-align: left;
color: black;
}

.vertical-center {
margin: 0 auto;
}

.theme_wwu2019_bold_text {
font-weight: bold;
color: white;
margin: 0;
}

.dialog_center {
width: 40%;
display: inline-table;
height: auto;
margin: 10% auto auto;
position: absolute;
top: 0;
bottom: 0;
right: 0;
left: 0;
border-top-left-radius: calc(0.3rem - 1px);
border-top-right-radius: calc(0.3rem - 1px);
}

.theme_wwu2019_cookie_consent_form {
margin-top: 10px;
margin-bottom: 10px;
}

.dialog_overlay {
z-index: 2001;
background-color: white;
}
.theme_wwu2019_switch_wrapper {
text-align: left;
padding-top: 5px;
border-bottom: 1px solid lightgrey;
border-top: 1px solid lightgrey;
background: white;
}

.theme_wwu2019_switch_label {
background-image: url([[pix:theme_wwu2019|arrow_up]]);
height: 1em;
background-size: contain;
background-repeat: no-repeat;
margin: 0 0 0 5px;
padding-left: calc(1em + 5px);
color: $primary;
font-weight: bold;
}

:checked ~ .theme_wwu2019_switch_label {
background-image: url([[pix:theme_wwu2019|arrow_down]]);
}

.theme_wwu2019_switched_text {
display: none;
}

:checked ~ .theme_wwu2019_switched_text {
display: block;
}

.theme_wwu2019_switch_input {
display: none;
}

.text-bold {
font-weight: bold;
}
Loading