[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-exchange] 02/02: implement more sanity checks
From: |
gnunet |
Subject: |
[taler-exchange] 02/02: implement more sanity checks |
Date: |
Fri, 13 Oct 2023 08:50:30 +0200 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository exchange.
commit 4a8fb418d75b302ca578c5c1dec460ae9192112c
Author: Christian Grothoff <grothoff@gnunet.org>
AuthorDate: Fri Oct 13 08:50:25 2023 +0200
implement more sanity checks
---
src/include/taler_util.h | 12 ++++++++
src/json/json_helper.c | 20 +++++++++----
src/util/config.c | 77 ++++++++++++++++++++++++++++++++----------------
3 files changed, 79 insertions(+), 30 deletions(-)
diff --git a/src/include/taler_util.h b/src/include/taler_util.h
index 4dcf6f8f..5f70bf65 100644
--- a/src/include/taler_util.h
+++ b/src/include/taler_util.h
@@ -304,6 +304,18 @@ TALER_CONFIG_currency_specs_to_json (
const struct TALER_CurrencySpecification *cspec);
+/**
+ * Check that @a map contains a valid currency scale
+ * map that maps integers from [-12,24] to currency
+ * symbols given as strings.
+ *
+ * @param map map to check
+ * @return #GNUNET_OK if @a map is valid
+ */
+enum GNUNET_GenericReturnValue
+TALER_check_currency_scale_map (const json_t *map);
+
+
/**
* Allow user to specify an amount on the command line.
*
diff --git a/src/json/json_helper.c b/src/json/json_helper.c
index 99d8e5b5..6c960353 100644
--- a/src/json/json_helper.c
+++ b/src/json/json_helper.c
@@ -192,6 +192,9 @@ parse_cspec (void *cls,
unsigned int eline;
(void) cls;
+ memset (r_cspec->currency,
+ 0,
+ sizeof (r_cspec->currency));
if (GNUNET_OK !=
GNUNET_JSON_parse (root,
gspec,
@@ -218,13 +221,20 @@ parse_cspec (void *cls,
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
- memset (r_cspec->currency,
- 0,
- sizeof (r_cspec->currency));
- /* FIXME: check currency consists only of legal characters! */
+ if (GNUNET_OK !=
+ TALER_check_currency (currency))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
strcpy (r_cspec->currency,
currency);
- /* FIXME: check map is valid! */
+ if (GNUNET_OK !=
+ TALER_check_currency_scale_map (map))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
r_cspec->name = GNUNET_strdup (name);
r_cspec->decimal_separator = GNUNET_strdup (decimal_separator);
r_cspec->map_alt_unit_names = json_incref ((json_t *) map);
diff --git a/src/util/config.c b/src/util/config.c
index d3804022..7002a6d7 100644
--- a/src/util/config.c
+++ b/src/util/config.c
@@ -392,36 +392,63 @@ parse_currencies_cb (void *cls,
return;
}
}
-
+ if (GNUNET_OK !=
+ TALER_check_currency_scale_map (cspec->map_alt_unit_names))
{
- /* validate map only maps from decimal numbers to strings! */
- const char *str;
- json_t *val;
+ GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
+ section,
+ "ALT_UNIT_NAMES",
+ "invalid map entry detected");
+ cpc->failure = true;
+ json_decref (cspec->map_alt_unit_names);
+ cspec->map_alt_unit_names = NULL;
+ return;
+ }
+}
+
+
+enum GNUNET_GenericReturnValue
+TALER_check_currency_scale_map (const json_t *map)
+{
+ /* validate map only maps from decimal numbers to strings! */
+ const char *str;
+ const json_t *val;
+ bool zf = false;
- json_object_foreach (cspec->map_alt_unit_names, str, val)
+ if (! json_is_object (map))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Object required for currency scale map\n");
+ return GNUNET_SYSERR;
+ }
+ json_object_foreach ((json_t *) map, str, val)
+ {
+ int idx;
+ char dummy;
+
+ if ( (1 != sscanf (str,
+ "%d%c",
+ &idx,
+ &dummy)) ||
+ (idx < -12) ||
+ (idx > 24) ||
+ (! json_is_string (val) ) )
{
- int idx;
- char dummy;
-
- if ( (1 != sscanf (str,
- "%d%c",
- &idx,
- &dummy)) ||
- (idx < -12) ||
- (idx > 24) ||
- (! json_is_string (val) ) )
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- section,
- "ALT_UNIT_NAMES",
- "invalid map entry detected");
- cpc->failure = true;
- json_decref (cspec->map_alt_unit_names);
- cspec->map_alt_unit_names = NULL;
- return;
- }
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Invalid entry `%s' in currency scale map\n",
+ str);
+ return GNUNET_SYSERR;
}
+ if (0 == idx)
+ zf = true;
}
+ if (! zf)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Entry for 0 missing in currency scale map\n");
+ return GNUNET_SYSERR;
+ }
+ return GNUNET_OK;
}
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.