forked from GithubBackups/healthchecks
Update AddSmsForm to remove any invisible unicode characers
This commit is contained in:
parent
7534f1856f
commit
a37e83aca8
@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
## Improvements
|
## Improvements
|
||||||
- Add a tooltip to the 'confirmation link' label (#436)
|
- Add a tooltip to the 'confirmation link' label (#436)
|
||||||
- Update API to allow specifying channels by names (#440)
|
- Update API to allow specifying channels by names (#440)
|
||||||
|
- When saving a phone number, remove any invisible unicode characers
|
||||||
|
|
||||||
## v1.17.0 - 2020-10-14
|
## v1.17.0 - 2020-10-14
|
||||||
|
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
from datetime import timedelta as td
|
from datetime import timedelta as td
|
||||||
import json
|
import json
|
||||||
|
import re
|
||||||
from urllib.parse import quote, urlencode
|
from urllib.parse import quote, urlencode
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.forms import URLField
|
from django.forms import URLField
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.core.validators import RegexValidator
|
|
||||||
from hc.front.validators import (
|
from hc.front.validators import (
|
||||||
CronExpressionValidator,
|
CronExpressionValidator,
|
||||||
TimezoneValidator,
|
TimezoneValidator,
|
||||||
@ -193,18 +193,22 @@ class AddShellForm(forms.Form):
|
|||||||
return json.dumps(dict(self.cleaned_data), sort_keys=True)
|
return json.dumps(dict(self.cleaned_data), sort_keys=True)
|
||||||
|
|
||||||
|
|
||||||
phone_validator = RegexValidator(
|
|
||||||
regex="^\+\d{5,15}$", message="Invalid phone number format."
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class AddSmsForm(forms.Form):
|
class AddSmsForm(forms.Form):
|
||||||
error_css_class = "has-error"
|
error_css_class = "has-error"
|
||||||
label = forms.CharField(max_length=100, required=False)
|
label = forms.CharField(max_length=100, required=False)
|
||||||
value = forms.CharField(max_length=16, validators=[phone_validator])
|
value = forms.CharField()
|
||||||
down = forms.BooleanField(required=False, initial=True)
|
down = forms.BooleanField(required=False, initial=True)
|
||||||
up = forms.BooleanField(required=False, initial=True)
|
up = forms.BooleanField(required=False, initial=True)
|
||||||
|
|
||||||
|
def clean_value(self):
|
||||||
|
v = self.cleaned_data["value"]
|
||||||
|
|
||||||
|
stripped = v.encode("ascii", "ignore").decode("ascii")
|
||||||
|
if not re.match(r"^\+\d{5,15}$", stripped):
|
||||||
|
raise forms.ValidationError("Invalid phone number format.")
|
||||||
|
|
||||||
|
return stripped
|
||||||
|
|
||||||
|
|
||||||
class ChannelNameForm(forms.Form):
|
class ChannelNameForm(forms.Form):
|
||||||
name = forms.CharField(max_length=100, required=False)
|
name = forms.CharField(max_length=100, required=False)
|
||||||
|
@ -37,11 +37,11 @@ class AddSmsTestCase(BaseTestCase):
|
|||||||
self.assertEqual(c.project, self.project)
|
self.assertEqual(c.project, self.project)
|
||||||
|
|
||||||
def test_it_rejects_bad_number(self):
|
def test_it_rejects_bad_number(self):
|
||||||
form = {"value": "not a phone number address"}
|
for v in ["not a phone number address", False, 15, "+123456789A"]:
|
||||||
|
form = {"value": v}
|
||||||
self.client.login(username="alice@example.org", password="password")
|
self.client.login(username="alice@example.org", password="password")
|
||||||
r = self.client.post(self.url, form)
|
r = self.client.post(self.url, form)
|
||||||
self.assertContains(r, "Invalid phone number format.")
|
self.assertContains(r, "Invalid phone number format.")
|
||||||
|
|
||||||
def test_it_trims_whitespace(self):
|
def test_it_trims_whitespace(self):
|
||||||
form = {"value": " +1234567890 "}
|
form = {"value": " +1234567890 "}
|
||||||
@ -65,3 +65,13 @@ class AddSmsTestCase(BaseTestCase):
|
|||||||
self.client.login(username="bob@example.org", password="password")
|
self.client.login(username="bob@example.org", password="password")
|
||||||
r = self.client.get(self.url)
|
r = self.client.get(self.url)
|
||||||
self.assertEqual(r.status_code, 403)
|
self.assertEqual(r.status_code, 403)
|
||||||
|
|
||||||
|
def test_it_strips_invisible_formatting_characters(self):
|
||||||
|
form = {"label": "My Phone", "value": "\u202c+1234567890\u202c"}
|
||||||
|
|
||||||
|
self.client.login(username="alice@example.org", password="password")
|
||||||
|
r = self.client.post(self.url, form)
|
||||||
|
self.assertRedirects(r, self.channels_url)
|
||||||
|
|
||||||
|
c = Channel.objects.get()
|
||||||
|
self.assertEqual(c.phone_number, "+1234567890")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user