82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
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
|