aboutsummaryrefslogtreecommitdiff
path: root/src/mint-lib
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-08-08 21:46:26 +0200
committerChristian Grothoff <christian@grothoff.org>2015-08-08 21:46:26 +0200
commit189adf52eb96de135d531f53389ecce2d791268d (patch)
tree880e0c362ff5a9858e59a04625dd42188e640cb9 /src/mint-lib
parent6ea5858d3276378dd3636ecc36ed312a0ccaee61 (diff)
finshing json parsing support for /refresh/melt handling
Diffstat (limited to 'src/mint-lib')
-rw-r--r--src/mint-lib/mint_api_json.c75
-rw-r--r--src/mint-lib/mint_api_json.h46
-rw-r--r--src/mint-lib/mint_api_refresh.c9
3 files changed, 126 insertions, 4 deletions
diff --git a/src/mint-lib/mint_api_json.c b/src/mint-lib/mint_api_json.c
index 8b0b54375..b15173940 100644
--- a/src/mint-lib/mint_api_json.c
+++ b/src/mint-lib/mint_api_json.c
@@ -253,6 +253,37 @@ parse_json (json_t *root,
}
break;
+ case MAJ_CMD_UINT16:
+ {
+ json_int_t val;
+
+ if (! json_is_integer (pos))
+ {
+ GNUNET_break_op (0);
+ return i;
+ }
+ val = json_integer_value (pos);
+ if ( (0 > val) || (val > UINT16_MAX) )
+ {
+ GNUNET_break_op (0);
+ return i;
+ }
+ *spec[i].details.u16 = (uint16_t) val;
+ }
+ break;
+
+ case MAJ_CMD_JSON_OBJECT:
+ {
+ if (! (json_is_object (pos) || json_is_array (pos)) )
+ {
+ GNUNET_break_op (0);
+ return i;
+ }
+ json_incref (pos);
+ *spec[i].details.obj = pos;
+ }
+ break;
+
default:
GNUNET_break (0);
return i;
@@ -307,6 +338,10 @@ parse_free (struct MAJ_Specification *spec,
GNUNET_free (*spec[i].details.eddsa_signature.purpose_p);
*spec[i].details.eddsa_signature.purpose_p = NULL;
break;
+ case MAJ_CMD_JSON_OBJECT:
+ json_decref (*spec[i].details.obj);
+ *spec[i].details.obj = NULL;
+ break;
default:
GNUNET_break (0);
break;
@@ -418,6 +453,46 @@ MAJ_spec_amount (const char *name,
/**
+ * 16-bit integer.
+ *
+ * @param name name of the JSON field
+ * @param[out] u16 where to store the integer found under @a name
+ */
+struct MAJ_Specification
+MAJ_spec_uint16 (const char *name,
+ uint16_t *u16)
+{
+ struct MAJ_Specification ret =
+ {
+ .cmd = MAJ_CMD_UINT16,
+ .field = name,
+ .details.u16 = u16
+ };
+ return ret;
+}
+
+
+/**
+ * JSON object.
+ *
+ * @param name name of the JSON field
+ * @param[out] jsonp where to store the JSON found under @a name
+ */
+struct MAJ_Specification
+MAJ_spec_json (const char *name,
+ json_t **jsonp)
+{
+ struct MAJ_Specification ret =
+ {
+ .cmd = MAJ_CMD_JSON_OBJECT,
+ .field = name,
+ .details.obj = jsonp
+ };
+ return ret;
+}
+
+
+/**
* Specification for parsing an RSA public key.
*
* @param name name of the JSON field
diff --git a/src/mint-lib/mint_api_json.h b/src/mint-lib/mint_api_json.h
index 46ccef3ab..bca3b47ca 100644
--- a/src/mint-lib/mint_api_json.h
+++ b/src/mint-lib/mint_api_json.h
@@ -79,7 +79,17 @@ enum MAJ_Command
MAJ_CMD_STRING,
/**
- * Parse at current position.
+ * Parse `uint16_t` integer at the current position.
+ */
+ MAJ_CMD_UINT16,
+
+ /**
+ * Parse JSON object at the current position.
+ */
+ MAJ_CMD_JSON_OBJECT,
+
+ /**
+ * Parse ??? at current position.
*/
MAJ_CMD_C
@@ -181,6 +191,16 @@ struct MAJ_Specification
*/
const char **strptr;
+ /**
+ * Where to store 16-bit integer.
+ */
+ uint16_t *u16;
+
+ /**
+ * Where to store a JSON object.
+ */
+ json_t **obj;
+
} details;
};
@@ -249,7 +269,7 @@ MAJ_spec_string (const char *name,
* Absolute time.
*
* @param name name of the JSON field
- * @param at where to store the absolute time found under @a name
+ * @param[out] at where to store the absolute time found under @a name
*/
struct MAJ_Specification
MAJ_spec_absolute_time (const char *name,
@@ -257,6 +277,28 @@ MAJ_spec_absolute_time (const char *name,
/**
+ * 16-bit integer.
+ *
+ * @param name name of the JSON field
+ * @param[out] u16 where to store the integer found under @a name
+ */
+struct MAJ_Specification
+MAJ_spec_uint16 (const char *name,
+ uint16_t *u16);
+
+
+/**
+ * JSON object.
+ *
+ * @param name name of the JSON field
+ * @param[out] jsonp where to store the JSON found under @a name
+ */
+struct MAJ_Specification
+MAJ_spec_json (const char *name,
+ json_t **jsonp);
+
+
+/**
* Specification for parsing an amount value.
*
* @param name name of the JSON field
diff --git a/src/mint-lib/mint_api_refresh.c b/src/mint-lib/mint_api_refresh.c
index ede95af5b..3012957d6 100644
--- a/src/mint-lib/mint_api_refresh.c
+++ b/src/mint-lib/mint_api_refresh.c
@@ -1063,7 +1063,7 @@ verify_refresh_melt_signature_ok (struct TALER_MINT_RefreshMeltHandle *rmh,
struct MAJ_Specification spec[] = {
MAJ_spec_fixed_auto ("mint_sig", &mint_sig),
MAJ_spec_fixed_auto ("mint_pub", &mint_sig),
- // MAJ_spec_uint16 ("noreveal_index", noreveal_index), // FIXME!
+ MAJ_spec_uint16 ("noreveal_index", noreveal_index),
MAJ_spec_end
};
struct TALER_RefreshMeltConfirmationPS confirm;
@@ -1124,7 +1124,7 @@ verify_refresh_melt_signature_forbidden (struct TALER_MINT_RefreshMeltHandle *rm
struct TALER_CoinSpendPublicKeyP coin_pub;
unsigned int i;
struct MAJ_Specification spec[] = {
- // MAJ_spec_json ("history", &history), // FIXME!
+ MAJ_spec_json ("history", &history),
MAJ_spec_fixed_auto ("coin_pub", &coin_pub),
MAJ_spec_amount ("original_value", &original_value),
MAJ_spec_amount ("requested_value", &melt_value_with_fee),
@@ -1165,6 +1165,7 @@ verify_refresh_melt_signature_forbidden (struct TALER_MINT_RefreshMeltHandle *rm
{
/* coin not found in our original request */
GNUNET_break_op (0);
+ json_decref (history);
return GNUNET_SYSERR;
}
@@ -1174,6 +1175,7 @@ verify_refresh_melt_signature_forbidden (struct TALER_MINT_RefreshMeltHandle *rm
{
/* We disagree on the value of the coin */
GNUNET_break_op (0);
+ json_decref (history);
return GNUNET_SYSERR;
}
if (0 != TALER_amount_cmp (&melt_value_with_fee,
@@ -1181,6 +1183,7 @@ verify_refresh_melt_signature_forbidden (struct TALER_MINT_RefreshMeltHandle *rm
{
/* We disagree on the value of the coin */
GNUNET_break_op (0);
+ json_decref (history);
return GNUNET_SYSERR;
}
@@ -1194,8 +1197,10 @@ verify_refresh_melt_signature_forbidden (struct TALER_MINT_RefreshMeltHandle *rm
&total))
{
GNUNET_break_op (0);
+ json_decref (history);
return GNUNET_SYSERR;
}
+ json_decref (history);
/* check if melt operation was really too expensive given history */
if (GNUNET_OK !=