/* This file is part of TALER (C) 2014 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 */ /** * @file merchant/merchant_db.c * @brief DB work related to contract management * @author Marcello Stanisci */ #include "platform.h" #include #include #include #include "merchant.h" #include "merchant_db.h" #include "taler_merchant_contract_lib.h" /** * Take the global wire details and return a JSON containing them, * compliantly with the Taler's API. * @param wire the merchant's wire details * @param salt the nounce for hashing the wire details with * @param edate when the beneficiary wants this transfer to take place * @return JSON representation of the wire details, NULL upon errors */ json_t * MERCHANT_get_wire_json (const struct MERCHANT_WIREFORMAT_Sepa *wire, uint64_t salt) { json_t *root; json_t *j_salt; j_nounce = json_integer (salt); if (NULL == (root = json_pack ("{s:s, s:s, s:s, s:s, s:I}", "type", "SEPA", "IBAN", wire->iban, "name", wire->name, "bic", wire->bic, "r", json_integer_value (j_salt)))) return NULL; return root; } /** * Take from the frontend the (partly) generated contract and fill * the missing values in it; for example, the SEPA details. * Moreover, it stores the contract in the DB. * @param j_contract parsed contract, originated by the frontend. It will be * hold the new values. * @param db_conn the handle to the local DB * @param contract where to store the (subset of the) contract to be (still) signed * @param timestamp contract's timestamp (shall be generated by the merchant) * @param expiry the time when the contract will expire * @param edate when the merchant wants to receive the wire transfer corresponding * to this deal (this value is also a field inside the 'wire' JSON format) * @param refund deadline until which the merchant can return the paid amount * @param nounce the nounce used to hash the wire details * @param a will be pointed to the (allocated) stringified 0-terminated contract * @return GNUNET_OK on success, GNUNET_NO if attempting to double insert the * same contract, GNUNET_SYSERR in case of other (mostly DB related) errors. */ /** * TODO: inspect reference counting and, accordingly, free those json_t*(s) * still allocated */ uint32_t MERCHANT_handle_contract (json_t *j_contract, PGconn *db_conn, struct Contract *contract, struct GNUNET_TIME_Absolute timestamp, struct GNUNET_TIME_Absolute expiry, struct GNUNET_TIME_Absolute edate, struct GNUNET_TIME_Absolute refund, char **a, uint64_t nounce) { json_t *j_amount; json_int_t j_product_id; json_int_t j_trans_id; char *contract_str; struct TALER_Amount amount; /* Extracting values useful for DB work. Only gettable from the JSON since they are generated by the frontend */ if (-1 == json_unpack (j_contract, "{s:o, s:I, s:{s:I}}", "amount", &j_amount, "trans_id", &j_trans_id, "details", "product_id", &j_product_id)) { printf ("no unpacking\n"); return GNUNET_SYSERR; } TALER_json_to_amount (j_amount, &amount); contract_str = json_dumps (j_contract, JSON_COMPACT | JSON_PRESERVE_ORDER); *a = contract_str; GNUNET_CRYPTO_hash (contract_str, strlen (contract_str) + 1, &contract->h_contract_details); contract->purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_CONTRACT); contract->purpose.size = htonl (sizeof (struct Contract)); // DB mgmt return MERCHANT_DB_contract_create (db_conn, timestamp, expiry, edate, refund, &amount, &contract->h_contract_details, (uint64_t) j_trans_id, // safe? contract_str, nounce, (uint64_t) j_product_id); }