From 2b6346bca0e0db52bfc86714382c2f9cd3c39833 Mon Sep 17 00:00:00 2001 From: Kuba Orlik Date: Thu, 10 Feb 2022 18:13:59 +0100 Subject: [PATCH] Reorganize problems --- report-window/deduce-problems.tsx | 238 +----------------- .../problems/no-information-at-all.tsx | 63 +++++ report-window/problems/problem.ts | 14 ++ report-window/problems/unlawful-cookies.tsx | 168 +++++++++++++ 4 files changed, 248 insertions(+), 235 deletions(-) create mode 100644 report-window/problems/no-information-at-all.tsx create mode 100644 report-window/problems/problem.ts create mode 100644 report-window/problems/unlawful-cookies.tsx diff --git a/report-window/deduce-problems.tsx b/report-window/deduce-problems.tsx index 0d80416..20377cc 100644 --- a/report-window/deduce-problems.tsx +++ b/report-window/deduce-problems.tsx @@ -1,240 +1,8 @@ import { RequestCluster } from '../request-cluster'; -import { ExplainerKey } from './explainers'; import { ParsedAnswers } from './parse-answers'; -import { v } from './verbs'; - -abstract class Problem { - constructor(public answers: ParsedAnswers, public clusters: Record) {} - - getMarkedClusters() { - return Object.values(this.clusters).filter((c) => c.hasMarks()); - } - - abstract getEmailContent(): JSX.Element; - abstract getNecessaryExplainers(): ExplainerKey[]; -} - -function formatRange(cluster: RequestCluster) { - const parts = [] as string[]; - console.log(cluster); - if (cluster.hasMarkedCookies()) { - parts.push('mojego identyfikatora internetowego pozyskanego z Cookie'); - } - if (cluster.exposesOrigin()) { - parts.push('części mojej historii przeglądania'); - } - return parts.join(' oraz '); -} - -class NoInformationAtAllProblem extends Problem { - getEmailContent() { - const _ = (word: string) => v(word, this.answers.zaimek); - return ( - <> -

Brak informacji na temat przetwarzania danych osobowych

-

- {_('Moje')} dane osobowe zostały ujawnione podmiotom, które są właścicielami domen: -

- -

- Na stronie brakuje jednak jakichkolwiek informacji o tym, jakie są cele przetwarzania - takich danych oraz jakie są podstawy prawne takiego przetwarzania. -

-

Zwracam się zatem do Państwa z następującymi pytaniami:

- - - ); - } - getNecessaryExplainers() { - const explainers = [] as Array; - - if ( - this.getMarkedClusters().some((cluster) => { - console.log(cluster); - return cluster.hasMarkedCookies(); - }) - ) { - explainers.push('cookies_are_pii'); - } - return explainers; - } -} - -class UnlawfulCookieAccess extends Problem { - getNecessaryExplainers(): ExplainerKey[] { - return []; - } - getEmailContent() { - const cookie_clusters = Object.values(this.clusters).filter((c) => c.hasMarkedCookies()); - const unnecessary_hosts = Object.entries(this.answers.hosts) - .filter(([, answers]) => answers.was_processing_necessary === 'no') - .map(([host]) => host); - const maybe_unnecessary_hosts = Object.entries(this.answers.hosts) - .filter(([, answers]) => answers.was_processing_necessary === 'not_sure') - .map(([host]) => host); - const _ = (key: string) => v(key, this.answers.zaimek); - return ( - <> -

Dostęp do cookies niezgodny z ustawą Prawo Telekomunikacyjne

-

- Państwa strona dokonała odczytu plików Cookie zapisanych na dysku twardym mojego - komputera. Dotyczy to plików cookie przypisanych do domen: -

-
    - {cookie_clusters.map((cluster, index) => { - const names = cluster - .getMarkedEntries() - .filter((e) => e.source === 'cookie') - .map((e) => e.name); - - return ( -
  • - {cluster.id} ({names.length > 1 ? 'pliki' : 'plik'}{' '} - {names.map((name, index) => { - return ( - <> - {index > 0 ? ', ' : ''} - {name} - - ); - })} - ){index === cookie_clusters.length - 1 ? '.' : ';'} -
  • - ); - })} -
-

- Zgodnie z treścią Art. 173.{' '} - - ustawy Prawo Telekomunikacyjne - - , strona może pozyskać dostęp do treści plików cookies pod warunkiem spełnienia - jednego z następujących warunków: -

-
    -
  1. - Użytkownik wyraził zgodę na takie przetwarzanie danych po tym, jak został - poinformowany bezpośrednio o celu uzyskania dostępu do tej informacji; -
  2. -
  3. - Dostęp do treści plików cookies jest konieczny do dostarczania usługi świadczonej - drogą elektroniczną zażądanej przez użytkownika. -
  4. -
- {(() => { - if (this.answers.popup_type == 'none' || this.answers.popup_type == 'page') { - return ( -

- Jako, że strona nie pytała {_('mnie')} nigdy o zgodę, nie jest spełniony - warunek 1. -

- ); - } else if (this.answers.popup_type === 'passive_popup') { - return ( -

- Państwa strona nie dała mi nigdy faktycznego wyboru dotyczacego wyrażenia - lub odmówienia zgody na takie przetwarzanie danych osobowych, dlatego nie - jest spełniony warunek 1.{' '} - {this.answers.mentions_passive_consent ? ( - <> - Zgody wyrażonej w sposób bierny lub milczący nie można uznać za ważną - w świetle obowiązujących przepisów rozporządzenia 2016/679. Dlatego - zaniechanie zmiany ustawień przeglądarki lub po prostu korzystanie ze - strony nie stanowi ważnej zgody. Takie jest{' '} - - stanowisko polskiego UODO - - . - - ) : ( - '' - )} -

- ); - } else if (this.answers.popup_type === 'some_choice') { - if (this.answers.popup_action === 'none') { - return ( -

- Nie {_('wyraziłem')} zgody na takie przetwarzanie {_('moich')} danych - osobowych. W okienku pytającym o zgodję nic nie {_('kliknąłem')}. Nie - jest zatem spełniony warunek 1. -

- ); - } else if (this.answers.popup_action === 'closed_popup') { - return ( -

- Nie {_('wyraziłem')} zgody na takie przetwarzanie {_('moich')} danych - osobowych. {this.answers.popup_closed_how.trim()} - {this.answers.popup_closed_how.trim().at(-1) != '.' ? '.' : ''} Takiego - działania nie można uznać za ważną zgodę na przetwarzanie danych - osobowych, gdyż nie spełnia warunku jednoznaczności opisanego w Art. 4, - pkt 11 RODO. Nie jest zatem spełniony warunek 1. -

- ); - } else if (this.answers.popup_action == 'deny_all') { - return ( -

- {this.answers.popup_deny_all_how.trim()} - {this.answers.popup_closed_how.trim().at(-1) != '.' ? '.' : ''} Zatem nie - jest spełniony warunek 1. -

- ); - } - } - })()} - {unnecessary_hosts.length > 0 ? ( -

- W {_('mojej')} ocenie odczytywanie przez Państwa stronę treści plików cookies z{' '} - {unnecessary_hosts.join(', ')} nie jest konieczne do wyświetlenia treści Państwa - strony, dlatego nie jest dla nich spełniony warunek 2. Jeżeli Państwa zdaniem jest - inaczej, {_('proszę')} o wskazanie, co jest źródłem tej konieczności i co odróżnia - Państwa stronę od wielu innych stron, które realizują te same funkcjonalności{' '} - bez korzystania z plików Cookie. -

- ) : ( - '' - )} -

- {_('Proszę')} o wskazanie, czy być może stosowali Państwo inną podstawę prawną do - takiego przetwarzania {_('moich')} danych osobowych, czy przetwarzali je państwo bez - ważnej podstawy prawnej? -

-

- {_('Proszę')} też o wskazanie, czy dostęp do treści plików cookie z $ - {maybe_unnecessary_hosts.join(', ')} jest konieczny do poprawnego działania strony? - Jeżeli tak, to {_('proszę')} wskazać, w jaki sposób. Co sprawia, że strona nie może - działać bez nich? -

- - ); - } - static qualifies(answers: ParsedAnswers, clusters: RequestCluster[]): boolean { - // są cookiesy, nie było zgody, nie są konieczne do działania strony - const cookie_clusters = Object.values(clusters).filter((c) => c.hasMarkedCookies()); - return cookie_clusters.some((cluster) => { - const hostAnswers = answers.hosts[cluster.id]; - return ( - (hostAnswers.present == 'not_mentioned' || - hostAnswers.present == 'not_before_making_a_choice' || - ['none', 'closed_popup', 'deny_all'].includes(hostAnswers.popup_action)) && - hostAnswers.was_processing_necessary != 'yes' - ); - }); - } -} +import NoInformationAtAllProblem from './problems/no-information-at-all'; +import { Problem } from './problems/problem'; +import { UnlawfulCookieAccess } from './problems/unlawful-cookies'; export default function deduceProblems( answers: ParsedAnswers, diff --git a/report-window/problems/no-information-at-all.tsx b/report-window/problems/no-information-at-all.tsx new file mode 100644 index 0000000..c11e10d --- /dev/null +++ b/report-window/problems/no-information-at-all.tsx @@ -0,0 +1,63 @@ +import { RequestCluster } from '../../request-cluster'; +import { ExplainerKey } from '../explainers'; +import { v } from '../verbs'; +import { Problem } from './problem'; + +function formatRange(cluster: RequestCluster) { + const parts = [] as string[]; + console.log(cluster); + if (cluster.hasMarkedCookies()) { + parts.push('mojego identyfikatora internetowego pozyskanego z Cookie'); + } + if (cluster.exposesOrigin()) { + parts.push('części mojej historii przeglądania'); + } + return parts.join(' oraz '); +} + +export default class NoInformationAtAllProblem extends Problem { + getEmailContent() { + const _ = (word: string) => v(word, this.answers.zaimek); + return ( + <> +

Brak informacji na temat przetwarzania danych osobowych

+

+ {_('Moje')} dane osobowe zostały ujawnione podmiotom, które są właścicielami domen: +

+
    + {this.getMarkedClusters().map((cluster) => ( +
  • + {cluster.id} (w zakresie: {formatRange(cluster)}) +
  • + ))} +
+

+ Na stronie brakuje jednak jakichkolwiek informacji o tym, jakie są cele przetwarzania + takich danych oraz jakie są podstawy prawne takiego przetwarzania. +

+

Zwracam się zatem do Państwa z następującymi pytaniami:

+
    +
  • Jaka jest tożsamość właścicieli tych domen?
  • +
  • Jaki jest cel takiego przetwarzania danych przez Państwa stronę?
  • +
  • + Jaka jest podstawa prawna takiego przetwarzania moich danych osobowych przez + Państwa stronę? +
  • +
+ + ); + } + getNecessaryExplainers() { + const explainers = [] as Array; + + if ( + this.getMarkedClusters().some((cluster) => { + console.log(cluster); + return cluster.hasMarkedCookies(); + }) + ) { + explainers.push('cookies_are_pii'); + } + return explainers; + } +} diff --git a/report-window/problems/problem.ts b/report-window/problems/problem.ts new file mode 100644 index 0000000..6967a30 --- /dev/null +++ b/report-window/problems/problem.ts @@ -0,0 +1,14 @@ +import { RequestCluster } from '../../request-cluster'; +import { ExplainerKey } from '../explainers'; +import { ParsedAnswers } from '../parse-answers'; + +export abstract class Problem { + constructor(public answers: ParsedAnswers, public clusters: Record) {} + + getMarkedClusters() { + return Object.values(this.clusters).filter((c) => c.hasMarks()); + } + + abstract getEmailContent(): JSX.Element; + abstract getNecessaryExplainers(): ExplainerKey[]; +} diff --git a/report-window/problems/unlawful-cookies.tsx b/report-window/problems/unlawful-cookies.tsx new file mode 100644 index 0000000..f631cdc --- /dev/null +++ b/report-window/problems/unlawful-cookies.tsx @@ -0,0 +1,168 @@ +import { RequestCluster } from '../../request-cluster'; +import { ExplainerKey } from '../explainers'; +import { ParsedAnswers } from '../parse-answers'; +import { v } from '../verbs'; +import { Problem } from './problem'; + +export class UnlawfulCookieAccess extends Problem { + getNecessaryExplainers(): ExplainerKey[] { + return []; + } + getEmailContent() { + const cookie_clusters = Object.values(this.clusters).filter((c) => c.hasMarkedCookies()); + const unnecessary_hosts = Object.entries(this.answers.hosts) + .filter(([, answers]) => answers.was_processing_necessary === 'no') + .map(([host]) => host); + const maybe_unnecessary_hosts = Object.entries(this.answers.hosts) + .filter(([, answers]) => answers.was_processing_necessary === 'not_sure') + .map(([host]) => host); + const _ = (key: string) => v(key, this.answers.zaimek); + return ( + <> +

Dostęp do cookies niezgodny z ustawą Prawo Telekomunikacyjne

+

+ Państwa strona dokonała odczytu plików Cookie zapisanych na dysku twardym mojego + komputera. Dotyczy to plików cookie przypisanych do domen: +

+
    + {cookie_clusters.map((cluster, index) => { + const names = cluster + .getMarkedEntries() + .filter((e) => e.source === 'cookie') + .map((e) => e.name); + + return ( +
  • + {cluster.id} ({names.length > 1 ? 'pliki' : 'plik'}{' '} + {names.map((name, index) => { + return ( + <> + {index > 0 ? ', ' : ''} + {name} + + ); + })} + ){index === cookie_clusters.length - 1 ? '.' : ';'} +
  • + ); + })} +
+

+ Zgodnie z treścią Art. 173.{' '} + + ustawy Prawo Telekomunikacyjne + + , strona może pozyskać dostęp do treści plików cookies pod warunkiem spełnienia + jednego z następujących warunków: +

+
    +
  1. + Użytkownik wyraził zgodę na takie przetwarzanie danych po tym, jak został + poinformowany bezpośrednio o celu uzyskania dostępu do tej informacji; +
  2. +
  3. + Dostęp do treści plików cookies jest konieczny do dostarczania usługi świadczonej + drogą elektroniczną zażądanej przez użytkownika. +
  4. +
+ {(() => { + if (this.answers.popup_type == 'none' || this.answers.popup_type == 'page') { + return ( +

+ Jako, że strona nie pytała {_('mnie')} nigdy o zgodę, nie jest spełniony + warunek 1. +

+ ); + } else if (this.answers.popup_type === 'passive_popup') { + return ( +

+ Państwa strona nie dała mi nigdy faktycznego wyboru dotyczacego wyrażenia + lub odmówienia zgody na takie przetwarzanie danych osobowych, dlatego nie + jest spełniony warunek 1.{' '} + {this.answers.mentions_passive_consent ? ( + <> + Zgody wyrażonej w sposób bierny lub milczący nie można uznać za ważną + w świetle obowiązujących przepisów rozporządzenia 2016/679. Dlatego + zaniechanie zmiany ustawień przeglądarki lub po prostu korzystanie ze + strony nie stanowi ważnej zgody. Takie jest{' '} + + stanowisko polskiego UODO + + . + + ) : ( + '' + )} +

+ ); + } else if (this.answers.popup_type === 'some_choice') { + if (this.answers.popup_action === 'none') { + return ( +

+ Nie {_('wyraziłem')} zgody na takie przetwarzanie {_('moich')} danych + osobowych. W okienku pytającym o zgodję nic nie {_('kliknąłem')}. Nie + jest zatem spełniony warunek 1. +

+ ); + } else if (this.answers.popup_action === 'closed_popup') { + return ( +

+ Nie {_('wyraziłem')} zgody na takie przetwarzanie {_('moich')} danych + osobowych. {this.answers.popup_closed_how.trim()} + {this.answers.popup_closed_how.trim().at(-1) != '.' ? '.' : ''} Takiego + działania nie można uznać za ważną zgodę na przetwarzanie danych + osobowych, gdyż nie spełnia warunku jednoznaczności opisanego w Art. 4, + pkt 11 RODO. Nie jest zatem spełniony warunek 1. +

+ ); + } else if (this.answers.popup_action == 'deny_all') { + return ( +

+ {this.answers.popup_deny_all_how.trim()} + {this.answers.popup_closed_how.trim().at(-1) != '.' ? '.' : ''} Zatem nie + jest spełniony warunek 1. +

+ ); + } + } + })()} + {unnecessary_hosts.length > 0 ? ( +

+ W {_('mojej')} ocenie odczytywanie przez Państwa stronę treści plików cookies z{' '} + {unnecessary_hosts.join(', ')} nie jest konieczne do wyświetlenia treści Państwa + strony, dlatego nie jest dla nich spełniony warunek 2. Jeżeli Państwa zdaniem jest + inaczej, {_('proszę')} o wskazanie, co jest źródłem tej konieczności i co odróżnia + Państwa stronę od wielu innych stron, które realizują te same funkcjonalności{' '} + bez korzystania z plików Cookie. +

+ ) : ( + '' + )} +

+ {_('Proszę')} o wskazanie, czy być może stosowali Państwo inną podstawę prawną do + takiego przetwarzania {_('moich')} danych osobowych, czy przetwarzali je państwo bez + ważnej podstawy prawnej? +

+

+ {_('Proszę')} też o wskazanie, czy dostęp do treści plików cookie z + {maybe_unnecessary_hosts.join(', ')} jest konieczny do poprawnego działania strony? + Jeżeli tak, to {_('proszę')} wskazać, w jaki sposób. Co sprawia, że strona nie może + działać bez nich? +

+ + ); + } + static qualifies(answers: ParsedAnswers, clusters: RequestCluster[]): boolean { + // są cookiesy, nie było zgody, nie są konieczne do działania strony + const cookie_clusters = Object.values(clusters).filter((c) => c.hasMarkedCookies()); + return cookie_clusters.some((cluster) => { + const hostAnswers = answers.hosts[cluster.id]; + return ( + (hostAnswers.present == 'not_mentioned' || + hostAnswers.present == 'not_before_making_a_choice' || + ['none', 'closed_popup', 'deny_all'].includes(hostAnswers.popup_action)) && + hostAnswers.was_processing_necessary != 'yes' + ); + }); + } +}