From caa73a9bfa199be140f403c3fd6c38c4bec32bbb Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Mon, 14 Nov 2016 18:49:26 +0100 Subject: [PATCH 01/10] Afegeixo test d'identitat local --- test/test_identitat_local.py | 28 +++++++++ test/test_reply.py | 114 +++++++++++++++++------------------ 2 files changed, 85 insertions(+), 57 deletions(-) create mode 100644 test/test_identitat_local.py diff --git a/test/test_identitat_local.py b/test/test_identitat_local.py new file mode 100644 index 0000000..c6474a4 --- /dev/null +++ b/test/test_identitat_local.py @@ -0,0 +1,28 @@ +from soa.identitat import GestioIdentitatLocal +import settings +import unittest + + +class TestIdentitatLocal(unittest.TestCase): + + def test_patrons_mail(self): + settings.init() + settings.set("patrons_mail_addicionals", { + "^root@([a-z0-9.\-]+\.)?domain\.example\.com$": "usuari.generic", + "^(.*)@example.edu$": "%s", + "^(.*)@example.org$": "%s" + }) + identitat = GestioIdentitatLocal() + uid = identitat.obtenir_uid_local("usuari.qualsevol@example.edu") + self.assertEquals("usuari.qualsevol", uid) + uid = identitat.obtenir_uid_local("usuari.qualsevol@example.org") + self.assertEquals("usuari.qualsevol", uid) + uid = identitat.obtenir_uid_local("root@xxxx.domain.example.com") + self.assertEquals("usuari.generic", uid) + uid = identitat.obtenir_uid_local("root@domain.example.com") + self.assertEquals("usuari.generic", uid) + uid = identitat.obtenir_uid_local("root@xx.example.com") + self.assertEquals(None, uid) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_reply.py b/test/test_reply.py index b1b680c..33bb169 100644 --- a/test/test_reply.py +++ b/test/test_reply.py @@ -1,57 +1,57 @@ -import unittest -import mock -import settings -from soa.tiquets import GestioTiquets -from soa.identitat import GestioIdentitat -from filtres.reply import FiltreReply -from mailticket import MailTicket - - -class TestReply(unittest.TestCase): - - def setUp(self): - self.tickets = mock.create_autospec(GestioTiquets) - self.tickets.consulta_tiquet_dades.return_value = { - "solicitant": "usuari.real", - "emailSolicitant": "mail.extern@mail.com" - } - self.identitat = mock.create_autospec(GestioIdentitat) - self.identitat.obtenir_uid.return_value = None - - settings.init() - settings.set("regex_reply", "(.*)") # Una que trobi sempre algo - settings.set("regex_privat", "X") # Una que no trobi mai res - settings.set("usuari_extern", "usuari.extern") - - def test_reply_mail_extern_igual_a_solicitant_detecta_usuari_real( - self): - msg = mock.create_autospec(MailTicket) - msg.get_from.return_value = "mail.extern@mail.com" - msg.get_subject.return_value = "Re: ticket de prova" - f = FiltreReply(msg, self.tickets, self.identitat) - - self.assertTrue(f.es_aplicable()) - self.assertEquals(f.solicitant, 'usuari.real') - - def test_reply_mail_extern_diferent_a_solicitant_detecta_usuari_extern( - self): - msg = mock.create_autospec(MailTicket) - msg.get_from.return_value = "mail.extern.diferent@mail.com" - msg.get_subject.return_value = "Re: ticket de prova" - f = FiltreReply(msg, self.tickets, self.identitat) - - self.assertTrue(f.es_aplicable()) - self.assertEquals(f.solicitant, 'usuari.extern') - - def test_reply_ticket_id_dintre_de_message_id( - self): - msg = mock.create_autospec(MailTicket) - msg.get_header.return_value = "<4b3b6b9c-bd31-tiquet-id-657421@gn6>" - msg.get_subject.return_value = "Re: ticket de prova" - f = FiltreReply(msg, self.tickets, self.identitat) - - self.assertTrue(f.es_aplicable()) - self.assertEquals(f.ticket_id, "657421") - -if __name__ == '__main__': - unittest.main() +import unittest +import mock +import settings +from soa.tiquets import GestioTiquets +from soa.identitat import GestioIdentitat +from filtres.reply import FiltreReply +from mailticket import MailTicket + + +class TestReply(unittest.TestCase): + + def setUp(self): + self.tickets = mock.create_autospec(GestioTiquets) + self.tickets.consulta_tiquet_dades.return_value = { + "solicitant": "usuari.real", + "emailSolicitant": "mail.extern@mail.com" + } + self.identitat = mock.create_autospec(GestioIdentitat) + self.identitat.obtenir_uid.return_value = None + + settings.init() + settings.set("regex_reply", "(.*)") # Una que trobi sempre algo + settings.set("regex_privat", "X") # Una que no trobi mai res + settings.set("usuari_extern", "usuari.extern") + + def test_reply_mail_extern_igual_a_solicitant_detecta_usuari_real( + self): + msg = mock.create_autospec(MailTicket) + msg.get_from.return_value = "mail.extern@mail.com" + msg.get_subject.return_value = "Re: ticket de prova" + f = FiltreReply(msg, self.tickets, self.identitat) + + self.assertTrue(f.es_aplicable()) + self.assertEquals(f.solicitant, 'usuari.real') + + def test_reply_mail_extern_diferent_a_solicitant_detecta_usuari_extern( + self): + msg = mock.create_autospec(MailTicket) + msg.get_from.return_value = "mail.extern.diferent@mail.com" + msg.get_subject.return_value = "Re: ticket de prova" + f = FiltreReply(msg, self.tickets, self.identitat) + + self.assertTrue(f.es_aplicable()) + self.assertEquals(f.solicitant, 'usuari.extern') + + def test_reply_ticket_id_dintre_de_message_id( + self): + msg = mock.create_autospec(MailTicket) + msg.get_header.return_value = "<4b3b6b9c-bd31-tiquet-id-657421@gn6>" + msg.get_subject.return_value = "Re: ticket de prova" + f = FiltreReply(msg, self.tickets, self.identitat) + + self.assertTrue(f.es_aplicable()) + self.assertEquals(f.ticket_id, "657421") + +if __name__ == '__main__': + unittest.main() From b98ad059c94d4d4bb321a338bbfa1d50e9d7b9ab Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Mon, 14 Nov 2016 18:52:59 +0100 Subject: [PATCH 02/10] Afegim mes tests i mails per la classe Mailticket --- test/mails/reply-attachment.txt | 34 +++++++++++++++++++++++ test/mails/reply-mutipart-alternative.txt | 8 ++---- test/test_mailticket.py | 26 +++++++++++++++++ 3 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 test/mails/reply-attachment.txt diff --git a/test/mails/reply-attachment.txt b/test/mails/reply-attachment.txt new file mode 100644 index 0000000..319335b --- /dev/null +++ b/test/mails/reply-attachment.txt @@ -0,0 +1,34 @@ +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary="------------000908000400050109010407" + +This is a multi-part message in MIME format. +--------------000908000400050109010407 +Content-Type: text/plain; charset=UTF-8; format=flowed +Content-Transfer-Encoding: 8bit + +Ni cas! + +El 05/12/2014 15:33, mailtoticket@example.com escribió El tiquet 99999 amb prioritat *2:Mitja* sol·licitat per *USUARI QUALSEVOL* ha +> estat assignat a l'equip *PROVA*. +> +> Tiquet: *Ticket de prova que no s'ha d'esborrar* +> +> Descripció +> Aquest ticket es per provar un tema d'attachments i replys +> +> +> +> + +--------------000908000400050109010407 +Content-Type: text/plain; charset=UTF-8; + name="prova.txt" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; + filename="prova.txt" + +cHJvdmEgaW5MYWI= +--------------000908000400050109010407-- + + diff --git a/test/mails/reply-mutipart-alternative.txt b/test/mails/reply-mutipart-alternative.txt index 388a53c..5396298 100644 --- a/test/mails/reply-mutipart-alternative.txt +++ b/test/mails/reply-mutipart-alternative.txt @@ -20,13 +20,9 @@ El 09/12/2014 15:46, mailtoticket@example.com escribió > Descripció > hola > -> -> -> Per accedir al tiquet prem sobre el segünllaç> 549720 - prova reply - --- +-- USUARI QUALSEVOL --------------090609040105000108020504 @@ -68,7 +64,7 @@ Content-Transfer-Encoding: 8bit alert("hola");
-
-- 
+    
--
 
        USUARI QUALSEVOL
 
