rentgen/components/report-window/generate-survey-questions.ts

441 lines
22 KiB
TypeScript

import { RequestCluster } from '../../request-cluster';
function generateHostPage(
cluster: RequestCluster,
index: number,
all_clusters: RequestCluster[]
): { title: string; elements: any[]; visibleIf?: string } {
function f(name: string, c = cluster) {
return `${c.id.replace(/\./g, '_')}|${name}`;
}
const previous_cluster: RequestCluster | null = index > 0 ? all_clusters[index - 1] : null;
function defaultValue(name: string) {
if (!previous_cluster) {
return {};
}
return { defaultValueExpression: `{${f(name, previous_cluster)}}` };
}
const domain = cluster.id;
const danych = cluster.getDataTypeDescription();
return {
title: cluster.id,
elements: [
{
type: 'radiogroup',
name: f('present'),
isRequired: true,
title: `Strona udostępniła właścicielowi domeny ${domain} ${danych}. Cel takiego przetwarzania danych:`,
...defaultValue('present'),
visibleIf: '{popup_type} != "none"',
choices: [
{
value: 'not_mentioned',
text: 'nie jest podany nigdzie na stronie',
visibleIf: "{policy_readable} = 'yes' ",
},
{
value: 'not_before_making_a_choice',
text: 'nie jest podany w żadnym miejscu na stronie, do którego można się dostać bez podejmowania wyboru dotyczącego przetwarzania danych osobowych',
},
{
value: 'mentioned_in_policy',
text: 'jest podany w polityce prywatności',
visibleIf: "{policy_readable} = 'yes' ",
},
{
value: 'mentioned_in_popup',
text: 'jest podany w okienku RODO',
visibleIf: "{popup_type} != 'none' ",
},
],
},
{
type: 'radiogroup',
name: f('legal_basis_type'),
...defaultValue('legal_basis_type'),
isRequired: true,
title: `Podstawa prawna dla tego konkretnego celu`,
visibleIf: `{${f('present')}} notempty and {${f(
'present'
)}} != "not_mentioned" and {${f('present')}} != "not_before_making_a_choice"`,
choices: [
{ value: 'consent', text: 'to zgoda (art. 6 ust. 1 lit. a RODO).' },
{
value: 'legitimate_interest',
text: 'to uzasadniony interes (art. 6 ust. 1 lit. f RODO).',
},
{ value: 'not_mentioned', text: 'nie jest wskazana nigdzie na stronie.' },
],
},
{
type: 'radiogroup',
name: f('consent_problems'),
...defaultValue('consent_problems'),
isRequired: true,
title: `Jak ma się ta podstawa prawna do stanu faktycznego?`,
visibleIf: `{${f('legal_basis_type')}} = "consent"`,
defaultValueExpression:
'iif({popup_action} = "none" or {popup_action} = "closed_popup", "claims_consent_but_sends_before_consent", iif({popup_action} = "accept_all" and {rejection_is_hard} = "yes", "claims_consent_but_there_was_no_easy_refuse", ""))',
choices: [
{
value: 'claims_consent_but_sends_before_consent',
text: `Strona wysłała {moje} dane do ${domain} zanim {wyraziłem} na to zgodę`,
},
{
value: 'claims_consent_but_there_was_no_easy_refuse',
text: '{Kliknąłem} przycisk od wyrażania zgody, ale w okienku o zgodę nie było natychmiastowo dostępnego przycisku do niewyrażenia zgody jednym kliknięciem',
},
{ value: 'none', text: 'żadne z powyższych.' },
],
},
{
type: 'radiogroup',
name: f('legitimate_interest_activity_specified'),
...defaultValue('legitimate_interest_activity_specified'),
isRequired: true,
title: /* HTML */ `Czy administrator strony opisał szczegółowo, na czym polega
uzasadniony interes w kontekście tego celu?`,
visibleIf: `{${f('legal_basis_type')}} = "legitimate_interest"`,
choices: [
{
value: 'precise',
text: /* HTML */ `Tak, wskazuje jasno na bieżące działania lub korzyści
wynikające z takiego przetwarzania danych.`,
},
{
value: 'vague',
text: `Wskazuje tylko ogólnie, jak np. „marketing” czy „statystyki”.`,
},
{
value: 'no',
text: `Nie. Nie wiadomo, na czym ten uzasadniony interes polega.`,
},
],
},
{
type: 'text',
title: `Jak administrator opisał to, na czym polega uzasadniony interes w kontekście ${domain}?`,
name: f('legitimate_interest_description'),
visibleIf: `{${f('legitimate_interest_activity_specified')}} = 'vague'`,
placeholder: 'marketing',
defaultValueExpression:
index == 0
? 'marketing'
: `{${f(
'legitimate_interest_description',
previous_cluster || undefined
)}}`,
},
{
type: 'radiogroup',
title: `Czy domena ${domain} należy do podmiotu spoza Europy (np. Google, Facebook)?`,
name: f('outside_eu'),
...defaultValue('outside_eu'),
visibleIf: `{${f('legitimate_interest_activity_specified')}} = "precise" or {${f(
'consent_problems'
)}} = "none"`,
isRequired: true,
choices: [
{ value: 'yes', text: 'Tak' },
{ value: 'no', text: 'Nie' },
{ value: 'not_sure', text: 'Nie wiem' },
],
},
{
type: 'radiogroup',
title: `Czy w {Twojej} ocenie ujawnienie {Twoich} danych (${danych}) właścicielowi domeny ${domain} było konieczne do świadczenia zażądanej przez {Ciebie} usługi drogą elektroniczną?`,
name: f('was_processing_necessary'),
isRequired: true,
...defaultValue('was_processing_necessary'),
visibleIf: `{${f('legal_basis_type')}} = "legitimate_interest" or {${f(
'present'
)}} = "not_mentioned" or {${f(
'present'
)}} = "not_before_making_a_choice" or {popup_type} = "none"`,
choices: [
{ value: 'yes', text: 'Tak, było konieczne' },
{ value: 'no', text: 'Nie, nie było konieczne' },
{ value: 'not_sure', text: 'Nie mam zdania' },
],
},
],
};
}
export default function generateSurveyQuestions(clusters: RequestCluster[]) {
return {
showQuestionNumbers: 'off',
showProgressBar: 'top',
pagePrevText: 'Wróć',
pageNextText: 'Dalej',
completeText: 'Dalej',
locale: 'pl',
clearInvisibleValues: 'onHidden',
pages: [
{
title: 'Dodatkowe pytania',
elements: [
{
type: 'html',
name: 'intro',
html: /* HTML */ `<p>
Analiza ruchu sieciowego generowanego przez stronę została zakończona.
Teraz, aby lepiej oszacować, gdzie są potencjalne obszary robocze pod
względem zgodności z RODO, możesz udzielić odpowiedzi na pytania
dotyczące funkcjonowania strony. Wtyczka wtedy wygeneruje raport lub
treść maila, którą możesz wysłać do administratora strony.
</p>`,
},
],
},
{
title: 'Kontekst analizy',
elements: [
{
type: 'radiogroup',
name: 'user_role',
title: 'Jestem:',
isRequired: true,
choices: [
{ value: 'user', text: 'użytkownikiem strony' },
{ value: 'admin', text: 'administratorem strony' },
],
},
{
type: 'radiogroup',
name: 'email_type',
title: 'Chcę:',
visibleIf: "{user_role} = 'user'",
choices: [
{
value: 'polite_information',
text: 'uprzejmie poinformować administratora strony o potencjalnych problemach ze zgodnością z RODO na jego stronie',
},
{
value: 'official_request',
text: 'wysłać formalne zapytanie do administratora strony, na które ma obowiązek odpowiedzieć. Jeżeli administrator nie odpowie na takie zapytanie, może to być podstawą złożenia skargi do UODO',
},
],
},
{
type: 'radiogroup',
name: 'zaimek',
title: 'Forma czasownika, jaka będzie użyta w raporcie:',
isRequired: true,
choices: [
{ value: 0, text: 'wysłałem' },
{ value: 1, text: 'wysłałam' },
{ value: 2, text: 'wysłałom' },
{ value: 3, text: 'wysłaliśmy' },
],
},
],
},
{
title: 'Obowiązek informacyjny i mechanizm pozyskiwania zgody',
elements: [
{
type: 'radiogroup',
title: 'Jaką formę informacji o przetwarzaniu danych osobowych stosuje ta strona?',
name: 'popup_type',
isRequired: true,
choices: [
{ value: 'none', text: 'Brak informacji' },
{
value: 'page',
text: 'Tylko w postaci tekstu na podstronie np. "prywatność" lub "polityka cookies"',
},
{
value: 'passive_popup',
text: /* HTML */ `Okienko o cookiesach, bez możliwości podjęcia
żadnego wyboru (np. tylko opcja „zamknij”)`,
},
{
value: 'some_choice',
text: 'Okienko o cookiesach, z możliwością podjęcia wyboru',
},
],
},
{
type: 'checkbox',
title: /* HTML */ `Istnieje możliwość, że okienko z informacjami i wyborami
dotyczącymi przetwarzania {Twoich} danych osobowych ukazało się dawno temu w
trakcie {twojej} wcześniejszej wizyty i wtedy je {odkliknąłeś}. {Otwórz} tę
samą stronę w Trybie Prywatnym (Incognito). Co {widzisz}?`,
visibleIf: "{popup_type} = 'none' or {popup_type} = 'page'",
name: 'is_incognito_different',
isRequired: true,
choices: [
{
value: 'incognito_is_the_same',
text: 'W Trybie prywatnym {widzę} to samo, co {widziałem} w normalnym trybie',
},
],
},
{
type: 'html',
visibleIf:
'{is_incognito_different} != "no" and ({popup_type} = "none" or {popup_type} = "page") ',
html: /* HTML */ `Jeżeli w trybie incognito {widzisz} więcej okienek z
informacjami o przetwarzaniu danych osobowych, {wykonaj} analizę w
normalnym trybie ponownie - ale najpierw {usuń} pliki cookies tej
strony.
<a
href="https://support.mozilla.org/pl/kb/usuwanie-ciasteczek-i-danych-stron-firefox?redirectslug=usuwanie-ciasteczek&redirectlocale=pl"
target="_blank"
>
{Zobacz}, jak to zrobić
</a>`,
},
{
type: 'radiogroup',
name: 'mentions_passive_consent',
isRequired: true,
visibleIf: '{popup_type} = "passive_popup"',
title: 'Czy treść okienka wskazuje na zgodę wyrażoną pasywnie, np. „Korzystając z naszej strony wyrażasz zgodę”, „Brak zmiany ustawień przeglądarki oznacza zgodę”, „Klikając przycisk "X" (zamknij) wyrażasz zgodę”?',
choices: [
{
value: 'yes',
text: 'Tak',
},
{
value: 'no',
text: 'Nie',
},
],
},
{
type: 'text',
name: 'passive_consent_description',
isRequired: true,
visibleIf: '{mentions_passive_consent} = "yes"',
title: 'Jakimi słowami administrator opisuje to pasywne wyrażenie zgody? Zacytuj wprost. Na przykład: „Korzystając ze strony wyrażasz zgodę”, albo „Pozostawiając ustawienia przeglądarki bez zmian (..) wyrażasz zgodę”',
defaultValue: 'Korzystając ze strony wyrażasz zgodę',
},
{
type: 'radiogroup',
name: 'cookie_wall',
isRequired: true,
visibleIf: '{popup_type} = "passive_popup"',
title: 'Czy treść strony jest wygodnie czytelna bez odkliknięcia tego okienka o RODO?',
choices: [
{
value: 'no', // wiem, że tu jest "no", a odpowiedź brzmi "tak" - ale nazwa pytania dotyczy obecności cookie walla
text: 'Tak, jest czytelna',
},
{
value: 'yes',
text: 'Nie. Jest zupełnie niewidoczna albo jest przesłonięta w stopniu uniemożliwiającym lub znacznie utrudniającym czytanie treści strony.',
},
],
},
{
type: 'radiogroup',
name: 'rejection_is_hard',
isRequired: true,
visibleIf: '{popup_type} = "some_choice"',
title: 'Czy wyrażenie zgody na wszystkie cele jest dokładnie tak samo łatwe, jak odmowa zgody na wszystkie cele?',
choices: [
{
value: 'no', // wiem, że tu jest "no", a odpowiedź brzmi "tak" - ale nazwa pytania dotyczy braku równowagi
text: 'Tak. Opcja odmowy zgody na wszystkie cele jest równie widoczna i łatwo dostępna, co opcja wyrażenia zgody.',
},
{
value: 'yes',
text: 'Nie. {Muszę} wykonać więcej czynności (np. kliknięć) aby odmówić wszystkich zgód, albo opcja niewyrażenia zgody jest mało widoczna.',
},
],
},
{
type: 'radiogroup',
name: 'popup_action',
isRequired: true,
visibleIf: '{popup_type} = "some_choice" or {popup_type} = "passive_popup"',
title: 'Jaką akcję {podjąłeś} w ramach wyskakującego okienka?',
choices: [
{
value: 'none',
text: 'Nic nie {kliknąłem}',
},
{
value: 'closed_popup',
text: '{Zamknąłem} okienko za pomocą przycisku „X” lub „Zamknij”, lub podobnego',
},
{
value: 'accept_all',
text: '{Kliknąłem} przycisk od akceptacji wszystkich zgód',
},
{
value: 'deny_all',
text: '{Odmówiłem} wyrażenia zgody na wszystkie cele',
},
{
value: 'other',
text: 'Coś innego',
},
],
},
{
type: 'text',
name: 'popup_closed_how',
isRequired: true,
visibleIf: '{popup_action} = "closed_popup"',
title: 'W jaki sposób {zamknąłeś} okienko o zgodę? Opisz pełnym zdaniem',
defaultValueExpression: '{Kliknąłem} przycisk „X”.',
},
{
type: 'text',
name: 'popup_deny_all_how',
isRequired: true,
visibleIf: '{popup_action} = "deny_all"',
title: 'W jaki sposób {zamknąłeś} okienko o zgodę? Opisz pełnym zdaniem, np.: „{Kliknąłem} przycisk <Odrzuć wszystkie>” lub „{Odznaczyłem} wszystkie opcje w ustawieniach zaawansowanych”',
defaultValueExpression: '{Kliknąłem} przycisk „odmawiam wyrażenia zgody”.',
},
{
type: 'radiogroup',
name: 'administrator_identity_available_before_choice',
isRequired: true,
visibleIf: '{popup_type} = "some_choice"',
title: 'Czy przed podjęciem wyboru dot. {Twoich} danych {masz} możliwość poznać tożsamość administratora strony?',
choices: [
{
value: 'yes',
text: 'Tak.',
},
{
value: 'no',
text: 'Nie.',
},
],
},
],
},
{
title: 'Obowiązek informacyjny, polityka prywatności',
visibleIf: "{popup_type} != 'none'",
elements: [
{
type: 'radiogroup',
title: 'Czy polityka prywatności jest dostępna i czytelna?',
name: 'policy_readable',
isRequired: true,
choices: [
{ value: 'yes', text: 'Dostępna i czytelna' },
{
value: 'entirely_obscured_by_popup',
text: 'Dostępna, ale nieczytelna. Zasłania ją całkowicie lub prawie całkowicie popup o RODO lub nie można się do niej doklikać bez podjęcia wyboru w okienku',
},
{
value: 'cant_find',
text: `Niedostępna. {Szukałem}, ale nie {znalazłem} jej na stronie`,
},
],
},
],
},
...clusters.map(generateHostPage),
],
};
}