From 34832bb5f18720c8d872f49d880b7f1a92bfdecf Mon Sep 17 00:00:00 2001 From: Emanuele De Cupis Date: Mon, 30 Aug 2021 10:20:53 +0200 Subject: [PATCH 1/4] [#ip-374] refactor --- .../handler.ts | 85 +----------------- .../messages.ts | 86 +++++++++++++++++++ 2 files changed, 87 insertions(+), 84 deletions(-) create mode 100644 SendUserDataDownloadMessageActivity/messages.ts diff --git a/SendUserDataDownloadMessageActivity/handler.ts b/SendUserDataDownloadMessageActivity/handler.ts index 925a0d9e..7fa115d4 100644 --- a/SendUserDataDownloadMessageActivity/handler.ts +++ b/SendUserDataDownloadMessageActivity/handler.ts @@ -4,90 +4,7 @@ import { readableReport } from "@pagopa/ts-commons/lib/reporters"; import * as t from "io-ts"; import { FiscalCode, NonEmptyString } from "@pagopa/ts-commons/lib/strings"; - -// TODO: switch text based on user's preferred_language -// eslint-disable-next-line @typescript-eslint/explicit-function-return-type -const userDataDownloadMessage = ( - blobName: string, - password: string, - publicDownloadBaseUrl: string -) => - NewMessage.decode({ - content: { - markdown: `Ciao, -abbiamo completato la gestione della richiesta di accesso ai tuoi dati. - -Qui trovi il link per scaricare i dati personali che trattiamo tramite l’App IO. -I dati sono compressi in un file zip, che è disponibile per i prossimi 15 giorni. - -Clicca il link qui sotto: - -[Link all'archivio ZIP](${publicDownloadBaseUrl}/${blobName}) - -Oppure copia e incolla l’indirizzo nel tuo browser: - -\`${publicDownloadBaseUrl}/${blobName}\` - -Per aprire il file ZIP, usa questa password: - -${password} - -I dati contenuti nello zip sono in formato yaml: un formato standard che in informatica consente lo scambio di dati fra applicazioni diverse. - -Nello zip, potrai trovare: -- Il testo dei Messaggi da te ricevuti; -- Le tue preferenze di notifica; -- L’indirizzo email da te indicato e, se del caso, la conferma della sua validazione; -- Il tuo codice fiscale. - -## Come scaricare i dati - -Per una migliore esperienza utente, ti consigliamo di copiare il link che hai ricevuto e aprirlo da PC. - -E’ possibile effettuare lo scaricamento anche da smartphone, qualora tu avessi un’app di file explorer installata. L’app ti servirà per aprire l’archivio.zip una volta scaricato. -Di seguito trovi le istruzioni per i due diversi sistemi operativi. - -Dispositivi iOS: -- Premi il link che ti abbiamo inviato qui sopra -- Verrai reindirizzato alla finestra del browser in cui ti verrà chiesto se vuoi davvero scaricare un archivio.zip il cui nome inizia con il tuo codice fiscale -- Clicca su “Scarica” -- Viene visualizzata una freccia alla destra della barra del browser. Cliccala e poi clicca sul titolo del file. -- Se hai l’app File installata, ti si aprirà una finestra in cui potrai visualizzare il pacchetto. -- Clicca sul documento e inserisci la password per decomprimere il file. - -Dispositivi Android: -- Premi il link qui sopra -- Verrai reindirizzato alla finestra del browser, in cui una notifica a fondo pagina ti informa dello scaricamento in corso. -- Al termine dello scaricamento, clicca la notifica per aprire il file. -- Seleziona l’app con cui aprire il file zip -- Clicca sul documento e inserisci la password per decomprimere il file. - -## Informazioni sul trattamento dei tuoi dati - -Ai sensi del GDPR, ti confermiamo che trattiamo i tuoi dati personali all’interno dell’App Io. -In particolare, trattiamo i tuoi dati identificativi e di contatto per finalità di identificazione e autenticazione, registrazione delle preferenze e invio di messaggi strettamente legati al funzionamento dell’App, nonché di assistenza e debug e attività volte ad assicurare la sicurezza. Inoltre, come responsabili del trattamento degli Enti Erogatori, per consentirti di usufruire dei Servizi, trattiamo oltre ai tuoi dati identificativi e di contatto, anche i dati contenuti nei messaggi. - -Alcuni dei dati da noi trattati sono raccolti dal tuo provider Spid al momento della tua registrazione ovvero, qualora tu ti sia registrato tramite CIE, dal Ministero dell’Interno. - -I tuoi dati sono trattati anche per tramite di fornitori terzi, situati in paesi al di fuori dello SEE. Utilizziamo per i trasferimenti extra UE le garanzie previste dagli art. 44 e seguenti del GDPR. In particolare, utilizziamo fornitori certificati Privacy Shield e, in ogni caso, laddove necessario, abbiamo vincolato tali fornitori al rispetto delle condizioni contrattuali tipo approvate dalla Commissione. - -Conserviamo i tuoi dati per un tempo limitato. In particolare, I dati relativi ai Messaggi inviati per conto degli Enti Erogatori sono cancellati dopo 3 anni dalla loro ricezione e i tuoi dati identificativi sono conservati per un periodo massimo di 10 anni dalla tua cancellazione. - -Puoi richiedere di esercitare il tuo diritto di limitazione e opposizione del trattamento e a chiedere la rettifica del tuo indirizzo email. Potrai inoltre rivolgerti al Garante per la protezione dei dati personali. -Con riferimento ai dati dei Servizi offerti dagli Enti Erogatori, tutti i diritti dovranno essere esercitati presso di loro. - -Puoi trovare tutte le informazioni sul trattamento dei tuoi dati nella nostra [Informativa Privacy](ioit://PROFILE_PRIVACY) che è accessibile in ogni momento nella sezione Profilo/Privacy e Condizioni d’uso. -Se ti servono dettagli o informazioni su questi dati, ti invitiamo a scrivere all’indirizzo email dpo@pagopa.it. - -Grazie ancora per aver utilizzato IO! -Il Team Privacy di PagoPA S.p.A. - -`, - subject: `IO App - richiesta di accesso ai dati` - } - }).getOrElseL(errs => { - throw new Error("Invalid MessageContent: " + readableReport(errs)); - }); +import { userDataDownloadMessage } from "./messages"; /** * Send a single user data download message diff --git a/SendUserDataDownloadMessageActivity/messages.ts b/SendUserDataDownloadMessageActivity/messages.ts new file mode 100644 index 00000000..d9d37fad --- /dev/null +++ b/SendUserDataDownloadMessageActivity/messages.ts @@ -0,0 +1,86 @@ +import { NewMessage } from "@pagopa/io-functions-commons/dist/generated/definitions/NewMessage"; +import { readableReport } from "@pagopa/ts-commons/lib/reporters"; + +// TODO: switch text based on user's preferred_language +// eslint-disable-next-line @typescript-eslint/explicit-function-return-type +export const userDataDownloadMessage = ( + blobName: string, + password: string, + publicDownloadBaseUrl: string +) => + NewMessage.decode({ + content: { + markdown: `Ciao, + abbiamo completato la gestione della richiesta di accesso ai tuoi dati. + + Qui trovi il link per scaricare i dati personali che trattiamo tramite l’App IO. + I dati sono compressi in un file zip, che è disponibile per i prossimi 15 giorni. + + Clicca il link qui sotto: + + [Link all'archivio ZIP](${publicDownloadBaseUrl}/${blobName}) + + Oppure copia e incolla l’indirizzo nel tuo browser: + + \`${publicDownloadBaseUrl}/${blobName}\` + + Per aprire il file ZIP, usa questa password: + + ${password} + + I dati contenuti nello zip sono in formato yaml: un formato standard che in informatica consente lo scambio di dati fra applicazioni diverse. + + Nello zip, potrai trovare: + - Il testo dei Messaggi da te ricevuti; + - Le tue preferenze di notifica; + - L’indirizzo email da te indicato e, se del caso, la conferma della sua validazione; + - Il tuo codice fiscale. + + ## Come scaricare i dati + + Per una migliore esperienza utente, ti consigliamo di copiare il link che hai ricevuto e aprirlo da PC. + + E’ possibile effettuare lo scaricamento anche da smartphone, qualora tu avessi un’app di file explorer installata. L’app ti servirà per aprire l’archivio.zip una volta scaricato. + Di seguito trovi le istruzioni per i due diversi sistemi operativi. + + Dispositivi iOS: + - Premi il link che ti abbiamo inviato qui sopra + - Verrai reindirizzato alla finestra del browser in cui ti verrà chiesto se vuoi davvero scaricare un archivio.zip il cui nome inizia con il tuo codice fiscale + - Clicca su “Scarica” + - Viene visualizzata una freccia alla destra della barra del browser. Cliccala e poi clicca sul titolo del file. + - Se hai l’app File installata, ti si aprirà una finestra in cui potrai visualizzare il pacchetto. + - Clicca sul documento e inserisci la password per decomprimere il file. + + Dispositivi Android: + - Premi il link qui sopra + - Verrai reindirizzato alla finestra del browser, in cui una notifica a fondo pagina ti informa dello scaricamento in corso. + - Al termine dello scaricamento, clicca la notifica per aprire il file. + - Seleziona l’app con cui aprire il file zip + - Clicca sul documento e inserisci la password per decomprimere il file. + + ## Informazioni sul trattamento dei tuoi dati + + Ai sensi del GDPR, ti confermiamo che trattiamo i tuoi dati personali all’interno dell’App Io. + In particolare, trattiamo i tuoi dati identificativi e di contatto per finalità di identificazione e autenticazione, registrazione delle preferenze e invio di messaggi strettamente legati al funzionamento dell’App, nonché di assistenza e debug e attività volte ad assicurare la sicurezza. Inoltre, come responsabili del trattamento degli Enti Erogatori, per consentirti di usufruire dei Servizi, trattiamo oltre ai tuoi dati identificativi e di contatto, anche i dati contenuti nei messaggi. + + Alcuni dei dati da noi trattati sono raccolti dal tuo provider Spid al momento della tua registrazione ovvero, qualora tu ti sia registrato tramite CIE, dal Ministero dell’Interno. + + I tuoi dati sono trattati anche per tramite di fornitori terzi, situati in paesi al di fuori dello SEE. Utilizziamo per i trasferimenti extra UE le garanzie previste dagli art. 44 e seguenti del GDPR. In particolare, utilizziamo fornitori certificati Privacy Shield e, in ogni caso, laddove necessario, abbiamo vincolato tali fornitori al rispetto delle condizioni contrattuali tipo approvate dalla Commissione. + + Conserviamo i tuoi dati per un tempo limitato. In particolare, I dati relativi ai Messaggi inviati per conto degli Enti Erogatori sono cancellati dopo 3 anni dalla loro ricezione e i tuoi dati identificativi sono conservati per un periodo massimo di 10 anni dalla tua cancellazione. + + Puoi richiedere di esercitare il tuo diritto di limitazione e opposizione del trattamento e a chiedere la rettifica del tuo indirizzo email. Potrai inoltre rivolgerti al Garante per la protezione dei dati personali. + Con riferimento ai dati dei Servizi offerti dagli Enti Erogatori, tutti i diritti dovranno essere esercitati presso di loro. + + Puoi trovare tutte le informazioni sul trattamento dei tuoi dati nella nostra [Informativa Privacy](ioit://PROFILE_PRIVACY) che è accessibile in ogni momento nella sezione Profilo/Privacy e Condizioni d’uso. + Se ti servono dettagli o informazioni su questi dati, ti invitiamo a scrivere all’indirizzo email dpo@pagopa.it. + + Grazie ancora per aver utilizzato IO! + Il Team Privacy di PagoPA S.p.A. + + `, + subject: `IO App - richiesta di accesso ai dati` + } + }).getOrElseL(errs => { + throw new Error(`Invalid MessageContent: ${readableReport(errs)}`); + }); From 180d15febb9253209bed914b05dc70ad2d1f3ee3 Mon Sep 17 00:00:00 2001 From: Emanuele De Cupis Date: Mon, 30 Aug 2021 10:57:54 +0200 Subject: [PATCH 2/4] [#ip-374] failing tests --- .../__tests__/messages.test.ts | 20 +++++++++++++++++++ package.json | 1 + yarn.lock | 5 +++++ 3 files changed, 26 insertions(+) create mode 100644 SendUserDataDownloadMessageActivity/__tests__/messages.test.ts diff --git a/SendUserDataDownloadMessageActivity/__tests__/messages.test.ts b/SendUserDataDownloadMessageActivity/__tests__/messages.test.ts new file mode 100644 index 00000000..0554f918 --- /dev/null +++ b/SendUserDataDownloadMessageActivity/__tests__/messages.test.ts @@ -0,0 +1,20 @@ +const marked = require("marked"); + +const aUrl = "any-url"; +const aBlobName = "any-blob-name"; + +import { userDataDownloadMessage } from "../messages"; + +describe("userDataDownloadMessage", () => { + it.each` + title | password + ${"a simple password"} | ${"a".repeat(18)} + ${"a password with one *"} | ${"adfafas*dasgaf"} + ${"a password with two *"} | ${"adfafas*da*sgaf"} + `("should render $title", async ({ password }) => { + const message = userDataDownloadMessage(aBlobName, password, aUrl); + const rendered = marked(message.content.markdown); + + expect(rendered).toEqual(expect.stringContaining(password)); + }); +}); diff --git a/package.json b/package.json index 9288a675..707b9c58 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "jest": "^24.9.0", "jest-mock-express": "^0.1.1", "lolex": "^5.1.2", + "marked": "^3.0.2", "modclean": "^3.0.0-beta.1", "npm-run-all": "^4.1.5", "oval": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index c4b59ab9..63914859 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6880,6 +6880,11 @@ marked@^0.7.0: resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== +marked@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-3.0.2.tgz#60ce97d6aec34dd882ab4bb4df82494666854e17" + integrity sha512-TMJQQ79Z0e3rJYazY0tIoMsFzteUGw9fB3FD+gzuIT3zLuG9L9ckIvUfF51apdJkcqc208jJN2KbtPbOvXtbjA== + math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" From ddde8af2436a68290e144fda20a8865d6e84be76 Mon Sep 17 00:00:00 2001 From: Emanuele De Cupis Date: Mon, 30 Aug 2021 10:58:29 +0200 Subject: [PATCH 3/4] [#ip-374] fix password rendering --- SendUserDataDownloadMessageActivity/messages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SendUserDataDownloadMessageActivity/messages.ts b/SendUserDataDownloadMessageActivity/messages.ts index d9d37fad..795584a3 100644 --- a/SendUserDataDownloadMessageActivity/messages.ts +++ b/SendUserDataDownloadMessageActivity/messages.ts @@ -26,7 +26,7 @@ export const userDataDownloadMessage = ( Per aprire il file ZIP, usa questa password: - ${password} + \`${password}\` I dati contenuti nello zip sono in formato yaml: un formato standard che in informatica consente lo scambio di dati fra applicazioni diverse. From 1a30e0b7a942a9717d1f4de6da82d0725b3a1010 Mon Sep 17 00:00:00 2001 From: Emanuele De Cupis Date: Mon, 30 Aug 2021 12:17:22 +0200 Subject: [PATCH 4/4] [#ip-374] remove * from generated passwords --- utils/random.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/random.ts b/utils/random.ts index 4e12d5bb..7d2c50fc 100644 --- a/utils/random.ts +++ b/utils/random.ts @@ -9,7 +9,7 @@ import * as randomstring from "randomstring"; /* printable 7 bit ASCII, some special char removed */ const RANDOM_CHARSET = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+-/=?@"; + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()+-/=?@"; export const StrongPassword = WithinRangeString(18, 19); export type StrongPassword = t.TypeOf;