Shorter HAR files. More precise controls over what's missing in the
consent popup
This commit is contained in:
parent
dbfc57126c
commit
edfde535d2
|
@ -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,36 +25,7 @@ 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) => (
|
||||
{cluster.getRepresentativeMarks().map((mark) => (
|
||||
<li>
|
||||
{emailClassifications[mark.classification]}{" "}
|
||||
{emailSources[mark.source]} (nazwa: <code>{mark.name}</code>,{" "}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 }}>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
9
util.ts
9
util.ts
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user