From dfbf63d1222f34b74ecbcdd301450abed416fe78 Mon Sep 17 00:00:00 2001 From: melinath Date: Thu, 17 Jun 2010 16:25:24 -0400 Subject: [PATCH] Added redirect and link validators to allow internal-style absolute and relative links/redirects. --- models.py | 3 ++- validators.py | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/models.py b/models.py index f866ee6..0063c86 100644 --- a/models.py +++ b/models.py @@ -19,6 +19,7 @@ from django.template.loader import get_template from django.http import Http404, HttpResponse, HttpResponseServerError, HttpResponseRedirect from django.core.servers.basehttp import FileWrapper from django.conf import settings +from philo.validators import URLRedirectValidator def register_value_model(model): @@ -275,7 +276,7 @@ class Redirect(Node): (302, 'Temporary'), (301, 'Permanent'), ) - target = models.URLField(help_text='Must be a valid, absolute URL (i.e. http://)') + target = models.CharField(max_length=200,validators=[URLRedirectValidator()]) status_code = models.IntegerField(choices=STATUS_CODES, default=302, verbose_name='redirect type') def render_to_response(self, request, path=None, subpath=None): diff --git a/validators.py b/validators.py index bc41d02..68ba293 100644 --- a/validators.py +++ b/validators.py @@ -1,5 +1,7 @@ from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ +from django.core.validators import URLValidator +import re class TreeParentValidator(object): @@ -43,6 +45,7 @@ class TreeParentValidator(object): return self.static_message or _(u"A %s can't be its own parent." % self.instance.__class__.__name__) message = property(get_message) + class TreePositionValidator(object): code = 'invalid' @@ -75,3 +78,25 @@ class TreePositionValidator(object): def get_message(self): return self.static_message or _(u"A %s with that path (parent and slug) already exists." % self.obj_class.__name__) message = property(get_message) + + +class URLRedirectValidator(URLValidator): + regex = re.compile( + r'^(?:https?://' # http:// or https:// + r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' #domain... + r'localhost|' #localhost... + r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip + r'(?::\d+)?' # optional port + r'|)' # also allow internal redirects + r'(?:/?|[/?]?\S+)$', re.IGNORECASE) + + +class URLLinkValidator(URLValidator): + regex = re.compile( + r'^(?:https?://' # http:// or https:// + r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' #domain... + r'localhost|' #localhost... + r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip + r'(?::\d+)?' # optional port + r'|)' # also allow internal links + r'(?:/?|[/?#]?\S+)$', re.IGNORECASE) -- 2.20.1