forked from CGM_Public/pretix_original
Allow to use custom domains for some but not all events (Z#23153875) (#4627)
* Allow to use custom domains for some but not all events * Update src/pretix/multidomain/urlreverse.py * Apply suggestions from code review Co-authored-by: Mira <weller@rami.io> * Logging for domain config changes --------- Co-authored-by: Mira <weller@rami.io>
This commit is contained in:
@@ -57,8 +57,9 @@ from pretix.base.middleware import LocaleMiddleware
|
||||
from pretix.base.models import Customer, Event, Organizer
|
||||
from pretix.base.timemachine import time_machine_now_assigned_from_request
|
||||
from pretix.helpers.http import redirect_to_url
|
||||
from pretix.multidomain.models import KnownDomain
|
||||
from pretix.multidomain.urlreverse import (
|
||||
get_event_domain, get_organizer_domain,
|
||||
build_absolute_uri, get_event_domain, get_organizer_domain,
|
||||
)
|
||||
from pretix.presale.signals import process_request, process_response
|
||||
|
||||
@@ -134,7 +135,7 @@ def update_customer_session_auth_hash(request, customer):
|
||||
|
||||
|
||||
def add_customer_to_request(request):
|
||||
if 'cross_domain_customer_auth' in request.GET and request.event_domain:
|
||||
if 'cross_domain_customer_auth' in request.GET and request.domain_mode in (KnownDomain.MODE_EVENT_DOMAIN, KnownDomain.MODE_ORG_ALT_DOMAIN):
|
||||
# The user is logged in on the main domain and now wants to take their session
|
||||
# to a event-specific domain. We validate the one time token received via a
|
||||
# query parameter and make sure we invalidate it right away. Then, we look up
|
||||
@@ -258,11 +259,13 @@ def _detect_event(request, require_live=True, require_plugin=None):
|
||||
|
||||
url = resolve(request.path_info)
|
||||
|
||||
request_domain_mode = getattr(request, 'domain_mode', 'system')
|
||||
print("Mode", request_domain_mode)
|
||||
try:
|
||||
if hasattr(request, 'event_domain'):
|
||||
if request_domain_mode == KnownDomain.MODE_EVENT_DOMAIN:
|
||||
# We are on an event's custom domain
|
||||
pass
|
||||
elif hasattr(request, 'organizer_domain'):
|
||||
elif request_domain_mode in (KnownDomain.MODE_ORG_DOMAIN, KnownDomain.MODE_ORG_ALT_DOMAIN):
|
||||
# We are on an organizer's custom domain
|
||||
if 'organizer' in url.kwargs and url.kwargs['organizer']:
|
||||
if url.kwargs['organizer'] != request.organizer.slug:
|
||||
@@ -277,12 +280,20 @@ def _detect_event(request, require_live=True, require_plugin=None):
|
||||
organizer=request.organizer,
|
||||
)
|
||||
|
||||
# If this event has a custom domain, send the user there
|
||||
domain = get_event_domain(request.event)
|
||||
if domain:
|
||||
# If this event has a custom domain or is not available on this alt domain, send the user there
|
||||
domain, domainmode = get_event_domain(request.event, fallback=False, return_mode=True)
|
||||
if not domain and request_domain_mode == KnownDomain.MODE_ORG_ALT_DOMAIN:
|
||||
path = request.get_full_path().split("/", 2)[-1]
|
||||
r = redirect_to_url(build_absolute_uri(request.event, "presale:event.index") + path)
|
||||
r['Access-Control-Allow-Origin'] = '*'
|
||||
return r
|
||||
elif domain and domain != request.host:
|
||||
if request.port and request.port not in (80, 443):
|
||||
domain = '%s:%d' % (domain, request.port)
|
||||
path = request.get_full_path().split("/", 2)[-1]
|
||||
if domainmode == KnownDomain.MODE_EVENT_DOMAIN:
|
||||
path = request.get_full_path().split("/", 2)[-1]
|
||||
else:
|
||||
path = request.get_full_path()
|
||||
r = redirect_to_url(urljoin('%s://%s' % (request.scheme, domain), path))
|
||||
r['Access-Control-Allow-Origin'] = '*'
|
||||
return r
|
||||
@@ -299,11 +310,14 @@ def _detect_event(request, require_live=True, require_plugin=None):
|
||||
request.organizer = request.event.organizer
|
||||
|
||||
# If this event has a custom domain, send the user there
|
||||
domain = get_event_domain(request.event)
|
||||
domain, domainmode = get_event_domain(request.event, fallback=False, return_mode=True)
|
||||
if domain:
|
||||
if request.port and request.port not in (80, 443):
|
||||
domain = '%s:%d' % (domain, request.port)
|
||||
path = request.get_full_path().split("/", 3)[-1]
|
||||
if domainmode == KnownDomain.MODE_EVENT_DOMAIN:
|
||||
path = request.get_full_path().split("/", 3)[-1]
|
||||
else:
|
||||
path = request.get_full_path().split("/", 2)[-1]
|
||||
r = redirect_to_url(urljoin('%s://%s' % (request.scheme, domain), path))
|
||||
r['Access-Control-Allow-Origin'] = '*'
|
||||
return r
|
||||
@@ -377,6 +391,7 @@ def _detect_event(request, require_live=True, require_plugin=None):
|
||||
except Event.DoesNotExist:
|
||||
try:
|
||||
if hasattr(request, 'organizer_domain'):
|
||||
# Redirect for case-insensitive event slug
|
||||
event = request.organizer.events.get(
|
||||
slug__iexact=url.kwargs['event'],
|
||||
organizer=request.organizer,
|
||||
@@ -388,6 +403,7 @@ def _detect_event(request, require_live=True, require_plugin=None):
|
||||
return r
|
||||
else:
|
||||
if 'event' in url.kwargs and 'organizer' in url.kwargs:
|
||||
# Redirect for case-insensitive event or organizer slug
|
||||
event = Event.objects.select_related('organizer').get(
|
||||
slug__iexact=url.kwargs['event'],
|
||||
organizer__slug__iexact=url.kwargs['organizer']
|
||||
@@ -403,6 +419,7 @@ def _detect_event(request, require_live=True, require_plugin=None):
|
||||
raise Http404(_('The selected event was not found.'))
|
||||
except Organizer.DoesNotExist:
|
||||
if 'organizer' in url.kwargs:
|
||||
# Redirect for case-insensitive organizer slug
|
||||
try:
|
||||
organizer = Organizer.objects.get(
|
||||
slug__iexact=url.kwargs['organizer']
|
||||
|
||||
@@ -77,7 +77,7 @@ class RedirectBackMixin:
|
||||
self.redirect_field_name,
|
||||
self.request.GET.get(self.redirect_field_name, '')
|
||||
)
|
||||
hosts = list(KnownDomain.objects.filter(event__organizer=self.request.organizer).values_list('domainname', flat=True))
|
||||
hosts = list(KnownDomain.objects.filter(organizer=self.request.organizer).values_list('domainname', flat=True))
|
||||
siteurlsplit = urlsplit(settings.SITE_URL)
|
||||
if siteurlsplit.port and siteurlsplit.port not in (80, 443):
|
||||
hosts = ['%s:%d' % (h, siteurlsplit.port) for h in hosts]
|
||||
@@ -168,7 +168,7 @@ class LogoutView(View):
|
||||
return HttpResponseRedirect(next_page)
|
||||
|
||||
def get_next_page(self):
|
||||
if getattr(self.request, 'event_domain', False):
|
||||
if getattr(self.request, 'domain_mode', 'system') in (KnownDomain.MODE_ORG_ALT_DOMAIN, KnownDomain.MODE_EVENT_DOMAIN):
|
||||
# After we cleared the cookies on this domain, redirect to the parent domain to clear cookies as well
|
||||
next_page = eventreverse(self.request.organizer, 'presale:organizer.customer.logout', kwargs={})
|
||||
if self.redirect_field_name in self.request.POST or self.redirect_field_name in self.request.GET:
|
||||
@@ -188,7 +188,7 @@ class LogoutView(View):
|
||||
self.redirect_field_name,
|
||||
self.request.GET.get(self.redirect_field_name)
|
||||
)
|
||||
hosts = list(KnownDomain.objects.filter(event__organizer=self.request.organizer).values_list('domainname', flat=True))
|
||||
hosts = list(KnownDomain.objects.filter(organizer=self.request.organizer).values_list('domainname', flat=True))
|
||||
siteurlsplit = urlsplit(settings.SITE_URL)
|
||||
if siteurlsplit.port and siteurlsplit.port not in (80, 443):
|
||||
hosts = ['%s:%d' % (h, siteurlsplit.port) for h in hosts]
|
||||
|
||||
@@ -71,7 +71,7 @@ from pretix.helpers.formats.en.formats import (
|
||||
)
|
||||
from pretix.helpers.http import redirect_to_url
|
||||
from pretix.helpers.thumb import get_thumbnail
|
||||
from pretix.multidomain.urlreverse import eventreverse
|
||||
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
|
||||
from pretix.presale.forms.organizer import EventListFilterForm
|
||||
from pretix.presale.ical import get_public_ical
|
||||
from pretix.presale.views import OrganizerViewMixin
|
||||
@@ -1305,3 +1305,8 @@ class OrganizerFavicon(View):
|
||||
return redirect_to_url(get_thumbnail(icon_file, '32x32^', formats=settings.PILLOW_FORMATS_QUESTIONS_FAVICON).thumb.url)
|
||||
else:
|
||||
return redirect_to_url(static("pretixbase/img/favicon.ico"))
|
||||
|
||||
|
||||
class RedirectToOrganizerIndex(View):
|
||||
def get(self, *args, **kwargs):
|
||||
return redirect_to_url(build_absolute_uri(self.request.organizer, "presale:organizer.index"))
|
||||
|
||||
Reference in New Issue
Block a user