LCOV - code coverage report
Current view: top level - auditor - taler-auditor-httpd_mhd.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 51.7 % 29 15
Test Date: 2026-11-03 22:15:25 Functions: 75.0 % 4 3

            Line data    Source code
       1              : /*
       2              :   This file is part of TALER
       3              :   Copyright (C) 2014-2020 Taler Systems SA
       4              : 
       5              :   TALER is free software; you can redistribute it and/or modify it under the
       6              :   terms of the GNU Affero General Public License as published by the Free Software
       7              :   Foundation; either version 3, or (at your option) any later version.
       8              : 
       9              :   TALER is distributed in the hope that it will be useful, but WITHOUT ANY
      10              :   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
      11              :   A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more details.
      12              : 
      13              :   You should have received a copy of the GNU Affero General Public License along with
      14              :   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
      15              : */
      16              : 
      17              : /**
      18              :  * @file taler-auditor-httpd_mhd.c
      19              :  * @brief helpers for MHD interaction; these are TALER_MHD_handler_ functions
      20              :  *        that generate simple MHD replies that do not require any real operations
      21              :  *        to be performed (error handling, static pages, etc.)
      22              :  * @author Florian Dold
      23              :  * @author Benedikt Mueller
      24              :  * @author Christian Grothoff
      25              :  */
      26              : #include <gnunet/gnunet_util_lib.h>
      27              : #include <jansson.h>
      28              : #include <microhttpd.h>
      29              : #include <pthread.h>
      30              : #include "taler/taler_mhd_lib.h"
      31              : #include "taler-auditor-httpd.h"
      32              : #include "taler-auditor-httpd_mhd.h"
      33              : 
      34              : 
      35              : /**
      36              :  * Check recursively that integers in @a value can be represented exactly by
      37              :  * JavaScript clients, that is, that their magnitude does not exceed the
      38              :  * largest SafeUint64.  Negative values occur (such as "profitable" being -1
      39              :  * for a loss).
      40              :  *
      41              :  * @param value JSON value to inspect
      42              :  * @return true if all integers are safe
      43              :  */
      44              : static bool
      45          132 : json_integers_are_safe (const json_t *value)
      46              : {
      47          132 :   if (json_is_integer (value))
      48              :   {
      49            0 :     json_int_t number = json_integer_value (value);
      50              : 
      51            0 :     if (number < 0)
      52            0 :       return ((uint64_t) (-(number + 1))) < TAH_SAFE_UINT64_MAX;
      53            0 :     return ((uint64_t) number <= TAH_SAFE_UINT64_MAX);
      54              :   }
      55          132 :   if (json_is_array (value))
      56              :   {
      57              :     size_t index;
      58              :     json_t *child;
      59              : 
      60          132 :     json_array_foreach ((json_t *) value, index, child)
      61            0 :     if (! json_integers_are_safe (child))
      62            0 :       return false;
      63              :   }
      64          132 :   if (json_is_object (value))
      65              :   {
      66              :     const char *key;
      67              :     json_t *child;
      68              : 
      69            0 :     json_object_foreach ((json_t *) value, key, child)
      70            0 :     if (! json_integers_are_safe (child))
      71            0 :       return false;
      72              :   }
      73          132 :   return true;
      74              : }
      75              : 
      76              : 
      77              : enum MHD_Result
      78          132 : TAH_reply_json_records (struct MHD_Connection *connection,
      79              :                         json_t *records)
      80              : {
      81          132 :   if (! json_integers_are_safe (records))
      82              :   {
      83            0 :     GNUNET_break (0);
      84            0 :     json_decref (records);
      85            0 :     return TALER_MHD_reply_with_error (
      86              :       connection,
      87              :       MHD_HTTP_INTERNAL_SERVER_ERROR,
      88              :       TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE,
      89              :       "monitoring response contains an integer outside SafeUint64");
      90              :   }
      91          132 :   return TALER_MHD_REPLY_JSON_PACK (
      92              :     connection,
      93              :     MHD_HTTP_OK,
      94              :     GNUNET_JSON_pack_array_steal ("records",
      95              :                                   records));
      96              : }
      97              : 
      98              : 
      99              : enum MHD_Result
     100            1 : TAH_MHD_handler_static_response (struct TAH_RequestHandler *rh,
     101              :                                  struct MHD_Connection *connection,
     102              :                                  void **connection_cls,
     103              :                                  const char *upload_data,
     104              :                                  size_t *upload_data_size,
     105              :                                  const char *const args[])
     106              : {
     107              :   size_t dlen;
     108              : 
     109              :   (void) connection_cls;
     110              :   (void) upload_data;
     111              :   (void) upload_data_size;
     112            2 :   dlen = (0 == rh->data_size)
     113            1 :          ? strlen ((const char *) rh->data)
     114            1 :          : rh->data_size;
     115            2 :   return TALER_MHD_reply_static (connection,
     116              :                                  rh->response_code,
     117              :                                  rh->mime_type,
     118            1 :                                  rh->data,
     119              :                                  dlen);
     120              : }
     121              : 
     122              : 
     123              : enum MHD_Result
     124            0 : TAH_MHD_handler_agpl_redirect (struct TAH_RequestHandler *rh,
     125              :                                struct MHD_Connection *connection,
     126              :                                void **connection_cls,
     127              :                                const char *upload_data,
     128              :                                size_t *upload_data_size,
     129              :                                const char *const args[])
     130              : {
     131              :   (void) rh;
     132              :   (void) connection_cls;
     133              :   (void) upload_data;
     134              :   (void) upload_data_size;
     135            0 :   return TALER_MHD_reply_agpl (connection,
     136              :                                "http://www.git.taler.net/?p=exchange.git");
     137              : }
     138              : 
     139              : 
     140              : /* end of taler-auditor-httpd_mhd.c */
        

Generated by: LCOV version 2.0-1