+
+def deobfuscate_domain(domain: str, blocker: str, domain_hash: str = None) -> str:
+ logger.debug("domain='%s',blocker='%s',domain_hash='%s' - CALLED!", domain, blocker, domain_hash)
+ domain_helper.raise_on(blocker)
+
+ if not isinstance(domain, str):
+ raise ValueError(f"Parameter domain[]='{type(domain)}' is not of type 'str'")
+ elif domain == "":
+ raise ValueError("Parameter domain is empty")
+ elif not isinstance(domain_hash, str) and domain_hash is not None:
+ raise ValueError(f"Parameter domain_hash[]='{type(domain_hash)}' is not of type 'str'")
+
+ if domain.find("*") >= 0:
+ logger.debug("blocker='%s' uses obfuscated domains", blocker)
+
+ # Obscured domain name with no hash
+ row = instances.deobfuscate("*", domain, domain_hash)
+
+ logger.debug("row[]='%s'", type(row))
+ if row is not None:
+ logger.debug("domain='%s' de-obscured to '%s'", domain, row["domain"])
+ domain = row["domain"]
+ else:
+ logger.warning("blocker='%s' has domain='%s' that cannot be deobfuscated.", blocker, domain)
+ instances.set_has_obfuscation(blocker, True)
+ elif domain.find("?") >= 0:
+ logger.debug("blocker='%s' uses obfuscated domains", blocker)
+
+ # Obscured domain name with no hash
+ row = instances.deobfuscate("?", domain, domain_hash)
+
+ logger.debug("row[]='%s'", type(row))
+ if row is not None:
+ logger.debug("domain='%s' de-obscured to '%s'", domain, row["domain"])
+ domain = row["domain"]
+ else:
+ logger.warning("blocker='%s' has domain='%s' that cannot be deobfuscated.", blocker, domain)
+ instances.set_has_obfuscation(blocker, True)
+ else:
+ logger.debug("domain='%s' is not obfuscated", domain)
+
+ logger.debug("domain='%s' - EXIT!", domain)
+ return domain
+
+def process_block(blocker: str, blocked: str, reason: str, block_level: str) -> bool:
+ logger.debug("blocker='%s',blocked='%s',reason='%s',block_level='%s' - CALLED!", blocker, blocked, reason, block_level)
+ domain_helper.raise_on(blocker)
+ domain_helper.raise_on(blocked)
+
+ added = False
+ if not isinstance(reason, str) and reason is not None:
+ raise ValueError(f"Parameter reason[]='{type(reason)}' is not of type 'str'")
+ elif not isinstance(block_level, str):
+ raise ValueError(f"Parameter block_level[]='{type(block_level)}' is not of type 'str'")
+ elif block_level == "":
+ raise ValueError("Parameter block_level is empty")
+
+ if not blocks.is_instance_blocked(blocker, blocked, block_level):
+ logger.debug("Invoking blocks.add_instance(%s, %s, %s, %s) ...", blocker, blocked, reason, block_level)
+ blocks.add_instance(blocker, blocked, reason, block_level)
+ added = True
+ else:
+ logger.debug("Updating block last seen and reason for blocker='%s',blocked='%s' ...", blocker, blocked)
+ blocks.update_last_seen(blocker, blocked, block_level)
+
+ logger.debug("added='%s' - EXIT!", added)
+ return added
+
+def alias_block_level(block_level: str) -> str:
+ logger.debug("block_level='%s' - CALLED!", block_level)
+ if not isinstance(block_level, str):
+ raise ValueError(f"Parameter block_level[]='%s' is not of type 'str'", type(block_level))
+ elif block_level == "":
+ raise ValueError("Parameter 'block_level' is empty")
+
+ if block_level == "silence":
+ logger.debug("Block level 'silence' has been changed to 'silenced'")
+ block_level = "silenced"
+ elif block_level == "suspend":
+ logger.debug("Block level 'suspend' has been changed to 'suspended'")
+ block_level = "suspended"
+ elif block_level == "nsfw":
+ logger.debug("Block level 'nsfw' has been changed to 'media_nsfw'")
+ block_level = "media_nsfw"
+
+ logger.debug("block_level='%s' - EXIT!", block_level)
+ return block_level