import hmac from hashlib import sha1 from django.conf import settings from judge.utils.unicode import utf8bytes class CamoClient(object): """Based on https://github.com/sionide21/camo-client""" def __init__(self, server, key, excluded=(), https=False): self.server = server.rstrip("/") self.key = key self.https = https self.excluded = excluded def image_url(self, url): return "%s/%s/%s" % ( self.server, hmac.new(utf8bytes(self.key), utf8bytes(url), sha1).hexdigest(), utf8bytes(url).hex(), ) def rewrite_url(self, url): if url.startswith(self.server) or url.startswith(self.excluded): return url elif url.startswith(("http://", "https://")): return self.image_url(url) elif url.startswith("//"): return self.rewrite_url(("https:" if self.https else "http:") + url) else: return url def update_tree(self, doc): for img in doc.xpath(".//img"): for attr in ("src", "data-src"): if img.get(attr): img.set(attr, self.rewrite_url(img.get(attr))) for obj in doc.xpath(".//object"): if obj.get("data"): obj.set("data", self.rewrite_url(obj.get("data"))) if settings.DMOJ_CAMO_URL and settings.DMOJ_CAMO_KEY: client = CamoClient( settings.DMOJ_CAMO_URL, key=settings.DMOJ_CAMO_KEY, excluded=settings.DMOJ_CAMO_EXCLUDE, https=settings.DMOJ_CAMO_HTTPS, ) else: client = None