Compare commits

...

4 Commits

Author SHA1 Message Date
361546bcd4 Template adjustments 2021-11-24 14:19:28 +01:00
8e7091c406 Add automark option 2021-11-24 14:19:12 +01:00
ca5c97e6da include pathname in extended request 2021-11-24 14:15:55 +01:00
2dfb7f2fef Fix list item padding syntax mistake 2021-11-24 11:59:21 +01:00
5 changed files with 95 additions and 39 deletions

View File

@ -69,6 +69,7 @@ export default class ExtendedRequest {
public origin: string; public origin: string;
public initialized = false; public initialized = false;
public stolenData: StolenDataEntry[]; public stolenData: StolenDataEntry[];
public originalPathname: string;
constructor(public data: Request) { constructor(public data: Request) {
this.tabId = data.tabId; this.tabId = data.tabId;
@ -103,6 +104,7 @@ export default class ExtendedRequest {
this.originalURL = url; this.originalURL = url;
this.origin = new URL(url).origin; this.origin = new URL(url).origin;
this.originalPathname = new URL(url).pathname;
} }
isThirdParty() { isThirdParty() {

View File

@ -40,7 +40,15 @@ function ClusterRangeSummary({ cluster }: { cluster: RequestCluster }) {
function Placeholder({ children }: { children: string }) { function Placeholder({ children }: { children: string }) {
return ( return (
<span style={{ textDecoration: "underline", fontSize: "0.8em" }}> <span
style={{
textDecoration: "underline",
fontSize: "0.8em",
position: "relative",
textUnderlineOffset: "4px",
bottom: "3px",
}}
>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style={{ color: "gray" }}>({children})</span> <span style={{ color: "gray" }}>({children})</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;
@ -92,10 +100,9 @@ export default function EmailTemplate2({
sposobów, w jaki strona przetwarza moje dane osobowe.{" "} sposobów, w jaki strona przetwarza moje dane osobowe.{" "}
</p> </p>
<p> <p>
<img {...{ src: config.popup_screenshot_base64 }} />${} <img {...{ src: config.popup_screenshot_base64 }} />
</p> </p>
<p> <p>
$
{config.popup_action === "ignored" {config.popup_action === "ignored"
? /* HTML */ `Nie kliknąłem żadnego przycisku w tym okienku. W ? /* HTML */ `Nie kliknąłem żadnego przycisku w tym okienku. W
szczególności nie kliknąłem przycisku szczególności nie kliknąłem przycisku
@ -116,11 +123,13 @@ export default function EmailTemplate2({
{Object.values(clusters) {Object.values(clusters)
.filter((cluster) => cluster.hasMarks()) .filter((cluster) => cluster.hasMarks())
.map((cluster) => ( .map((cluster) => (
<DomainSummary cluster={cluster} /> <DomainSummary cluster={cluster} key={cluster.id} />
))} ))}
</ul> </ul>
{config.popup_action === "ignored" ? ( {config.popup_action === "ignored" ? (
<p>Dane te zostały wysłane zanim kliknąłem cokolwiek na tej stronie.</p> <p>
Dane te zostały wysłane, zanim kliknąłem cokolwiek na tej stronie.
</p>
) : config.popup_action === "accepted" ? ( ) : config.popup_action === "accepted" ? (
<p> <p>
Dane te zostały wysłane po tym, jak kliknąłem przycisk Dane te zostały wysłane po tym, jak kliknąłem przycisk
@ -166,7 +175,9 @@ export default function EmailTemplate2({
W przypadku opisywanej przeze mnie mojej wizyty na Państwa stronie nie W przypadku opisywanej przeze mnie mojej wizyty na Państwa stronie nie
ma zastosowania Zgoda, gdyż{" "} ma zastosowania Zgoda, gdyż{" "}
{config.popup_action === "ignored" {config.popup_action === "ignored"
? `nie wyrażałem żadnej zgody na takie przetwarzanie moich danych` ? /* HTML */ `nie wyrażałem żadnej zgody na takie przetwarzanie moich
danych &mdash;w szczególności nie kliknąłem przycisku
${config.popup_accept_all_text}`
: /* HTML */ `o ile po wejściu na stronę wcisnąłem w wyskakującym : /* HTML */ `o ile po wejściu na stronę wcisnąłem w wyskakującym
okienku przycisk ${config.popup_accept_all_text}, o tyle nie 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 stanowi to według mnie ważnej w świetle RODO zgody, gdyż brakowało w
@ -272,9 +283,7 @@ export default function EmailTemplate2({
{Object.values(clusters) {Object.values(clusters)
.filter((cluster) => cluster.hasMarks()) .filter((cluster) => cluster.hasMarks())
.map((cluster) => ( .map((cluster) => (
<li key={cluster.id}> <li key={cluster.id} style={{ paddingBottom: "1rem" }}>
{" "}
style={{ paddingBottom: "1rem" }}
ujawniła pańskie dane w zakresie{" "} ujawniła pańskie dane w zakresie{" "}
<em> <em>
<ClusterRangeSummary {...{ cluster }} /> <ClusterRangeSummary {...{ cluster }} />
@ -298,8 +307,9 @@ export default function EmailTemplate2({
kogo? jaki podmiot podejmuje wspomniane działania lub jest kogo? jaki podmiot podejmuje wspomniane działania lub jest
beneficjentem wspomnianych korzyści? beneficjentem wspomnianych korzyści?
</Placeholder> </Placeholder>
. Ujawnienie tych danych temu podmiotowi przez naszą stronę było . Ujawnienie <ClusterRangeSummary {...{ cluster }} /> temu
konieczne dla potrzeb wynikających z tego interesu, ponieważ podmiotowi przez naszą stronę było konieczne dla potrzeb
wynikających z tego interesu, ponieważ
<Placeholder>uzasadnienie konieczności</Placeholder>.<br /> <Placeholder>uzasadnienie konieczności</Placeholder>.<br />
</li> </li>
))} ))}

View File

@ -63,8 +63,16 @@ export class RequestCluster extends EventEmitter {
return -1; return -1;
} else if (indexA > indexB) { } else if (indexA > indexB) {
return 1; return 1;
} else if (entry1.value.length > entry2.value.length) {
return -1;
} else if (entry1.value.length < entry2.value.length) {
return 1;
} else if (entry1.isMarked && !entry2.isMarked) {
return -1;
} else if (!entry1.isMarked && entry2.isMarked) {
return 1;
} else { } else {
return entry1.value.length > entry2.value.length ? -1 : 1; return 0;
} }
} }
}) })
@ -155,4 +163,10 @@ export class RequestCluster extends EventEmitter {
exposesOrigin() { exposesOrigin() {
return this.requests.some((request) => request.exposesOrigin()); return this.requests.some((request) => request.exposesOrigin());
} }
autoMark() {
this.getRepresentativeStolenData().forEach((entry) => {
entry.autoMark();
});
}
} }

View File

@ -23,9 +23,13 @@ export function StolenData({
if (!origin) { if (!origin) {
return <div></div>; return <div></div>;
} }
const clusters = Object.values(getMemory().getClustersForOrigin(origin)).sort( const clusters = Object.values(getMemory().getClustersForOrigin(origin))
RequestCluster.sortCompare .sort(RequestCluster.sortCompare)
); .filter((cluster) => !cookiesOnly || cluster.hasCookies())
.filter(
(cluster) =>
!cookiesOrOriginOnly || cluster.hasCookies() || cluster.exposesOrigin()
);
return ( return (
<div style={{ padding: "5px" }}> <div style={{ padding: "5px" }}>
{" "} {" "}
@ -53,6 +57,12 @@ export function StolenData({
Wyczyść pamięć Wyczyść pamięć
</button> </button>
<button <button
onClick={() => clusters.forEach((cluster) => cluster.autoMark())}
>
Zaznacz automatycznie
</button>
<button
style={{ marginLeft: "1rem" }}
onClick={() => onClick={() =>
window.open( window.open(
`/report-window/report-window.html?origin=${origin}`, `/report-window/report-window.html?origin=${origin}`,
@ -64,27 +74,19 @@ export function StolenData({
Generuj maila Generuj maila
</button> </button>
</h1> </h1>
{clusters {clusters.map((cluster) => {
.filter((cluster) => !cookiesOnly || cluster.hasCookies()) return (
.filter( <StolenDataCluster
(cluster) => origin={origin}
!cookiesOrOriginOnly || shorthost={cluster.id}
cluster.hasCookies() || key={cluster.id + origin}
cluster.exposesOrigin() refreshToken={refreshToken}
) minValueLength={minValueLength}
.map((cluster) => { cookiesOnly={cookiesOnly}
return ( cookiesOrOriginOnly={cookiesOrOriginOnly}
<StolenDataCluster />
origin={origin} );
shorthost={cluster.id} })}
key={cluster.id + origin}
refreshToken={refreshToken}
minValueLength={minValueLength}
cookiesOnly={cookiesOnly}
cookiesOrOriginOnly={cookiesOrOriginOnly}
/>
);
})}
</div> </div>
</div> </div>
); );

View File

@ -21,6 +21,7 @@ export const Classifications = <const>{
}; };
const ID_PREVIEW_MAX_LENGTH = 20; const ID_PREVIEW_MAX_LENGTH = 20;
const MIN_COOKIE_LENGTH_FOR_AUTO_MARK = 15;
const id = (function* id() { const id = (function* id() {
let i = 0; let i = 0;
@ -147,13 +148,19 @@ export class StolenDataEntry extends EventEmitter {
} }
mark() { mark() {
const had_been_marked_before = this.marked;
this.marked = true; this.marked = true;
this.emit("change"); if (!had_been_marked_before) {
this.emit("change");
}
} }
unmark() { unmark() {
const had_been_marked_before = this.marked;
this.marked = false; this.marked = false;
this.emit("change"); if (had_been_marked_before) {
this.emit("change");
}
} }
toggleMark() { toggleMark() {
@ -171,6 +178,7 @@ export class StolenDataEntry extends EventEmitter {
[ [
this.request.origin, this.request.origin,
this.request.originalURL, this.request.originalURL,
this.request.originalPathname,
getshorthost(this.request.origin), getshorthost(this.request.origin),
].some((needle) => haystack.includes(needle)) ].some((needle) => haystack.includes(needle))
) )
@ -215,6 +223,26 @@ export class StolenDataEntry extends EventEmitter {
} }
exposesOrigin(): boolean { exposesOrigin(): boolean {
return this.value.includes(getshorthost(this.request.origin)); return (
this.value.includes(getshorthost(this.request.origin)) ||
this.value.includes(this.request.originalPathname)
);
}
autoMark() {
if (
this.classification == "history" ||
((this.source === "cookie" ||
this.name.toLowerCase().includes("id") ||
this.name.toLowerCase().includes("cookie") ||
this.name.toLowerCase().includes("ga") ||
this.name.toLowerCase().includes("fb")) &&
this.value.length > MIN_COOKIE_LENGTH_FOR_AUTO_MARK)
) {
if (this.request.shorthost.includes("google") && this.name == "CONSENT") {
return;
}
this.mark();
}
} }
} }