示例#1
0
	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)
示例#2
0
	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')