finshing json parsing support for /refresh/melt handling

This commit is contained in:
Christian Grothoff 2015-08-08 21:46:26 +02:00
parent 6ea5858d32
commit 189adf52eb
3 changed files with 126 additions and 4 deletions

View File

@ -253,6 +253,37 @@ parse_json (json_t *root,
} }
break; 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: default:
GNUNET_break (0); GNUNET_break (0);
return i; return i;
@ -307,6 +338,10 @@ parse_free (struct MAJ_Specification *spec,
GNUNET_free (*spec[i].details.eddsa_signature.purpose_p); GNUNET_free (*spec[i].details.eddsa_signature.purpose_p);
*spec[i].details.eddsa_signature.purpose_p = NULL; *spec[i].details.eddsa_signature.purpose_p = NULL;
break; break;
case MAJ_CMD_JSON_OBJECT:
json_decref (*spec[i].details.obj);
*spec[i].details.obj = NULL;
break;
default: default:
GNUNET_break (0); GNUNET_break (0);
break; break;
@ -417,6 +452,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. * Specification for parsing an RSA public key.
* *

View File

@ -79,7 +79,17 @@ enum MAJ_Command
MAJ_CMD_STRING, 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 MAJ_CMD_C
@ -181,6 +191,16 @@ struct MAJ_Specification
*/ */
const char **strptr; const char **strptr;
/**
* Where to store 16-bit integer.
*/
uint16_t *u16;
/**
* Where to store a JSON object.
*/
json_t **obj;
} details; } details;
}; };
@ -249,13 +269,35 @@ MAJ_spec_string (const char *name,
* Absolute time. * Absolute time.
* *
* @param name name of the JSON field * @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 struct MAJ_Specification
MAJ_spec_absolute_time (const char *name, MAJ_spec_absolute_time (const char *name,
struct GNUNET_TIME_Absolute *at); struct GNUNET_TIME_Absolute *at);
/**
* 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. * Specification for parsing an amount value.
* *

View File

@ -1063,7 +1063,7 @@ verify_refresh_melt_signature_ok (struct TALER_MINT_RefreshMeltHandle *rmh,
struct MAJ_Specification spec[] = { struct MAJ_Specification spec[] = {
MAJ_spec_fixed_auto ("mint_sig", &mint_sig), MAJ_spec_fixed_auto ("mint_sig", &mint_sig),
MAJ_spec_fixed_auto ("mint_pub", &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 MAJ_spec_end
}; };
struct TALER_RefreshMeltConfirmationPS confirm; struct TALER_RefreshMeltConfirmationPS confirm;
@ -1124,7 +1124,7 @@ verify_refresh_melt_signature_forbidden (struct TALER_MINT_RefreshMeltHandle *rm
struct TALER_CoinSpendPublicKeyP coin_pub; struct TALER_CoinSpendPublicKeyP coin_pub;
unsigned int i; unsigned int i;
struct MAJ_Specification spec[] = { 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_fixed_auto ("coin_pub", &coin_pub),
MAJ_spec_amount ("original_value", &original_value), MAJ_spec_amount ("original_value", &original_value),
MAJ_spec_amount ("requested_value", &melt_value_with_fee), 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 */ /* coin not found in our original request */
GNUNET_break_op (0); GNUNET_break_op (0);
json_decref (history);
return GNUNET_SYSERR; 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 */ /* We disagree on the value of the coin */
GNUNET_break_op (0); GNUNET_break_op (0);
json_decref (history);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
if (0 != TALER_amount_cmp (&melt_value_with_fee, 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 */ /* We disagree on the value of the coin */
GNUNET_break_op (0); GNUNET_break_op (0);
json_decref (history);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
@ -1194,8 +1197,10 @@ verify_refresh_melt_signature_forbidden (struct TALER_MINT_RefreshMeltHandle *rm
&total)) &total))
{ {
GNUNET_break_op (0); GNUNET_break_op (0);
json_decref (history);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
json_decref (history);
/* check if melt operation was really too expensive given history */ /* check if melt operation was really too expensive given history */
if (GNUNET_OK != if (GNUNET_OK !=