21#include <test/jtx/WSClient.h>
22#include <xrpl/beast/unit_test.h>
36 boost::system::error_code ec;
37 boost::asio::ip::make_address(addr, ec);
44 using namespace test::jtx;
49 BEAST_EXPECT(env.
rpc(
"ping")[
"result"][
"role"] ==
"admin");
51 ->invoke(
"ping")[
"result"][
"unlimited"]
57 BEAST_EXPECT(!env.rpc(
"ping")[
"result"].isMember(
"role"));
59 makeWSClient(env.app().config())->invoke(
"ping")[
"result"];
61 !wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
66 BEAST_EXPECT(env.rpc(
"ping")[
"result"][
"role"] ==
"proxied");
68 makeWSClient(env.app().config())->invoke(
"ping")[
"result"];
70 !wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
76 headers[
"X-Forwarded-For"] =
"12.34.56.78";
77 rpcRes = env.rpc(headers,
"ping")[
"result"];
78 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
79 BEAST_EXPECT(rpcRes[
"ip"] ==
"12.34.56.78");
82 headers[
"X-Forwarded-For"] =
"87.65.43.21, 44.33.22.11";
83 rpcRes = env.rpc(headers,
"ping")[
"result"];
84 BEAST_EXPECT(rpcRes[
"ip"] ==
"87.65.43.21");
87 headers[
"X-Forwarded-For"] =
"87.65.43.21:47011, 44.33.22.11";
88 rpcRes = env.rpc(headers,
"ping")[
"result"];
89 BEAST_EXPECT(rpcRes[
"ip"] ==
"87.65.43.21");
93 headers[
"Forwarded"] =
"for=88.77.66.55";
94 rpcRes = env.rpc(headers,
"ping")[
"result"];
95 BEAST_EXPECT(rpcRes[
"ip"] ==
"88.77.66.55");
98 headers[
"Forwarded"] =
99 "what=where;for=55.66.77.88;for=nobody;"
101 rpcRes = env.rpc(headers,
"ping")[
"result"];
102 BEAST_EXPECT(rpcRes[
"ip"] ==
"55.66.77.88");
105 headers[
"Forwarded"] =
106 "what=where; for=55.66.77.88, for=99.00.11.22;"
108 rpcRes = env.rpc(headers,
"ping")[
"result"];
109 BEAST_EXPECT(rpcRes[
"ip"] ==
"55.66.77.88");
112 headers[
"Forwarded"] =
113 "what=where; For=99.88.77.66, for=55.66.77.88;"
115 rpcRes = env.rpc(headers,
"ping")[
"result"];
116 BEAST_EXPECT(rpcRes[
"ip"] ==
"99.88.77.66");
119 headers[
"Forwarded"] =
120 "what=where; for=\"55.66.77.88:47011\";"
122 rpcRes = env.rpc(headers,
"ping")[
"result"];
123 BEAST_EXPECT(rpcRes[
"ip"] ==
"55.66.77.88");
126 headers[
"Forwarded"] =
127 "what=where; For= \" 99.88.77.66 \" ,for=11.22.33.44;"
129 rpcRes = env.rpc(headers,
"ping")[
"result"];
130 BEAST_EXPECT(rpcRes[
"ip"] ==
"99.88.77.66");
133 wsRes =
makeWSClient(env.app().config(),
true, 2, headers)
134 ->invoke(
"ping")[
"result"];
136 !wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
139 headers[
"X-User"] = name;
140 rpcRes = env.rpc(headers,
"ping")[
"result"];
141 BEAST_EXPECT(rpcRes[
"role"] ==
"identified");
142 BEAST_EXPECT(rpcRes[
"username"] == name);
143 BEAST_EXPECT(rpcRes[
"ip"] ==
"99.88.77.66");
145 wsRes =
makeWSClient(env.app().config(),
true, 2, headers)
146 ->invoke(
"ping")[
"result"];
147 BEAST_EXPECT(wsRes[
"unlimited"].asBool());
151 headers[
"X-Forwarded-For"] =
152 "2001:db8:3333:4444:5555:6666:7777:8888";
153 rpcRes = env.rpc(headers,
"ping")[
"result"];
154 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
156 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:8888");
159 headers[
"X-Forwarded-For"] =
160 "2001:db8:3333:4444:5555:6666:7777:9999, a:b:c:d:e:f, "
162 rpcRes = env.rpc(headers,
"ping")[
"result"];
163 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
165 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:9999");
168 headers[
"X-Forwarded-For"] =
169 "[2001:db8:3333:4444:5555:6666:7777:8888]";
170 rpcRes = env.rpc(headers,
"ping")[
"result"];
171 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
173 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:8888");
176 headers[
"X-Forwarded-For"] =
177 "[2001:db8:3333:4444:5555:6666:7777:9999], [a:b:c:d:e:f], "
179 rpcRes = env.rpc(headers,
"ping")[
"result"];
180 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
182 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:9999");
186 headers[
"Forwarded"] =
187 "for=\"[2001:db8:3333:4444:5555:6666:7777:aaaa]\"";
188 rpcRes = env.rpc(headers,
"ping")[
"result"];
189 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
191 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:aaaa");
194 headers[
"Forwarded"] =
195 "For=\"[2001:db8:bb:cc:dd:ee:ff::]:2345\", for=99.00.11.22";
196 rpcRes = env.rpc(headers,
"ping")[
"result"];
197 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
198 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:bb:cc:dd:ee:ff::");
201 headers[
"Forwarded"] =
202 "proto=http;FOR=\"[2001:db8:11:22:33:44:55:66]\""
204 rpcRes = env.rpc(headers,
"ping")[
"result"];
205 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
206 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:11:22:33:44:55:66");
211 headers[
"X-Forwarded-For"] =
"2001:db8:3333:4444:5555:6666:1.2.3.4";
212 rpcRes = env.rpc(headers,
"ping")[
"result"];
213 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
215 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:1.2.3.4");
218 headers[
"X-Forwarded-For"] =
219 "2001:db8:3333:4444:5555:6666:5.6.7.8, a:b:c:d:e:f, "
221 rpcRes = env.rpc(headers,
"ping")[
"result"];
222 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
224 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:5.6.7.8");
227 headers[
"X-Forwarded-For"] =
228 "[2001:db8:3333:4444:5555:6666:9.10.11.12]";
229 rpcRes = env.rpc(headers,
"ping")[
"result"];
230 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
232 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:9.10.11.12");
235 headers[
"X-Forwarded-For"] =
236 "[2001:db8:3333:4444:5555:6666:13.14.15.16], [a:b:c:d:e:f], "
238 rpcRes = env.rpc(headers,
"ping")[
"result"];
239 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
241 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:13.14.15.16");
245 headers[
"Forwarded"] =
246 "for=\"[2001:db8:3333:4444:5555:6666:20.19.18.17]\"";
247 rpcRes = env.rpc(headers,
"ping")[
"result"];
248 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
250 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:20.19.18.17");
253 headers[
"Forwarded"] =
254 "For=\"[2001:db8:bb:cc::24.23.22.21]\", for=99.00.11.22";
255 rpcRes = env.rpc(headers,
"ping")[
"result"];
256 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
257 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:bb:cc::24.23.22.21");
260 headers[
"Forwarded"] =
261 "proto=http;FOR=\"[::11:22:33:44:45.55.65.75]:234\""
263 rpcRes = env.rpc(headers,
"ping")[
"result"];
264 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
265 BEAST_EXPECT(rpcRes[
"ip"] ==
"::11:22:33:44:45.55.65.75");
271 BEAST_EXPECT(env.rpc(
"ping")[
"result"][
"role"] ==
"admin");
273 ->invoke(
"ping")[
"result"][
"unlimited"]
279 BEAST_EXPECT(env.rpc(
"ping")[
"result"][
"role"] ==
"proxied");
281 makeWSClient(env.app().config())->invoke(
"ping")[
"result"];
283 !wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
286 headers[
"X-Forwarded-For"] =
"12.34.56.78";
287 Json::Value rpcRes = env.rpc(headers,
"ping")[
"result"];
288 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
289 BEAST_EXPECT(rpcRes[
"ip"] ==
"12.34.56.78");
297 using namespace test::jtx;
306 headers[
"Forwarded"] =
"for 88.77.66.55";
307 rpcRes = env.
rpc(headers,
"ping")[
"result"];
308 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
309 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
311 headers[
"Forwarded"] =
"by=88.77.66.55";
312 rpcRes = env.
rpc(headers,
"ping")[
"result"];
313 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
314 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
318 headers[
"Forwarded"] =
"for=";
319 rpcRes = env.
rpc(headers,
"ping")[
"result"];
320 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
321 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
324 headers[
"X-Forwarded-For"] =
" ";
325 rpcRes = env.
rpc(headers,
"ping")[
"result"];
326 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
327 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
331 headers[
"Forwarded"] =
"for= \" \" ";
332 rpcRes = env.
rpc(headers,
"ping")[
"result"];
333 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
334 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
337 headers[
"X-Forwarded-For"] =
"\"\"";
338 rpcRes = env.
rpc(headers,
"ping")[
"result"];
339 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
340 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
344 headers[
"X-Forwarded-For"] =
"\"12.34.56.78 ";
345 rpcRes = env.
rpc(headers,
"ping")[
"result"];
346 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
347 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
349 headers[
"X-Forwarded-For"] =
"12.34.56.78\"";
350 rpcRes = env.
rpc(headers,
"ping")[
"result"];
351 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
352 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
356 headers[
"Forwarded"] =
"FOR=[2001:db8:bb:cc::";
357 rpcRes = env.
rpc(headers,
"ping")[
"result"];
358 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
359 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
362 headers[
"X-Forwarded-For"] =
"2001:db8:bb:cc::24.23.22.21]";
363 rpcRes = env.
rpc(headers,
"ping")[
"result"];
364 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
365 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
369 headers[
"Forwarded"] =
"FOR=[]";
370 rpcRes = env.
rpc(headers,
"ping")[
"result"];
371 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
372 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
375 headers[
"X-Forwarded-For"] =
"\" [ ] \"";
376 rpcRes = env.
rpc(headers,
"ping")[
"result"];
377 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
378 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
391BEAST_DEFINE_TESTSUITE(Roles, app,
ripple);
bool isMember(const char *key) const
Return true if the object has a member named key.
virtual Config & config()=0
bool isValidIpAddress(std::string const &addr)
void run() override
Runs the suite.
void testInvalidIpAddresses()
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 > admin_localnet(std::unique_ptr< Config >)
std::unique_ptr< Config > secure_gateway(std::unique_ptr< Config >)
std::unique_ptr< Config > no_admin(std::unique_ptr< Config >)
adjust config so no admin ports are enabled
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
std::unique_ptr< Config > secure_gateway_localnet(std::unique_ptr< Config >)
std::unique_ptr< WSClient > makeWSClient(Config const &cfg, bool v2, unsigned rpc_version, 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.