diff --git a/test/test_mailticket.py b/test/test_mailticket.py index 8f69603..1903115 100644 --- a/test/test_mailticket.py +++ b/test/test_mailticket.py @@ -55,5 +55,31 @@ def test_get_date_invalid_format(self): dt = apple_mail.get_date() self.assertEquals("11/09/2015 11:45", dt.strftime("%d/%m/%Y %H:%M")) + def test_redirigit_passa_a_to(self): + """ Un missatge redirigit a usuari.concret@example.com + ha de tenir el "to" igual a usuari.concret@example.com """ + msg = MailTicket(StringIO( + "Resent-To: usuari.concret@example.com\n" + "To: altre.usuari@example.com")) + self.assertEquals(msg.get_to(), "usuari.concret@example.com") + + def test_comprovar_from_to(self): + """ Si un usuari.concret redirigeix a mailtoticket + s'han de de mantenir les dos adreces """ + msg = MailTicket(StringIO( + "From: usuari.concret@example.com\n" + "Resent-To: mailtoticket@example.com")) + self.assertEquals(msg.get_from(), "usuari.concret@example.com") + self.assertEquals(msg.get_to(), "mailtoticket@example.com") + + def test_mailticket_multipart_alternative(self): + msg = llegir_mail("reply-mutipart-alternative.txt") + self.assertTrue(not msg.te_attachments()) + + def test_mailticket_attach(self): + """ Un mail amb attachmens ha de retornar que te attachments """ + msg = llegir_mail("reply-attachment.txt") + self.assertTrue(msg.te_attachments()) + if __name__ == '__main__': unittest.main() From eae1ba784febfcb1420331f1b2b120620e5a56c5 Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Mon, 14 Nov 2016 18:53:52 +0100 Subject: [PATCH 03/10] =?UTF-8?q?Fem=20el=20Mailticket=20mes=20robust=20si?= =?UTF-8?q?=20falta=20configuraci=C3=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mailticket.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mailticket.py b/mailticket.py index b90fa2b..2e18094 100755 --- a/mailticket.py +++ b/mailticket.py @@ -19,10 +19,10 @@ class MailTicket: def __init__(self, fitxer): self.filtrar_attachments_per_nom \ - = settings.get("filtrar_attachments_per_nom") + = settings.get("filtrar_attachments_per_nom") or [] self.filtrar_attachments_per_hash \ - = settings.get("filtrar_attachments_per_hash") - self.mails_no_ticket = settings.get("mails_no_ticket") + = settings.get("filtrar_attachments_per_hash") or [] + self.mails_no_ticket = settings.get("mails_no_ticket") or [] self.msg = email.message_from_file(fitxer) # Farem lazy initialization d'aquestes 2 properties per si hi ha From 0ae38850133adc310630959b533c032fc5ed91fe Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Mon, 14 Nov 2016 18:55:51 +0100 Subject: [PATCH 04/10] Anonimitzem millor els testos de reply --- test/test_reply.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_reply.py b/test/test_reply.py index 33bb169..21883e0 100644 --- a/test/test_reply.py +++ b/test/test_reply.py @@ -13,7 +13,7 @@ def setUp(self): self.tickets = mock.create_autospec(GestioTiquets) self.tickets.consulta_tiquet_dades.return_value = { "solicitant": "usuari.real", - "emailSolicitant": "mail.extern@mail.com" + "emailSolicitant": "mail.extern@example.com" } self.identitat = mock.create_autospec(GestioIdentitat) self.identitat.obtenir_uid.return_value = None @@ -26,7 +26,7 @@ def setUp(self): def test_reply_mail_extern_igual_a_solicitant_detecta_usuari_real( self): msg = mock.create_autospec(MailTicket) - msg.get_from.return_value = "mail.extern@mail.com" + msg.get_from.return_value = "mail.extern@example.com" msg.get_subject.return_value = "Re: ticket de prova" f = FiltreReply(msg, self.tickets, self.identitat) @@ -36,7 +36,7 @@ def test_reply_mail_extern_igual_a_solicitant_detecta_usuari_real( def test_reply_mail_extern_diferent_a_solicitant_detecta_usuari_extern( self): msg = mock.create_autospec(MailTicket) - msg.get_from.return_value = "mail.extern.diferent@mail.com" + msg.get_from.return_value = "mail.extern.diferent@example.com" msg.get_subject.return_value = "Re: ticket de prova" f = FiltreReply(msg, self.tickets, self.identitat) @@ -46,12 +46,12 @@ def test_reply_mail_extern_diferent_a_solicitant_detecta_usuari_extern( def test_reply_ticket_id_dintre_de_message_id( self): msg = mock.create_autospec(MailTicket) - msg.get_header.return_value = "<4b3b6b9c-bd31-tiquet-id-657421@gn6>" + msg.get_header.return_value = "<4b3b6b9c-bd31-tiquet-id-999999@gn6>" msg.get_subject.return_value = "Re: ticket de prova" f = FiltreReply(msg, self.tickets, self.identitat) self.assertTrue(f.es_aplicable()) - self.assertEquals(f.ticket_id, "657421") + self.assertEquals(f.ticket_id, "999999") if __name__ == '__main__': unittest.main() From ea988daa39019c8fe35b38d1feb0b0207dd3f42d Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Mon, 14 Nov 2016 18:58:49 +0100 Subject: [PATCH 05/10] Testos i mails per testejar els casos que han de crear un ticket nou --- test/mails/attachment_signatura.txt | 39 ++++++++ test/mails/mail_enviat_usuari_concret.txt | 6 ++ test/mails/mail_redirigit_usuari_concret.txt | 8 ++ test/mails/urgent.txt | 6 ++ test/test_nou.py | 97 ++++++++++++++++++++ 5 files changed, 156 insertions(+) create mode 100644 test/mails/attachment_signatura.txt create mode 100644 test/mails/mail_enviat_usuari_concret.txt create mode 100644 test/mails/mail_redirigit_usuari_concret.txt create mode 100644 test/mails/urgent.txt create mode 100644 test/test_nou.py diff --git a/test/mails/attachment_signatura.txt b/test/mails/attachment_signatura.txt new file mode 100644 index 0000000..4a518d1 --- /dev/null +++ b/test/mails/attachment_signatura.txt @@ -0,0 +1,39 @@ +Subject: Mail amb attachment que es una signatura +To: mailtoticket@example.com +From: usuari.qualsevol@example.com +Date: Wed, 14 Jan 2015 09:41:15 +0100 +MIME-Version: 1.0 +Content-type: multipart/mixed; + Boundary="0__=4EBBF75EDFBC2A818f9e8a93df938690918c4EBBF75EDFBC2A81" +Content-Disposition: inline + +--0__=4EBBF75EDFBC2A818f9e8a93df938690918c4EBBF75EDFBC2A81 +Content-type: text/plain; charset=ISO-8859-1 +Content-transfer-encoding: quoted-printable + + + + +Prova + + (Embedded + image moved + to file: + pic01487.jpg) + += + +--0__=4EBBF75EDFBC2A818f9e8a93df938690918c4EBBF75EDFBC2A81 +Content-type: image/jpeg; + name="pic01487.jpg" +Content-Disposition: attachment; filename="pic01487.jpg" +Content-transfer-encoding: base64 + +/9j/4AAQSkZJRgABAQEAYABgAAD/4QAWRXhpZgAASUkqAAgAAAAAAAAAAAD/2wBDAAEBAQEBAQEB +AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/ +2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB +AQEBAQEBAQEBAQH/wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAr/xAAU +EAEAAAAAAAAAAAAAAAAAAAAA/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAA +AAAAAAD/2gAMAwEAAhEDEQA/AL+AAf/Z + +--0__=4EBBF75EDFBC2A818f9e8a93df938690918c4EBBF75EDFBC2A81-- diff --git a/test/mails/mail_enviat_usuari_concret.txt b/test/mails/mail_enviat_usuari_concret.txt new file mode 100644 index 0000000..777cbe8 --- /dev/null +++ b/test/mails/mail_enviat_usuari_concret.txt @@ -0,0 +1,6 @@ +From: Usuari Concret +Subject: Mail enviat des d'un usuari concret +Content-Type: text/plain; charset=ISO-8859-1; format=flowed +Content-Transfer-Encoding: 8bit + +Mail que s'envia des d'un usuari concret \ No newline at end of file diff --git a/test/mails/mail_redirigit_usuari_concret.txt b/test/mails/mail_redirigit_usuari_concret.txt new file mode 100644 index 0000000..96b902e --- /dev/null +++ b/test/mails/mail_redirigit_usuari_concret.txt @@ -0,0 +1,8 @@ +Resent-From: Usuari Concret +Resent-To: mailtoticket@example.com +From: usuari.qualsevol@example.com +Subject: Mail reenviat des d'un usuari concret +Content-Type: text/plain; charset=ISO-8859-1; format=flowed +Content-Transfer-Encoding: 8bit + +Mail que s'envia des d'un usuari qualsevol i redirigit per un usuari concret \ No newline at end of file diff --git a/test/mails/urgent.txt b/test/mails/urgent.txt new file mode 100644 index 0000000..0083f45 --- /dev/null +++ b/test/mails/urgent.txt @@ -0,0 +1,6 @@ +From: usuari.qualsevol@example.com +Subject: Mail URGENT reenviat des d'un usuari qualsevol +Content-Type: text/plain; charset=ISO-8859-1; format=flowed +Content-Transfer-Encoding: 8bit + +Mail que s'envia des d'un usuari qualsevol \ No newline at end of file diff --git a/test/test_nou.py b/test/test_nou.py new file mode 100644 index 0000000..58eb218 --- /dev/null +++ b/test/test_nou.py @@ -0,0 +1,97 @@ +from filtres.nou import FiltreNou +import unittest +import mock +import testhelper +import settings +from soa.tiquets import GestioTiquets +from soa.identitat import GestioIdentitat + + +class TestTicketNou(unittest.TestCase): + + def setUp(self): + self.mock_tickets = self.crear_mock_tickets() + self.mock_identitat = self.crear_mock_identitat() + settings.init() + + def crear_mock_tickets(self): + tickets = mock.create_autospec(GestioTiquets) + tickets.consulta_tiquet.return_value = { + "solicitant": "usuari.qualsevol"} + tickets.afegir_comentari_tiquet.return_value = {"codiRetorn": "1"} + tickets.alta_tiquet.return_value = { + "codiRetorn": "1", "codiTiquet": "666"} + return tickets + + def crear_mock_identitat(self): + identitat = mock.create_autospec(GestioIdentitat) + identitat.obtenir_uid.return_value = "usuari.qualsevol" + return identitat + + def test_filtra_signatura(self): + """ Un mail amb signatura coneguda + no ha de fer un attachment amb la signatura """ + settings.set("filtrar_attachments_per_hash", [ + "593e2391d469398a04b4d315e5793341" + ]) + msg = testhelper.llegir_mail("attachment_signatura.txt") + f = FiltreNou(msg, self.mock_tickets, self.mock_identitat) + if f.es_aplicable(): + f.filtrar() + self.assertEquals( + self.mock_tickets.annexar_fitxer_tiquet.call_count, 0) + + def test_redirigit_per_usuari_concret(self): + """ Un missatge reenviat per usuari.concret@example.com + ha de crear-se a l'equip 11112 """ + settings.set("valors_defecte", [{ + "order": ['Resent-From'], + "match": "^usuari.concret@example\.com$", + "defaults": {"equipResolutor": "11112"} + }]) + msg = testhelper.llegir_mail("mail_redirigit_usuari_concret.txt") + self.assertEquals(msg.get_resent_from(), "usuari.concret@example.com") + f = FiltreNou(msg, self.mock_tickets, self.mock_identitat) + if f.es_aplicable(): + f.filtrar() + self.assertEquals( + self.mock_tickets.alta_tiquet.call_args_list[ + 0][1]['equipResolutor'], + '11112') + + def test_message_from_usuari_concret(self): + """ Un missatge que ve de usuari.concret@example.com + ha de crear-se a l'equip 11113 """ + settings.set("valors_defecte", [{ + "order": ['From'], + "match": "^usuari.concret@example\.com$", + "defaults": {"equipResolutor": "11113"} + }]) + msg = testhelper.llegir_mail("mail_enviat_usuari_concret.txt") + self.assertEquals(msg.get_from(), "usuari.concret@example.com") + f = FiltreNou(msg, self.mock_tickets, self.mock_identitat) + if f.es_aplicable(): + f.filtrar() + self.assertEquals( + self.mock_tickets.alta_tiquet.call_args_list[ + 0][1]['equipResolutor'], + '11113') + + def test_message_urgent(self): + """ Un missatge amb la paraula URGENT al subject + ha de crear-se amb gravetat alta """ + settings.set("valors_defecte", [{ + "order": ['Subject'], + "match": ".*URGENT", + "defaults": {"urgencia": "GRAVETAT_ALTA"} + }]) + msg = testhelper.llegir_mail("urgent.txt") + f = FiltreNou(msg, self.mock_tickets, self.mock_identitat) + if f.es_aplicable(): + f.filtrar() + self.assertEquals( + self.mock_tickets.alta_tiquet.call_args_list[0][1]['urgencia'], + 'GRAVETAT_ALTA') + +if __name__ == '__main__': + unittest.main() From 966173d0e1d951d53001be83e267c6a4586c4438 Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Mon, 14 Nov 2016 18:59:06 +0100 Subject: [PATCH 06/10] =?UTF-8?q?Fem=20el=20filtre=20"Nou"=20mes=20robust?= =?UTF-8?q?=20quan=20falta=20configuraci=C3=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- filtres/nou.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/filtres/nou.py b/filtres/nou.py index ba44f8d..59d0bbe 100644 --- a/filtres/nou.py +++ b/filtres/nou.py @@ -23,6 +23,8 @@ def es_aplicable(self): def obtenir_parametres_addicionals(self): defaults = {"equipResolutor": settings.get("equip_resolutor_nous")} + if settings.get("valors_defecte") is None: + return defaults for item in settings.get("valors_defecte"): regex = re.compile(item['match'], re.IGNORECASE) for header_name in item['order']: From 4a483bc7396ac31c13122bc512d961bb5be6ffad Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Tue, 15 Nov 2016 15:52:53 +0100 Subject: [PATCH 07/10] Si hi ha "reply-to" el mira abans del "from" per trobar el solicitant --- filtres/filtre.py | 12 ++--- test/test_reply.py | 114 ++++++++++++++++++++++----------------------- 2 files changed, 62 insertions(+), 64 deletions(-) diff --git a/filtres/filtre.py b/filtres/filtre.py index 0be527c..2eb9cb3 100644 --- a/filtres/filtre.py +++ b/filtres/filtre.py @@ -27,14 +27,12 @@ def filtrar(self): return def get_uid(self): - uid = self.identitat.obtenir_uid(self.msg.get_from()) - if uid is not None: - return uid - + uid = None if self.msg.get_reply_to() is not None: - return self.identitat.obtenir_uid(self.msg.get_reply_to()) - - return None + uid = self.identitat.obtenir_uid(self.msg.get_reply_to()) + if uid is None: + uid = self.identitat.obtenir_uid(self.msg.get_from()) + return uid def codificar_base_64_si_cal(self, attachment): if attachment['Content-Transfer-Encoding'] == 'base64': diff --git a/test/test_reply.py b/test/test_reply.py index b1b680c..33bb169 100644 --- a/test/test_reply.py +++ b/test/test_reply.py @@ -1,57 +1,57 @@ -import unittest -import mock -import settings -from soa.tiquets import GestioTiquets -from soa.identitat import GestioIdentitat -from filtres.reply import FiltreReply -from mailticket import MailTicket - - -class TestReply(unittest.TestCase): - - def setUp(self): - self.tickets = mock.create_autospec(GestioTiquets) - self.tickets.consulta_tiquet_dades.return_value = { - "solicitant": "usuari.real", - "emailSolicitant": "mail.extern@mail.com" - } - self.identitat = mock.create_autospec(GestioIdentitat) - self.identitat.obtenir_uid.return_value = None - - settings.init() - settings.set("regex_reply", "(.*)") # Una que trobi sempre algo - settings.set("regex_privat", "X") # Una que no trobi mai res - settings.set("usuari_extern", "usuari.extern") - - def test_reply_mail_extern_igual_a_solicitant_detecta_usuari_real( - self): - msg = mock.create_autospec(MailTicket) - msg.get_from.return_value = "mail.extern@mail.com" - msg.get_subject.return_value = "Re: ticket de prova" - f = FiltreReply(msg, self.tickets, self.identitat) - - self.assertTrue(f.es_aplicable()) - self.assertEquals(f.solicitant, 'usuari.real') - - def test_reply_mail_extern_diferent_a_solicitant_detecta_usuari_extern( - self): - msg = mock.create_autospec(MailTicket) - msg.get_from.return_value = "mail.extern.diferent@mail.com" - msg.get_subject.return_value = "Re: ticket de prova" - f = FiltreReply(msg, self.tickets, self.identitat) - - self.assertTrue(f.es_aplicable()) - self.assertEquals(f.solicitant, 'usuari.extern') - - def test_reply_ticket_id_dintre_de_message_id( - self): - msg = mock.create_autospec(MailTicket) - msg.get_header.return_value = "<4b3b6b9c-bd31-tiquet-id-657421@gn6>" - msg.get_subject.return_value = "Re: ticket de prova" - f = FiltreReply(msg, self.tickets, self.identitat) - - self.assertTrue(f.es_aplicable()) - self.assertEquals(f.ticket_id, "657421") - -if __name__ == '__main__': - unittest.main() +import unittest +import mock +import settings +from soa.tiquets import GestioTiquets +from soa.identitat import GestioIdentitat +from filtres.reply import FiltreReply +from mailticket import MailTicket + + +class TestReply(unittest.TestCase): + + def setUp(self): + self.tickets = mock.create_autospec(GestioTiquets) + self.tickets.consulta_tiquet_dades.return_value = { + "solicitant": "usuari.real", + "emailSolicitant": "mail.extern@mail.com" + } + self.identitat = mock.create_autospec(GestioIdentitat) + self.identitat.obtenir_uid.return_value = None + + settings.init() + settings.set("regex_reply", "(.*)") # Una que trobi sempre algo + settings.set("regex_privat", "X") # Una que no trobi mai res + settings.set("usuari_extern", "usuari.extern") + + def test_reply_mail_extern_igual_a_solicitant_detecta_usuari_real( + self): + msg = mock.create_autospec(MailTicket) + msg.get_from.return_value = "mail.extern@mail.com" + msg.get_subject.return_value = "Re: ticket de prova" + f = FiltreReply(msg, self.tickets, self.identitat) + + self.assertTrue(f.es_aplicable()) + self.assertEquals(f.solicitant, 'usuari.real') + + def test_reply_mail_extern_diferent_a_solicitant_detecta_usuari_extern( + self): + msg = mock.create_autospec(MailTicket) + msg.get_from.return_value = "mail.extern.diferent@mail.com" + msg.get_subject.return_value = "Re: ticket de prova" + f = FiltreReply(msg, self.tickets, self.identitat) + + self.assertTrue(f.es_aplicable()) + self.assertEquals(f.solicitant, 'usuari.extern') + + def test_reply_ticket_id_dintre_de_message_id( + self): + msg = mock.create_autospec(MailTicket) + msg.get_header.return_value = "<4b3b6b9c-bd31-tiquet-id-657421@gn6>" + msg.get_subject.return_value = "Re: ticket de prova" + f = FiltreReply(msg, self.tickets, self.identitat) + + self.assertTrue(f.es_aplicable()) + self.assertEquals(f.ticket_id, "657421") + +if __name__ == '__main__': + unittest.main() From adb0e70c136b04ea666f5df0f23b6ef2dddd59d4 Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Thu, 24 Nov 2016 09:06:12 +0100 Subject: [PATCH 08/10] Afegim un comentari per explicar el canvi d'ordre de reply-to i from --- filtres/filtre.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/filtres/filtre.py b/filtres/filtre.py index 2eb9cb3..6729867 100644 --- a/filtres/filtre.py +++ b/filtres/filtre.py @@ -27,6 +27,10 @@ def filtrar(self): return def get_uid(self): + # Comprovem primer el reply-to pel cas de Prisma en que tenim + # un formulari que envia mails com un usuari genèric i amb reply-to + # a l'adreça de l'usuari que ha fet la petició. + # TODO: intentar fer aixo configurable uid = None if self.msg.get_reply_to() is not None: uid = self.identitat.obtenir_uid(self.msg.get_reply_to()) From efcd48112d7f36367d36f26d8a96df48aca1c834 Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Mon, 14 Nov 2016 19:02:49 +0100 Subject: [PATCH 09/10] Afegeixo els testos de neteja de HTML amb els seus mails anonimitzats --- test/mails/mail-accents.txt | 20 ++ test/mails/mail-office.txt | 642 +++++++++++++++++++++++++++++++++++ test/mails/pgp.txt | 154 +++++++++ test/mails/reply-no-html.txt | 23 ++ test/mails/reply6.txt | 84 +++++ test/test_neteja.py | 42 +++ 6 files changed, 965 insertions(+) create mode 100644 test/mails/mail-accents.txt create mode 100644 test/mails/mail-office.txt create mode 100644 test/mails/pgp.txt create mode 100644 test/mails/reply-no-html.txt create mode 100644 test/mails/reply6.txt diff --git a/test/mails/mail-accents.txt b/test/mails/mail-accents.txt new file mode 100644 index 0000000..afdef75 --- /dev/null +++ b/test/mails/mail-accents.txt @@ -0,0 +1,20 @@ +Content-Type: text/plain; charset=UTF-8; format=flowed +Content-Transfer-Encoding: 8bit + +I si ara responc aquí què passa! +I amb el charset utf8 i tot com toca + +El jueves, 11 de diciembre de 2014 9:04:50, mailtoticket@example.com escribió: +> El tiquet *999999* amb prioritat *#CodiUrgencia:#Urgencia *sol·licitat per +> *#Solicitant* t'ha estat assignat. +> +> Assumpte: *mail amb accénts* +> +> Descripció: +> [Tiquet creat automaticament des de mail a Thu Dec 11 09:04:50 2014 ] +> +> I aquí també +> +> ç +> +> \ No newline at end of file diff --git a/test/mails/mail-office.txt b/test/mails/mail-office.txt new file mode 100644 index 0000000..acefef7 --- /dev/null +++ b/test/mails/mail-office.txt @@ -0,0 +1,642 @@ +Content-Type: multipart/related; + boundary="------------070402080403040907080600" + +This is a multi-part message in MIME format. +--------------070402080403040907080600 +Content-Type: text/html; charset=windows-1252 +Content-Transfer-Encoding: 8bit + + + + + + +
Benvolgut,
+
+ S�c un dels professors de XXX i et demanaria si pots configurar en + el meu compte Atenea que el curs per defecte sigui el de XXX + 2014-15 Q2. Alternativament i si ho puc fer jo mateix, t'agrairia + saber com ho haig de fer, doncs he buscat i no he aconseguit + trobar l'opci�.
+
+ + Ja em dir�s, moltes gr�cies pel suport.
+
+ Atentament,
+
+
+ + + + + + + + + + +
+

