53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
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
|