diff options
Diffstat (limited to '')
| -rw-r--r-- | webmentions_ssg/forms/__init__.py | 3 | ||||
| -rw-r--r-- | webmentions_ssg/forms/validators.py | 25 |
2 files changed, 27 insertions, 1 deletions
diff --git a/webmentions_ssg/forms/__init__.py b/webmentions_ssg/forms/__init__.py index 98962ad..0c54999 100644 --- a/webmentions_ssg/forms/__init__.py +++ b/webmentions_ssg/forms/__init__.py @@ -4,7 +4,7 @@ from flask_wtf import FlaskForm from wtforms import PasswordField, StringField, SubmitField from wtforms.validators import URL, InputRequired, Regexp -from .validators import AllowedHostname, NotEqualTo +from .validators import AllowedHostname, NotEqualTo, PublicURL class LoginForm(FlaskForm): @@ -25,6 +25,7 @@ class EndpointForm(FlaskForm): message="source must begin with http or https", ), NotEqualTo("target"), + PublicURL(), ], ) target = StringField( diff --git a/webmentions_ssg/forms/validators.py b/webmentions_ssg/forms/validators.py index 20d9ebf..e979644 100644 --- a/webmentions_ssg/forms/validators.py +++ b/webmentions_ssg/forms/validators.py @@ -3,6 +3,12 @@ from urllib.parse import urlsplit from flask import current_app from wtforms import ValidationError +from ..url_security import ( + AddressResolutionError, + NonPublicAddressError, + ensure_public_url, +) + class NotEqualTo: """ @@ -60,3 +66,22 @@ class AllowedHostname: message = field.gettext("Invalid input.") raise ValidationError(message) + + +class PublicURL: + def __init__(self, message=None): + self.message = message + + def __call__(self, form, field): + try: + ensure_public_url(field.data) + except ( + AddressResolutionError, + NonPublicAddressError, + ) as exc: + message = self.message + + if message is None: + message = field.gettext("URL must resolve to a public address.") + + raise ValidationError(message) from exc |
