You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.7 KiB

from urllib.parse import urlparse
from django.forms import ModelForm
from django.http import HttpRequest, HttpResponse, HttpResponseForbidden
from pyrogram import Chat as PyrogramChat
from pyrogram.api.types.chat import Chat as MTProtoChat
from pyrogram.api.types.user import User as MTProtoUser
from pyrogram.api.types.channel import Channel as MTProtoChannel
def parse_mtproto_chat(client, chat):
if isinstance(chat, MTProtoChat):
return PyrogramChat._parse_chat_chat(client, chat)
elif isinstance(chat, MTProtoUser):
return PyrogramChat._parse_user_chat(client, chat)
return PyrogramChat._parse_channel_chat(client, chat)
def same_origin(current_uri, redirect_uri):
a = urlparse(current_uri)
if not a.scheme:
return True
b = urlparse(redirect_uri)
return (a.scheme, a.hostname, a.port) == (b.scheme, b.hostname, b.port)
def turbolinks(request: HttpRequest):
ctx = {}
if request.META.get('HTTP_TURBOLINKS_REFERRER') is not None:
ctx['is_turbolinks'] = True
return ctx
class TurbolinksMiddleware:
def process_request(self, request: HttpRequest):
referrer = request.META.get('HTTP_TURBOLINKS_REFERRER')
if referrer:
request.META['HTTP_REFERER'] = referrer
return
def process_response(self, request: HttpRequest, response: HttpResponse):
referrer = request.META.get('HTTP_TURBOLINKS_REFERRER')
if referrer is None:
return response
if response.has_header('Location'):
loc = response['Location']
request.session['_turbolinks_redirect_to'] = loc
if referrer and not same_origin(loc, referrer):
return HttpResponseForbidden()
else:
if request.session.get('_turbolinks_redirect_to'):
loc = request.session.pop('_turbolinks_redirect_to')
response['Turbolinks-Location'] = loc
return response
def get_config_form(mdl):
class ConfigForm(ModelForm):
prefix = 'config'
class Meta:
model = mdl
exclude = ()
widgets = mdl.CUSTOM_WIDGETS if hasattr(mdl, 'CUSTOM_WIDGETS') else {}
return ConfigForm
class AllowCORSMixin(object):
def add_access_control_headers(self, response):
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "GET, OPTIONS"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "X-Requested-With, Content-Type"
def options(self, request, *args, **kwargs):
response = HttpResponse()
self.add_access_control_headers(response)
return response