1#include <test/jtx/Env.h>
2#include <test/jtx/WSClient.h>
3#include <test/jtx/envconfig.h>
5#include <xrpl/beast/unit_test/suite.h>
7#include <boost/asio/ip/address.hpp>
8#include <boost/system/detail/error_code.hpp>
20 boost::system::error_code ec;
21 boost::asio::ip::make_address(addr, ec);
34 BEAST_EXPECT(env.
rpc(
"ping")[
"result"][
"role"] ==
"admin");
41 BEAST_EXPECT(!env.
rpc(
"ping")[
"result"].
isMember(
"role"));
43 BEAST_EXPECT(!wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
48 BEAST_EXPECT(env.
rpc(
"ping")[
"result"][
"role"] ==
"proxied");
49 BEAST_EXPECT(!env.
rpc(
"ping")[
"result"].
isMember(
"ip"));
51 BEAST_EXPECT(!wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
57 headers[
"X-Forwarded-For"] =
"12.34.56.78";
58 rpcRes = env.
rpc(headers,
"ping")[
"result"];
59 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
60 BEAST_EXPECT(rpcRes[
"ip"] ==
"12.34.56.78");
63 headers[
"X-Forwarded-For"] =
"87.65.43.21, 44.33.22.11";
64 rpcRes = env.
rpc(headers,
"ping")[
"result"];
65 BEAST_EXPECT(rpcRes[
"ip"] ==
"87.65.43.21");
68 headers[
"X-Forwarded-For"] =
"87.65.43.21:47011, 44.33.22.11";
69 rpcRes = env.
rpc(headers,
"ping")[
"result"];
70 BEAST_EXPECT(rpcRes[
"ip"] ==
"87.65.43.21");
74 headers[
"Forwarded"] =
"for=88.77.66.55";
75 rpcRes = env.
rpc(headers,
"ping")[
"result"];
76 BEAST_EXPECT(rpcRes[
"ip"] ==
"88.77.66.55");
79 headers[
"Forwarded"] =
80 "what=where;for=55.66.77.88;for=nobody;"
82 rpcRes = env.
rpc(headers,
"ping")[
"result"];
83 BEAST_EXPECT(rpcRes[
"ip"] ==
"55.66.77.88");
86 headers[
"Forwarded"] =
87 "what=where; for=55.66.77.88, for=99.00.11.22;"
89 rpcRes = env.
rpc(headers,
"ping")[
"result"];
90 BEAST_EXPECT(rpcRes[
"ip"] ==
"55.66.77.88");
93 headers[
"Forwarded"] =
94 "what=where; For=99.88.77.66, for=55.66.77.88;"
96 rpcRes = env.
rpc(headers,
"ping")[
"result"];
97 BEAST_EXPECT(rpcRes[
"ip"] ==
"99.88.77.66");
100 headers[
"Forwarded"] =
101 "what=where; for=\"55.66.77.88:47011\";"
103 rpcRes = env.
rpc(headers,
"ping")[
"result"];
104 BEAST_EXPECT(rpcRes[
"ip"] ==
"55.66.77.88");
107 headers[
"Forwarded"] =
108 "what=where; For= \" 99.88.77.66 \" ,for=11.22.33.44;"
110 rpcRes = env.
rpc(headers,
"ping")[
"result"];
111 BEAST_EXPECT(rpcRes[
"ip"] ==
"99.88.77.66");
115 BEAST_EXPECT(!wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
118 headers[
"X-User"] = name;
119 rpcRes = env.
rpc(headers,
"ping")[
"result"];
120 BEAST_EXPECT(rpcRes[
"role"] ==
"identified");
121 BEAST_EXPECT(rpcRes[
"username"] == name);
122 BEAST_EXPECT(rpcRes[
"ip"] ==
"99.88.77.66");
125 BEAST_EXPECT(wsRes[
"unlimited"].asBool());
129 headers[
"X-Forwarded-For"] =
"2001:db8:3333:4444:5555:6666:7777:8888";
130 rpcRes = env.
rpc(headers,
"ping")[
"result"];
131 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
132 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:8888");
135 headers[
"X-Forwarded-For"] =
136 "2001:db8:3333:4444:5555:6666:7777:9999, a:b:c:d:e:f, "
138 rpcRes = env.
rpc(headers,
"ping")[
"result"];
139 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
140 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:9999");
143 headers[
"X-Forwarded-For"] =
"[2001:db8:3333:4444:5555:6666:7777:8888]";
144 rpcRes = env.
rpc(headers,
"ping")[
"result"];
145 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
146 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:8888");
149 headers[
"X-Forwarded-For"] =
150 "[2001:db8:3333:4444:5555:6666:7777:9999], [a:b:c:d:e:f], "
152 rpcRes = env.
rpc(headers,
"ping")[
"result"];
153 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
154 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:9999");
158 headers[
"Forwarded"] =
"for=\"[2001:db8:3333:4444:5555:6666:7777:aaaa]\"";
159 rpcRes = env.
rpc(headers,
"ping")[
"result"];
160 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
161 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:aaaa");
164 headers[
"Forwarded"] =
"For=\"[2001:db8:bb:cc:dd:ee:ff::]:2345\", for=99.00.11.22";
165 rpcRes = env.
rpc(headers,
"ping")[
"result"];
166 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
167 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:bb:cc:dd:ee:ff::");
170 headers[
"Forwarded"] =
171 "proto=http;FOR=\"[2001:db8:11:22:33:44:55:66]\""
173 rpcRes = env.
rpc(headers,
"ping")[
"result"];
174 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
175 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:11:22:33:44:55:66");
180 headers[
"X-Forwarded-For"] =
"2001:db8:3333:4444:5555:6666:1.2.3.4";
181 rpcRes = env.
rpc(headers,
"ping")[
"result"];
182 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
183 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:1.2.3.4");
186 headers[
"X-Forwarded-For"] =
187 "2001:db8:3333:4444:5555:6666:5.6.7.8, a:b:c:d:e:f, "
189 rpcRes = env.
rpc(headers,
"ping")[
"result"];
190 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
191 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:5.6.7.8");
194 headers[
"X-Forwarded-For"] =
"[2001:db8:3333:4444:5555:6666:9.10.11.12]";
195 rpcRes = env.
rpc(headers,
"ping")[
"result"];
196 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
197 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:9.10.11.12");
200 headers[
"X-Forwarded-For"] =
201 "[2001:db8:3333:4444:5555:6666:13.14.15.16], [a:b:c:d:e:f], "
203 rpcRes = env.
rpc(headers,
"ping")[
"result"];
204 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
205 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:13.14.15.16");
209 headers[
"Forwarded"] =
"for=\"[2001:db8:3333:4444:5555:6666:20.19.18.17]\"";
210 rpcRes = env.
rpc(headers,
"ping")[
"result"];
211 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
212 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:20.19.18.17");
215 headers[
"Forwarded"] =
"For=\"[2001:db8:bb:cc::24.23.22.21]\", for=99.00.11.22";
216 rpcRes = env.
rpc(headers,
"ping")[
"result"];
217 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
218 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:bb:cc::24.23.22.21");
221 headers[
"Forwarded"] =
222 "proto=http;FOR=\"[::11:22:33:44:45.55.65.75]:234\""
224 rpcRes = env.
rpc(headers,
"ping")[
"result"];
225 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
226 BEAST_EXPECT(rpcRes[
"ip"] ==
"::11:22:33:44:45.55.65.75");
232 headers[
"Forwarded"] =
"by=203.0.113.43;for=1.2.3.4";
233 rpcRes = env.
rpc(headers,
"ping")[
"result"];
234 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
235 BEAST_EXPECT(rpcRes[
"ip"] ==
"1.2.3.4");
238 headers[
"Forwarded"] =
"proto=https;by=proxy.example.com;for=5.6.7.8";
239 rpcRes = env.
rpc(headers,
"ping")[
"result"];
240 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
241 BEAST_EXPECT(rpcRes[
"ip"] ==
"5.6.7.8");
247 BEAST_EXPECT(env.
rpc(
"ping")[
"result"][
"role"] ==
"admin");
254 BEAST_EXPECT(env.
rpc(
"ping")[
"result"][
"role"] ==
"proxied");
256 BEAST_EXPECT(!wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
259 headers[
"X-Forwarded-For"] =
"12.34.56.78";
261 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
262 BEAST_EXPECT(rpcRes[
"ip"] ==
"12.34.56.78");
280 headers[
"Forwarded"] =
"for 88.77.66.55";
281 rpcRes = env.
rpc(headers,
"ping")[
"result"];
282 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
283 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
285 headers[
"Forwarded"] =
"by=88.77.66.55";
286 rpcRes = env.
rpc(headers,
"ping")[
"result"];
287 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
288 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
292 headers[
"Forwarded"] =
"for=";
293 rpcRes = env.
rpc(headers,
"ping")[
"result"];
294 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
295 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
298 headers[
"X-Forwarded-For"] =
" ";
299 rpcRes = env.
rpc(headers,
"ping")[
"result"];
300 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
301 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
305 headers[
"Forwarded"] =
"for= \" \" ";
306 rpcRes = env.
rpc(headers,
"ping")[
"result"];
307 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
308 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
311 headers[
"X-Forwarded-For"] =
"\"\"";
312 rpcRes = env.
rpc(headers,
"ping")[
"result"];
313 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
314 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
318 headers[
"X-Forwarded-For"] =
"\"12.34.56.78 ";
319 rpcRes = env.
rpc(headers,
"ping")[
"result"];
320 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
321 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
323 headers[
"X-Forwarded-For"] =
"12.34.56.78\"";
324 rpcRes = env.
rpc(headers,
"ping")[
"result"];
325 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
326 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
330 headers[
"Forwarded"] =
"FOR=[2001:db8:bb:cc::";
331 rpcRes = env.
rpc(headers,
"ping")[
"result"];
332 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
333 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
336 headers[
"X-Forwarded-For"] =
"2001:db8:bb:cc::24.23.22.21]";
337 rpcRes = env.
rpc(headers,
"ping")[
"result"];
338 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
339 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
343 headers[
"Forwarded"] =
"FOR=[]";
344 rpcRes = env.
rpc(headers,
"ping")[
"result"];
345 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
346 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
349 headers[
"X-Forwarded-For"] =
"\" [ ] \"";
350 rpcRes = env.
rpc(headers,
"ping")[
"result"];
351 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
352 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
TestcaseT testcase
Memberspace for declaring test cases.
bool isMember(char const *key) const
Return true if the object has a member named key.
virtual Config & config()=0
void testInvalidIpAddresses()
static bool isValidIpAddress(std::string const &addr)
void run() override
Runs the suite.
A transaction testing environment.
json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
std::unique_ptr< Config > secureGateway(std::unique_ptr< Config >)
std::unique_ptr< Config > secureGatewayLocalnet(std::unique_ptr< Config >)
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
std::unique_ptr< Config > adminLocalnet(std::unique_ptr< Config >)
std::unique_ptr< Config > noAdmin(std::unique_ptr< Config >)
adjust config so no admin ports are enabled
BEAST_DEFINE_TESTSUITE(AMMClawback, app, xrpl)
std::unique_ptr< WSClient > makeWSClient(Config const &cfg, bool v2, unsigned rpcVersion, std::unordered_map< std::string, std::string > const &headers)
Returns a client operating through WebSockets/S.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.