summaryrefslogtreecommitdiff
path: root/src/mitm/talermerchantmitm/mitm.py
blob: 6975f210eedab31a8ae5438e7dd0c731d4bf66cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#This file is part of TALER
#Copyright (C) 2014, 2015, 2016, 2017 GNUnet e.V. and INRIA
#
#TALER is free software; you can redistribute it and/or modify it under the
#terms of the GNU Lesser General Public License as published by the Free Software
#Foundation; either version 2.1, or (at your option) any later version.
#
#TALER is distributed in the hope that it will be useful, but WITHOUT ANY
#WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
#A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
#
#You should have received a copy of the GNU Lesser General Public License along with
#TALER; see the file COPYING.LGPL.  If not, see <http://www.gnu.org/licenses/>

# @author Marcello Stanisci
# @brief Error generator for responses coming from the exchange

from flask import (request,
                   Flask,
                   jsonify,
                   make_response)
import requests
from urllib.parse import (urljoin,
                          urlencode,
                          urlparse,
                          urlunparse)
from pytaler import amount
import base64
import os
import logging
import json
from random import randint
from datetime import datetime

app = Flask(__name__)
app.secret_key = base64.b64encode(os.urandom(64)).decode('utf-8')
logger = logging.getLogger(__name__)
exchange_url = os.environ.get("TALER_EXCHANGE_URL")
assert(None != exchange_url)

# The functions taking 'resp' as parameter are responsible for
# modifying the data to return.

def track_transaction(resp):
    return resp

def track_transfer(resp):
    return resp

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=["GET", "POST"])
def all(path):
    body = request.get_json()
    url = list(urlparse(request.url))
    xurl = urlparse(exchange_url)
    url[0] = xurl[0]
    url[1] = xurl[1]
    url = urlunparse(url)
    if "POST" == request.method:
        r = requests.post(urljoin(url, path), json=body)
    else:
        r = requests.get(urljoin(url, path), json=body)
    dispatcher = {
        "track_transaction": track_transaction,
        "track_transfer": track_transfer
    }
    func = dispatcher.get(request.headers.get("X-Taler-Mitm"),
                          lambda x: make_response(x.text))
    response = func(r)
    for key, value in r.headers.items():
        if key not in ("Server", "Content-Length"):
            response.headers[key] = value
    return response, r.status_code