summaryrefslogtreecommitdiff
path: root/src/backend/taler-merchant-httpd_contract.c
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2015-12-18 10:57:48 +0100
committerFlorian Dold <florian.dold@gmail.com>2015-12-18 10:57:48 +0100
commitbc084ef901a528cf95bef4b8421eb53e4040af5f (patch)
treeff58d534e3299bdd1fe3c92b7698d2b00d8c74e1 /src/backend/taler-merchant-httpd_contract.c
parent9ec51e8031d54616faea2c769791fdbbcfd8b3eb (diff)
parent4b528005ca4aacc366ce0e72bdc17a78b213d2ac (diff)
downloadmerchant-bc084ef901a528cf95bef4b8421eb53e4040af5f.tar.gz
merchant-bc084ef901a528cf95bef4b8421eb53e4040af5f.tar.bz2
merchant-bc084ef901a528cf95bef4b8421eb53e4040af5f.zip
Merge branch 'master' of ssh://taler.net/var/git/merchant
Diffstat (limited to 'src/backend/taler-merchant-httpd_contract.c')
-rw-r--r--src/backend/taler-merchant-httpd_contract.c147
1 files changed, 42 insertions, 105 deletions
diff --git a/src/backend/taler-merchant-httpd_contract.c b/src/backend/taler-merchant-httpd_contract.c
index c42a8b37..e44d3b84 100644
--- a/src/backend/taler-merchant-httpd_contract.c
+++ b/src/backend/taler-merchant-httpd_contract.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- (C) 2014 Christian Grothoff (and other contributing authors)
+ (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
@@ -13,39 +13,30 @@
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/>
*/
-
/**
- * @file merchant/backend/taler-merchant-httpd.c
+ * @file backend/taler-merchant-httpd_contract.c
* @brief HTTP serving layer mainly intended to communicate with the frontend
* @author Marcello Stanisci
*/
-
#include "platform.h"
-#include <microhttpd.h>
#include <jansson.h>
-#include <gnunet/gnunet_util_lib.h>
-#include <curl/curl.h>
#include <taler/taler_signatures.h>
-#include <taler/taler_amount_lib.h>
-#include <taler/taler_json_lib.h>
-#include <taler/taler_mint_service.h>
-#include "taler-mint-httpd.h"
-#include "taler-mint-httpd_parsing.h"
-#include "taler-mint-httpd_responses.h"
-#include "merchant_db.h"
-#include "merchant.h"
-#include "taler_merchant_lib.h"
#include "taler-merchant-httpd.h"
+#include "taler-merchant-httpd_parsing.h"
+#include "taler-merchant-httpd_auditors.h"
+#include "taler-merchant-httpd_mints.h"
+#include "taler-merchant-httpd_responses.h"
-extern struct MERCHANT_Auditor *auditors;
-extern unsigned int nauditors;
/**
- * Manage a contract request. In practical terms, it adds the fields 'mints',
- * 'merchant_pub', and 'H_wire' to the contract 'proposition' gotten from the
- * frontend. Finally, it adds (outside of the contract) a signature of the
- * (hashed stringification) of this contract and the hashed stringification
- * of this contract to the final bundle sent back to the frontend.
+ * Manage a contract request. In practical terms, it adds the fields
+ * 'mints', 'merchant_pub', and 'H_wire' to the contract 'proposition'
+ * gotten from the frontend. Finally, it adds (outside of the
+ * contract) a signature of the (hashed stringification) of the
+ * contract (and the hashed stringification of this contract as well
+ * to aid diagnostics) to the final bundle, which is then send back to
+ * the frontend.
+ *
* @param rh context of the handler
* @param connection the MHD connection to handle
* @param[in,out] connection_cls the connection's closure (can be updated)
@@ -61,18 +52,8 @@ MH_handler_contract (struct TMH_RequestHandler *rh,
size_t *upload_data_size)
{
json_t *root;
- json_t *trusted_mints;
- json_t *j_auditors;
- json_t *auditor;
- json_t *mint;
- json_t *j_wire;
- const struct TALER_MINT_Keys *keys;
int res;
- int cnt;
- struct GNUNET_HashCode h_wire;
- struct GNUNET_CRYPTO_EddsaPublicKey pubkey;
- struct MERCHANT_Contract contract;
- char *contract_str;
+ struct TALER_ContractPS contract;
struct GNUNET_CRYPTO_EddsaSignature contract_sig;
res = TMH_PARSE_post_json (connection,
@@ -82,87 +63,43 @@ MH_handler_contract (struct TMH_RequestHandler *rh,
&root);
if (GNUNET_SYSERR == res)
return MHD_NO;
- /* the POST's body has to be further fetched */ if ((GNUNET_NO == res) || (NULL == root))
+ /* the POST's body has to be further fetched */
+ if ((GNUNET_NO == res) || (NULL == root))
return MHD_YES;
- /* Generate preferred mint(s) array. */
-
- trusted_mints = json_array ();
- for (cnt = 0; cnt < nmints; cnt++)
- {
- if (!mints[cnt].pending)
- {
- keys = TALER_MINT_get_keys (mints[cnt].conn);
- mint = json_pack ("{s:s, s:o}",
- "url", mints[cnt].hostname,
- "master_pub",
- TALER_json_from_data
- (&keys->master_pub.eddsa_pub,
- sizeof (keys->master_pub.eddsa_pub)));
- json_array_append_new (trusted_mints, mint);
- }
- }
- j_auditors = json_array ();
- for (cnt = 0; cnt < nauditors; cnt++)
- {
- auditor = json_pack ("{s:s}",
- "name", auditors[cnt].name);
- json_array_append_new (j_auditors, auditor);
- }
-
- /**
- * Return badly if no mints are trusted (or no call to /keys has still
- * returned the expected data). WARNING: it
- * may be possible that a mint trusted by the wallet is good, but
- * still pending; that case must be handled with some "polling-style"
- * routine, simply ignored, or ended with an invitation to the wallet
- * to just retry later
- */
- if (!json_array_size (trusted_mints))
- return MHD_NO;
-
- /**
- * Hard error, no action can be taken by a wallet
- */
- if (!json_array_size (j_auditors))
- return MHD_NO;
-
- json_object_set_new (root, "mints", trusted_mints);
- json_object_set_new (root, "auditors", j_auditors);
-
- if (NULL == (j_wire = MERCHANT_get_wire_json (wire,
- salt)))
- return MHD_NO;
-
- /* hash wire objcet */
- if (GNUNET_SYSERR ==
- TALER_hash_json (j_wire, &h_wire))
- return MHD_NO;
-
+ /* add fields to the "root" that the backend should provide */
+ json_object_set (root,
+ "mints",
+ trusted_mints);
+ json_object_set (root,
+ "auditors",
+ j_auditors);
json_object_set_new (root,
"H_wire",
- TALER_json_from_data (&h_wire, sizeof (h_wire)));
-
- GNUNET_CRYPTO_eddsa_key_get_public (privkey, &pubkey);
+ TALER_json_from_data (&h_wire,
+ sizeof (h_wire)));
json_object_set_new (root,
"merchant_pub",
- TALER_json_from_data (&pubkey, sizeof (pubkey)));
-
- /* Sign */
- contract_str = json_dumps (root, JSON_COMPACT | JSON_SORT_KEYS);
- GNUNET_CRYPTO_hash (contract_str, strlen (contract_str), &contract.h_contract);
+ TALER_json_from_data (&pubkey,
+ sizeof (pubkey)));
+ /* create contract signature */
+ GNUNET_assert (GNUNET_OK ==
+ TALER_hash_json (root,
+ &contract.h_contract));
contract.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_CONTRACT);
contract.purpose.size = htonl (sizeof (contract));
- GNUNET_CRYPTO_eddsa_sign (privkey, &contract.purpose, &contract_sig);
-
+ GNUNET_CRYPTO_eddsa_sign (privkey,
+ &contract.purpose,
+ &contract_sig);
+ /* return final response */
return TMH_RESPONSE_reply_json_pack (connection,
MHD_HTTP_OK,
"{s:o, s:o, s:o}",
"contract", root,
- "sig", TALER_json_from_data
- (&contract_sig, sizeof (contract_sig)),
- "H_contract", TALER_json_from_data
- (&contract.h_contract,
- sizeof (contract.h_contract)));
-
+ "sig", TALER_json_from_data (&contract_sig,
+ sizeof (contract_sig)),
+ "H_contract", TALER_json_from_data (&contract.h_contract,
+ sizeof (contract.h_contract)));
}
+
+/* end of taler-merchant-httpd_contract.c */