Datenschutzbestimmungen hinzugefügt, theme wird sofort aktiviert

This commit is contained in:
silas 2018-10-11 23:36:09 +02:00
parent 1c8ec944f7
commit 864530ecf1
9 changed files with 196 additions and 39 deletions

File diff suppressed because one or more lines are too long

View File

@ -30,8 +30,15 @@
<link href="css/foundation.css" media="screen,print" rel="stylesheet" type="text/css">
<link href="css/wordRotator.css" media="screen,print" rel="stylesheet" type="text/css">
</head>
<body class='black'>
<body>
<script>
let defaultThemeClass = 'black';
let currentThemeClass = localStorage.getItem("currentTheme");
if (!currentThemeClass) {
currentThemeClass = defaultThemeClass;
}
document.body.classList.add(currentThemeClass);
</script>
<div id='print-content'>
</div>
@ -94,7 +101,7 @@
</div>
<footer>
<a data-site-name='privacyPolicy' class='deep-link' data-translation="policy-heading">Privacy Policy</a>
<a href="https://apps.silas.link" target="_blank" rel = "noopener" data-translation="other-apps">Other Apps</a>
<a href="https://apps.silas.link" target="_blank" rel="noopener" data-translation="other-apps">Other Apps</a>
</footer>
<script>
var initPromise;

View File

