@@ -55,6 +55,13 @@ class global_settings_enable_upload_rate_limiter_test_class : public global_sett
55
55
};
56
56
57
57
58
+ class global_setting_enable_bbox_size_limiter_test_class : public global_settings_default {
59
+
60
+ public:
61
+ // enable bbox size limiter
62
+ bool get_bbox_size_limiter_upload () const override { return true ; }
63
+ };
64
+
58
65
std::unique_ptr<xmlDoc, void (*)(xmlDoc *)> getDocument (const std::string &document)
59
66
{
60
67
return {xmlReadDoc ((xmlChar *)(document.c_str ()), NULL , NULL , XML_PARSE_PEDANTIC | XML_PARSE_NONET), xmlFreeDoc};
@@ -2447,6 +2454,7 @@ TEST_CASE_METHOD( DatabaseTestsFixture, "test_osmchange_end_to_end", "[changeset
2447
2454
2448
2455
}
2449
2456
2457
+
2450
2458
TEST_CASE_METHOD ( DatabaseTestsFixture, " test_osmchange_rate_limiter" , " [changeset][upload][db]" ) {
2451
2459
2452
2460
// Upload rate limiter enabling
@@ -2599,6 +2607,175 @@ TEST_CASE_METHOD( DatabaseTestsFixture, "test_osmchange_rate_limiter", "[changes
2599
2607
}
2600
2608
}
2601
2609
2610
+
2611
+ TEST_CASE_METHOD ( DatabaseTestsFixture, " test_osmchange_bbox_size_limiter" , " [changeset][upload][db]" ) {
2612
+
2613
+ // Upload bbox size limiter enabling
2614
+ auto test_settings = std::unique_ptr<
2615
+ global_setting_enable_bbox_size_limiter_test_class >(
2616
+ new global_setting_enable_bbox_size_limiter_test_class ());
2617
+ global_settings::set_configuration (std::move (test_settings));
2618
+
2619
+ const std::string bearertoken = " Bearer 4f41f2328befed5a33bcabdf14483081c8df996cbafc41e313417776e8fafae8" ;
2620
+ const std::string generator = " Test" ;
2621
+
2622
+ auto sel_factory = tdb.get_data_selection_factory ();
2623
+ auto upd_factory = tdb.get_data_update_factory ();
2624
+
2625
+ null_rate_limiter limiter;
2626
+ routes route;
2627
+
2628
+ SECTION (" Initialize test data" ) {
2629
+
2630
+ tdb.run_sql (R"(
2631
+ INSERT INTO users (id, email, pass_crypt, pass_salt, creation_time, display_name, data_public, status)
2632
+ VALUES
2633
+ (1, 'demo@example.com', 'xx', '', '2013-11-14T02:10:00Z', 'demo', true, 'confirmed');
2634
+
2635
+ INSERT INTO changesets (id, user_id, created_at, closed_at, num_changes)
2636
+ VALUES
2637
+ (1, 1, now() at time zone 'utc', now() at time zone 'utc' + '1 hour' ::interval, 0),
2638
+ (3, 1, now() at time zone 'utc', now() at time zone 'utc' + '1 hour' ::interval, 0);
2639
+
2640
+ SELECT setval('current_nodes_id_seq', 14000000000, false);
2641
+
2642
+ INSERT INTO oauth_applications (id, owner_type, owner_id, name, uid, secret, redirect_uri, scopes, confidential, created_at, updated_at)
2643
+ VALUES (3, 'User', 1, 'App 1', 'dHKmvGkmuoMjqhCNmTJkf-EcnA61Up34O1vOHwTSvU8', '965136b8fb8d00e2faa2faaaed99c0ec10225518d0c8d9fb1d2af701e87eb68c',
2644
+ 'http://demo.localhost:3000', 'write_api read_gpx', false, '2021-04-12 17:53:30', '2021-04-12 17:53:30');
2645
+
2646
+ INSERT INTO public.oauth_access_tokens (id, resource_owner_id, application_id, token, refresh_token, expires_in, revoked_at, created_at, scopes, previous_refresh_token)
2647
+ VALUES (67, 1, 3, '4f41f2328befed5a33bcabdf14483081c8df996cbafc41e313417776e8fafae8', NULL, NULL, NULL, '2021-04-14 19:38:21', 'write_api', '');
2648
+
2649
+ )"
2650
+ );
2651
+
2652
+ // Test api_size_limit database function.
2653
+ // Real database function is managed outside of CGImap
2654
+
2655
+ tdb.run_sql (R"(
2656
+
2657
+ CREATE OR REPLACE FUNCTION api_size_limit(user_id bigint)
2658
+ RETURNS bigint
2659
+ AS $$
2660
+ BEGIN
2661
+ RETURN 5000000;
2662
+ END;
2663
+ $$ LANGUAGE plpgsql STABLE;
2664
+
2665
+ )" );
2666
+ }
2667
+
2668
+ SECTION (" Try to upload one way with two nodes, with very large bbox" )
2669
+ {
2670
+ // set up request headers from test case
2671
+ test_request req;
2672
+ req.set_header (" REQUEST_METHOD" , " POST" );
2673
+ req.set_header (" REQUEST_URI" , " /api/0.6/changeset/1/upload" );
2674
+ req.set_header (" HTTP_AUTHORIZATION" , bearertoken);
2675
+ req.set_header (" REMOTE_ADDR" , " 127.0.0.1" );
2676
+
2677
+ req.set_payload (R"( <?xml version="1.0" encoding="UTF-8"?>
2678
+ <osmChange version="0.6" generator="iD">
2679
+ <create>
2680
+ <node id='-25355' lat='68.13898255618' lon='-105.8206640625' changeset="1" />
2681
+ <node id='-25357' lat='-34.30685345531' lon='80.8590234375' changeset="1" />
2682
+ <way id='-579' changeset="1">
2683
+ <nd ref='-25355' />
2684
+ <nd ref='-25357' />
2685
+ </way>
2686
+ </create>
2687
+ </osmChange>)" );
2688
+
2689
+ // execute the request
2690
+ process_request (req, limiter, generator, route, *sel_factory, upd_factory.get ());
2691
+
2692
+ CAPTURE (req.body ().str ());
2693
+ REQUIRE (req.response_status () == 413 );
2694
+ }
2695
+
2696
+ SECTION (" Try to upload twice in same changeset, two nodes with very large bbox" )
2697
+ {
2698
+ // set up request headers from test case
2699
+ {
2700
+ test_request req;
2701
+ req.set_header (" REQUEST_METHOD" , " POST" );
2702
+ req.set_header (" REQUEST_URI" , " /api/0.6/changeset/3/upload" );
2703
+ req.set_header (" HTTP_AUTHORIZATION" , bearertoken);
2704
+ req.set_header (" REMOTE_ADDR" , " 127.0.0.1" );
2705
+
2706
+ req.set_payload (R"( <?xml version="1.0" encoding="UTF-8"?>
2707
+ <osmChange version="0.6" generator="iD">
2708
+ <create>
2709
+ <node id='-25355' lat='68.13898255618' lon='-105.8206640625' changeset="3" />
2710
+ </create>
2711
+ </osmChange>)" );
2712
+
2713
+ // execute the request
2714
+ process_request (req, limiter, generator, route, *sel_factory, upd_factory.get ());
2715
+
2716
+ CAPTURE (req.body ().str ());
2717
+ REQUIRE (req.response_status () == 200 );
2718
+ }
2719
+
2720
+ {
2721
+ test_request req;
2722
+ req.set_header (" REQUEST_METHOD" , " POST" );
2723
+ req.set_header (" REQUEST_URI" , " /api/0.6/changeset/3/upload" );
2724
+ req.set_header (" HTTP_AUTHORIZATION" , bearertoken);
2725
+ req.set_header (" REMOTE_ADDR" , " 127.0.0.1" );
2726
+
2727
+ req.set_payload (R"( <?xml version="1.0" encoding="UTF-8"?>
2728
+ <osmChange version="0.6" generator="iD">
2729
+ <create>
2730
+ <node id='-25357' lat='-34.30685345531' lon='80.8590234375' changeset="3" />
2731
+ </create>
2732
+ </osmChange>)" );
2733
+
2734
+ // execute the request
2735
+ process_request (req, limiter, generator, route, *sel_factory, upd_factory.get ());
2736
+
2737
+ CAPTURE (req.body ().str ());
2738
+ REQUIRE (req.response_status () == 413 );
2739
+ }
2740
+ }
2741
+
2742
+ SECTION (" Try to upload one way with two nodes, with very small bbox" )
2743
+ {
2744
+ // set up request headers from test case
2745
+ test_request req;
2746
+ req.set_header (" REQUEST_METHOD" , " POST" );
2747
+ req.set_header (" REQUEST_URI" , " /api/0.6/changeset/1/upload" );
2748
+ req.set_header (" HTTP_AUTHORIZATION" , bearertoken);
2749
+ req.set_header (" REMOTE_ADDR" , " 127.0.0.1" );
2750
+
2751
+ req.set_payload (R"( <?xml version="1.0" encoding="UTF-8"?>
2752
+ <osmChange version="0.6" generator="iD">
2753
+ <create>
2754
+ <node id='-25360' lat='51.50723246769' lon='-0.12171328202' changeset="1" />
2755
+ <node id='-25361' lat='51.50719824397' lon='-0.12160197034' changeset="1" />
2756
+ <way id='-582' changeset="1">
2757
+ <nd ref='-25360' />
2758
+ <nd ref='-25361' />
2759
+ </way>
2760
+ </create>
2761
+ </osmChange>)" );
2762
+
2763
+ // execute the request
2764
+ process_request (req, limiter, generator, route, *sel_factory, upd_factory.get ());
2765
+
2766
+ CAPTURE (req.body ().str ());
2767
+ REQUIRE (req.response_status () == 200 );
2768
+
2769
+ auto doc = getDocument (req.body ().str ());
2770
+ REQUIRE (getXPath (doc.get (), " /diffResult/node[1]/@old_id" ) == " -25360" );
2771
+ REQUIRE (getXPath (doc.get (), " /diffResult/node[2]/@old_id" ) == " -25361" );
2772
+ REQUIRE (getXPath (doc.get (), " /diffResult/way[1]/@old_id" ) == " -582" );
2773
+ REQUIRE (getXPath (doc.get (), " /diffResult/node[1]/@new_version" ) == " 1" );
2774
+ REQUIRE (getXPath (doc.get (), " /diffResult/node[2]/@new_version" ) == " 1" );
2775
+ REQUIRE (getXPath (doc.get (), " /diffResult/way[1]/@new_version" ) == " 1" );
2776
+ }
2777
+ }
2778
+
2602
2779
int main (int argc, char *argv[]) {
2603
2780
Catch::Session session;
2604
2781
0 commit comments