def validate(self): if not Form.validate(self): return False self.raw_message = flask.request.files["message"].stream.read() try: digest = pyzor.digest.DataDigester( email.message_from_string(self.raw_message)).value if digest != self.digest.data: self.add_error("digest", "Digest does not match message.") return False client = pyzor.client.Client(timeout=20) try: response = client.check(digest) except pyzor.TimeoutError as e: self.add_error("message", "Temporary error please try again.") self.logger.warn("Timeout: %s", e) return False except pyzor.CommError as e: self.add_error("message", "Temporary error please try again.") self.logger.warn("Error: %s", e) return False if not response.is_ok(): self.add_error("message", "Temporary error please try again.") self.logger.warn("Invalid response from server: %s", response) return False if int(response["Count"]) == 0: self.add_error("message", "Message not reported as spam.") return False if int(response["WL-Count"]) != 0: self.add_error("message", "Message is already whitelisted.") return False except AssertionError: self.add_error("message", "Invalid message.") return False return True
def check_pyzor(self, msg, target=None): """Check the message with the defined pyzor servers. Stores the digest so it can be later used for reporting. :return: True if the message is listed on Pyzor at least `pyzor_max` times and was never whitelisted. """ if not self["use_pyzor"]: return False digest = pyzor.digest.DataDigester(msg.msg).value # Store the digest data in the local message context, so it can be # used for reporting later. self.set_local(msg, "digest", digest) msg.plugin_tags["PYZOR_DIGEST"] = digest client = self["client"] self.ctxt.log.debug("Checking digest %s with Pyzor", digest) for server in self["pyzor_servers"]: response = client.check(digest, server.rsplit(":", 1)) r_count = int(response["Count"]) wl_count = int(response["WL-Count"]) self.ctxt.log.debug("Response from %s: (%s, %s)", server, r_count, wl_count) msg.plugin_tags["PYZOR_COUNT"] = r_count msg.plugin_tags["PYZOR_WL_COUNT"] = wl_count if r_count >= self["pyzor_max"] and not wl_count: return True return False
def check_pyzor(self, msg, target=None): """Check the message with the defined pyzor servers. Stores the digest so it can be used """ if not self["use_pyzor"]: return False digest = pyzor.digest.DataDigester(msg.msg).value # Store the digest data in the local message context, so it can be # used for reporting later. self.set_local(msg, "digest", digest) client = self["client"] self.ctxt.log.debug("Checking digest %s with Pyzor", digest) for server in self["pyzor_servers"]: response = client.check(digest, server.rsplit(":", 1)) r_count = int(response["Count"]) wl_count = int(response["WL-Count"]) self.ctxt.log.debug("Response from %s: (%s, %s)", server, r_count, wl_count) if r_count >= self["pyzor_max"] and not wl_count: return True return False