implement #5177 (not yet tested)

This commit is contained in:
Christian Grothoff 2017-11-20 14:20:09 +01:00
parent 8f48db8fdf
commit 11269125fa
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
3 changed files with 173 additions and 29 deletions

View File

@ -1,3 +1,24 @@
% This file is part of TALER
% Copyright (C) 2016, 2017 Taler Systems SA
%
% TALER is free software; you can redistribute it and/or modify it under the
% terms of the GNU Affero 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 Affero General Public License for more details.
%
% You should have received a copy of the GNU Affero General Public License along with
% TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
%
%
% With respect to this file, our interpretation of the license is
% that publishing an audit report (i.e. in TeX or PDF) requires
% publishing the corresponding j2 template sources under AGPL, and
% linking to them from the report. (This file _is_ source code,
% the generated PDF is the service under definition of the AGPL.)
%
\documentclass{article} % {acmart}
\usepackage{url}
\usepackage[T1]{fontenc}
@ -7,7 +28,15 @@
\begin{document}
\title{Taler Auditor Report}
% If you update this template, complying with the license requires
% publishing the J2 source and linking to it from the generated PDF.
% So if you change this outside of the Taler Git repository, you must
% update this link (and the link must remain available to the receiver
% of the result from the generated TeX, PDF or other format).
\title{Taler Auditor Report\footnote{Template available at \url{https://git.taler.net/}}}
% You must also credit the original author.
\author{Christian Grothoff}
\maketitle
\section{Operations}
@ -569,6 +598,80 @@ have a clear financial impact.
\end{longtable}
{% endif %}
\subsection{Outgoing wire transfer subject issues}
This section describes issues found by the wire auditor that
relate to outgoing wire transfers being malformed.
This happens if the exchange somehow creates wire transfers
with duplicate or malformed wire transfer subjects.
{% if wire.wire_format_inconsistencies|length() == 0 %}
{\bf No wire format inconsistencies found.}
{% else %}
\begin{longtable}{p{4.5cm}|rl}
\multicolumn{3}{c}{ {\bf Row hash} } \\
{\bf Diagnostic} & \multicolumn{2}{c|}{ {\bf Amount} } \\
\hline \hline
\endfirsthead
\multicolumn{3}{c}{ {\bf Row hash} } \\
{\bf Diagnostic} & \multicolumn{2}{c|}{ {\bf Amount} } \\
\hline \hline
\endhead
\hline
\multicolumn{3}{c}{ {\bf Row hash} } \\
{\bf Diagnostic} & \multicolumn{2}{c|}{ {\bf Amount} } \\
\endfoot
\hline
\hline
{\bf Total} &
{{ wire.total_wire_format_amount.value }}.{{ wire.total_wire_format_amount.fraction }} &
{{ wire.total_wire_format_amount.currency }} \\
\caption{Outgoing wire transfer subject issues found.}
\label{table:outgoing:wtid}
\endlastfoot
{% for item in wire.wire_format_inconsistencies %}
\multicolumn{3}{l}{ \verb! {{ item.wire_offset_hash }} ! } \\
\nopagebreak
{{ item.diagnostic }} &
{{ item.amount.value }}.{{ item.amount.fraction }} &
{{ item.amount.currency }} \\
{% endfor %}
\end{longtable}
{% endif %}
\subsection{Wire fee structure inconsistencies}
This section lists cases where the exchange's database may be ambiguous
with respect to what wire fee it charges at what time.
{% if data.wire_fee_time_inconsistencies|length() == 0 %}
{\bf No wire fee timing issues detected.}
{% else %}
\begin{longtable}{p{1.5cm}|r|p{5.5}}
{\bf Wire format} & {\bf Timestamp} & {\bf Diagnostic}
\\ \hline \hline
\endfirsthead
{\bf Wire format} & {\bf Timestamp} & {\bf Diagnostic}
\\ \hline \hline
\endhead
\hline \hline
{\bf Wire format} & {\bf Timestamp} & {\bf Diagnostic} \\
\endfoot
\hline \hline
{\bf Wire format} & {\bf Timestamp} & {\bf Diagnostic} \\
\caption{Wire fees with ambiguous timestamps.}
\label{table:wire_fee:ambiguity}
\endlastfoot
{% for item in data.wire_fee_time_inconsistencies %}
{\tt {{ item.type }} } & {{ item.time }} & {{ item.diagnostic }} \\ \hline
{% endfor %}
\end{longtable}
{% endif %}
\subsection{Other issues}
This section describes issues found that do not have a clear financial

View File

@ -3,14 +3,14 @@
Copyright (C) 2016, 2017 Inria
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
terms of the GNU Affero 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.
A PARTICULAR PURPOSE. See the GNU Affero Public License for more details.
You should have received a copy of the GNU General Public License along with
You should have received a copy of the GNU Affero Public License along with
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
/**
@ -210,6 +210,11 @@ static json_t *report_aggregation_fee_balances;
*/
static json_t *report_amount_arithmetic_inconsistencies;
/**
* Array of reports about wire fees being ambiguous in terms of validity periods.
*/
static json_t *report_fee_time_inconsistencies;
/**
* Profits the exchange made by bad amount calculations.
*/
@ -2303,11 +2308,24 @@ get_wire_fee (struct AggregationContext *ac,
pos->prev,
wfi);
/* Check non-overlaping fee invariant */
/* TODO (#5177): report problems more nicely? */
if (NULL != wfi->prev)
GNUNET_break (wfi->prev->end_date.abs_value_us <= wfi->start_date.abs_value_us);
if (NULL != wfi->next)
GNUNET_break (wfi->next->start_date.abs_value_us >= wfi->end_date.abs_value_us);
if ( (NULL != wfi->prev) &&
(wfi->prev->end_date.abs_value_us > wfi->start_date.abs_value_us) )
{
report (report_fee_time_inconsistencies,
json_pack ("{s:s, s:s, s:s}",
"type", type,
"diagnostic", "start date before previous end date",
"time", GNUNET_STRINGS_absolute_time_to_string (wfi->start_date)));
}
if ( (NULL != wfi->next) &&
(wfi->next->start_date.abs_value_us >= wfi->end_date.abs_value_us) )
{
report (report_fee_time_inconsistencies,
json_pack ("{s:s, s:s, s:s}",
"type", type,
"diagnostic", "end date date after next start date",
"time", GNUNET_STRINGS_absolute_time_to_string (wfi->end_date)));
}
return &wfi->wire_fee;
}
@ -4085,6 +4103,8 @@ run (void *cls,
(report_amount_arithmetic_inconsistencies = json_array ()));
GNUNET_assert (NULL !=
(report_bad_sig_losses = json_array ()));
GNUNET_assert (NULL !=
(report_fee_time_inconsistencies = json_array ()));
setup_sessions_and_run ();
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Audit complete\n");
@ -4108,7 +4128,8 @@ run (void *cls,
" s:o, s:o, s:o, s:o, s:o,"
" s:o, s:o, s:o, s:o, s:o,"
" s:o, s:o, s:o, s:o, s:o,"
" s:o, s:o, s:o, s:o, s:o}",
" s:o, s:o, s:o, s:o, s:o,"
" s:o }",
/* blocks of 5 for easier counting/matching to format string */
/* block */
"reserve_balance_insufficient_inconsistencies",
@ -4175,9 +4196,10 @@ run (void *cls,
"total_arithmetic_delta_minus",
TALER_JSON_from_amount (&total_arithmetic_delta_minus),
"total_aggregation_fee_income",
TALER_JSON_from_amount (&total_aggregation_fee_income)
TALER_JSON_from_amount (&total_aggregation_fee_income),
/* block */
);
"wire_fee_time_inconsistencies",
report_fee_time_inconsistencies);
GNUNET_break (NULL != report);
json_dumpf (report,
stdout,

View File

@ -159,6 +159,12 @@ static json_t *report_missattribution_in_inconsistencies;
*/
static json_t *report_row_inconsistencies;
/**
* Array of reports about inconcistencies in the database about
* the incoming wire transfers (exchange is not exactly to blame).
*/
static json_t *report_wire_format_inconsistencies;
/**
* Array of reports about minor row inconcistencies.
*/
@ -201,6 +207,11 @@ static struct TALER_Amount total_missattribution_in;
*/
static struct TALER_Amount total_amount_lag;
/**
* Total amount affected by wire format trouble.s
*/
static struct TALER_Amount total_wire_format_amount;
/**
* Amount of zero in our currency.
*/
@ -324,7 +335,7 @@ do_shutdown (void *cls)
GNUNET_assert (NULL != report_row_minor_inconsistencies);
report = json_pack ("{s:o, s:o, s:o, s:o, s:o,"
" s:o, s:o, s:o, s:o, s:o,"
" s:o, s:o }",
" s:o, s:o, s:o, s:o }",
/* blocks of 5 */
"wire_out_amount_inconsistencies",
report_wire_out_inconsistencies,
@ -348,6 +359,10 @@ do_shutdown (void *cls)
"row_minor_inconsistencies",
report_row_minor_inconsistencies,
/* block */
"total_wire_format_amount",
TALER_JSON_from_amount (&total_wire_format_amount),
"wire_format_inconsistencies",
report_wire_format_inconsistencies,
"total_amount_lag",
TALER_JSON_from_amount (&total_bad_amount_in_minus),
"lag_details",
@ -363,6 +378,7 @@ do_shutdown (void *cls)
report_row_minor_inconsistencies = NULL;
report_missattribution_in_inconsistencies = NULL;
report_lags = NULL;
report_wire_format_inconsistencies = NULL;
}
if (NULL != hh)
{
@ -846,18 +862,17 @@ history_debit_cb (void *cls,
row_off_size,
&rowh);
GNUNET_asprintf (&diagnostic,
"malformed wire transfer subject `%s'",
"malformed subject `%8s...'",
details->wtid_s);
report (report_row_inconsistencies,
json_pack ("{s:s, s:I, s:o, s:o, s:s}",
"table", "bank wire log",
"row", (json_int_t) 0,
GNUNET_break (GNUNET_OK ==
TALER_amount_add (&total_wire_format_amount,
&total_wire_format_amount,
&details->amount));
report (report_wire_format_inconsistencies,
json_pack ("{s:o, s:o, s:s}",
"amount", TALER_JSON_from_amount (&details->amount),
"wire_offset_hash", GNUNET_JSON_from_data_auto (&rowh),
"diagnostic", diagnostic));
/* TODO (#5177): report generator currently ignores 'amount' for this
table, maybe use a different table to report this issue! */
/* TODO: add 'amount' to some total amount that was badly wired! */
GNUNET_free (diagnostic);
return GNUNET_SYSERR;
}
@ -881,18 +896,17 @@ history_debit_cb (void *cls,
row_off_size,
&rowh);
GNUNET_asprintf (&diagnostic,
"duplicate wire transfer subject `%s'",
"duplicate subject hash `%8s...'",
TALER_B2S (&roi->subject_hash));
report (report_row_inconsistencies,
json_pack ("{s:s, s:I, s:o, s:o, s:s}",
"table", "bank wire log",
"row", (json_int_t) 0,
GNUNET_break (GNUNET_OK ==
TALER_amount_add (&total_wire_format_amount,
&total_wire_format_amount,
&details->amount));
report (report_wire_format_inconsistencies,
json_pack ("{s:o, s:o, s:s}",
"amount", TALER_JSON_from_amount (&details->amount),
"wire_offset_hash", GNUNET_JSON_from_data_auto (&rowh),
"diagnostic", diagnostic));
/* TODO (#5177): report generator currently ignores 'amount' for this
table, maybe use a different table to report this issue! */
/* TODO: add 'amount' to some total amount that was badly wired! */
GNUNET_free (diagnostic);
return GNUNET_SYSERR;
}
@ -1381,6 +1395,8 @@ run (void *cls,
(report_reserve_in_inconsistencies = json_array ()));
GNUNET_assert (NULL !=
(report_row_minor_inconsistencies = json_array ()));
GNUNET_assert (NULL !=
(report_wire_format_inconsistencies = json_array ()));
GNUNET_assert (NULL !=
(report_row_inconsistencies = json_array ()));
GNUNET_assert (NULL !=
@ -1405,6 +1421,9 @@ run (void *cls,
GNUNET_assert (GNUNET_OK ==
TALER_amount_get_zero (currency,
&total_amount_lag));
GNUNET_assert (GNUNET_OK ==
TALER_amount_get_zero (currency,
&total_wire_format_amount));
GNUNET_assert (GNUNET_OK ==
TALER_amount_get_zero (currency,
&zero));