Usuari Qualsevol +

+

Departament +xxx

+

xxxyyy zzz

+

Tlf/Phone: + 555 555 555

+

Adre�a/Address: C/ Rue del Percebe 13.

+

.

+

+
+
+ On 09/02/15 15:37, Usuari Qualsevol wrote:
+
+
+ + + + +
+

Hola, la matricula dels estudiants de + grau que ja han cursat ja la primera fase acaba el dia 11; per + tant el dimecres dia 12 podr�em disposar de la matr�cula + definitiva.

+

+

Si em passes els correus electr�nics dels + alumnes matriculats, els hi enviar� un correu per veure quins + alumnes necessiten o volen fer XXX en angl�s. Al mateix temps + els convocar� a la sessi� presencial de XXX per dilluns 16.

+

+

Una pregunta, quan estar� el nou curs donat + d�alta a Atenea amb els alumnes inclosos? Voldria tenir-ho el + m�s aviat possible per poder tamb� interactuar amb ells abans + del comen�ament del curs.

+

+

Quan parlo de nou curs, es tracta de donar + d�alta de nou, la �ltima versi� que hi ha a Atenea.

+

+

Per aquest quadrimestre nom�s donarem + d�alta a Atenea als professors de XXX (els mateixos del curs + anterior), els coordinadors d�especialitat (els mateixos del + curs anterior) i tu mateix.

