diff --git a/src/pretix/plugins/stripe/payment.py b/src/pretix/plugins/stripe/payment.py index 046daff19d..6db96e3290 100644 --- a/src/pretix/plugins/stripe/payment.py +++ b/src/pretix/plugins/stripe/payment.py @@ -1,12 +1,14 @@ import hashlib import json import logging +import urllib.parse from collections import OrderedDict import stripe from django import forms from django.conf import settings from django.contrib import messages +from django.core import signing from django.template.loader import get_template from django.utils.translation import ugettext, ugettext_lazy as _ @@ -371,7 +373,17 @@ class StripeMethod(BasePaymentProvider): order.payment_info = str(source) order.save(update_fields=['payment_info']) request.session['payment_stripe_order_secret'] = order.secret - return source.redirect.url + return self.redirect(request, source.redirect.url) + + def redirect(self, request, url): + if request.session.get('iframe_session', False): + signer = signing.Signer(salt='safe-redirect') + return ( + build_absolute_uri(request.event, 'plugins:stripe:redirect') + '?url=' + + urllib.parse.quote(signer.sign(url)) + ) + else: + return str(url) class StripeCC(StripeMethod): @@ -436,7 +448,7 @@ class StripeCC(StripeMethod): if source.status == "pending": order.payment_info = str(source) order.save(update_fields=['payment_info']) - return source.redirect.url + return self.redirect(request, source.redirect.url) except stripe.error.StripeError as e: if e.json_body: err = e.json_body['error'] diff --git a/src/pretix/plugins/stripe/templates/pretixplugins/stripe/redirect.html b/src/pretix/plugins/stripe/templates/pretixplugins/stripe/redirect.html new file mode 100644 index 0000000000..01c9d1ae9d --- /dev/null +++ b/src/pretix/plugins/stripe/templates/pretixplugins/stripe/redirect.html @@ -0,0 +1,32 @@ +{% load compress %} +{% load i18n %} +{% load staticfiles %} + + +
++ {% trans "The window to enter your payment data was not opened or was closed?" %} +
++ + {% trans "Click here in order to open the window." %} + +
+ +