420 lines
18 KiB
TypeScript
420 lines
18 KiB
TypeScript
import React, { useState } from "react";
|
||
import { RequestCluster } from "../request-cluster";
|
||
import { StolenDataEntry } from "../stolen-data-entry";
|
||
import { getDate, unique } from "../util";
|
||
import DomainSummary from "./domain-summary";
|
||
import EmailTemplate2Controls from "./email-template-2-controls";
|
||
|
||
export type EmailTemplate2Config = {
|
||
popup_type: "none" | "passive_cookie_banner" | "consent";
|
||
popup_action: "ignored" | "accepted" | "closed";
|
||
popup_closed_how: string;
|
||
popup_screenshot_base64: string | null;
|
||
popup_accept_all_text: string;
|
||
popup_mentions_passive_consent: boolean;
|
||
popup_passive_consent_text: string;
|
||
};
|
||
|
||
function ClusterRangeSummary({ cluster }: { cluster: RequestCluster }) {
|
||
const range = unique(
|
||
cluster.getMarkedEntries().map((entry) => entry.classification)
|
||
);
|
||
const has_cookie_ids = cluster
|
||
.getMarkedEntries()
|
||
.filter((entry) => entry.source === "cookie")
|
||
.some((entry) => entry.classification == "id");
|
||
return (
|
||
<>
|
||
{[
|
||
"Pańskiego adresu IP",
|
||
range.includes("id")
|
||
? "Pańskiego identyfikatora interenetowego" +
|
||
(has_cookie_ids ? " z cookie" : "")
|
||
: "",
|
||
range.includes("history")
|
||
? "części Pańskiej historii przeglądania"
|
||
: "",
|
||
range.includes("location") ? "informacji na temat Pana położenia" : "",
|
||
]
|
||
.filter((e) => e !== "")
|
||
.join(", ")}
|
||
</>
|
||
);
|
||
}
|
||
|
||
function Placeholder({ children }: { children: string }) {
|
||
return (
|
||
<span
|
||
style={{
|
||
textDecoration: "underline",
|
||
fontSize: "0.8em",
|
||
position: "relative",
|
||
textUnderlineOffset: "4px",
|
||
bottom: "3px",
|
||
}}
|
||
>
|
||
<span dangerouslySetInnerHTML={{ __html: " ".repeat(12) }}></span>
|
||
<span style={{ color: "gray" }}>({children})</span>
|
||
<span dangerouslySetInnerHTML={{ __html: " ".repeat(12) }}></span>
|
||
</span>
|
||
);
|
||
}
|
||
|
||
function Base64Image({ base64 }: { base64: string }) {
|
||
return <img style={{ maxWidth: "100%" }} {...{ src: base64 }} />;
|
||
}
|
||
|
||
export default function EmailTemplate2({
|
||
entries,
|
||
clusters,
|
||
}: {
|
||
entries: StolenDataEntry[];
|
||
clusters: Record<string, RequestCluster>;
|
||
version: number;
|
||
}): JSX.Element {
|
||
const [config, setConfig] = useState<EmailTemplate2Config>({
|
||
popup_type: "none",
|
||
popup_action: "ignored",
|
||
popup_screenshot_base64: null,
|
||
popup_accept_all_text: "Zaakceptuj wszystkie",
|
||
popup_mentions_passive_consent: false,
|
||
popup_passive_consent_text: "",
|
||
popup_closed_how: "kliknięcie przycisku „X”",
|
||
});
|
||
|
||
const visited_url = entries[0].request.originalURL;
|
||
|
||
return (
|
||
<>
|
||
<EmailTemplate2Controls {...{ config, setConfig }} />
|
||
<p>
|
||
Dzień dobry, w dniu {getDate()} odwiedziłem stronę {visited_url}.
|
||
</p>
|
||
{config.popup_type === "none" ? (
|
||
<p>
|
||
Nie ukazał mi się na stronie żaden mechanizm pozyskujący zgodę na
|
||
przetwarzanie moich danych osobowych lub umożliwiający mi wyrażenie
|
||
sprzeciwu wobec przetwarzania przez stronę moich danych osobowych w
|
||
zakresie wyraczającym poza procesy konieczne do wyświetlenia strony
|
||
</p>
|
||
) : config.popup_type == "passive_cookie_banner" ? (
|
||
<>
|
||
<p>Na stronie była widoczna informacja o plikach Cookie. </p>
|
||
<p>
|
||
<Base64Image {...{ base64: config.popup_screenshot_base64 }} />
|
||
</p>
|
||
</>
|
||
) : (
|
||
<>
|
||
<p>
|
||
Ukazało mi się okienko z informacjami i pytaniami dotyczącymi
|
||
sposobów, w jaki strona przetwarza moje dane osobowe.{" "}
|
||
</p>
|
||
<p>
|
||
<Base64Image {...{ base64: config.popup_screenshot_base64 }} />
|
||
</p>
|
||
<p>
|
||
{config.popup_action === "ignored"
|
||
? /* HTML */ `Nie kliknąłem żadnego przycisku w tym okienku. W
|
||
szczególności nie kliknąłem przycisku
|
||
„${config.popup_accept_all_text}”.`
|
||
: config.popup_action === "accepted"
|
||
? `Kliknąlem na widoczną w tym okienku opcję „${config.popup_accept_all_text}”.`
|
||
: ""}
|
||
</p>
|
||
</>
|
||
)}
|
||
<p>
|
||
W tym samym czasie rejestrowałem ruch sieciowy generowany przez tę
|
||
stronę za pomocą narzędzi w przeglądarce Firefox. Okazało się, że
|
||
Państwa strona wysłała była moje dane osobowe do następujących
|
||
podmiotów:
|
||
</p>
|
||
<ul>
|
||
{Object.values(clusters)
|
||
.filter((cluster) => cluster.hasMarks())
|
||
.map((cluster) => (
|
||
<DomainSummary cluster={cluster} key={cluster.id} />
|
||
))}
|
||
</ul>
|
||
{config.popup_action === "ignored" ? (
|
||
<p>
|
||
Dane te zostały wysłane, zanim kliknąłem cokolwiek na tej stronie.
|
||
</p>
|
||
) : config.popup_action === "accepted" ? (
|
||
<p>
|
||
Dane te zostały wysłane po tym, jak kliknąłem przycisk „
|
||
{config.popup_accept_all_text}”
|
||
</p>
|
||
) : (
|
||
""
|
||
)}
|
||
<p>
|
||
W załączeniu przesyłam część zrzutów ekranu dokumentujących fakt
|
||
wysłania tych danych przez Państwa stronę.{" "}
|
||
</p>
|
||
<h3>Podstawa prawna</h3>
|
||
<p>
|
||
Ustawa Prawo Telekomunikacyjne w art. 173 reguluje warunki, które musi
|
||
spełnić administrator strony, aby jego strona mogła zapisywać i czytać
|
||
treść plików cookie. Nie reguluje jednak tego, jakim podmiotom i w jakim
|
||
zakresie dane mogą być <em>ujawniane</em> przez stronę. Tym zajmuje się
|
||
Rozporządzenie 2016/679 Parlamentu Europejskiego i Rady (UE) z dnia 27
|
||
kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z
|
||
przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich
|
||
danych oraz uchylenia dyrektywy 95/46/WE (ogólne rozporządzenie o
|
||
ochronie danych) – RODO. Zapis/odczyt plików cookie a ujawnianie ich
|
||
treści podmiotom trzecim to dwa różne procesy. Niniejsza wiadomość i
|
||
pytania w niej zawarte dotyczą właśnie <em>ujawniania</em> moich danych
|
||
osobowych (pochodzących m.in. z Cookies) podmiotom trzecim.
|
||
</p>
|
||
<p>
|
||
W kontekście stron internetowych są właściwie dopuszczalne tylko trzy z
|
||
sześciu wymienionych w Art. 6 pkt 1 RODO podstaw prawnych dla
|
||
przetwarzania danych osobowych:
|
||
</p>
|
||
<ol>
|
||
<li>
|
||
„Zgoda” — osoba, której dane dotyczą wyraziła zgodę na
|
||
przetwarzanie swoich danych osobowych w jednym lub większej liczbie
|
||
określonych celów (<em>Art. 6 pkt 1 lit. a)</em>).
|
||
</li>
|
||
<li>
|
||
„Niezbędność” — przetwarzanie jest niezbędne do wykonania umowy,
|
||
której stroną jest osoba, której dane dotyczą, lub do podjęcia działań
|
||
na żądanie osoby, której dane dotyczą, przed zawarciem umowy (
|
||
<em>Art. 6 pkt 1 lit. b)</em>);{" "}
|
||
</li>
|
||
<li>
|
||
„Uzasadniony Interes” — przetwarzanie jest niezbędne do celów
|
||
wynikających z prawnie uzasadnionych interesów realizowanych przez
|
||
administratora lub przez stronę trzecią, z wyjątkiem sytuacji, w
|
||
których nadrzędny charakter wobec tych interesów mają interesy lub
|
||
podstawowe prawa i wolności osoby, której dane dotyczą, wymagające
|
||
ochrony danych osobowych, w szczególności gdy osoba, której dane
|
||
dotyczą, jest dzieckiem (<em>Art. 6 pkt 1 lit. f)</em>
|
||
);
|
||
</li>
|
||
</ol>
|
||
<p>
|
||
W przypadku opisywanej przeze mnie mojej wizyty na Państwa stronie nie
|
||
ma zastosowania „Zgoda”, gdyż{" "}
|
||
{config.popup_action === "ignored" ? (
|
||
<>
|
||
nie wyrażałem żadnej zgody na takie przetwarzanie moich danych
|
||
{config.popup_type === "consent" ? (
|
||
<>
|
||
— w szczególności nie kliknąłem przycisku „
|
||
{config.popup_accept_all_text}”
|
||
</>
|
||
) : (
|
||
""
|
||
)}
|
||
.
|
||
</>
|
||
) : config.popup_action === "accepted" ? (
|
||
<>
|
||
o ile po wejściu na stronę wcisnąłem w wyskakującym okienku przycisk
|
||
„{config.popup_accept_all_text}”, o tyle nie stanowi to według mnie
|
||
ważnej w świetle RODO zgody, gdyż brakowało w tym okienku równie
|
||
łatwo osiągalnego przycisku, którego kliknięcie skutkowałoby
|
||
zasygnalizowaniem braku mojej zgody na takie przetwarzanie moich
|
||
danych. Mówiąc wprost — wyrażenie „zgody” było łatwiejsze niż
|
||
jej niewyrażenie. Niewyrażenie zgody wiąże się z negatywną
|
||
konsekwencją konieczności przechodzenia przez dodatkowe kroki w
|
||
wyskakującym okienku. Zatem tak otrzymana przez Państwo moja „zgoda”
|
||
nie jest poprawną podstawą prawną do przetwarzania moich danych
|
||
osobowych, gdyż nie spełnia warunku dobrowolności wspomnianego w
|
||
motywie (42) RODO.
|
||
</>
|
||
) : config.popup_action === "closed" ? (
|
||
<>
|
||
zamknąłem okienko pytające o zgodę poprzez {config.popup_closed_how}
|
||
. Nie może być to uznane za zgodę, bo nie spełnia to warunku
|
||
jednoznaczności opisanego w motywie (32) Rozporządzenia 2016/679.{" "}
|
||
</>
|
||
) : (
|
||
""
|
||
)}{" "}
|
||
Za zgodę nie można też uznać posiadania włączonej obsługi cookies w
|
||
przeglądarce (gdyż aby zgoda była ważna, musi być szczegółowa dla
|
||
każdego celów z osobna), jakichkolwiek innych ustawień przeglądarki, ani
|
||
pasywnych działań z mojej strony (np. „kontynuowanie korzystania ze
|
||
strony”)
|
||
{config.popup_mentions_passive_consent ? (
|
||
<>
|
||
{" "}
|
||
— nieprawdą więc jest zawarty na Państwa stronie komunikat „
|
||
{config.popup_passive_consent_text.trim()}” (por. paragraf 97.{" "}
|
||
<a href="https://edpb.europa.eu/sites/default/files/files/file1/edpb_guidelines_202005_consent_pl.pdf">
|
||
oficjalnych wytycznych EROD dotyczących zgody na mocy
|
||
rozporządzenia 2016/679
|
||
</a>
|
||
)
|
||
</>
|
||
) : (
|
||
""
|
||
)}
|
||
.
|
||
</p>
|
||
<p>
|
||
W mojej ocenie „Niezbędność“ nie ma zastosowania co do opisanych powyżej
|
||
sposobów przetwarzania danych. Nie widzę, co miałoby sprawiać, aby
|
||
wysyłanie moich danych osobowych do wspomnianych powyżej podmiotów
|
||
trzecich było konieczne do wyświetlenia Państwa strony na ekranie mojego
|
||
komputera (zob.{" "}
|
||
<a href="https://edpb.europa.eu/system/files/2021-11/edpb_guidelines_082020_on_the_targeting_of_social_media_users_pl_0.pdf">
|
||
Wytyczne 8/2020 EROD dotyczące targetowania użytkowników mediów
|
||
społecznościowych
|
||
</a>
|
||
, par. 49);.{" "}
|
||
</p>
|
||
<p>
|
||
Pozostaje zatem „Uzasadniony Interes”. Aby Administrator mógł używać
|
||
uzasadnionego interesu jako podstawy prawnej targetowania użytkowników
|
||
Sieci, muszą zostać spełnione m.in. następujące warunki:{" "}
|
||
</p>
|
||
<ol>
|
||
<li>
|
||
Administrator danych lub podmiot trzeci, któremu dane są ujawniane
|
||
musi{" "}
|
||
<strong>
|
||
faktycznie realizować dany konkretny uzasadniony interes
|
||
</strong>{" "}
|
||
(
|
||
<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">
|
||
Wyrok TSUE z dnia 29 lipca 2019 r. w sprawie Fashion ID, C-40/17,
|
||
ECLI:EU:C:2019:629
|
||
</a>
|
||
, pkt 95.)
|
||
</li>
|
||
<li>
|
||
Takie przetwarzanie danych jest <strong>konieczne</strong> dla potrzeb
|
||
wynikających z danego uzasadnionego interesu (
|
||
<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">
|
||
Wyrok TSUE z dnia 29 lipca 2019 r. w sprawie Fashion ID, C-40/17,
|
||
ECLI:EU:C:2019:629
|
||
</a>
|
||
, pkt 95.)
|
||
</li>
|
||
<li>
|
||
Wybrany uzasadniony interes musi mieć pierwszeństwo nad prawami i
|
||
wolnościami osoby, której dotyczą przetwarzane dane (
|
||
<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">
|
||
Wyrok TSUE z dnia 29 lipca 2019 r. w sprawie Fashion ID, C-40/17,
|
||
ECLI:EU:C:2019:629
|
||
</a>
|
||
, pkt 95.)
|
||
</li>
|
||
<li>
|
||
Osoby, których dane dotyczą, powinny mieć możliwość wyrażenia
|
||
sprzeciwu wobec przetwarzania ich danych do celów związanych z
|
||
targetowaniem <strong>przed rozpoczęciem przetwarzania</strong> (zob.{" "}
|
||
<a href="https://edpb.europa.eu/system/files/2021-11/edpb_guidelines_082020_on_the_targeting_of_social_media_users_pl_0.pdf">
|
||
Wytyczne 8/2020 EROD dotyczące targetowania użytkowników mediów
|
||
społecznościowych
|
||
</a>
|
||
, par. 54);
|
||
</li>
|
||
</ol>
|
||
{config.popup_action !== "accepted" ? (
|
||
<p>
|
||
Moje dane zostały ujawnione podmiotom trzecim tuż po włączeniu strony,
|
||
zatem nie jest spełniony warunek 4. Apeluję o wdrożenie zmian na
|
||
stronie, które sprawią, że dopiero po świadomym niewyrażeniu sprzeciwu
|
||
przez użytkownika aktywowane są procesy przetwarzania danych
|
||
osobowych, których podstawą prawną jest uzasadniony interes.
|
||
</p>
|
||
) : (
|
||
""
|
||
)}
|
||
<p>
|
||
Jeżeli istnieją jednak inne niż uzasadniony interes ważne podstawy
|
||
prawne do takiego przetwarzania moich danych osobowych przez Państwa
|
||
stronę, proszę o ich wskazanie,{" "}
|
||
<em>dla każdego z wymienionych podmiotów z osobna</em>. (Przypominam, że
|
||
Art. 173 ustawy Prawo Telekomunikacyjne nie ma tutaj zastosowania,
|
||
ponieważ nie pytam o zapis/odczyt plików na moim komputerze, tylko o
|
||
ujawnianie moich danych osobowych podmiotom trzecim). W przeciwnym
|
||
wypadku, aby ustalić, czy moje dane były przez Państwa przetwarzane na
|
||
mocy uzasadnionego interesu zgodnie z prawem, proszę o wypełnienie
|
||
następującego szablonu (lub udzielenie tych samych informacji w innej
|
||
postaci, przy zachowaniu zakresu i szczegółowości informacji:
|
||
</p>
|
||
<div style={{ border: "1px solid black", padding: "1rem" }}>
|
||
<p>
|
||
W dniu {getDate()} strona {visited_url}:
|
||
</p>
|
||
<ul>
|
||
{Object.values(clusters)
|
||
.filter((cluster) => cluster.hasMarks())
|
||
.map((cluster) => (
|
||
<li key={cluster.id} style={{ paddingBottom: "1rem" }}>
|
||
ujawniła pańskie dane w zakresie{" "}
|
||
<em>
|
||
<ClusterRangeSummary {...{ cluster }} />
|
||
</em>{" "}
|
||
firmie <Placeholder>nazwa firmy</Placeholder>, która jest
|
||
właścicielem domeny <strong>{cluster.id}</strong> i swoją
|
||
politykę prywatności publikuje pod adresem{" "}
|
||
<Placeholder>
|
||
adres URL polityki prywatności tej firmy
|
||
</Placeholder>
|
||
. Podstawą prawną takiego przetwarzania danych przez naszą
|
||
stronę jest uzasadniony interes:{" "}
|
||
<Placeholder>
|
||
na czym polega ten uzasadniony interes, tzn. bieżące działania
|
||
podejmowane przez podmiot realizujący ten interes lub korzyści
|
||
dla podmiotu realizującego ten interes oczekiwane w bardzo
|
||
bliskiej przyszłości
|
||
</Placeholder>{" "}
|
||
realizowany przez{" "}
|
||
<Placeholder>
|
||
kogo? jaki podmiot podejmuje wspomniane działania lub jest
|
||
beneficjentem wspomnianych korzyści?
|
||
</Placeholder>
|
||
. Ujawnienie <ClusterRangeSummary {...{ cluster }} /> temu
|
||
podmiotowi przez naszą stronę było konieczne dla potrzeb
|
||
wynikających z tego interesu, ponieważ
|
||
<Placeholder>uzasadnienie konieczności</Placeholder>.<br />
|
||
</li>
|
||
))}
|
||
</ul>
|
||
</div>
|
||
<p>
|
||
Proszę w szczególności zwrócić uwagę na podanie adresów do polityk
|
||
prywatności tych firm, abym wiedział, jak skontaktować się z nimi i
|
||
wnioskować o usunięcie z ich baz wysłanych przez Państwa stronę moich
|
||
danych. )
|
||
</p>
|
||
<p>
|
||
W odpowiedzi proszę się nie powoływać na IAB Europe i ich rzekomą renomę
|
||
w tworzeniu rozwiązań zgodnych z RODO. IAB chroni interes reklamodawców,
|
||
a nie Użytkowników, i ich rozwiązania (np. TCF) są{" "}
|
||
<a href="https://panoptykon.org/search/site/IAB">
|
||
notorycznie niezgodne z RODO i pozbawione szacunku dla Użytkowników
|
||
</a>
|
||
.
|
||
</p>
|
||
<p>
|
||
Apeluję także o wprowadzenie stosownych zmian na stronie tak, aby nie
|
||
pozostawiać cienia wątpliwości odnośnie tego, na mocy jakiej przesłanki
|
||
legalizującej dane są przetwarzane przez wspomniane podmioty trzecie,
|
||
lub tak, aby te dane po prostu nie były wysyłane. Pomoże to zachować
|
||
prywatność innym użytkownikom Państwa strony. Polecam Państwa uwadze
|
||
<a href="https://edpb.europa.eu/sites/default/files/files/file1/edpb_guidelines_202005_consent_pl.pdf">
|
||
{" "}
|
||
oficjalne wytyczne EROD dotyczące zgody w kontekście RODO
|
||
</a>
|
||
. Aby na przykład zapobiec automatycznemu wysyłaniu historii
|
||
przeglądania do podmiotów trzecich przez Państwa stronę, można po prostu
|
||
ustawić odpowiednio treść nagłówka{" "}
|
||
<a href="https://developer.mozilla.org/pl/docs/Web/HTTP/Headers/Referrer-Policy">
|
||
Referrer-Policy{" "}
|
||
</a>
|
||
.
|
||
</p>
|
||
</>
|
||
);
|
||
}
|