From 44ebdeb378f4bf09d6bd1f395764868b57d9fd82 Mon Sep 17 00:00:00 2001 From: Neil Williams Date: Mon, 4 Jun 2012 19:24:06 -0700 Subject: [PATCH] Implement domain bans that inform user of block at submit time. --- r2/r2/controllers/api.py | 11 ++++------- r2/r2/controllers/errors.py | 1 + r2/r2/controllers/validator/validator.py | 11 +++++++++++ r2/r2/models/admintools.py | 3 +++ r2/r2/templates/newlink.html | 1 + 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/r2/r2/controllers/api.py b/r2/r2/controllers/api.py index 5a74f18f2..8cc483760 100755 --- a/r2/r2/controllers/api.py +++ b/r2/r2/controllers/api.py @@ -187,6 +187,7 @@ class ApiController(RedditController): VCaptcha(), VRatelimit(rate_user = True, rate_ip = True, prefix = "rate_submit_"), + VShamedDomain('url'), ip = ValidIP(), sr = VSubmitSR('sr', 'kind'), url = VUrl(['url', 'sr', 'resubmit']), @@ -248,7 +249,8 @@ class ApiController(RedditController): check_domain = True # check for no url, or clear that error field on return - if form.has_errors("url", errors.NO_URL, errors.BAD_URL): + if form.has_errors("url", errors.NO_URL, errors.BAD_URL, + errors.DOMAIN_BANNED): pass elif form.has_errors("url", errors.ALREADY_SUB): check_domain = False @@ -266,13 +268,8 @@ class ApiController(RedditController): g.log.warning("%s is trying to submit url=None (title: %r)" % (request.ip, title)) elif check_domain: + banmsg = is_banned_domain(url, request.ip) - -# Uncomment if we want to let spammers know we're on to them -# if banmsg: -# form.set_html(".field-url.BAD_URL", banmsg) -# return - else: form.has_errors('text', errors.TOO_LONG) diff --git a/r2/r2/controllers/errors.py b/r2/r2/controllers/errors.py index 7803c17bf..56d473754 100644 --- a/r2/r2/controllers/errors.py +++ b/r2/r2/controllers/errors.py @@ -94,6 +94,7 @@ error_list = dict(( ('OAUTH2_ACCESS_DENIED', _('access denied by the user')), ('CONFIRM', _("please confirm the form")), ('NO_API', _('cannot perform this action via the API')), + ('DOMAIN_BANNED', _('%(domain)s is not allowed on reddit: %(reason)s')), )) errors = Storage([(e, e) for e in error_list.keys()]) diff --git a/r2/r2/controllers/validator/validator.py b/r2/r2/controllers/validator/validator.py index 6484ef70d..8e4049e2e 100644 --- a/r2/r2/controllers/validator/validator.py +++ b/r2/r2/controllers/validator/validator.py @@ -1025,6 +1025,17 @@ class VUrl(VRequired): pass return params +class VShamedDomain(Validator): + def run(self, url): + if not url: + return + + is_shamed, domain, reason = is_shamed_domain(url, request.ip) + + if is_shamed: + self.set_error(errors.DOMAIN_BANNED, dict(domain=domain, + reason=reason)) + class VExistingUname(VRequired): def __init__(self, item, *a, **kw): VRequired.__init__(self, item, errors.NO_USER, *a, **kw) diff --git a/r2/r2/models/admintools.py b/r2/r2/models/admintools.py index 621b43d29..958028c7c 100644 --- a/r2/r2/models/admintools.py +++ b/r2/r2/models/admintools.py @@ -329,6 +329,9 @@ def is_banned_IP(ip): def is_banned_domain(dom, ip): return None +def is_shamed_domain(dom, ip): + return False, None, None + def valid_thing(v, karma, *a, **kw): return not v._thing1._spam diff --git a/r2/r2/templates/newlink.html b/r2/r2/templates/newlink.html index 06023f377..d7e7605a8 100755 --- a/r2/r2/templates/newlink.html +++ b/r2/r2/templates/newlink.html @@ -72,6 +72,7 @@ ${thing.formtabs_menu} ${error_field("NO_URL", "url", "div")} ${error_field("BAD_URL", "url", "div")} + ${error_field("DOMAIN_BANNED", "url", "div")} ${error_field("ALREADY_SUB", "url", "div")} ${error_field("NO_LINKS", "sr")} ${error_field("NO_SELFS", "sr")}