Sunil Mohan Adapa 31cad0bf40
tor: Better validation for upstream bridges
- Convert line terminators in the form field so that it matches the
  current status information resulting in proper detection of change in
  value.

- Allow IPv6 addresses properly.  Allow "[ipv6]:port" format.

- Make specifying port optional.

- Allow spaces at the beginning and ending of the line to compensate for
  copy/paste errors.

- Allow empty lines between bridge specifications.

- Allow multiple spaces between the components.

- Raise error if upstream bridges are not provided when 'use upstream
  bridges' option is enabled.

- Write tests for upstream bridges validator.
2017-01-29 11:20:34 +05:30

97 lines
3.3 KiB
Python

#
# This file is part of Plinth.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
"""
Tests for Tor module.
"""
from django.core.exceptions import ValidationError
import os
import unittest
from plinth.modules.tor import utils
from plinth.modules.tor import forms
euid = os.geteuid()
class TestTor(unittest.TestCase):
"""Test cases for testing the tor module."""
@unittest.skipUnless(euid == 0, 'Needs to be root')
def test_is_apt_transport_tor_enabled(self):
"""Test that is_apt_transport_tor_enabled does not raise any unhandled
exceptions.
"""
utils._is_apt_transport_tor_enabled()
@unittest.skipUnless(euid == 0, 'Needs to be root')
def test_get_status(self):
"""Test that get_status does not raise any unhandled exceptions.
This should work regardless of whether tor is installed, or
/etc/tor/torrc exists.
"""
utils.get_status()
class TestTorForm(unittest.TestCase):
"""Test whether Tor configration form works."""
def test_bridge_validator(self):
"""Test upstream bridges' form field validator."""
validator = forms.bridges_validator
# Just IP:port
validator('73.237.165.184:9001')
validator('73.237.165.184')
validator('[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443')
validator('[2001:db8:85a3:8d3:1319:8a2e:370:7348]')
# With fingerprint
validator('73.237.165.184:9001 '
'0D04F10F497E68D2AF32375BB763EC3458A908C8')
# With transport type
validator('obfs4 73.237.165.184:9001 '
'0D04F10F497E68D2AF32375BB763EC3458A908C8')
# With transport type and extra options
validator('obfs4 10.1.1.1:30000 '
'0123456789ABCDEF0123456789ABCDEF01234567 '
'cert=A/b+1 iat-mode=0')
# Leading, trailing spaces and empty lines
validator('\n'
' \n'
'73.237.165.184:9001 '
'0D04F10F497E68D2AF32375BB763EC3458A908C8'
' \n'
'73.237.165.184:9001 '
'0D04F10F497E68D2AF32375BB763EC3458A908C8'
' \n'
'\n')
# Invalid number for parts
self.assertRaises(ValidationError, validator, ' ')
# Invalid IP address/port
self.assertRaises(ValidationError, validator, '73.237.165.384:9001')
self.assertRaises(ValidationError, validator, '73.237.165.184:90001')
self.assertRaises(ValidationError, validator,
'[a2001:db8:85a3:8d3:1319:8a2e:370:7348]:443')
self.assertRaises(ValidationError, validator,
'[2001:db8:85a3:8d3:1319:8a2e:370:7348]:90443')