+

+ + + + + + + + + + +
+

Usuari

+

Director + Acad�mic

+
+

+
+

Rue del Percebe 13

+

Telf.: + 555 555 555

+

altre.usuari@example.com/ www.example.com/

+

+
+

+

+
+
+
+ + + +--------------070402080403040907080600 +Content-Type: image/jpeg +Content-Transfer-Encoding: base64 +Content-ID: + +/9j/4AAQSkZJRgABAQEAYABgAAD/4QAWRXhpZgAASUkqAAgAAAAAAAAAAAD/2wBDAAEBAQEBAQEB +AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/ +2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB +AQEBAQEBAQEBAQH/wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAr/xAAU +EAEAAAAAAAAAAAAAAAAAAAAA/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAA +AAAAAAD/2gAMAwEAAhEDEQA/AL+AAf/Z +--------------070402080403040907080600-- diff --git a/test/mails/pgp.txt b/test/mails/pgp.txt new file mode 100644 index 0000000..07b0bbf --- /dev/null +++ b/test/mails/pgp.txt @@ -0,0 +1,154 @@ +Content-Type: multipart/alternative; + boundary="------------030903060301010207080901" + +This is a multi-part message in MIME format. +--------------030903060301010207080901 +Content-Type: text/plain; charset=utf-8; format=flowed +Content-Transfer-Encoding: 8bit + + + + +-------- Mensaje reenviado -------- +Asunto: activació de l'entorn segur +Fecha: Tue, 12 Jan 2016 07:56:42 +0100 +De: Usuari Qualsevol +Para: mailtoticket@example.com + + + +Hola, + +Us volia demanar... la desactivació de la connexió a Internet (em penso que + +Grà cies, + +-- +Salut! + +Usuari + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +CFsAnHUBBh3XTpN30HrfOUaGVpxYsX9xlNOMlluEioZwSBHlL0/42g5VjCYxY21R +mQINBO1W3yxOxAJ/x3h0bGdXfCKuoA/tKIUMO97D2/5mPcOgXAVYALUafLv7y1V0 +DwFjA9T1ONO5LR0iknc= +=1gTk +-----END PGP PUBLIC KEY BLOCK----- + + + +-- + + E-mail : mailtoticket@example.com + +====================================================================== + +Abans d'imprimir aquest missatge, si us plau, assegureu-vos que sigui +necessari. El medi ambient és cosa de tots. + + +-- + + + E-mail : usuari@example.com + Web : http://suport.example.com/ + +====================================================================== + +Abans d'imprimir aquest missatge, si us plau, assegureu-vos que sigui +necessari. El medi ambient és cosa de tots. + + +--------------030903060301010207080901 +Content-Type: text/html; charset=utf-8 +Content-Transfer-Encoding: 8bit + + + + + + + +
+