@ -3764,6 +3764,41 @@ class LocalStorageSettingsFragment extends Fragment {
}
return res;
}
onStart() {
let res = super.onStart();
let settings = this.findBy(".setting", true);
const settingsManager = SettingsManager.getInstance();
for (let i = 0; i < settings.length; i++) {
let setting = settings[i];
const name = setting.name;
let value;
if (!setting["dataset"]["raw"]) {
value = settingsManager.getSetting(name);
} else {
value = localStorage.getItem(name);
}
let isCheckable = false;
if (setting instanceof HTMLInputElement && (setting.type === 'checkbox' || setting.type === 'radio')) {
isCheckable = true;
}
if (Helper.isNotNull(value)) {
if (isCheckable) {
setting.checked = (value === setting.value);
}
else {
setting.value = value;
}
if (value !== "") {
setting.classList.add("notEmpty");
}
}
}
return res;
}
}
class SmartColumn{
@ -6766,7 +6801,22 @@ class PrivacyPolicySite extends WordRotatorBaseSite {
super(siteManager, "html/application/privacyPolicy.html", "privacyPolicy");
}
onFirstStart() {
let trackSwitch =this.findBy("#track-switch");
trackSwitch.addEventListener("change", function (e) {
Matomo.setTrack(this.checked === true);
e.stopPropagation();
e.preventDefault();
});
super.onFirstStart();
}
onStart(args) {
let trackSwitch =this.findBy("#track-switch");
let shouldTrack = (Helper.nonNull(localStorage.getItem("matomoShouldTrack"), "1") === "1");
trackSwitch.checked = shouldTrack;
Matomo.update("Privacy Policy Site");
return super.onStart(args);
}
@ -6842,7 +6892,6 @@ class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
}
});
this.findBy("#reset-levels").addEventListener("click", () => {
localStorage.removeItem("currentLevel");
localStorage.removeItem("date-last-sync");

View File

@ -409,6 +409,41 @@ class LocalStorageSettingsFragment extends Fragment {
}
return res;
}
onStart() {
let res = super.onStart();
let settings = this.findBy(".setting", true);
const settingsManager = SettingsManager.getInstance();
for (let i = 0; i < settings.length; i++) {
let setting = settings[i];
const name = setting.name;
let value;
if (!setting["dataset"]["raw"]) {
value = settingsManager.getSetting(name);
} else {
value = localStorage.getItem(name);
}
let isCheckable = false;
if (setting instanceof HTMLInputElement && (setting.type === 'checkbox' || setting.type === 'radio')) {
isCheckable = true;
}
if (Helper.isNotNull(value)) {
if (isCheckable) {
setting.checked = (value === setting.value);
}
else {
setting.value = value;
}
if (value !== "") {
setting.classList.add("notEmpty");
}
}
}
return res;
}
}
class SmartColumn{

View File

@ -3,8 +3,8 @@
<h3 id="dsg-general-intro"></h3>
<p>Diese Datenschutzerklärung klärt Sie über die Art, den Umfang und Zweck der Verarbeitung von personenbezogenen
Daten (nachfolgend kurz „Daten“) im Rahmen der Erbringung unserer Leistungen sowie innerhalb unseres
Onlineangebotes und der mit ihm verbundenen Webseiten, Funktionen und Inhalte sowie externen Onlinepräsenzen,
wie z.B. unser Social Media Profile auf (nachfolgend gemeinsam bezeichnet als „Onlineangebot“). Im Hinblick auf
Onlineangebotes und der mit ihm verbundenen Webseiten, Funktionen und Inhalte sowie externen Onlinepräsenzen
(nachfolgend gemeinsam bezeichnet als „Onlineangebot“). Im Hinblick auf
die verwendeten Begrifflichkeiten, wie z.B. „Verarbeitung“ oder „Verantwortlicher“ verweisen wir auf die
Definitionen im Art. 4 der Datenschutzgrundverordnung (DSGVO). <br>
<br>
@ -18,11 +18,11 @@ Deutschland<br>
E-Mailadresse: wordRotator@silas.link<br>
Link zum Impressum: https://wordrotator.silas.link/impressum</span></p>
<h3 id="dsg-general-datatype">Arten der verarbeiteten Daten</h3>
<p>- Bestandsdaten (z.B., Personen-Stammdaten, Namen oder Adressen).<br>
<p>
- Bestandsdaten (z.B., Personen-Stammdaten, Namen oder Adressen).<br>
- Kontaktdaten (z.B., E-Mail, Telefonnummern).<br>
- Inhaltsdaten (z.B., Texteingaben, Fotografien, Videos).<br>
- Nutzungsdaten (z.B., besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten).<br>
- Meta-/Kommunikationsdaten (z.B., Geräte-Informationen, IP-Adressen).</p>
- Meta-/Kommunikationsdaten (z.B., Geräte-Informationen, Anonymisierte IP-Adressen).</p>
<h3 id="dsg-general-datasubjects">Kategorien betroffener Personen</h3>
<p>Besucher und Nutzer des Onlineangebotes (Nachfolgend bezeichnen wir die betroffenen Personen zusammenfassend auch
als „Nutzer“).<br>
@ -114,17 +114,17 @@ Link zum Impressum: https://wordrotator.silas.link/impressum</span></p>
Zugriff gewähren, erfolgt dies insbesondere zu administrativen Zwecken als berechtigtes Interesse und
darüberhinausgehend auf einer den gesetzlichen Vorgaben entsprechenden Grundlage. <br>
</p>
<h3 id="dsg-general-thirdparty">Übermittlungen in Drittländer</h3>
<p>Sofern wir Daten in einem Drittland (d.h. außerhalb der Europäischen Union (EU), des Europäischen
Wirtschaftsraums (EWR) oder der Schweizer Eidgenossenschaft) verarbeiten oder dies im Rahmen der Inanspruchnahme
von Diensten Dritter oder Offenlegung, bzw. Übermittlung von Daten an andere Personen oder Unternehmen
geschieht, erfolgt dies nur, wenn es zur Erfüllung unserer (vor)vertraglichen Pflichten, auf Grundlage Ihrer
Einwilligung, aufgrund einer rechtlichen Verpflichtung oder auf Grundlage unserer berechtigten Interessen
geschieht. Vorbehaltlich gesetzlicher oder vertraglicher Erlaubnisse, verarbeiten oder lassen wir die Daten in
einem Drittland nur beim Vorliegen der gesetzlichen Voraussetzungen. D.h. die Verarbeitung erfolgt z.B. auf
Grundlage besonderer Garantien, wie der offiziell anerkannten Feststellung eines der EU entsprechenden
Datenschutzniveaus (z.B. für die USA durch das „Privacy Shield“) oder Beachtung offiziell anerkannter spezieller
vertraglicher Verpflichtungen.</p>
<!--<h3 id="dsg-general-thirdparty">Übermittlungen in Drittländer</h3>-->
<!--<p>Sofern wir Daten in einem Drittland (d.h. außerhalb der Europäischen Union (EU), des Europäischen-->
<!--Wirtschaftsraums (EWR) oder der Schweizer Eidgenossenschaft) verarbeiten oder dies im Rahmen der Inanspruchnahme-->
<!--von Diensten Dritter oder Offenlegung, bzw. Übermittlung von Daten an andere Personen oder Unternehmen-->
<!--geschieht, erfolgt dies nur, wenn es zur Erfüllung unserer (vor)vertraglichen Pflichten, auf Grundlage Ihrer-->
<!--Einwilligung, aufgrund einer rechtlichen Verpflichtung oder auf Grundlage unserer berechtigten Interessen-->
<!--geschieht. Vorbehaltlich gesetzlicher oder vertraglicher Erlaubnisse, verarbeiten oder lassen wir die Daten in-->
<!--einem Drittland nur beim Vorliegen der gesetzlichen Voraussetzungen. D.h. die Verarbeitung erfolgt z.B. auf-->
<!--Grundlage besonderer Garantien, wie der offiziell anerkannten Feststellung eines der EU entsprechenden-->
<!--Datenschutzniveaus (z.B. für die USA durch das „Privacy Shield“) oder Beachtung offiziell anerkannter spezieller-->
<!--vertraglicher Verpflichtungen.</p>-->
<h3 id="dsg-general-rightssubject">Rechte der betroffenen Personen</h3>
<p>Sie haben das Recht, eine Bestätigung darüber zu verlangen, ob betreffende Daten verarbeitet werden und auf
Auskunft über diese Daten sowie auf weitere Informationen und Kopie der Daten entsprechend den gesetzlichen
@ -170,14 +170,6 @@ Link zum Impressum: https://wordrotator.silas.link/impressum</span></p>
entsprechende Option in den Systemeinstellungen ihres Browsers zu deaktivieren. Gespeicherte Cookies können in
den Systemeinstellungen des Browsers gelöscht werden. Der Ausschluss von Cookies kann zu
Funktionseinschränkungen dieses Onlineangebotes führen.<br>
<br>
Ein genereller Widerspruch gegen den Einsatz der zu Zwecken des Onlinemarketing eingesetzten Cookies kann bei
einer Vielzahl der Dienste, vor allem im Fall des Trackings, über die US-amerikanische Seite <a
href="http://www.aboutads.info/choices/">http://www.aboutads.info/choices/</a> oder die EU-Seite <a
href="http://www.youronlinechoices.com/">http://www.youronlinechoices.com/</a> erklärt werden. Des
Weiteren kann die Speicherung von Cookies mittels deren Abschaltung in den Einstellungen des Browsers erreicht
werden. Bitte beachten Sie, dass dann gegebenenfalls nicht alle Funktionen dieses Onlineangebotes genutzt werden
können.</p>
<h3 id="dsg-general-erasure">Löschung von Daten</h3>
<p>Die von uns verarbeiteten Daten werden nach Maßgabe der gesetzlichen Vorgaben gelöscht oder in ihrer Verarbeitung
eingeschränkt. Sofern nicht im Rahmen dieser Datenschutzerklärung ausdrücklich angegeben, werden die bei uns
@ -197,14 +189,19 @@ Link zum Impressum: https://wordrotator.silas.link/impressum</span></p>
<p></p>
<p><span class="ts-muster-content">Die von uns in Anspruch genommenen Hosting-Leistungen dienen der Zurverfügungstellung der folgenden Leistungen: Infrastruktur- und Plattformdienstleistungen, Rechenkapazität, Speicherplatz und Datenbankdienste, E-Mail-Versand, Sicherheitsleistungen sowie technische Wartungsleistungen, die wir zum Zwecke des Betriebs dieses Onlineangebotes einsetzen. <br>
<br>
Hierbei verarbeiten wir, bzw. unser Hostinganbieter Bestandsdaten, Kontaktdaten, Inhaltsdaten, Vertragsdaten, Nutzungsdaten, Meta- und Kommunikationsdaten von Kunden, Interessenten und Besuchern dieses Onlineangebotes auf Grundlage unserer berechtigten Interessen an einer effizienten und sicheren Zurverfügungstellung dieses Onlineangebotes gem. Art. 6 Abs. 1 lit. f DSGVO i.V.m. Art. 28 DSGVO (Abschluss Auftragsverarbeitungsvertrag).</span>
Hierbei verarbeiten wir, bzw. unser Hostinganbieter Bestandsdaten, Kontaktdaten, Vertragsdaten, Nutzungsdaten, Meta- und Kommunikationsdaten von Kunden, Interessenten und Besuchern dieses Onlineangebotes auf Grundlage unserer berechtigten Interessen an einer effizienten und sicheren Zurverfügungstellung dieses Onlineangebotes gem. Art. 6 Abs. 1 lit. f DSGVO i.V.m. Art. 28 DSGVO (Abschluss Auftragsverarbeitungsvertrag).</span>
</p>
<p></p>
<h3 id="dsg-logfiles">Erhebung von Zugriffsdaten und Logfiles</h3>
<p></p>
<p><span class="ts-muster-content">Wir, bzw. unser Hostinganbieter, erhebt auf Grundlage unserer berechtigten Interessen im Sinne des Art. 6 Abs. 1 lit. f. DSGVO Daten über jeden Zugriff auf den Server, auf dem sich dieser Dienst befindet (sogenannte Serverlogfiles). Zu den Zugriffsdaten gehören Name der abgerufenen Webseite, Datei, Datum und Uhrzeit des Abrufs, übertragene Datenmenge, Meldung über erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte Seite), IP-Adresse und der anfragende Provider.<br>
<p><span class="ts-muster-content">Wir, bzw. unser Hostinganbieter, erhebt auf Grundlage unserer berechtigten Interessen
im Sinne des Art. 6 Abs. 1 lit. f. DSGVO Daten über jeden Zugriff auf den Server, auf dem sich dieser Dienst befindet
(sogenannte Serverlogfiles). Zu den Zugriffsdaten gehören Name der abgerufenen Webseite, Datei, Datum und Uhrzeit des Abrufs,
übertragene Datenmenge, Meldung über erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL
(die zuvor besuchte Seite), IP-Adresse und der anfragende Provider.<br>
<br>
Logfile-Informationen werden aus Sicherheitsgründen (z.B. zur Aufklärung von Missbrauchs- oder Betrugshandlungen) für die Dauer von maximal 7 Tagen gespeichert und danach gelöscht. Daten, deren weitere Aufbewahrung zu Beweiszwecken erforderlich ist, sind bis zur endgültigen Klärung des jeweiligen Vorfalls von der Löschung ausgenommen.</span>
Logfile-Informationen werden aus Sicherheitsgründen (z.B. zur Aufklärung von Missbrauchs- oder Betrugshandlungen) für die
Dauer von maximal 5 Wochen gespeichert und danach gelöscht. Daten, deren weitere Aufbewahrung zu Beweiszwecken erforderlich ist, sind bis zur endgültigen Klärung des jeweiligen Vorfalls von der Löschung ausgenommen.</span>
</p>
<p></p>
<h3 id="dsg-matomo">Reichweitenmessung mit Matomo</h3>
@ -213,13 +210,24 @@ Logfile-Informationen werden aus Sicherheitsgründen (z.B. zur Aufklärung von M
<br>
Matomo verwendet Cookies, die auf dem Computer der Nutzer gespeichert werden und die eine Analyse der Benutzung unseres Onlineangebotes durch die Nutzer ermöglichen. Dabei können aus den verarbeiteten Daten pseudonyme Nutzungsprofile der Nutzer erstellt werden. Die Cookies haben eine Speicherdauer von einer Woche. Die durch das Cookie erzeugten Informationen über Ihre Benutzung dieser Webseite werden nur auf unserem Server gespeichert und nicht an Dritte weitergegeben.<br>
<br>
Nutzer können der anonymisierten Datenerhebung durch das Programm Matomo jederzeit mit Wirkung für die Zukunft widersprechen, indem sie auf den untenstehenden Link klicken. In diesem Fall wird in ihrem Browser ein sog. Opt-Out-Cookie abgelegt, was zur Folge hat, dass Matomo keinerlei Sitzungsdaten mehr erhebt. Wenn Nutzer ihre Cookies löschen, so hat dies jedoch zur Folge, dass auch das Opt-Out-Cookie gelöscht wird und daher von den Nutzern erneut aktiviert werden muss.<br>
Nutzer können der anonymisierten Datenerhebung durch das Programm Matomo jederzeit mit Wirkung für die Zukunft widersprechen,
indem sie den unten befindlichen Schalter nutzen. In diesem Fall wird in ihrem Browser ein sog. Opt-Out-Cookie abgelegt,
was zur Folge hat, dass Matomo keinerlei Sitzungsdaten mehr erhebt.
Wenn Nutzer ihre Cookies löschen, so hat dies jedoch zur Folge, dass auch das Opt-Out-Cookie gelöscht wird und daher
von den Nutzern erneut aktiviert werden muss.<br>
<br>
Die Logs mit den Daten der Nutzer werden nach spätestens einem Jahr gelöscht.<br>
<br>
<span style="color:red !important">[Bitte setzen Sie an dieser Stelle das IFRAME von Matomo mit dem opt-out cookie ein (und schalten die IP-Anonymisierung im Einstellungsbereich ein)]</span>.</span>
<br></span>
</p>
<label class="switch row setting-row">
<span class='columns small-6' data-translation="track"></span>
<span class='columns small-6 text-right'>
<input type="checkbox" class="setting" id="track-switch" name='matomoShouldTrack' value="1"
data-default="1" data-raw="1">
<span class="slider"></span>
</span>
</label>
<a href="https://datenschutz-generator.de" class="dsg1-6" rel="nofollow" target="_blank">Erstellt mit
Datenschutz-Generator.de von RA Dr. Thomas Schwenke</a>
<p>und angepasst vom Webseitenbetreiber</p>
Datenschutz-Generator.de von RA Dr. Thomas Schwenke</a><br/>
und angepasst vom Webseitenbetreiber
</div>

View File

@ -26,7 +26,6 @@ export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
}
});
this.findBy("#reset-levels").addEventListener("click", () => {
localStorage.removeItem("currentLevel");
localStorage.removeItem("date-last-sync");

View File

@ -85,6 +85,12 @@ export class MenuSite extends WordRotatorBaseSite {
this.listener();
window.addEventListener("resize", this.listener);
//Musikbuttons update, falls in den Einstellungen umgestellt
let playSoundButton = this.findBy("#play-sound");
playSoundButton.checked = settingsManager.getSetting("play-sound", true);
let playMusicButton = this.findBy("#play-music");
playMusicButton.checked = settingsManager.getSetting("play-music", true);
return res;
}

View File

@ -1,5 +1,5 @@
import {WordRotatorBaseSite} from "./WordRotatorBaseSite";
import {InitPromise} from "../../../../../js/lib/pwa-lib";
import {Helper, InitPromise} from "../../../../../js/lib/pwa-lib";
import {Matomo} from "../../../../../js/lib/pwa-assets";
export class PrivacyPolicySite extends WordRotatorBaseSite {
@ -7,7 +7,22 @@ export class PrivacyPolicySite extends WordRotatorBaseSite {
super(siteManager, "html/application/privacyPolicy.html", "privacyPolicy");
}
onFirstStart() {
let trackSwitch =this.findBy("#track-switch");
trackSwitch.addEventListener("change", function (e) {
Matomo.setTrack(this.checked === true);
e.stopPropagation();
e.preventDefault();
});
super.onFirstStart();
}
onStart(args) {
let trackSwitch =this.findBy("#track-switch");
let shouldTrack = (Helper.nonNull(localStorage.getItem("matomoShouldTrack"), "1") === "1");
trackSwitch.checked = shouldTrack;
Matomo.update("Privacy Policy Site");
return super.onStart(args);
}

View File

@ -465,6 +465,44 @@ test('SendUserstats', async t => {
await testLocalStorageSet("matomoShouldTrack", "1");
});
test.only('SendUserstatsInPrivacyPolicy', async t => {
await waitForMainMenu(t);
let matomoCheck = ClientFunction(() => {
return new Promise((resolve) => {
function check() {
window["_paq"].push([function () {
resolve(!this["isUserOptedOut"]());
}]);
}
window.addEventListener("load", () => {
check();
});
if (document.readyState === 'complete') {
check();
}
});
});
await t
.click(Selector(".action [data-translation-title='settings']"))
.click(Selector("#privacy-policy-button"))
.expect(Selector("#track-switch").checked).ok();
let res = await matomoCheck();
await t.expect(res).ok()
.click(Selector(".switch [data-translation='track']"))
.expect(Selector("#track-switch").checked).eql(false);
res = await matomoCheck();
await t.expect(res).eql(false)
.click(Selector(".switch [data-translation='track']"))
.expect(Selector("#track-switch").checked).ok();
res = await matomoCheck();
await t.expect(res).ok()
}).before(async t => {
await testLocalStorageSet("matomoShouldTrack", "1");
});
test('Themes', async t => {
await waitForMainMenu(t);
await t