# -*- coding: utf-8 -*- """ (c) 2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon """ from __future__ import unicode_literals, absolute_import import datetime import unittest import sys import time import os import flask import flask_wtf from mock import patch, MagicMock sys.path.insert( 0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..") ) import pagure.forms import tests class PagureFlaskFormTests(tests.SimplePagureTest): """ Tests for forms of the flask application """ @patch.dict( "pagure.config.config", {"SERVER_NAME": "localhost.localdomain"} ) def setUp(self): super(PagureFlaskFormTests, self).setUp() def test_csrf_form_no_input(self): """ Test the CSRF validation if not CSRF is specified. """ with self.app.application.test_request_context(method="POST"): flask.g.session = MagicMock() form = pagure.forms.ConfirmationForm() self.assertFalse(form.validate_on_submit()) def test_csrf_form_w_invalid_input(self): """ Test the CSRF validation with an invalid CSRF specified. """ with self.app.application.test_request_context(method="POST"): flask.g.session = MagicMock() form = pagure.forms.ConfirmationForm() form.csrf_token.data = "foobar" self.assertFalse(form.validate_on_submit()) def test_csrf_form_w_input(self): """ Test the CSRF validation with a valid CSRF specified. """ with self.app.application.test_request_context(method="POST"): flask.g.session = MagicMock() form = pagure.forms.ConfirmationForm() form.csrf_token.data = form.csrf_token.current_token self.assertTrue(form.validate_on_submit()) def test_csrf_form_w_expired_input(self): """ Test the CSRF validation with an expired CSRF specified. """ with self.app.application.test_request_context(method="POST"): flask.g.session = MagicMock() form = pagure.forms.ConfirmationForm() data = form.csrf_token.current_token # CSRF token expired if hasattr(flask_wtf, "__version__") and tuple( [int(v) for v in flask_wtf.__version__.split(".")] ) < (0, 10, 0): expires = time.time() - 1 else: expires = ( datetime.datetime.now() - datetime.timedelta(minutes=1) ).strftime("%Y%m%d%H%M%S") # Change the CSRF format if hasattr(flask_wtf, "__version__") and tuple( [int(e) for e in flask_wtf.__version__.split(".")] ) >= (0, 14, 0): import itsdangerous try: # ItsDangerous-1.0 timestamp = itsdangerous.base64_encode( itsdangerous.encoding.int_to_bytes(int(expires)) ) except AttributeError: # ItsDangerous-0.24 timestamp = itsdangerous.base64_encode( itsdangerous.int_to_bytes(int(expires)) ) timestamp = timestamp.decode("ascii") part1, _, part2 = data.split(".", 2) form.csrf_token.data = ".".join([part1, timestamp, part2]) else: _, hmac_csrf = data.split("##", 1) form.csrf_token.data = "%s##%s" % (expires, hmac_csrf) self.assertFalse(form.validate_on_submit()) def test_csrf_form_w_unexpiring_input(self): """ Test the CSRF validation with a CSRF not expiring. """ pagure.config.config["WTF_CSRF_TIME_LIMIT"] = None with self.app.application.test_request_context(method="POST"): flask.g.session = MagicMock() form = pagure.forms.ConfirmationForm() data = form.csrf_token.current_token if hasattr(flask_wtf, "__version__") and tuple( [int(e) for e in flask_wtf.__version__.split(".")] ) >= (0, 14, 0): form.csrf_token.data = data else: _, hmac_csrf = data.split("##", 1) # CSRF can no longer expire, they have no expiration info form.csrf_token.data = "##%s" % hmac_csrf self.assertTrue(form.validate_on_submit()) def test_add_user_form(self): """ Test the AddUserForm of pagure.forms """ with self.app.application.test_request_context(method="POST"): flask.g.session = MagicMock() form = pagure.forms.AddUserForm() form.csrf_token.data = form.csrf_token.current_token # No user or access given self.assertFalse(form.validate_on_submit()) # No access given form.user.data = "foo" self.assertFalse(form.validate_on_submit()) form.access.data = "admin" self.assertTrue(form.validate_on_submit()) def test_add_user_to_group_form(self): """ Test the AddUserToGroup form of pagure.forms """ with self.app.application.test_request_context(method="POST"): flask.g.session = MagicMock() form = pagure.forms.AddUserToGroupForm() form.csrf_token.data = form.csrf_token.current_token # No user given self.assertFalse(form.validate_on_submit()) form.user.data = "foo" # Everything given self.assertTrue(form.validate_on_submit()) def test_add_group_form(self): """ Test the AddGroupForm form of pagure.forms """ with self.app.application.test_request_context(method="POST"): flask.g.session = MagicMock() form = pagure.forms.AddGroupForm() form.csrf_token.data = form.csrf_token.current_token # No group given self.assertFalse(form.validate_on_submit()) # No access given form.group.data = "gname" self.assertFalse(form.validate_on_submit()) form.access.data = "admin" self.assertTrue(form.validate_on_submit()) if __name__ == "__main__": unittest.main(verbosity=2)