+
+ -------- Mensaje reenviado -------- + + + + + + + + + + + + + + + + + + + +
Asunto: + activació de l'entorn segur
Fecha: Tue, 12 Jan 2016 07:56:42 +0100
De: Jordi Delgado <usuari.qualsevol@example.com>
Para: mailtoticket@example.com
+
+
+
Hola,
+
+Us volia demanar...
+
+Grà cies,
+
+--
+Salut!
+
+Usuari
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1
+
+CFsAnHUBBh3XTpN30HrfOUaGVpxYsX9xlNOMlluEioZwSBHlL0/42g5VjCYxY21R
+mQINBO1W3yxOxAJ/x3h0bGdXfCKuoA/tKIUMO97D2/5mPcOgXAVYALUafLv7y1V0
+DwFjA9T1ONO5LR0iknc=
+=1gTk
+-----END PGP PUBLIC KEY BLOCK-----
+
+
+
+
+
--
+
+       E-mail : mailtoticket@example.com
+
+======================================================================
+
+Abans  d'imprimir aquest missatge, si us plau, assegureu-vos que sigui
+necessari. El medi ambient és cosa de tots.
+
+
+
+
+
+
+
+
--
+
+       E-mail : usuari@example.com
+
+======================================================================
+
+Abans  d'imprimir aquest missatge, si us plau, assegureu-vos que sigui
+necessari. El medi ambient és cosa de tots.
+
+
+
+ + + +--------------030903060301010207080901-- diff --git a/test/mails/reply-no-html.txt b/test/mails/reply-no-html.txt new file mode 100644 index 0000000..033b6f9 --- /dev/null +++ b/test/mails/reply-no-html.txt @@ -0,0 +1,23 @@ +MIME-Version: 1.0 +Content-Type: text/plain;charset=iso-8859-1 +Content-Transfer-Encoding: 8bit +X-Priority: 3 (Normal) +Importance: Normal + +Hola, + + + Ok, dema em passo. + + Usuari + +>

