# -*- coding: utf-8 -*- # # Copyright (C) 2006-2009 Edgewall Software # All rights reserved. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision # history and logs, available at http://genshi.edgewall.org/log/. import unittest import six from genshi.input import HTML, ParseError from genshi.filters.html import HTMLFormFiller, HTMLSanitizer from genshi.template import MarkupTemplate from genshi.tests.test_utils import doctest_suite class HTMLFormFillerTestCase(unittest.TestCase): def test_fill_input_text_no_value(self): html = HTML(u"""
""") | HTMLFormFiller() self.assertEqual("""""", html.render()) def test_fill_input_text_single_value(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': 'bar'}) self.assertEqual("""""", html.render()) def test_fill_input_text_multi_value(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': ['bar']}) self.assertEqual("""""", html.render()) def test_fill_input_hidden_no_value(self): html = HTML(u"""""") | HTMLFormFiller() self.assertEqual("""""", html.render()) def test_fill_input_hidden_single_value(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': 'bar'}) self.assertEqual("""""", html.render()) def test_fill_input_hidden_multi_value(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': ['bar']}) self.assertEqual("""""", html.render()) def test_fill_textarea_no_value(self): html = HTML(u"""""") | HTMLFormFiller() self.assertEqual("""""", html.render()) def test_fill_textarea_single_value(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': 'bar'}) self.assertEqual("""""", html.render()) def test_fill_textarea_multi_value(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': ['bar']}) self.assertEqual("""""", html.render()) def test_fill_textarea_multiple(self): # Ensure that the subsequent textarea doesn't get the data from the # first html = HTML(u"""""") | HTMLFormFiller(data={'foo': 'Some text'}) self.assertEqual("""""", html.render()) def test_fill_textarea_preserve_original(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': 'Some text'}) self.assertEqual("""""", html.render()) def test_fill_input_checkbox_single_value_auto_no_value(self): html = HTML(u"""""") | HTMLFormFiller() self.assertEqual("""""", html.render()) def test_fill_input_checkbox_single_value_auto(self): html = HTML(u"""""") self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': ''})).render()) self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': 'on'})).render()) def test_fill_input_checkbox_single_value_defined(self): html = HTML("""""", encoding='ascii') self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': '1'})).render()) self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': '2'})).render()) def test_fill_input_checkbox_multi_value_auto(self): html = HTML("""""", encoding='ascii') self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': []})).render()) self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': ['on']})).render()) def test_fill_input_checkbox_multi_value_defined(self): html = HTML(u"""""") self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': ['1']})).render()) self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': ['2']})).render()) def test_fill_input_radio_no_value(self): html = HTML(u"""""") | HTMLFormFiller() self.assertEqual("""""", html.render()) def test_fill_input_radio_single_value(self): html = HTML(u"""""") self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': '1'})).render()) self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': '2'})).render()) def test_fill_input_radio_multi_value(self): html = HTML(u"""""") self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': ['1']})).render()) self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': ['2']})).render()) def test_fill_input_radio_empty_string(self): html = HTML(u"""""") self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': ''})).render()) def test_fill_input_radio_multi_empty_string(self): html = HTML(u"""""") self.assertEqual("""""", (html | HTMLFormFiller(data={'foo': ['']})).render()) def test_fill_select_no_value_auto(self): html = HTML(u"""""") | HTMLFormFiller() self.assertEqual("""""", html.render()) def test_fill_select_no_value_defined(self): html = HTML(u"""""") | HTMLFormFiller() self.assertEqual("""""", html.render()) def test_fill_select_single_value_auto(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': '1'}) self.assertEqual("""""", html.render()) def test_fill_select_single_value_defined(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': '1'}) self.assertEqual("""""", html.render()) def test_fill_select_multi_value_auto(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': ['1', '3']}) self.assertEqual("""""", html.render()) def test_fill_select_multi_value_defined(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': ['1', '3']}) self.assertEqual("""""", html.render()) def test_fill_option_segmented_text(self): html = MarkupTemplate(u"""""").generate(x=1) | HTMLFormFiller(data={'foo': '1'}) self.assertEqual(u"""""", html.render()) def test_fill_option_segmented_text_no_value(self): html = MarkupTemplate("""""").generate(x=1) | HTMLFormFiller(data={'foo': 'foo 1 bar'}) self.assertEqual("""""", html.render()) def test_fill_option_unicode_value(self): html = HTML(u"""""") | HTMLFormFiller(data={'foo': u'ö'}) self.assertEqual(u"""""", html.render(encoding=None)) def test_fill_input_password_disabled(self): html = HTML(u"""""") | HTMLFormFiller(data={'pass': 'bar'}) self.assertEqual("""""", html.render()) def test_fill_input_password_enabled(self): html = HTML(u"""""") | HTMLFormFiller(data={'pass': '1234'}, passwords=True) self.assertEqual("""""", html.render()) def StyleSanitizer(): safe_attrs = HTMLSanitizer.SAFE_ATTRS | frozenset(['style']) return HTMLSanitizer(safe_attrs=safe_attrs) class HTMLSanitizerTestCase(unittest.TestCase): def assert_parse_error_or_equal(self, expected, exploit, allow_strip=False): try: html = HTML(exploit) except ParseError: return sanitized_html = (html | HTMLSanitizer()).render() if not sanitized_html and allow_strip: return self.assertEqual(expected, sanitized_html) def test_sanitize_unchanged(self): html = HTML(u'fo