Ryan Barry has uploaded a new change for review. Change subject: Use a better URL validator. RegexValidator adds flags ......................................................................
Use a better URL validator. RegexValidator adds flags valid.url relied on urlparse very heavily, but urlparse did not throw an exception on some invalid addresses. urllib3 does this better, but is not available in EL6. Use the URL validator from django instead, and validate with a regex. To support this, give RegexValidator easier-to-set flags as part of the class constructor. Change-Id: I13429d0cc600446c8fd4c1be5e5a8752d6d992f7 Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1231029 Signed-off-by: Ryan Barry <[email protected]> --- M src/ovirt/node/valid.py 1 file changed, 28 insertions(+), 30 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-node refs/changes/94/42394/1 diff --git a/src/ovirt/node/valid.py b/src/ovirt/node/valid.py index 7b1bb45..8f6dc9d 100644 --- a/src/ovirt/node/valid.py +++ b/src/ovirt/node/valid.py @@ -141,11 +141,13 @@ """ # pattern defined by subclass pattern = None + flags = None - def __init__(self, pattern=None, description=None): + def __init__(self, pattern=None, description=None, flags=0): super(RegexValidator, self).__init__() self.pattern = self.pattern or pattern self.description = self.description or description + self.flags = self.flags or flags def validate(self, value): if type(self.pattern) in [str, unicode]: @@ -156,8 +158,11 @@ pass else: self.logger.warning("Unknown type: %s %s" % (value, type(value))) + if len(self.pattern) > 1: + print self.pattern return value is not None and \ - re.compile(*self.pattern).search(value) is not None + re.compile(*self.pattern, flags=self.flags).search(value) \ + is not None class Text(RegexValidator): @@ -311,7 +316,8 @@ description = "a valid FQDN" pattern = ("^(?!(\d+\.){3}\d+)(([a-z0-9\-]*[a-z0-9])\.)*" + - "(([a-z0-9\-]*[a-z0-9])\.?)$", re.I) + "(([a-z0-9\-]*[a-z0-9])\.?)$") + flags = re.IGNORECASE def validate(self, value): is_valid = super(FQDN, self).validate(value) @@ -547,44 +553,36 @@ return value == "" or (self.or_none and value is None) -class URL(Validator): +class URL(RegexValidator): """Allows any FQDN, IPv4 or IPv6 address >>> URL().validate("") False >>> URL().validate("https://1.2.3.4/abc") True - >>> URL(True, True, False).validate("https://1.2.3.4/") + >>> URL().validate("https://1.2.3.4/") True - >>> URL(True, True, False).validate("https://1.2.3.4") + >>> URL().validate("https://1.2.3.4") True - >>> URL(True, False, False).validate("https:///") - True + >>> URL().validate("https:///") + False + >>> URL().validate("http://1.2.3./") + False + >>> URL().validate("http://1.2.3.4:") + False + >>> URL().validate("http://1.2.3.4::") + False """ description = "a valid URL" - - requires_scheme = True - requires_netloc = True - requires_path = False - - def __init__(self, scheme=True, netloc=True, path=False): - self.requires_scheme = scheme - self.requires_netloc = netloc - self.requires_path = path - - def validate(self, value): - p = urlparse.urlparse(value) - is_valid = True - # pylint: disable-msg=E1101 - if self.requires_scheme: - is_valid &= p.scheme != "" - if self.requires_netloc: - is_valid &= p.netloc != "" - if self.requires_path: - is_valid &= p.path != "" - # pylint: enable-msg=E1101 - return is_valid + pattern = r"""^(?:http|ftp)s?:// # protocol + (?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61} + [A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)| # domain + localhost| # or localhost... + \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) # or ip + (?::\d+)? # and port + (?:/?|[/?]\S+)$ # path""" + flags = re.IGNORECASE | re.VERBOSE class Boolean(Validator): -- To view, visit https://gerrit.ovirt.org/42394 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I13429d0cc600446c8fd4c1be5e5a8752d6d992f7 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-node Gerrit-Branch: master Gerrit-Owner: Ryan Barry <[email protected]> _______________________________________________ node-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/node-patches