Bon dia,
+>
+> Us informem que s'ha actualitzat el contingut del vostre tiquet +> 999999 (Programari docent laboratoris +> d'informàtica) que es troba en procés de +> resolució amb el següent comentari:
+>
+ + + diff --git a/test/mails/reply6.txt b/test/mails/reply6.txt new file mode 100644 index 0000000..006294d --- /dev/null +++ b/test/mails/reply6.txt @@ -0,0 +1,84 @@ +Content-Type: multipart/alternative; + boundary="------------040907080504060509070408" + +This is a multi-part message in MIME format. +--------------040907080504060509070408 +Content-Type: text/plain; charset=UTF-8; format=flowed +Content-Transfer-Encoding: 8bit + +HOla + +No vaig contestar? Per mi be. + +Salutacions + +Usuari + +El 10/12/2014 9:59, mailtoticket@example.com escribió: +> Bon dia, +> +> Us informem que s'ha actualitzat el contingut del vostre tiquet +> *999999* que es troba en procés +> de resolució amb el següent comentari: +> +> Hola, +> +> Us torno a enviar el mail ja que no veig si hi ha hagut resposta. +> +> He demanat de reservar ... +> +> Us va bé? +> +> +> + + +-- +Usuari Qualsevol + + +--------------040907080504060509070408 +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 8bit + + + + + + +

