20 #include <ripple/beast/unit_test.h>
21 #include <ripple/protocol/ErrorCodes.h>
22 #include <ripple/protocol/jss.h>
24 #include <test/jtx/WSClient.h>
26 #include <boost/asio/ip/address_v4.hpp>
40 boost::system::error_code ec;
41 boost::asio::ip::make_address(addr, ec);
48 using namespace test::jtx;
53 BEAST_EXPECT(env.
rpc(
"ping")[
"result"][
"role"] ==
"admin");
55 ->invoke(
"ping")[
"result"][
"unlimited"]
61 BEAST_EXPECT(!env.rpc(
"ping")[
"result"].isMember(
"role"));
63 makeWSClient(env.app().config())->invoke(
"ping")[
"result"];
65 !wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
70 BEAST_EXPECT(env.rpc(
"ping")[
"result"][
"role"] ==
"proxied");
72 makeWSClient(env.app().config())->invoke(
"ping")[
"result"];
74 !wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
80 headers[
"X-Forwarded-For"] =
"12.34.56.78";
81 rpcRes = env.rpc(headers,
"ping")[
"result"];
82 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
83 BEAST_EXPECT(rpcRes[
"ip"] ==
"12.34.56.78");
86 headers[
"X-Forwarded-For"] =
"87.65.43.21, 44.33.22.11";
87 rpcRes = env.rpc(headers,
"ping")[
"result"];
88 BEAST_EXPECT(rpcRes[
"ip"] ==
"87.65.43.21");
91 headers[
"X-Forwarded-For"] =
"87.65.43.21:47011, 44.33.22.11";
92 rpcRes = env.rpc(headers,
"ping")[
"result"];
93 BEAST_EXPECT(rpcRes[
"ip"] ==
"87.65.43.21");
97 headers[
"Forwarded"] =
"for=88.77.66.55";
98 rpcRes = env.rpc(headers,
"ping")[
"result"];
99 BEAST_EXPECT(rpcRes[
"ip"] ==
"88.77.66.55");
102 headers[
"Forwarded"] =
103 "what=where;for=55.66.77.88;for=nobody;"
105 rpcRes = env.rpc(headers,
"ping")[
"result"];
106 BEAST_EXPECT(rpcRes[
"ip"] ==
"55.66.77.88");
109 headers[
"Forwarded"] =
110 "what=where; for=55.66.77.88, for=99.00.11.22;"
112 rpcRes = env.rpc(headers,
"ping")[
"result"];
113 BEAST_EXPECT(rpcRes[
"ip"] ==
"55.66.77.88");
116 headers[
"Forwarded"] =
117 "what=where; For=99.88.77.66, for=55.66.77.88;"
119 rpcRes = env.rpc(headers,
"ping")[
"result"];
120 BEAST_EXPECT(rpcRes[
"ip"] ==
"99.88.77.66");
123 headers[
"Forwarded"] =
124 "what=where; for=\"55.66.77.88:47011\";"
126 rpcRes = env.rpc(headers,
"ping")[
"result"];
127 BEAST_EXPECT(rpcRes[
"ip"] ==
"55.66.77.88");
130 headers[
"Forwarded"] =
131 "what=where; For= \" 99.88.77.66 \" ,for=11.22.33.44;"
133 rpcRes = env.rpc(headers,
"ping")[
"result"];
134 BEAST_EXPECT(rpcRes[
"ip"] ==
"99.88.77.66");
137 wsRes =
makeWSClient(env.app().config(),
true, 2, headers)
138 ->invoke(
"ping")[
"result"];
140 !wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
143 headers[
"X-User"] = name;
144 rpcRes = env.rpc(headers,
"ping")[
"result"];
145 BEAST_EXPECT(rpcRes[
"role"] ==
"identified");
146 BEAST_EXPECT(rpcRes[
"username"] == name);
147 BEAST_EXPECT(rpcRes[
"ip"] ==
"99.88.77.66");
149 wsRes =
makeWSClient(env.app().config(),
true, 2, headers)
150 ->invoke(
"ping")[
"result"];
151 BEAST_EXPECT(wsRes[
"unlimited"].asBool());
155 headers[
"X-Forwarded-For"] =
156 "2001:db8:3333:4444:5555:6666:7777:8888";
157 rpcRes = env.rpc(headers,
"ping")[
"result"];
158 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
160 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:8888");
163 headers[
"X-Forwarded-For"] =
164 "2001:db8:3333:4444:5555:6666:7777:9999, a:b:c:d:e:f, "
166 rpcRes = env.rpc(headers,
"ping")[
"result"];
167 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
169 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:9999");
172 headers[
"X-Forwarded-For"] =
173 "[2001:db8:3333:4444:5555:6666:7777:8888]";
174 rpcRes = env.rpc(headers,
"ping")[
"result"];
175 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
177 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:8888");
180 headers[
"X-Forwarded-For"] =
181 "[2001:db8:3333:4444:5555:6666:7777:9999], [a:b:c:d:e:f], "
183 rpcRes = env.rpc(headers,
"ping")[
"result"];
184 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
186 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:9999");
190 headers[
"Forwarded"] =
191 "for=\"[2001:db8:3333:4444:5555:6666:7777:aaaa]\"";
192 rpcRes = env.rpc(headers,
"ping")[
"result"];
193 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
195 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:7777:aaaa");
198 headers[
"Forwarded"] =
199 "For=\"[2001:db8:bb:cc:dd:ee:ff::]:2345\", for=99.00.11.22";
200 rpcRes = env.rpc(headers,
"ping")[
"result"];
201 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
202 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:bb:cc:dd:ee:ff::");
205 headers[
"Forwarded"] =
206 "proto=http;FOR=\"[2001:db8:11:22:33:44:55:66]\""
208 rpcRes = env.rpc(headers,
"ping")[
"result"];
209 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
210 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:11:22:33:44:55:66");
215 headers[
"X-Forwarded-For"] =
"2001:db8:3333:4444:5555:6666:1.2.3.4";
216 rpcRes = env.rpc(headers,
"ping")[
"result"];
217 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
219 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:1.2.3.4");
222 headers[
"X-Forwarded-For"] =
223 "2001:db8:3333:4444:5555:6666:5.6.7.8, a:b:c:d:e:f, "
225 rpcRes = env.rpc(headers,
"ping")[
"result"];
226 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
228 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:5.6.7.8");
231 headers[
"X-Forwarded-For"] =
232 "[2001:db8:3333:4444:5555:6666:9.10.11.12]";
233 rpcRes = env.rpc(headers,
"ping")[
"result"];
234 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
236 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:9.10.11.12");
239 headers[
"X-Forwarded-For"] =
240 "[2001:db8:3333:4444:5555:6666:13.14.15.16], [a:b:c:d:e:f], "
242 rpcRes = env.rpc(headers,
"ping")[
"result"];
243 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
245 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:13.14.15.16");
249 headers[
"Forwarded"] =
250 "for=\"[2001:db8:3333:4444:5555:6666:20.19.18.17]\"";
251 rpcRes = env.rpc(headers,
"ping")[
"result"];
252 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
254 rpcRes[
"ip"] ==
"2001:db8:3333:4444:5555:6666:20.19.18.17");
257 headers[
"Forwarded"] =
258 "For=\"[2001:db8:bb:cc::24.23.22.21]\", for=99.00.11.22";
259 rpcRes = env.rpc(headers,
"ping")[
"result"];
260 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
261 BEAST_EXPECT(rpcRes[
"ip"] ==
"2001:db8:bb:cc::24.23.22.21");
264 headers[
"Forwarded"] =
265 "proto=http;FOR=\"[::11:22:33:44:45.55.65.75]:234\""
267 rpcRes = env.rpc(headers,
"ping")[
"result"];
268 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
269 BEAST_EXPECT(rpcRes[
"ip"] ==
"::11:22:33:44:45.55.65.75");
275 BEAST_EXPECT(env.rpc(
"ping")[
"result"][
"role"] ==
"admin");
277 ->invoke(
"ping")[
"result"][
"unlimited"]
283 BEAST_EXPECT(env.rpc(
"ping")[
"result"][
"role"] ==
"proxied");
285 makeWSClient(env.app().config())->invoke(
"ping")[
"result"];
287 !wsRes.isMember(
"unlimited") || !wsRes[
"unlimited"].asBool());
290 headers[
"X-Forwarded-For"] =
"12.34.56.78";
291 Json::Value rpcRes = env.rpc(headers,
"ping")[
"result"];
292 BEAST_EXPECT(rpcRes[
"role"] ==
"proxied");
293 BEAST_EXPECT(rpcRes[
"ip"] ==
"12.34.56.78");
301 using namespace test::jtx;
310 headers[
"Forwarded"] =
"for 88.77.66.55";
311 rpcRes = env.
rpc(headers,
"ping")[
"result"];
312 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
313 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
315 headers[
"Forwarded"] =
"by=88.77.66.55";
316 rpcRes = env.
rpc(headers,
"ping")[
"result"];
317 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
318 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
322 headers[
"Forwarded"] =
"for=";
323 rpcRes = env.
rpc(headers,
"ping")[
"result"];
324 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
325 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
328 headers[
"X-Forwarded-For"] =
" ";
329 rpcRes = env.
rpc(headers,
"ping")[
"result"];
330 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
331 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
335 headers[
"Forwarded"] =
"for= \" \" ";
336 rpcRes = env.
rpc(headers,
"ping")[
"result"];
337 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
338 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
341 headers[
"X-Forwarded-For"] =
"\"\"";
342 rpcRes = env.
rpc(headers,
"ping")[
"result"];
343 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
344 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
348 headers[
"X-Forwarded-For"] =
"\"12.34.56.78 ";
349 rpcRes = env.
rpc(headers,
"ping")[
"result"];
350 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
351 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
353 headers[
"X-Forwarded-For"] =
"12.34.56.78\"";
354 rpcRes = env.
rpc(headers,
"ping")[
"result"];
355 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
356 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
360 headers[
"Forwarded"] =
"FOR=[2001:db8:bb:cc::";
361 rpcRes = env.
rpc(headers,
"ping")[
"result"];
362 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
363 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
366 headers[
"X-Forwarded-For"] =
"2001:db8:bb:cc::24.23.22.21]";
367 rpcRes = env.
rpc(headers,
"ping")[
"result"];
368 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
369 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
373 headers[
"Forwarded"] =
"FOR=[]";
374 rpcRes = env.
rpc(headers,
"ping")[
"result"];
375 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
376 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));
379 headers[
"X-Forwarded-For"] =
"\" [ ] \"";
380 rpcRes = env.
rpc(headers,
"ping")[
"result"];
381 BEAST_EXPECT(rpcRes[
"role"] ==
"admin");
382 BEAST_EXPECT(!rpcRes.
isMember(
"ip"));