implement actual Rewriting logic

This commit is contained in:
Jens Langhammer 2019-03-21 16:22:07 +01:00
parent 81fdcbadad
commit 6d916029bb
3 changed files with 55 additions and 21 deletions

View File

@ -7,15 +7,14 @@ import certifi
import urllib3 import urllib3
from django.core.cache import cache from django.core.cache import cache
from django.utils.http import urlencode from django.utils.http import urlencode
from django.views.generic import RedirectView
from revproxy.exceptions import InvalidUpstream from revproxy.exceptions import InvalidUpstream
from revproxy.response import get_django_response from revproxy.response import get_django_response
from revproxy.utils import encode_items, normalize_request_headers from revproxy.utils import encode_items, normalize_request_headers
from passbook.app_gw.models import ApplicationGatewayProvider from passbook.app_gw.models import ApplicationGatewayProvider
from passbook.app_gw.rewrite import Rewriter
from passbook.core.models import Application from passbook.core.models import Application
from passbook.core.policies import PolicyEngine from passbook.core.policies import PolicyEngine
from passbook.lib.config import CONFIG
IGNORED_HOSTNAMES_KEY = 'passbook_app_gw_ignored' IGNORED_HOSTNAMES_KEY = 'passbook_app_gw_ignored'
LOGGER = getLogger(__name__) LOGGER = getLogger(__name__)
@ -100,15 +99,12 @@ class ApplicationGatewayMiddleware:
return upstream return upstream
# def _format_path_to_redirect(self, request): def _format_path_to_redirect(self, request):
# full_path = request.get_full_path() LOGGER.debug("Path before: %s", request.get_full_path())
# LOGGER.debug("Dispatch full path: %s", full_path) rewriter = Rewriter(self.app_gw, request)
# for from_re, to_pattern in []: after = rewriter.build()
# if from_re.match(full_path): LOGGER.debug("Path after: %s", after)
# redirect_to = from_re.sub(to_pattern, full_path) return after
# LOGGER.debug("Redirect to: %s", redirect_to)
# return redirect_to
# return None
def get_proxy_request_headers(self, request): def get_proxy_request_headers(self, request):
"""Get normalized headers for the upstream """Get normalized headers for the upstream
@ -152,12 +148,11 @@ class ApplicationGatewayMiddleware:
get_data = encode_items(self.request.GET.lists()) get_data = encode_items(self.request.GET.lists())
return urlencode(get_data) return urlencode(get_data)
def _created_proxy_response(self, request): def _created_proxy_response(self, request, path):
request_payload = request.body request_payload = request.body
LOGGER.debug("Request headers: %s", self._request_headers) LOGGER.debug("Request headers: %s", self._request_headers)
path = request.get_full_path()
request_url = self.get_upstream() + path request_url = self.get_upstream() + path
LOGGER.debug("Request URL: %s", request_url) LOGGER.debug("Request URL: %s", request_url)
@ -215,17 +210,14 @@ class ApplicationGatewayMiddleware:
def dispatch(self, request): def dispatch(self, request):
"""Build proxied request and pass to upstream""" """Build proxied request and pass to upstream"""
if not self.check_permission(): # if not self.check_permission():
to_url = 'https://%s/?next=%s' % (CONFIG.get('domains')[0], request.get_full()) # to_url = 'https://%s/?next=%s' % (CONFIG.get('domains')[0], request.get_full_path())
return RedirectView.as_view(url=to_url)(request) # return RedirectView.as_view(url=to_url)(request)
self._request_headers = self.get_request_headers() self._request_headers = self.get_request_headers()
# redirect_to = self._format_path_to_redirect(request) path = self._format_path_to_redirect(request)
# if redirect_to: proxy_response = self._created_proxy_response(request, path)
# return redirect(redirect_to)
proxy_response = self._created_proxy_response(request)
self._replace_host_on_redirect_location(request, proxy_response) self._replace_host_on_redirect_location(request, proxy_response)
self._set_content_type(request, proxy_response) self._set_content_type(request, proxy_response)

View File

@ -0,0 +1,38 @@
"""passbook app_gw rewriter"""
from passbook.app_gw.models import RewriteRule
class Context:
"""Empty class which we dynamically add attributes to"""
class Rewriter:
"""Apply rewrites"""
__application = None
__request = None
def __init__(self, application, request):
self.__application = application
self.__request = request
def __build_context(self, matches):
"""Build object with .0, .1, etc as groups and give access to request"""
context = Context()
for index, group_match in enumerate(matches.groups()):
setattr(context, "g%d" % (index + 1), group_match)
setattr(context, 'request', self.__request)
return context
def build(self):
"""Run all rules over path and return final path"""
path = self.__request.get_full_path()
for rule in RewriteRule.objects.filter(provider__in=[self.__application]):
matches = rule.compiled_matcher.search(path)
if not matches:
continue
replace_context = self.__build_context(matches)
path = rule.replacement.format(context=replace_context)
if rule.halt:
return path
return path

View File

@ -195,3 +195,7 @@ form .form-row p.datetime {
.selector-remove { .selector-remove {
background: url(../admin/img/selector-icons.svg) 0 -64px no-repeat; background: url(../admin/img/selector-icons.svg) 0 -64px no-repeat;
} }
input[data-is-monospace] {
font-family: monospace;
}