HOla
+
+ No vaig contestar? Per mi be.
+
+ Salutacions
+
+ Usuari
+
+ El 10/12/2014 9:59, mailtoticket@example.com escribió:
+
+ +
Bon dia,
+
+ Us informem que s'ha actualitzat el contingut del vostre tiquet 999999 + que es troba + en procés de resolució amb el següent comentari:
+
+

Hola,

+

Us torno a enviar el mail ja que no veig si hi ha hagut + resposta.

+

He demanat de reservar ...

+

Us va bé?

+
+
+
+
+
+
--
+Usuari Qualsevol
+
+ + + +--------------040907080504060509070408-- \ No newline at end of file diff --git a/test/test_neteja.py b/test/test_neteja.py index 71cc5e6..7e87700 100644 --- a/test/test_neteja.py +++ b/test/test_neteja.py @@ -2,11 +2,53 @@ import netejahtml import unittest +import settings from testhelper import llegir_mail class TestNeteja(unittest.TestCase): + def setUp(self): + settings.init() + + def test_neteja_reply6(self): + msg = llegir_mail("reply6.txt") + html = msg.get_body() + net = netejahtml.neteja_reply(html) + self.assertTrue("vaig contestar?" in net) + self.assertFalse("Usuari Qualsevol" in net) + + def test_neteja_mail_accents(self): + msg = llegir_mail("mail-accents.txt") + html = msg.get_body() + net = netejahtml.neteja_reply(html) + self.assertTrue(u"què passa!" in net) + self.assertFalse("amb prioritat" in net) + + def test_neteja_mail_office(self): + msg = llegir_mail("mail-office.txt") + html = msg.get_body() + net = netejahtml.neteja_reply(html) + self.assertTrue("compte Atenea" in net) + self.assertFalse("la matricula dels estudiants" in net) + + def test_neteja_reply_no_html(self): + msg = llegir_mail("reply-no-html.txt") + html = msg.get_body() + net = netejahtml.neteja_reply(html) + self.assertTrue("Usuari" in net) + self.assertFalse("contingut del vostre tiquet" in net) + + def test_neteja_pgp(self): + msg = llegir_mail("pgp.txt") + html = msg.get_body() + net = netejahtml.treure_pgp(html) + self.assertTrue("Us volia demanar" in net) + self.assertTrue("Usuari" in net) + self.assertTrue("mailtoticket" in net) + self.assertFalse("PGP" in net) + self.assertFalse("mQINB" in net) + def test_treure_style(self): msg = llegir_mail("reply-mutipart-alternative.txt") html = msg.get_body() From e5e52398e1c82879e7d8b89ae3b28f742e4ec808 Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Wed, 30 Nov 2016 10:08:23 +0100 Subject: [PATCH 10/10] =?UTF-8?q?Faltava=20la=20cap=C3=A7alera=20UTF=20per?= =?UTF-8?q?=20no=20tenir=20problemes=20amb=20comentaris?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- filtres/filtre.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/filtres/filtre.py b/filtres/filtre.py index 6729867..e45c749 100644 --- a/filtres/filtre.py +++ b/filtres/filtre.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + import base64 import logging