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 */
|