Shorter HAR files. More precise controls over what's missing in the

consent popup
This commit is contained in:
Kuba Orlik 2021-11-22 12:03:55 +01:00
parent dbfc57126c
commit edfde535d2
5 changed files with 91 additions and 69 deletions

View File

@ -15,13 +15,6 @@ const emailSources: Record<Sources, string> = {
queryparams: "jako część adresu URL (query-params)",
};
const source_priority: Array<Sources> = [
"cookie",
"pathname",
"queryparams",
"header",
];
export default function DomainSummary({
cluster,
}: {
@ -32,49 +25,20 @@ export default function DomainSummary({
Właściciel domeny <strong>{cluster.id}</strong> otrzymał:{" "}
<ul>
<li>Mój adres IP</li>
{cluster
.getMarks()
.sort((markA, markB) => {
if (markA.entry.value > markB.entry.value) {
return -1;
} else if (markA.entry.value < markB.entry.value) {
return 1;
} else {
const indexA = source_priority.indexOf(markA.source);
const indexB = source_priority.indexOf(markB.source);
if (indexA < indexB) {
return -1;
} else if (indexA > indexB) {
return 1;
} else {
return markA.name > markB.name ? -1 : 1;
}
}
})
.filter((_, index, array) => {
if (index == 0) {
return true;
}
if (array[index].valuePreview === array[index - 1].valuePreview) {
return false;
} else {
return true;
}
})
.map((mark) => (
<li>
{emailClassifications[mark.classification]}{" "}
{emailSources[mark.source]} (nazwa: <code>{mark.name}</code>,{" "}
{mark.key ? (
<>
pozycja <code>{mark.key}</code>,
</>
) : (
""
)}
wartość: <code>{mark.valuePreview}</code>)
</li>
))}
{cluster.getRepresentativeMarks().map((mark) => (
<li>
{emailClassifications[mark.classification]}{" "}
{emailSources[mark.source]} (nazwa: <code>{mark.name}</code>,{" "}
{mark.key ? (
<>
pozycja <code>{mark.key}</code>,
</>
) : (
""
)}
wartość: <code>{mark.valuePreview}</code>)
</li>
))}
</ul>
</li>
);

View File

@ -4,12 +4,11 @@ import { RequestCluster } from "../request-cluster";
import { getDate, toBase64 } from "../util";
import DomainSummary from "./domain-summary";
type PopupState = "not_clicked" | "clicked_but_invalid";
type PopupState = "not_clicked" | "clicked_but_no_reject_all";
export default function EmailTemplate({
marks,
clusters,
version,
}: {
marks: Mark[];
clusters: Record<string, RequestCluster>;
@ -32,9 +31,11 @@ export default function EmailTemplate({
onChange={(e) => setPopupState(e.target.value as PopupState)}
>
<option value="not_clicked">Nic nie kliknięte</option>
<option value="clicked_but_invalid">Kliknięte, ale nieważne</option>
<option value="clicked_but_no_reject_all">
Kliknięte "akceptuj wszystkie", ale nie było opcji "Odrzuć wszystkie"
</option>
</select>
{popupState === "clicked_but_invalid" ? (
{popupState === "clicked_but_no_reject_all" ? (
<>
<div>
<label htmlFor="acceptAllName">
@ -88,22 +89,26 @@ export default function EmailTemplate({
okienka ze zgodami.
</p>
) : null}
{popupState === "clicked_but_invalid" ? (
{popupState === "clicked_but_no_reject_all" ? (
<p>
O ile po wejściu na stronę wcisnąłem w wyskakującym okienku przycisk
{acceptAllName}, 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. Zatem tak
otrzymana przez Państwo moja zgoda nie jest poprawną podstawą prawną
do przetwarzania moich danych osobowych (
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 Art. 4. pkt 11{" "}
<em>
art. 7 ust. 3 Rozporządzenia Parlamentu Europejskiego i Rady (UE)
2016/679 z dnia 27 kwietnia 2016
rozporządzenia Parlamentu Europejskiego i Rady (UE) 2016/679 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
</em>
).
{<img {...{ src: popupScreenshotBase64 }} />}
.{<img {...{ src: popupScreenshotBase64 }} />}
</p>
) : null}
<p>

View File

@ -16,11 +16,7 @@ function Report() {
}
const clusters = getMemory().getClustersForOrigin(origin);
const marks = Object.values(clusters)
.map((cluster) => cluster.getMarkedRequests())
.reduce(reduceConcat, [])
.map((request) => request.getMarkedEntries())
.reduce(reduceConcat, [])
.map((entry) => entry.marks)
.map((cluster) => cluster.getRepresentativeMarks())
.reduce(reduceConcat, []);
return (
<div {...{ "data-version": counter }}>

View File

@ -1,8 +1,19 @@
import { EventEmitter } from "events";
import ExtendedRequest from "./extended-request";
import { MergedStolenDataEntry, StolenDataEntry } from "./stolen-data-entry";
import {
MergedStolenDataEntry,
Sources,
StolenDataEntry,
} from "./stolen-data-entry";
import { allSubhosts, reduceConcat, unique } from "./util";
import { allSubhosts, isSameURL, reduceConcat, unique } from "./util";
const source_priority: Array<Sources> = [
"cookie",
"pathname",
"queryparams",
"header",
];
export class RequestCluster extends EventEmitter {
public requests: ExtendedRequest[] = [];
@ -122,4 +133,41 @@ export class RequestCluster extends EventEmitter {
.map((entry) => entry.marks)
.reduce(reduceConcat, []);
}
getRepresentativeMarks() {
// removes duplicates so the email/HAR file is shorter
return this.getMarks()
.sort((markA, markB) => {
if (markA.entry.value > markB.entry.value) {
return -1;
} else if (markA.entry.value < markB.entry.value) {
return 1;
} else {
const indexA = source_priority.indexOf(markA.source);
const indexB = source_priority.indexOf(markB.source);
if (indexA < indexB) {
return -1;
} else if (indexA > indexB) {
return 1;
} else {
return markA.entry.value.length > markB.entry.value.length ? -1 : 1;
}
}
})
.filter((_, index, array) => {
if (index == 0) {
return true;
}
if (
array[index].valuePreview === array[index - 1].valuePreview ||
(array[index].classification === "history" &&
array[index - 1].classification === "history") || // if they're both history, then the first one is the longest
isSameURL(array[index].entry.value, array[index - 1].entry.value)
) {
return false;
} else {
return true;
}
});
}
}

View File

@ -155,3 +155,12 @@ export function makeThrottle(interval: number) {
}
};
}
export function isSameURL(url1: string, url2: string): boolean {
if (url1 === url2) {
return true;
}
url1 = url1.replace(/^https?:\/\//, "").replace(/\/$/, "");
url2 = url2.replace(/^https?:\/\//, "").replace(/\/$/, "");
return url1 === url2;
}