From a044bdbf8aa9bc14f880b867d209742aedb616de Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 29 Oct 2013 15:19:39 +0100 Subject: [PATCH 1/5] [FIX] mute logger in some tests bzr revid: chs@openerp.com-20131029141939-xt9093hfv8cfjkdo --- openerp/tests/test_acl.py | 5 +++-- openerp/tests/test_mail.py | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openerp/tests/test_acl.py b/openerp/tests/test_acl.py index e80390cd5a2..44ec677ff6f 100644 --- a/openerp/tests/test_acl.py +++ b/openerp/tests/test_acl.py @@ -95,9 +95,10 @@ class TestACL(common.TransactionCase): part = P.browse(self.cr, self.demo_uid, pid) # accessing fields must no raise exceptions... part.name - # ... except they are restricted + # ... except if they are restricted with self.assertRaises(openerp.osv.orm.except_orm) as cm: - part.email + with mute_logger('openerp.osv.orm'): + part.email self.assertEqual(cm.exception.args[0], 'Access Denied') finally: diff --git a/openerp/tests/test_mail.py b/openerp/tests/test_mail.py index ddb8fc4a195..6450c5ba780 100755 --- a/openerp/tests/test_mail.py +++ b/openerp/tests/test_mail.py @@ -23,7 +23,7 @@ ############################################################################## import unittest2 -from openerp.tools import html_sanitize, html_email_clean, append_content_to_html, plaintext2html +from openerp.tools import html_sanitize, html_email_clean, append_content_to_html, plaintext2html, mute_logger HTML_SOURCE = """ test1 @@ -178,6 +178,7 @@ class TestSanitizer(unittest2.TestCase): html = html_sanitize(content) self.assertEqual(html, expected, 'html_sanitize is broken') + @mute_logger('openerp.tools.mail') def test_evil_malicious_code(self): # taken from https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#Tests cases = [ From 864af467e1e11a51de6eb7ae2ed0e3ae5b9f4388 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 31 Oct 2013 20:32:28 +0100 Subject: [PATCH 2/5] [FIX] module loading: do not warn about missing access rules for AbstractModels bzr revid: chs@openerp.com-20131031193228-agj0qa9ceolpmvy6 --- openerp/modules/loading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 43e59ed5df1..311e00be35b 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -363,7 +363,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False): cr.execute("""select model,name from ir_model where id NOT IN (select distinct model_id from ir_model_access)""") for (model, name) in cr.fetchall(): model_obj = pool.get(model) - if model_obj and not model_obj.is_transient(): + if model_obj and not model_obj.is_transient() and not isinstance(model_obj, openerp.osv.orm.AbstractModel): _logger.warning('The model %s has no access rules, consider adding one. E.g. access_%s,access_%s,model_%s,,1,1,1,1', model, model.replace('.', '_'), model.replace('.', '_'), model.replace('.', '_')) From aeaed95e81425a4ac00e528c0dfc29fd0e4d865f Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Fri, 8 Nov 2013 22:27:09 +0100 Subject: [PATCH 3/5] [IMP] trml2pdf: like css, invalid style name is not a warning. bzr revid: chs@openerp.com-20131108212709-4dmdbxxh2w1jd51p --- openerp/report/render/rml2pdf/trml2pdf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/report/render/rml2pdf/trml2pdf.py b/openerp/report/render/rml2pdf/trml2pdf.py index 2052b128ad9..5c688022ad8 100644 --- a/openerp/report/render/rml2pdf/trml2pdf.py +++ b/openerp/report/render/rml2pdf/trml2pdf.py @@ -242,7 +242,7 @@ class _rml_styles(object,): if sname in self.styles_obj: style = self.styles_obj[sname] else: - _logger.warning('Warning: style not found, %s - setting default!\n' % (node.get('style'),) ) + _logger.debug('Warning: style not found, %s - setting default!', node.get('style')) if not style: style = self.default_style['Normal'] para_update = self._para_style_update(node) From 1df6461c4addcbe4d7a4ee83337abad1f8417118 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Fri, 8 Nov 2013 23:58:20 +0100 Subject: [PATCH 4/5] [FIX] base: test_translation: load an existing translation bzr revid: chs@openerp.com-20131108225820-i2pea15b7lymyw6t --- openerp/addons/base/tests/test_base.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openerp/addons/base/tests/test_base.py b/openerp/addons/base/tests/test_base.py index 3a0131c2a05..a7df2a5bb27 100644 --- a/openerp/addons/base/tests/test_base.py +++ b/openerp/addons/base/tests/test_base.py @@ -311,10 +311,10 @@ class test_translation(common.TransactionCase): self.res_category = self.registry('res.partner.category') self.ir_translation = self.registry('ir.translation') cr, uid = self.cr, self.uid - self.registry('ir.translation').load(cr, ['base'], ['fr_BE']) + self.registry('ir.translation').load(cr, ['base'], ['fr_FR']) self.cat_id = self.res_category.create(cr, uid, {'name': 'Customers'}) self.ir_translation.create(cr, uid, {'name': 'res.partner.category,name', 'module':'base', - 'value': 'Clients', 'res_id': self.cat_id, 'lang':'fr_BE', 'state':'translated', 'type': 'model'}) + 'value': 'Clients', 'res_id': self.cat_id, 'lang':'fr_FR', 'state':'translated', 'type': 'model'}) def test_101_create_translated_record(self): cr, uid = self.cr, self.uid @@ -322,27 +322,27 @@ class test_translation(common.TransactionCase): no_context_cat = self.res_category.browse(cr, uid, self.cat_id) self.assertEqual(no_context_cat.name, 'Customers', "Error in basic name_get") - fr_context_cat = self.res_category.browse(cr, uid, self.cat_id, context={'lang':'fr_BE'}) + fr_context_cat = self.res_category.browse(cr, uid, self.cat_id, context={'lang':'fr_FR'}) self.assertEqual(fr_context_cat.name, 'Clients', "Translation not found") def test_102_duplicate_record(self): cr, uid = self.cr, self.uid - self.new_cat_id = self.res_category.copy(cr, uid, self.cat_id, context={'lang':'fr_BE'}) + self.new_cat_id = self.res_category.copy(cr, uid, self.cat_id, context={'lang':'fr_FR'}) no_context_cat = self.res_category.browse(cr, uid, self.new_cat_id) self.assertEqual(no_context_cat.name, 'Customers', "Duplication did not set untranslated value") - fr_context_cat = self.res_category.browse(cr, uid, self.new_cat_id, context={'lang':'fr_BE'}) + fr_context_cat = self.res_category.browse(cr, uid, self.new_cat_id, context={'lang':'fr_FR'}) self.assertEqual(fr_context_cat.name, 'Clients', "Did not found translation for initial value") def test_103_duplicate_record_fr(self): cr, uid = self.cr, self.uid - self.new_fr_cat_id = self.res_category.copy(cr, uid, self.cat_id, default={'name': 'Clients (copie)'}, context={'lang':'fr_BE'}) + self.new_fr_cat_id = self.res_category.copy(cr, uid, self.cat_id, default={'name': 'Clients (copie)'}, context={'lang':'fr_FR'}) no_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id) self.assertEqual(no_context_cat.name, 'Clients (copie)', "Duplication with default value not applied") - fr_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id, context={'lang':'fr_BE'}) + fr_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id, context={'lang':'fr_FR'}) self.assertEqual(fr_context_cat.name, 'Clients', "Did not found translation for initial value") From 7ba1d747cc178b09bacdfb8298935efafcbec778 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Wed, 13 Nov 2013 12:37:15 +0100 Subject: [PATCH 5/5] [FIX] html_sanitize: handle the case of empty documents (after sanitization). [IMP] test_mail: do not mute logger bzr revid: chs@openerp.com-20131113113715-tzaog0d6o2u4q0x4 --- openerp/tests/test_mail.py | 3 +-- openerp/tools/mail.py | 12 +++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/openerp/tests/test_mail.py b/openerp/tests/test_mail.py index 6450c5ba780..ddb8fc4a195 100755 --- a/openerp/tests/test_mail.py +++ b/openerp/tests/test_mail.py @@ -23,7 +23,7 @@ ############################################################################## import unittest2 -from openerp.tools import html_sanitize, html_email_clean, append_content_to_html, plaintext2html, mute_logger +from openerp.tools import html_sanitize, html_email_clean, append_content_to_html, plaintext2html HTML_SOURCE = """ test1 @@ -178,7 +178,6 @@ class TestSanitizer(unittest2.TestCase): html = html_sanitize(content) self.assertEqual(html, expected, 'html_sanitize is broken') - @mute_logger('openerp.tools.mail') def test_evil_malicious_code(self): # taken from https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#Tests cases = [ diff --git a/openerp/tools/mail.py b/openerp/tools/mail.py index c516cb7d643..b0605bf5c83 100644 --- a/openerp/tools/mail.py +++ b/openerp/tools/mail.py @@ -2,7 +2,7 @@ ############################################################################## # # OpenERP, Open Source Business Applications -# Copyright (C) 2012 OpenERP S.A. (). +# Copyright (C) 2012-2013 OpenERP S.A. (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -52,17 +52,19 @@ def html_sanitize(src): # html encode email tags part = re.compile(r"(<(([^a<>]|a[^<>\s])[^<>]*)@[^<>]+>)", re.IGNORECASE | re.DOTALL) src = part.sub(lambda m: cgi.escape(m.group(1)), src) - + # some corner cases make the parser crash (such as in test_mail) try: cleaner = clean.Cleaner(page_structure=True, style=False, safe_attrs_only=False, forms=False, kill_tags=tags_to_kill, remove_tags=tags_to_remove) cleaned = cleaner.clean_html(src) - except TypeError, e: + except TypeError: # lxml.clean version < 2.3.1 does not have a kill_tags attribute # to remove in 2014 - cleaner = clean.Cleaner(page_structure=True, style=False, safe_attrs_only=False, forms=False, remove_tags=tags_to_kill+tags_to_remove) + cleaner = clean.Cleaner(page_structure=True, style=False, safe_attrs_only=False, forms=False, remove_tags=tags_to_kill + tags_to_remove) cleaned = cleaner.clean_html(src) - except: + except Exception, e: + if isinstance(e, etree.ParserError) and 'empty' in str(e): + return "" _logger.warning('html_sanitize failed to parse %s' % (src)) cleaned = '

Impossible to parse

' return cleaned