Browse Source

Validate the chatroom URL

If some exception happened feching an attribute in a template, with Django 1.7,
empty value was returned. With Django 1.8 it makes it crashing… So some bugs
get revealed ;-).

Ref https://code.ffdn.org/FFDN/coin/pulls/99#issuecomment-398
Jocelyn Delalande 8 years ago
parent
commit
18135781db
4 changed files with 37 additions and 1 deletions
  1. 3 1
      coin/isp_database/models.py
  2. 17 0
      coin/isp_database/tests.py
  3. 9 0
      coin/members/tests.py
  4. 8 0
      coin/validation.py

+ 3 - 1
coin/isp_database/models.py

@@ -11,6 +11,7 @@ from localflavor.fr.models import FRSIRETField
 from coin.members.models import count_active_members
 from coin.offers.models import count_active_subscriptions
 from coin import utils
+from coin.validation import chatroom_url_validator
 
 # API version, see http://db.ffdn.org/format
 API_VERSION = 0.1
@@ -190,7 +191,8 @@ class RegisteredOffice(models.Model):
 
 
 class ChatRoom(models.Model):
-    url = models.CharField(verbose_name="URL", max_length=256)
+    url = models.CharField(
+        verbose_name="URL", max_length=256, validators=[chatroom_url_validator])
     isp = models.ForeignKey(ISPInfo)
 
 

+ 17 - 0
coin/isp_database/tests.py

@@ -1,8 +1,11 @@
+from django.contrib.auth.models import UserManager
 from django.test import TestCase
 
 # Create your tests here.
 
+from coin.members.models import Member
 from coin.isp_database.templatetags.isptags import *
+from .models import ChatRoom, ISPInfo
 
 class TestPrettifiers(TestCase):
     def test_pretty_iban(self):
@@ -16,3 +19,17 @@ class TestPrettifiers(TestCase):
         self.assertEqual(pretty_iban('ADkkBBBBSSSSCCCCCCCCCCCC'),
                          'ADkk BBBB SSSS CCCC CCCC CCCC')
         self.assertEqual(pretty_iban(''), '')
+
+class TestContactPage(TestCase):
+    def setUp(self):
+        # Could be replaced by a force_login when we will be at Django 1.9
+        Member.objects.create_user('user', password='password')
+        self.client.login(username='user', password='password')
+
+    def test_chat_view(self):
+        isp = ISPInfo.objects.create(name='test', email='foo@example.com', )
+        ChatRoom.objects.create(
+            isp=isp, url='irc://irc.example.com/#chan')
+
+        response = self.client.get('/members/contact/')
+        self.assertEqual(response.status_code, 200)

+ 9 - 0
coin/members/tests.py

@@ -14,8 +14,10 @@ from django.conf import settings
 from django.test import TestCase, Client, override_settings
 from django.contrib.auth.models import User
 from django.core import mail, management
+from django.core.exceptions import ValidationError
 
 from coin.members.models import Member, MembershipFee, LdapUser
+from coin.validation import chatroom_url_validator
 
 
 @unittest.skipIf(not settings.LDAP_ACTIVATE, "LDAP disabled")
@@ -500,3 +502,10 @@ class MemberTestsUtils(object):
         Renvoi une clé aléatoire pour un utilisateur LDAP
         """
         return 'coin_test_' + os.urandom(8).encode('hex')
+
+
+class TestValidators(TestCase):
+    def test_valid_chatroom(self):
+        chatroom_url_validator('irc://irc.example.com/#chan')
+        with self.assertRaises(ValidationError):
+            chatroom_url_validator('http://#faimaison@irc.geeknode.org')

+ 8 - 0
coin/validation.py

@@ -2,6 +2,9 @@
 from __future__ import unicode_literals
 
 from django.core.exceptions import ValidationError
+from django.core.validators import RegexValidator
+
+from .utils import re_chat_url
 
 
 def validate_v4(address):
@@ -12,3 +15,8 @@ def validate_v4(address):
 def validate_v6(address):
     if address.version != 6:
         raise ValidationError('{} is not an IPv6 address'.format(address))
+
+
+chatroom_url_validator = RegexValidator(
+    regex=re_chat_url,
+    message="Enter a value of the form  <proto>://<server>/<channel>")