lingo: use general signature scheme to send notifications (#13710)

This commit is contained in:
Thomas NOËL 2016-10-21 14:06:51 +02:00
parent 005d003292
commit 003d1315be
2 changed files with 18 additions and 30 deletions

View File

@ -40,7 +40,7 @@ from ckeditor.fields import RichTextField
from combo.data.models import CellBase
from combo.data.library import register_cell_class
from combo.utils import NothingInCacheException, sign_url, aes_hex_encrypt, requests
from combo.utils import NothingInCacheException, aes_hex_encrypt, requests
EXPIRED = 9999
@ -178,25 +178,7 @@ class BasketItem(models.Model):
notification_date = models.DateTimeField(null=True)
def notify(self, status):
source_server = urlparse.urlparse(self.source_url).netloc.split(':')[0]
service_dict = None
for services in settings.KNOWN_SERVICES.values():
for service in services.values():
url = service.get('url')
verif_orig = urlparse.urlparse(url).netloc.split(':')[0]
if verif_orig == source_server:
service_dict = service
break
else:
continue
break
if not service_dict:
logging.getLogger(__name__).error(
'failed to find data for server %s', source_server)
raise RuntimeError('failed to find data for server')
params = urlencode({'orig': service_dict.get('orig')})
url = self.source_url + 'jump/trigger/%s?%s' % (status, params)
url = sign_url(url, key=service_dict.get('secret'))
url = self.source_url + 'jump/trigger/%s' % status
message = {'result': 'ok'}
if status == 'paid':
transaction = self.transaction_set.filter(status=eopayment.PAID)[0]
@ -205,7 +187,8 @@ class BasketItem(models.Model):
message['bank_transaction_id'] = transaction.bank_transaction_id
message['bank_data'] = transaction.bank_data
headers = {'content-type': 'application/json'}
r = requests.post(url, data=json.dumps(message), headers=headers, timeout=3)
r = requests.post(url, remote_service='auto',
data=json.dumps(message), headers=headers, timeout=3)
r.raise_for_status()
def notify_payment(self):

View File

@ -98,10 +98,10 @@ def test_payment_min_amount(regie, user):
assert resp.status_code == 302
def test_successfull_items_payment(regie, user):
items = {'item1': {'amount': '10.5', 'source_url': '/item/1'},
'item2': {'amount': '42', 'source_url': '/item/2'},
'item3': {'amount': '100', 'source_url': '/item/3'},
'item4': {'amount': '354', 'source_url': '/item/4'}
items = {'item1': {'amount': '10.5', 'source_url': 'http://example.org/item/1'},
'item2': {'amount': '42', 'source_url': 'http://example.org/item/2'},
'item3': {'amount': '100', 'source_url': 'http://example.org/item/3'},
'item4': {'amount': '354', 'source_url': 'http://example.org/item/4'}
}
b_items = []
for subject, details in items.iteritems():
@ -126,7 +126,8 @@ def test_successfull_items_payment(regie, user):
assert resp.status_code == 302
assert urlparse.urlparse(resp.url).path == '/'
# simulate successful call to callback URL
resp = client.get(reverse('lingo-callback', kwargs={'regie_pk': regie.id}), args)
with mock.patch('combo.utils.RequestsSession.request') as request:
resp = client.get(reverse('lingo-callback', kwargs={'regie_pk': regie.id}), args)
assert resp.status_code == 200
def test_add_amount_to_basket(key, regie, user):
@ -211,7 +212,7 @@ def test_cancel_basket_item(key, regie, user):
def test_payment_callback(regie, user):
item = BasketItem.objects.create(user=user, regie=regie,
subject='test_item', amount='10.5',
source_url='/testitem')
source_url='http://example.org/testitem/')
login()
resp = client.post(reverse('lingo-pay'), {'item': [item.pk],
'regie': regie.pk})
@ -225,7 +226,10 @@ def test_payment_callback(regie, user):
# call callback with GET
callback_url = reverse('lingo-callback', kwargs={'regie_pk': regie.id})
get_resp = client.get(callback_url, data)
with mock.patch('combo.utils.RequestsSession.request') as request:
get_resp = client.get(callback_url, data)
url = request.call_args[0][1]
assert url.startswith('http://example.org/testitem/jump/trigger/paid')
assert get_resp.status_code == 200
assert Transaction.objects.get(order_id=transaction_id).status == 3
@ -240,8 +244,9 @@ def test_payment_callback(regie, user):
'amount': qs['amount'][0], 'ok': True}
# call callback with POST
post_resp = client.post(callback_url, urllib.urlencode(data),
content_type='text/html')
with mock.patch('combo.utils.RequestsSession.request') as request:
post_resp = client.post(callback_url, urllib.urlencode(data),
content_type='text/html')
assert post_resp.status_code == 200
assert Transaction.objects.get(order_id=transaction_id).status == 3