Add unknown-legal-basis problem

#64
Kuba Orlik 2022-07-07 21:16:48 +02:00
rodzic 6e062f92d7
commit f39bfd12b5
13 zmienionych plików z 100 dodań i 26 usunięć

Wyświetl plik

@ -2,18 +2,14 @@ import { RequestCluster } from '../../request-cluster';
import { ParsedAnswers } from './parse-answers';
import NoInformationAtAllProblem from './problems/no-information-at-all';
import { Problem } from './problems/problem';
import { UnknownLegalBasis } from './problems/unknown-legal-basis';
import { UnlawfulCookieAccess } from './problems/unlawful-cookies';
export default function deduceProblems(
answers: ParsedAnswers,
clusters: Record<string, RequestCluster>
): Problem[] {
const problems = [];
if (answers.popup_type === 'none') {
problems.push(new NoInformationAtAllProblem(answers, clusters));
}
if (UnlawfulCookieAccess.qualifies(answers, Object.values(clusters))) {
problems.push(new UnlawfulCookieAccess(answers, clusters));
}
return problems;
return [NoInformationAtAllProblem, UnlawfulCookieAccess, UnknownLegalBasis]
.map((c) => new c(answers, clusters))
.filter((p) => p.qualifies());
}

Wyświetl plik

@ -19,6 +19,7 @@ export default function EmailContent({
visited_url: string;
clusters: Record<string, RequestCluster>;
}) {
console.log('rendering email!', answers);
const _ = (key: string) => v(key, answers.zaimek);
const problems = deduceProblems(answers, clusters);
const explainers = Array.from(

Wyświetl plik

@ -20,7 +20,7 @@ export const Explainers: Record<ExplainerKey, (zaimek_index: 0 | 1 | 2 | 3) => J
W wypadku, gdy ujawnienie czy dostęp do danych osobowych zostało dokonane przez
skrypty podmiotów trzecich (np. Google, Facebook, itp), których autorem nie jest
Administrator strony, Administrator wciąż jest odpowiedzialny za procesy
przetwarzania danych osobowych, jakie realizują te skrypty&mdash;w myśl treści{' '}
przetwarzania danych osobowych, jakie realizują te skrypty - w myśl treści{' '}
<a href="https://curia.europa.eu/juris/document/document.jsf?text=&docid=216555&pageIndex=0&doclang=PL&mode=lst&dir=&occ=first&part=1&cid=1254905">
wyroku TSUE w sprawie C-40/17
</a>

Wyświetl plik

@ -16,14 +16,7 @@ function generateHostPage(
return { defaultValueExpression: `{${f(name, previous_cluster)}}` };
}
const domain = cluster.id;
let types_of_data: string[] = [];
if (cluster.exposesOrigin()) {
types_of_data.push('część Twojej historii przeglądania');
}
if (cluster.hasMarkedCookies()) {
types_of_data.push('unikalne ID z cookies');
}
const danych = types_of_data.join(', ');
const danych = cluster.getDataTypeDescription();
return {
title: cluster.id,
elements: [

Wyświetl plik

@ -50,6 +50,7 @@ export function parseAnswers({
mentions_passive_consent,
rejection_is_hard,
administrator_identity_available_before_choice,
popup_action,
...rest
}: RawAnswers): ParsedAnswers {
return {
@ -62,6 +63,7 @@ export function parseAnswers({
mentions_passive_consent,
rejection_is_hard,
administrator_identity_available_before_choice,
popup_action,
hosts: parseHostAnswers(rest),
} as ParsedAnswers;
}

Wyświetl plik

@ -3,6 +3,9 @@ import { v } from '../verbs';
import { Problem } from './problem';
export default class NoInformationAtAllProblem extends Problem {
qualifies() {
return this.answers.popup_type === 'none';
}
getEmailContent() {
const _ = (word: string) => v(word, this.answers.zaimek);
return (

Wyświetl plik

@ -19,6 +19,7 @@ export abstract class Problem {
abstract getEmailContent(): JSX.Element;
abstract getNecessaryExplainers(): ExplainerKey[];
abstract qualifies(): boolean;
getMarkedClusters() {
return Object.values(this.clusters).filter((c) => c.hasMarks());

Wyświetl plik

@ -0,0 +1,70 @@
import { RequestCluster } from '../../../request-cluster';
import { ExplainerKey } from '../explainers';
import { ParsedHostAnswers } from '../parse-answers';
import { v } from '../verbs';
import { Problem } from './problem';
const testCluster: (cluster: RequestCluster, answers: ParsedHostAnswers | undefined) => boolean = (
cluster,
hostAnswers
) => {
if (!hostAnswers) {
return false;
}
if (cluster.hasMarkedCookies()) {
/* if it has cookies, it will be picked up by the UnlawfulCookieAccess problem, and that one
is pretty detailed, so no need to mention it here. */
return false;
}
return hostAnswers.legal_basis_type == 'not_mentioned';
};
export class UnknownLegalBasis extends Problem {
getNecessaryExplainers(): ExplainerKey[] {
return ['responsibility_for_third_parties'];
}
qualifies(): boolean {
return Object.values(this.clusters).some((cluster) =>
testCluster(cluster, this.answers.hosts[cluster.id])
);
}
getRelatedClusters() {
return Object.values(this.clusters).filter((cluster) =>
testCluster(cluster, this.answers.hosts[cluster.id])
);
}
getEmailContent() {
const clusters = this.getRelatedClusters();
const _ = (key: string) => v(key, this.answers.zaimek);
return (
<>
<h2>Przetwarzanie danych osobowych bez podania podstawy prawnej</h2>
<p>Państwa strona przetworzyła {_('moje')} dane osobowe poprzez ujawnienie:</p>
<ul>
{clusters.map((cluster) => (
<li key={cluster.id}>
Właścicielowi domeny <strong>{cluster.id}</strong>:{' '}
{cluster.getDataTypeDescription('mojej')}
</li>
))}
</ul>
<p>
{_('Moja')} historia przeglądania stanowi {_('moje')} dane osobowe. Zgodnie z
treścią Artykułu 13 p. 1 lit. c){' '}
<a href="https://eur-lex.europa.eu/legal-content/PL/TXT/HTML/?uri=CELEX:32016R0679&qid=1632163985520&from=PL#d1e1822-1-1">
RODO
</a>
, aby przetwarzać dane osobowe, trzeba poinformować osobę, której dane dotyczą,
o tym, jaka jest podstawa prawna takiego przetwarzania danych.
</p>
<p>
Zwracam się zatem z pytaniem: jakie były podstawy prawne ujawnienia moich danych
każdemu z wyżej wymienionych podmiotów przez Państwa stronę?
</p>
</>
);
}
}

Wyświetl plik

@ -1,7 +1,5 @@
import { RequestCluster } from '../../../request-cluster';
import { wordlist } from '../../../util';
import { ExplainerKey } from '../explainers';
import { ParsedAnswers } from '../parse-answers';
import { v } from '../verbs';
import { Problem } from './problem';
@ -10,16 +8,16 @@ export class UnlawfulCookieAccess extends Problem {
return ['cookies_are_pii', 'responsibility_for_third_parties'];
}
static qualifies(answers: ParsedAnswers, clusters: RequestCluster[]): boolean {
qualifies(): boolean {
// są cookiesy, nie było zgody, nie są konieczne do działania strony
const cookie_clusters = Object.values(clusters).filter((c) => c.hasMarkedCookies());
const cookie_clusters = Object.values(this.clusters).filter((c) => c.hasMarkedCookies());
return cookie_clusters.some((cluster) => {
const hostAnswers = answers.hosts[cluster.id];
const hostAnswers = this.answers.hosts[cluster.id];
return (
(hostAnswers.present == 'not_mentioned' ||
hostAnswers.present == 'not_before_making_a_choice' ||
['none', 'closed_popup', 'deny_all'].includes(answers.popup_action) ||
answers.popup_type === 'none') &&
['none', 'closed_popup', 'deny_all'].includes(this.answers.popup_action) ||
this.answers.popup_type === 'none') &&
hostAnswers.was_processing_necessary != 'yes'
);
});

Wyświetl plik

@ -8,6 +8,7 @@ const words = {
mnie: ['mnie', 'mnie', 'mnie', 'nas'],
moich: ['moich', 'moich', 'moich', 'naszych'],
moje: ['moje', 'moje', 'moje', 'nasze'],
moja: ['moja', 'moja', 'moja', 'nasza'],
mojej: ['mojej', 'mojej', 'mojej', 'naszej'],
muszę: ['muszę', 'muszę', 'muszę', 'musimy'],
odkliknąłeś: ['odkliknąłeś', 'odkliknęłaś', 'odklikęłoś', 'odkliknęliście'],

1
package-lock.json wygenerowano
Wyświetl plik

@ -5,7 +5,6 @@
"requires": true,
"packages": {
"": {
"name": "rentgen",
"version": "0.0.3",
"license": "GPL-3.0-or-later",
"dependencies": {

Wyświetl plik

@ -182,4 +182,15 @@ export class RequestCluster extends SaferEmitter {
entry.unmark();
});
}
getDataTypeDescription(noun = 'Twojej') {
let types_of_data: string[] = [];
if (this.exposesOrigin()) {
types_of_data.push(`część ${noun} historii przeglądania`);
}
if (this.hasMarkedCookies()) {
types_of_data.push('unikalne ID z cookies');
}
return types_of_data.join(', ');
}
}

Wyświetl plik

@ -48,7 +48,6 @@ export class SaferEmitter extends EventEmitter {
Reflect.apply(listener, this, args);
} catch (error) {
console.error(error);
debugger;
}
});
}