commit 951edfedf35e74da53e1188a18e70030ed4077ef
parent da828fa663f9f0dab1bc73f5ff6f06a5fd77e559
Author: psyc://psyced.org/~lynX <psyc://psyced.org/@youbroketheinternet>
Date: Sat, 22 Aug 2015 00:31:30 +0200
Merge remote-tracking branch 'origin/master'
Diffstat:
6 files changed, 222 insertions(+), 176 deletions(-)
diff --git a/src/frontend/cert.php b/src/frontend/cert.php
@@ -1,83 +0,0 @@
-<!DOCTYPE html>
-<?php
-/*
- This file is part of TALER
- Copyright (C) 2014, 2015 Christian Grothoff (and other contributing authors)
-
- TALER is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/>
-*/
-
-/*
-
- Here goes all the Taler paying logic. The steps are
-
- 1. recover the session
- 2. generate the JSON to forward to the backend
- 3. route back to the wallet the certificate just gotten
-*/
-
-
-// recover the session
-session_start();
-if(!isset($_SESSION['maydonate'])){
- http_response_code(404);
- echo "Please try to donate before getting to this page :)";
-}
-else{
- // fake product id
- $p_id = rand(0,1001);
- // generate a transaction/certificate id. In production context, it's wishable to
- // record this value
- $trans_cert_id = rand(0, 1001);
- // fake a human readable description of this deal
- $desc = "donation aimed to stop the ants' massacre on hicking paths";
- // fake the price's integer (actually, the system is testishly suited for just 10 EUR coins)
- $value = 10;
- // fake the price's fractional
- $fraction = 0;
- // hardcode the currency
- $currency = "EUR";
-
- // pack the JSON
- $json = json_encode (array ('desc' => $desc, 'product' => $p_id, 'cid' => $trans_cert_id,
- 'price' => array ('value' => $value,
- 'fraction' => $fraction,
- 'currency' => $currency)));
- // test
- // echo $json;
- // echo phpinfo ();
-
- // crafting the request
- $req = new http\Client\Request ("POST",
- "http://" . $_SERVER["SERVER_NAME"] . "/backend" . "/contract",
- //"http://localhost:9898/",
- array ("Content-Type" => "application/json"));
- $req->getBody()->append ($json);
-
- $client = new http\Client;
- $client->enqueue($req)->send ();
- $resp = $client->getResponse ();
- $status_code = $resp->getResponseCode ();
- http_response_code ($status_code);
-
-
- if ($status_code != 200){
- echo "Error while generating the certificate, response code : " . $status_code;
- }
- // send the contract back to the wallet without touching it
- else{
- echo $resp->body->toString ();
- }
-}
-
-
-?>
diff --git a/src/frontend/checkout.php b/src/frontend/checkout.php
@@ -11,15 +11,15 @@
The JavaScript code in this page is free software: you can
redistribute it and/or modify it under the terms of the GNU
- General Public License (GNU GPL) as published by the Free Software
+ Lesser General Public License (GNU LGPL) as published by the Free Software
Foundation, either version 3 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 GPL for more details.
+ FOR A PARTICULAR PURPOSE. See the GNU LGPL for more details.
- As additional permission under GNU GPL version 3 section 7, you
+ As additional permission under GNU LGPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
- that code without the copy of the GNU GPL normally required by
+ 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.
@@ -34,109 +34,138 @@
payments methods and actually implementing just Taler; technically
the steps are:
- 1. retrieve the name of who will receive this donation
- 2. show a menu with all the required payments means
- 3. create a session
- 4. (JavaScript) implement the "checkout" button for the sole Taler way.
- Actually, this button's duty is to notice this web portal that the customer
- wants to see a certificate, and optionally to pay.
-
- -->
+ 1. retrieve the information about the donation from the
+ form and remember it in a PHP session
+ 2. show a menu with all the required payments system options,
+ only showing "Taler" if the wallet is present
+ 3. (JavaScript) implement the "checkout" button for Taler,
+ for the demo we ignore the other payment options.
+-->
<?php
-
-// getting the donation receiver's name
-$got_donation = $_POST['group0'];
-// create session
-session_start();
-$_SESSION['maydonate'] = true;
+ // get the donation information from form
+ $donation_receiver = $_POST['donation_receiver'];
+ $donation_amount = $_POST['donation_amount'];
+
+ // create PHP session and store donation information in session
+ session_start();
+ $_SESSION['receiver'] = $donation_receiver;
+ $_SESSION['amount'] = $donation_amount;
?>
<form name="tform" action="" method="POST">
-<div id="opt-form" align="left"><br>
-<input type="radio" name="group1" value="Lisa">Lisa<br>
-<input type="radio" name="group1" value="You Card" checked>You Card<br>
-<input type="radio" name="group1" value="Card Me">Card Me<br>
-<input id="t-button-id" type="radio" name="group1" value="Taler" disabled="true">Taler<br>
-<input type="button" onclick="ok(this.form)" value="Ok">
-</div>
+ <div id="opt-form" align="left"><br>
+ <input type="radio" name="payment_system" value="lisa" checked>Lisa</input>
+ <br>
+ <input type="radio" name="payment_system" value="ycard">You Card</input>
+ <br>
+ <input type="radio" name="payment_system" value="cardme">Card Me</input>
+ <br>
+ <input type="radio" name="payment_system" value="taler"
+ id="taler-radio-button-id" disabled="true">Taler</input>
+ <br>
+ <input type="button" onclick="pay(this.form)" value="Ok">
+ </div>
</form>
<script type="text/javascript">
-// trigger certificate generation on the server, and signal certificate
-// arrival "here" in the client.
-
-function ok(form){
- for(var cnt=0; cnt < form.group1.length; cnt++){
- var choice = form.group1[cnt];
- if(choice.checked){
- if(choice.value == "Taler"){
- var cert = new XMLHttpRequest();
- /* request certificate */
- cert.open("POST", "/cert.php", true);
- cert.onload = function (e) {
- if (cert.readyState == 4) {
- if (cert.status == 200){
- /* display certificate (i.e. it sends the JSON string
- to the (XUL) extension) */
- sendContract(cert.responseText);
- }
- else alert("No certificate gotten, status " + cert.status);
- }
- };
-
- cert.onerror = function (e){
- alert(cert.statusText);
- };
-
- cert.send(null);
- }
- else alert(choice.value + ": NOT available ");
- }
- }
+/* We got a JSON contract from the merchant,
+ pass it to the extension */
+function handle_contract(json_contract)
+{
+ var cevent = new CustomEvent('taler-contract', { 'detail' : jsonContract });
+ document.body.dispatchEvent(cevent);
};
+/* Trigger Taler contract generation on the server, and pass the
+ contract to the extension once we got it. */
+function taler_pay(form)
+{
+ var contract_request = new XMLHttpRequest();
+ contract_request.open("POST", "/generate_taler_contract.php", true);
+ contract_request.onload = function (e)
+ {
+ if (contract_request.readyState == 4)
+ {
+ if (contract_request.status == 200)
+ {
+ /* display contract_requestificate (i.e. it sends the JSON string
+ to the (XUL) extension) */
+ handle_contract(contract_request.responseText);
+ }
+ else
+ {
+ alert("Failed to receive contract from server. Status was " + contract_request.status);
+ }
+ }
+ };
+ contract_request.onerror = function (e)
+ {
+ alert(contract_request.statusText);
+ };
+ contract_request.send(null);
+}
+
+
+/* This function is called when the user presses the
+ 'Ok' button. We are now supposed to trigger the
+ "corret" payment system logic. For this demo, we
+ only handle "taler". */
+function pay(form)
+{
+ for (var cnt=0; cnt < form.payment_system.length; cnt++)
+ {
+ var choice = form.payment_system[cnt];
+
+ if (choice.checked)
+ {
+ if (choice.value == "taler")
+ {
+ taler_pay(form);
+ }
+ else
+ {
+ alert(choice.value + ": NOT available in this demo!");
+ }
+ }
+ }
+};
-/* the following event gets fired whenever a customer has a Taler
+/* The following event gets fired whenever a customer has a Taler
wallet installed in his browser. In that case, the webmaster can decide
whether or not displaying Taler as a payment option */
-
-function has_taler_wallet_cb(aEvent){
+function has_taler_wallet_cb(event)
+{
// event awaited by the wallet to change its button's color
var eve = new Event('taler-currency');
document.body.dispatchEvent(eve);
// enable the Taler payment option from the form
- var tbutton = document.getElementById("t-button-id");
+ var tbutton = document.getElementById("taler-radio-button-id");
tbutton.removeAttribute("disabled");
};
-// The Taler extension was unloaded, disable the option
-function taler_wallet_unload_cb(aEvent){
- var tbutton = document.getElementById("t-button-id");
+/* Function called when the Taler extension was unloaded,
+ here we disable the option */
+function taler_wallet_unload_cb(event)
+{
+ var tbutton = document.getElementById("taler-radio-button-id");
tbutton.addAttribute("disabled");
};
-
-function sendContract(jsonContract){
-
- var cevent = new CustomEvent('taler-contract', { 'detail' : jsonContract });
- document.body.dispatchEvent(cevent);
-};
/* FIXME: these triggers do not work when I enable/disable
the extension... */
-// to be triggered by the wallet
+// Register event to be triggered by the wallet (when present)
document.body.addEventListener("taler-wallet", has_taler_wallet_cb, false);
-// to be triggered by the wallet when it is unloaded
+// Register event to be triggered by the wallet when it is unloaded
document.body.addEventListener("taler-unload", taler_wallet_unload_cb, false);
-
</script>
</body>
</html>
diff --git a/src/frontend/fake_wire_transfer.php b/src/frontend/fake_wire_transfer.php
@@ -11,15 +11,15 @@
The JavaScript code in this page is free software: you can
redistribute it and/or modify it under the terms of the GNU
- General Public License (GNU GPL) as published by the Free Software
- Foundation, either version 3 of the License, or (at your option)
+ 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 GPL for more details.
+ FOR A PARTICULAR PURPOSE. See the GNU LGPL for more details.
- As additional permission under GNU GPL version 3 section 7, you
+ 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 GPL normally required by
+ 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.
@@ -44,7 +44,7 @@ $kudos_amount = $_POST['kudos_amount'];
// pack the JSON
$json = json_encode (array ('reserve_pub' => $reserve_pk,
- 'execution_date' => "/" . time() . "/",
+ 'execution_date' => "/Date(" . time() . ")/",
'wire' => array ('type' => 'test'),
'amount' => array ('value' => intval($kudos_amount),
'fraction' => 0,
@@ -71,7 +71,7 @@ if ($status_code != 200)
}
else
{
- echo "Pretend wire transfer successful. Go <a href="/">back</a> and enjoy shopping!";
+ echo "Pretend wire transfer successful. Go <a href=\"/\">back</a> and enjoy shopping!";
}
?>
</body>
diff --git a/src/frontend/generate_taler_contract.php b/src/frontend/generate_taler_contract.php
@@ -0,0 +1,99 @@
+<?php
+/*
+ This file is part of GNU TALER.
+ Copyright (C) 2014, 2015 GNUnet e.V.
+
+ 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. If not, If not, see <http://www.gnu.org/licenses/>
+
+*/
+
+/*
+ This code generates a Taler contract in JSON format. Key steps are:
+
+ 1. recover the PHP session with the contract information
+ 2. generate the JSON to forward to the backend
+ 3. forward the response with the contract from the backend to
+ to the wallet
+*/
+
+
+// 1) recover the session information
+session_start();
+if ( (! isset($_SESSION['receiver'])) ||
+ (! isset($_SESSION['amount']))
+{
+ http_response_code (404);
+ echo "Please select a contract before getting to this page...";
+ exit (0);
+}
+
+/* Obtain session state */
+$receiver = $_SESSION['receiver'];
+$amount = intval ($_SESSION['amount']);
+
+/* Fill in variables for simple JSON contract */
+// fake product id
+// --- FIXME: base on receiver for more realism!
+$p_id = rand(0,1001);
+// generate a front-end transaction id.
+// In production context, we might want to
+// record this value somewhere together
+// with the rest of the contract data.
+$transaction_id = rand(0, 1001);
+// Human-readable description of this deal
+$desc = "Donation to " . $receiver;
+// Add the value
+$value = $amount;
+// We don't have a fraction.
+$fraction = 0;
+// This is our 'toy' currency
+$currency = "KUDOS";
+
+// pack the JSON for the contract
+// --- FIXME: exact format needs review!
+$json = json_encode (array ('desc' => $desc,
+ 'product' => $p_id,
+ 'cid' => $transaction_id,
+ 'price' => array ('value' => $value,
+ 'fraction' => $fraction,
+ 'currency' => $currency)));
+
+// Craft the HTTP request, note that the backend
+// could be on an entirely different machine if
+// desired.
+$req = new http\Client\Request ("POST",
+ "/backend/contract",
+ array ("Content-Type" => "application/json"));
+$req->getBody()->append ($json);
+
+// Execute the HTTP request
+$client = new http\Client;
+$client->enqueue($req)->send ();
+
+// Fetch the response
+$resp = $client->getResponse ();
+$status_code = $resp->getResponseCode ();
+
+// Our response code is the same we got from the backend:
+http_response_code ($status_code);
+
+// Now generate our body
+if ($status_code != 200)
+{
+ echo "Error while generating the contract, response code: " . $status_code;
+}
+else
+{
+ // send the contract back to the wallet without touching it
+ echo $resp->body->toString ();
+}
+?>
diff --git a/src/frontend/index.html b/src/frontend/index.html
@@ -12,15 +12,15 @@
The JavaScript code in this page is free software: you can
redistribute it and/or modify it under the terms of the GNU
- General Public License (GNU GPL) as published by the Free Software
- Foundation, either version 3 of the License, or (at your option)
+ 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 GPL for more details.
+ FOR A PARTICULAR PURPOSE. See the GNU LGPL for more details.
- As additional permission under GNU GPL version 3 section 7, you
+ 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 GPL normally required by
+ 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.
@@ -108,13 +108,13 @@
<form name="tform" action="/checkout.php" method="POST">
<div class="participation" id="fake-shop">
<br>
- <input type="radio" name="group0" value="Taler" checked="true">Taler</input>
+ <input type="radio" name="donation_receiver" value="Taler" checked="true">Taler</input>
<br>
- <input type="radio" name="group0" value="Tor">Tor</input>
+ <input type="radio" name="donation_receiver" value="Tor">Tor</input>
<br>
- <input type="radio" name="group0" value="GNUnet">GNUnet</input>
+ <input type="radio" name="donation_receiver" value="GNUnet">GNUnet</input>
<br>
- <select id="taler-donation" name="kudos-donation">
+ <select id="taler-donation" name="donation_amount">
<option value="1">1 KUDOS</option>
<option value="6">5 KUDOS (*)</option>
<option value="10">10 KUDOS</option>
@@ -148,6 +148,7 @@
b = document.getElementById("payment");
b.style.display = '';
};
+
function wallet_uninstalled_cb(){
b = document.getElementById("installation");
b.style.display = '';
diff --git a/src/frontend/pay.php b/src/frontend/pay.php
@@ -8,17 +8,17 @@
<?php
/*
This file is part of TALER
- Copyright (C) 2014, 2015 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2014, 2015 GNUnet e.V.
TALER is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
+ 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 General Public License for more details.
+ A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
- You should have received a copy of the GNU General Public License along with
+ You should have received a copy of the GNU Lesser General Public License along with
TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/>
*/