def user_is_banned_async(self, ip=None): if ip is None: ip = self.user_ip if self._is_banned is None: self._is_banned, self._ban_reason = yield admin.check_ip_ban_async(ip) raise ndb.Return(self._is_banned, self._ban_reason)
def post(self, post_id_str=None, delete=""): is_admin = users.is_current_user_admin() if is_admin: delete = (delete is not None and delete != "") errors = [] ban_ip = None ban_ip_str_post = self.request.POST.get("banee-ip", "").strip() if len(ban_ip_str_post) <= 0: errors.append("You must supply an IP.") else: try: ban_ip = ipaddr.IPAddress(ban_ip_str_post) except ValueError: errors.append("The supplied IP is invalid.") ban_reason = self.request.POST.get("ban-reason", "").strip() if len(ban_reason) <= 0: errors.append("You must supply a reason.") if len(errors) > 0: self.display_page(errors=errors, ip=ban_ip_str_post, reason=ban_reason, delete=delete) else: ban_ip_num = int(ban_ip) ban_ip_num_str = str(ban_ip_num) banned_rpc = admin.check_ip_ban_async(ban_ip) ban_key = models.Ban.get_key(ban_ip_num_str) if delete: post_id = int(post_id_str) current_user = users.get_current_user() admin.delete_post(post_id) logging.info("%s deleted post #%s", current_user.email(), post_id) if banned_rpc.get_result()[0]: ban = ban_key.get() if ban.reason != ban_reason: current_user = users.get_current_user() logging.info("%s changed %s's ban reason from \"%s\" to \"%s\"", current_user.email(), ban_ip, ban.reason, ban_reason) ban.reason = cgi.escape(ban_reason) ban.put() ban_ip_num_str = str(ban_ip_num) memcache.delete_multi([ban_ip_num_str, '%s/reason' % ban_ip_num_str], key_prefix=admin.MEMCACHE_BAN_PREFIX) self.display_page(ip=ban_ip_num, reason=ban_reason, success=True, delete=delete) else: self.display_page(errors=['A ban with that IP and reason already exists.'], ip=str(ban_ip), reason=ban_reason, delete=delete) else: ban_ip_num_str = str(ban_ip_num) ban = models.Ban(key=ban_key, reason=cgi.escape(ban_reason)) ban.put() current_user = users.get_current_user() logging.info("%s banned %s with the reason \"%s\"", current_user.email(), ban_ip, ban_reason) memcache.delete_multi([ban_ip_num_str, '%s/reason' % ban_ip_num_str], key_prefix=admin.MEMCACHE_BAN_PREFIX) self.display_page(ip=str(ban_ip), reason=ban_reason, success=True, delete=delete) else: current_user = users.get_current_user() if current_user: self.abort(403) else: self.redirect('/login')