diff options
-rw-r--r-- | README | 3 | ||||
-rw-r--r-- | website/fake_wire_transfer.php | 91 | ||||
-rw-r--r-- | website/index.html | 115 | ||||
-rw-r--r-- | website/style.css | 328 |
4 files changed, 537 insertions, 0 deletions
@@ -0,0 +1,3 @@ +This directory is the root of the "demo" bank website. The +page being served (under the directory 'website') simulates +what a real bank does when transferring funds to some mint via SEPA. diff --git a/website/fake_wire_transfer.php b/website/fake_wire_transfer.php new file mode 100644 index 0000000..c370f21 --- /dev/null +++ b/website/fake_wire_transfer.php @@ -0,0 +1,91 @@ +<!DOCTYPE html> +<html> +<head> +<title>Fake Wire Transfer</title> + <script> + /* + @licstart The following is the entire license notice for the + JavaScript code in this page. + + Copyright (C) 2014,2015 GNUnet e.V. + + The JavaScript code in this page is free software: you can + redistribute it and/or modify it under the terms of the GNU + Lesser General Public License (GNU LGPL) as published by the Free Software + Foundation, either version 2.1 of the License, or (at your option) + any later version. The code is distributed WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU LGPL for more details. + + As additional permission under GNU LGPL version 2.1 section 7, you + may distribute non-source (e.g., minimized or compacted) forms of + that code without the copy of the GNU LGPL normally required by + section 4, provided you include this license notice and a URL + through which recipients can access the Corresponding Source. + + @licend The above is the entire license notice + for the JavaScript code in this page. + */ + </script> +</head> +<body> +<!-- + This page's main aim is to forward the fake wire transfer + request to the demonstrator and to inform the customer + about the result. In a real-world deployment, this + page would not be required as the customer would do a + wire transfer with his bank instead. + --> +<?php + +// Evaluate form +$reserve_pk = $_POST['reserve_pk']; +$kudos_amount = $_POST['kudos_amount']; +$mint = $_POST['mint_rcv']; +// check if the webform has given a well formed amount +$ret = preg_match ('/[0-9]+(\.[0-9][0-9]?)? [A-Z]+/', $kudos_amount, $matches); +if ($matches[0] != $_POST['kudos_amount']) +{ + http_response_code(400); // BAD REQUEST + echo "Malformed amount given"; + return; +} +$amount_chunks = preg_split('/[ \.]/', $_POST['kudos_amount']); +$amount_fraction = 0; +if (count($amount_chunks) > 2) + $amount_fraction = (double) ("0." . $amount_chunks[1]); +$amount_fraction = $amount_fraction * 1000000; +// pack the JSON +$json = json_encode (array ('reserve_pub' => $reserve_pk, + 'execution_date' => "/Date(" . time() . ")/", + 'wire' => array ('type' => 'test'), + 'amount' => array ('value' => intval($amount_chunks[0]), + 'fraction' => $amount_fraction, + 'currency' => $amount_chunks[count($amount_chunks) - 1]))); + +// craft the HTTP request +$req = new http\Client\Request ("POST", + "http://" . $mint . "/admin/add/incoming", + array ("Content-Type" => "application/json")); +$req->getBody()->append ($json); + +// execute HTTP request +$client = new http\Client; +$client->enqueue($req)->send (); +$resp = $client->getResponse (); + +// evaluate response +$status_code = $resp->getResponseCode (); +http_response_code ($status_code); + +if ($status_code != 200) +{ + echo "Error $status_code when faking the wire transfer. Please report to taler@gnu.org"; +} +else +{ + echo "Pretend wire transfer successful. Exit through the <a href=\"http://shop.demo.taler.net\">gift shop</a> and enjoy shopping!"; +} +?> +</body> +</html> diff --git a/website/index.html b/website/index.html new file mode 100644 index 0000000..7746e1e --- /dev/null +++ b/website/index.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <title>Taler's "demo" bank</title> + <link rel="stylesheet" type="text/css" href="style.css"> + <script> + /* + @licstart The following is the entire license notice for the + JavaScript code in this page. + + Copyright (C) 2015 GNUnet e.V. + + The JavaScript code in this page is free software: you can + redistribute it and/or modify it under the terms of the GNU + Lesser General Public License (GNU LGPL) as published by the Free Software + Foundation, either version 2.1 of the License, or (at your option) + any later version. The code is distributed WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU LGPL for more details. + + As additional permission under GNU LGPL version 2.1 section 7, you + may distribute non-source (e.g., minimized or compacted) forms of + that code without the copy of the GNU LGPL normally required by + section 4, provided you include this license notice and a URL + through which recipients can access the Corresponding Source. + + @licend The above is the entire license notice + for the JavaScript code in this page. + */ + </script> +</head> +<body id="css-zen-garden" onload="signal_me()"> + <div class="explanation" id="zen-explanation" role="article"> + <h1>Welcome to the KUDOS bank!</h1> + <p>Through this page, you can wire funds to our demonstrator mint + in order to create your reserves from where withdraw your coins. + Once the reserve is created, the withdrawing of coins will be + entirely handled by the wallet, with no intervention required + to the user. + </p> + <p> + Enter the deisired amount, and click 'Select mint'. Your wallet + will make you choose a mint and will automatically submit all the + needed data into the bank's system. At the end of the withdrawal, + the wallet will show you the 'All coins withdrawn' nice message. + </p> + + <p>Still missing a wallet? <a href="http://demo.taler.net/extension">Install one!</a> + </p> + </div> + <form id="reserve-form" name="tform" action="/fake_wire_transfer.php" method="POST"> + <input type="text" id="reserve-pk-input" name="reserve_pk" hidden></input> + Amount to withdraw: + <select id="reserve-amn-id" name="kudos_amount"> + <option value="1 KUDOS">1 KUDOS</option> + <option value="2 KUDOS">2 KUDOS</option> + <option value="3.01 KUDOS">3.01 KUDOS</option> + <option value="5 KUDOS">5 KUDOS</option> + <option value="10 KUDOS">10 KUDOS</option> + <option value="10.50 KUDOS">10.50 KUDOS</option> + <option value="1000.3 KUDOS">1000.3 KUDOS</option> + </select> + <input type="text" name="mint_rcv" id="kudos-mint" hidden></input> + <input id="select-mint" + type="button" + value="Select mint" + onclick="wire_funds()" + disabled></input> + </form> + </div> + <script type="text/javascript"> + + document.body.addEventListener("taler-wallet-present", + has_taler_wallet_cb, + false); + + document.body.addEventListener("taler-unload", + no_taler_wallet_cb, + false); + + document.body.addEventListener("taler-load", + signal_me, + false); + + function wire_funds(){ + var wallet_param = { + form_id : 'reserve-form', + input_amount : 'reserve-amn-id', + input_pub : 'reserve-pk-input', + mint_rcv : 'kudos-mint' + //'base_url' : window.location.host not anymore: must be given by the mint + }; + var trigger = new CustomEvent("taler-create-reserve", {detail: wallet_param}); + document.body.dispatchEvent(trigger); + }; + + /* The mint signals itself to the wallet */ + function signal_me(){ + var eve = new Event('taler-checkout-probe'); + document.body.dispatchEvent(eve); + }; + + function has_taler_wallet_cb(){ + var button = document.getElementById("select-mint"); + button.removeAttribute("disabled"); + } + + function no_taler_wallet_cb(){ + var button = document.getElementById("select-mint"); + button.setAttribute("disabled", "true"); + } + + </script> +</body> +</html> diff --git a/website/style.css b/website/style.css new file mode 100644 index 0000000..a476a63 --- /dev/null +++ b/website/style.css @@ -0,0 +1,328 @@ +/* css Zen Garden submission 020 - 'Friendly Beaches' by Sophie G - www.sophie-g.net */ +/* css released under Creative Commons ShareAlike License v1.0 - http://creativecommons.org/licenses/sa/1.0/ */ +/* All associated graphics copyright 2003, Sophie G */ + + +/* IMPORTANT */ +/* This design is not a template. You may not reproduce it elsewhere without the designer's written permission. */ +/* The CSS itself may freely be used for anything you wish, but the associated graphics belong to the designer. */ +/* What you may use - .css files. What you may not use - .jpg, .gif, and .png files. */ + + + +body { + background-color: #FFFFFF; + margin: 0px; + padding: 10px; + font-family: Ubuntu, Tahoma, Sans; + font-size: 90%; +} + +p { + line-height: 180%; +} +.page-wrapper { + background-color: #EDEEF0; + border: 1px solid #DAD5D9; + padding: 0px; + margin: 0px; +} +abbr { + border-bottom: 1px #6BA0D2 dashed; +} +header,h1 { + font-family: Impact, Georgia, serif; + background-color: #FFFFFF; +} +header h1 { + height: 190px; + margin: 0px; + background-color: black; + background-image: url(Gala.jpg); + background-repeat: no-repeat; +} +header h1, header h2 { + text-indent: 100%; + white-space: nowrap; + overflow: hidden; +} +header h2 { + background-color: #EDEEF0; + margin: 0px; + height: 24px; + padding: 0px 14px 2px 14px; + background-image: url(headerh2.gif); + background-repeat: no-repeat; +} +header h2 abbr { + color: #FFF; + border-bottom: 1px #FFF dashed; +} +.summary p:first-child { + position: absolute; + right: 21px; + top: 21px; + width: 12em; + height: 165px; + padding: 3px 0 0 0; + margin: 0px; + border: 1px solid #0C2953; + text-align: center; + font-size: 90%; + font-family: Impact, Georgia, serif; + line-height: 110%; + color: #FFF; + background-image: url(summary.jpg); + background-repeat: no-repeat; + background-position: 50% 100%; + background-color: #0C2953; +} +.preamble { + padding: 0px 15em 0px 3em; +} +.preamble h3 { + margin: 15px 0px 0px 0px; + padding: 6px 20px 2px 6px; + text-align: left; + font-size: 180%; + font-variant: small-caps; + color: #6BA0D2; + background-image: url(bordDroitPreambleh3.gif); + background-repeat: no-repeat; + background-position: 100% 0px; + background-color: #F6F7F7; +} +.preamble h3::before { + content: " "; + display: inline-block; + padding: 35px 0px 30px 48px; + background-image: url(preambleShell.jpg); + background-repeat: no-repeat; + background-position: 0px 50%; + vertical-align: middle; +} +.preamble p { + text-align: justify; +} +.preamble p:nth-child(2), .preamble p:nth-child(3) { + margin: 0px; + padding: 10px 20px 2px 6px; + background-image: url(bordDroitPreamble.gif); + background-repeat: repeat-y; + background-position: 100% 0px; + background-color: #F6F7F7; +} +.preamble p:nth-child(4) { + margin: 0px; + padding: 0px; + background-image: url(bordBasPreamble.gif); + background-repeat: no-repeat; + background-position: 100% 100%; + background-color: #F6F7F7; + padding: 10px 20px 20px 6px; +} +.preamble p:nth-child(4)::after { + content: " "; + display: block; + margin: 0px; + padding: 0 20px 0 6px; + background-image: url(bordBasPreambleGauche.gif); + background-repeat: no-repeat; + background-position: 0% 100%; +} +.supporting { + margin: 0px; + padding: 10px 16em 0px 1em; + font-size: 90%; +} +.explanation, .participation, .benefits, .requirements { + border: 2px solid #FFF; + padding: 0px; +} +.explanation { + margin: 0px 0px 10px 0px; +} +.participation { + margin: 0px 0px 10px 0px; + float: left; + width: 30%; +} +.benefits { + margin: 0px 0px 10px 32%; +} +.requirements { + margin: 0px 0px 10px 32%; +} +.supporting h3 { + margin: 0px; + padding: 5px 30px 1px 2px; + text-align: left; + font-size: 120%; + font-variant: small-caps; + color: #6BA0D2; + border-bottom: 1px solid #6BA0D2; + background-color: #F6F7F7; + background-repeat: no-repeat; + background-position: 100% 50%; +} +.explanation h3 { + background-image: url(explanationShell.jpg); +} +.supporting form { + padding: 30px; + display: inline-block; + clear: both; + width: 120em; +} +.supporting input { + margin: 8px; +} +.participation h3 { + background-image: url(participationShell.jpg); +} +.benefits h3 { + background-image: url(benefitsShell.jpg); +} +.requirements h3 { + background-image: url(requirementsRock.jpg); +} +.supporting p { + text-align: justify; + margin: 10px 0px 0px 0px; + padding: 1px 3px 2px 3px; +} +.supporting a:link { + color: #0083FF; + font-weight: bold; +} +.supporting a:visited { + color: #204160; + font-weight: bold; +} +.supporting a:hover, .supporting a:active { + color: #8C0000; + font-weight: bold; + text-decoration: none; +} +.sidebar, .summary p:last-child { + font-size: 90%; + font-family: Impact, Georgia, serif; + position: absolute; + right: 21px; + width: 12em; + border: 1px solid #0C2953; + padding: 0px; + margin: 0px; + background-color: #A4ACB3; +} +.summary p:last-child { + height: 50px; + text-align: center; + top: 217px; + font-size: 90%; + display: block; + padding: 3px 0; + color: #FFF; +} +.sidebar { + top: 266px; +} +.sidebar h3 { + background-color: #0C2953; + color: #FFF; + margin: 0px; + padding: 30px 1px 1px 1px; + background-repeat: no-repeat; +} +.sidebar h3.select { + background-image: url(selecth3.jpg); + background-position: 50% 0%; +} +.sidebar h3.favorites { + border-top: 1px solid #0C2953; + background-image: url(favoritesh3.jpg); + background-position: 40% 100%; +} +.sidebar h3.archives { + border-top: 1px solid #0C2953; + background-image: url(archivesh3.jpg); + background-position: 40% 100%; +} +.sidebar h3.resources { + border-top: 1px solid #0C2953; + background-image: url(resourcesh3.jpg); + background-position: 50% 30%; +} +.sidebar ul { + list-style-type: none; + font-size: 90%; + color: #FFF; + margin: 0px; + padding: 0px; + background-color: #A4ACB3; +} +.sidebar li { + padding: 3px 2px 3px 2px; + margin-bottom: 4px; +} +.sidebar li:hover { + padding: 2px 1px 2px 1px; + border: 1px dotted #0C2953; + background-color: #6BA0D2; +} +.summary p:last-child a:link { + color: #FFF; + font-weight: bold; +} +.summary p:last-child a:visited { + color: #204160; +} +.summary p:last-child a:hover, .summary p:last-child a:active { + color: #FFD800; + font-weight: bold; + text-decoration: none; +} +.sidebar a:link, .sidebar a:visited { + border-left: 6px solid #FFF; + padding-left: 2px; + font-weight: bold; + color: #FFF; +} +.sidebar a:visited { + color: #204160; +} +.sidebar a:hover, .sidebar a:active { + border-left: 6px solid #FFD800; + padding-left: 2px; + color: #FFD800; + text-decoration: none; + font-weight: bold; +} +.sidebar a.designer-name:link, .sidebar a.designer-name:visited { + border-left: none; + padding-left: 0px; + font-weight: normal; + color: #FFF; +} +.sidebar a.designer-name:hover, .sidebar a.designer-name:active { + border-left: none; + padding-left: 0px; + color: #FFD800; + text-decoration: none; +} +.sidebar abbr { + border-bottom: 1px #FFF dashed; +} +footer { + clear: both; + text-align: right; + margin: 0px -16em 0px 0px; + padding: 25px 0px 0px 0px; + background-repeat: no-repeat; + background-image: url(signSoph.gif); + background-position: 0% 95%; +} +footer a { + font-size: 70%; + font-family: Impact, Georgia, serif; +} |