MapProxy 3.1.3__tar.gz → 3.1.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {MapProxy-3.1.3 → mapproxy-3.1.4}/CHANGES.txt +9 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/PKG-INFO +30 -27
- {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/SOURCES.txt +1 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/entry_points.txt +0 -1
- {MapProxy-3.1.3 → mapproxy-3.1.4}/PKG-INFO +30 -27
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/deployment.rst +2 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/loader.py +4 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/multiapp.py +2 -1
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/demo.py +62 -54
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/kml.py +2 -1
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/capabilities_demo.html +1 -3
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util_grids.yaml +2 -1
- mapproxy-3.1.4/mapproxy/test/system/test_demo.py +123 -0
- mapproxy-3.1.4/mapproxy/util/escape.py +10 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/wsgiapp.py +2 -1
- {MapProxy-3.1.3 → mapproxy-3.1.4}/setup.py +1 -1
- MapProxy-3.1.3/mapproxy/test/system/test_demo.py +0 -56
- {MapProxy-3.1.3 → mapproxy-3.1.4}/AUTHORS.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/COPYING.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/LICENSE.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/MANIFEST.in +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/dependency_links.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/not-zip-safe +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/requires.txt +2 -2
- {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/top_level.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/README.md +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/GM.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/_static/logo.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/_static/logo_title.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/_static/mapproxy.css +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/_templates/versions.html +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/auth.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/caches.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/caching_layer_dimensions.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/conf.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/configuration.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/configuration_examples.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/coverages.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/decorate_img.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/development.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/bicubic.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/bilinear.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-dynamic.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-meta-buffer.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-metatiling-buffer.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-metatiling.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-no-clip.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-no-placement.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-partial-false.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-repeated.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/mapnik-webmerc-hq.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/mapnik-webmerc.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/mapproxy-demo.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/nearest.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/index.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/inspire.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/install.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/install_docker.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/install_osgeo4w.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/install_windows.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/labeling.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/mapproxy_util.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/mapproxy_util_autoconfig.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/plugins.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/seed.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/services.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/sources.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/tutorial.rst +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/tutorial.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/cache_conf.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/grid_conf.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/merged_conf.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/meta_conf.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/seed.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/simple_conf.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/azureblob.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/base.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/compact.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/couchdb.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/dummy.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/file.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/geopackage.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/legend.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/mbtiles.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/meta.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/path.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/redis.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/renderd.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/riak.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/s3.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/tile.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/arcgis.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/cgi.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/http.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/log.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/tile.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/wms.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/compat/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/compat/image.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/config-schema.json +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/config.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/coverage.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/defaults.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/spec.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/validator.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/config.wsgi +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/full_example.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/full_seed_example.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/log.ini +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/mapproxy.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/seed.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/exception.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/featureinfo.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/grid.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/fonts/DejaVuSans.ttf +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/fonts/LICENSE +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/fonts/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/mask.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/merge.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/message.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/opts.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/tile.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/transform.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/layer.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/proj.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/arcgis.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/base.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/tile.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/wms/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/wms/exception.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/wmts.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/response.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/app.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/caches.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/geopackage.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/layers.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/seeds.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/sources.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/utils.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/defrag.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/export.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/grids.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/scales.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/util.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/wms_capabilities.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/cachelock.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/cleanup.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/config.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/script.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/seeder.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/spec.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/util.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/base.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/ows.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/template_helper.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/demo.html +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/openlayers-demo.cfg +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/blank.gif +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/logo.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/ol.css +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/ol.js +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/proj4.min.js +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/proj4defs.js +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/site.css +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/theme/default/google.css +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/theme/default/ie6-style.css +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/theme/default/style.css +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static.html +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/tms_demo.html +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/wms_demo.html +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/wmts_demo.html +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/ows_exception.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/tms_capabilities.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/tms_exception.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/tms_root_resource.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/tms_tilemap_capabilities.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms100capabilities.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms100exception.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms110capabilities.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms110exception.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms111capabilities.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms111exception.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms130capabilities.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms130exception.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wmts100capabilities.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wmts100exception.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/tile.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/wms.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/wmts.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/arcgis.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/error.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/mapnik.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/tile.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/wms.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/srs.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/template.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/conftest.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/helper.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/http.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/image.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/mocker.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/common.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/network.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/kml/2.2.0/xAL.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/ReadMe.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmts.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/xml.xsd +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/arcgis.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/auth.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache.mbtiles +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_azureblob.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_band_merge.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_coverage.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_geopackage.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_grid_names.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_mbtiles.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_s3.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_source.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/combined_sources.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/coverage.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/demo.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/dimension.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/disable_storage.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/empty_ogrdata.geojson +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/formats.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/inspire.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/inspire_full.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/kml_layer.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/layer.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/layergroups.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/layergroups_root.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/legendgraphic.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/mapnik_source.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/mapproxy_export.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/mapserver.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/minimal_cgi.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/mixed_mode.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/multi_cache_layers.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/multiapp1.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/multiapp2.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/renderd_client.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/scalehints.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seed.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seed_mapproxy.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seed_old.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seed_timeouts.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seedonly.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/sld.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/source_errors.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/source_errors_raise.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/tileservice_origin.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/tileservice_refresh.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/tilesource_minmax_res.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util-conf-base-grids.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util-conf-overwrite.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util_wms_capabilities111.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util_wms_capabilities130.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/watermark.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/wms_srs_extent.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/wms_versions.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/wmts.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/wmts_dimensions.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/xslt_featureinfo.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_arcgis.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_auth.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_behind_proxy.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_bulk_meta_tiles.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_azureblob.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_band_merge.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_coverage.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_geopackage.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_grid_names.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_mbtiles.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_s3.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_source.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_combined_sources.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_coverage.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_decorate_img.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_demo_with_extra_service.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_dimensions.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_disable_storage.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_formats.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_inspire_vs.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_kml.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_layergroups.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_legendgraphic.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_mapnik.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_mapserver.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_mixed_mode_format.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_multi_cache_layers.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_multiapp.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_refresh.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_renderd_client.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_response_headers.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_scalehints.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_seed.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_seed_only.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_sld.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_source_errors.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_tilesource_minmax_res.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_tms.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_tms_origin.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_util_conf.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_util_export.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_util_grids.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_util_wms_capabilities.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_watermark.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wms.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wms_srs_extent.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wms_version.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wmsc.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wmts.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wmts_dimensions.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wmts_restful.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_xslt_featureinfo.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/test_http_helper.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/epsg +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/polygons/polygons.dbf +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/polygons/polygons.shp +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/polygons/polygons.shx +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_async.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_auth.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_azureblob.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_compact.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_couchdb.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_geopackage.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_mbtile.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_redis.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_riak.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_s3.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_tile.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_client.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_client_arcgis.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_client_cgi.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_collections.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_concat_legends.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_conf_loader.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_conf_validator.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_config.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_decorate_img.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_exceptions.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_featureinfo.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_file_lock_load.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_fs.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_geom.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_grid.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_image.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_image_mask.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_image_messages.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_image_options.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_isodate.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_multiapp.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_ogr_reader.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_request.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_request_wmts.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_response.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_seed.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_seed_cachelock.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_srs.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_tiled_source.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_tilefilter.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_times.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_timeutils.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_util_conf_utils.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_utils.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_wms_capabilities.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_wms_layer.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_yaml.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/tilefilter.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/async_.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/collections.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/coverage.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/dictspec/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/dictspec/spec.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/dictspec/test/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/dictspec/test/test_validator.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/dictspec/validator.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/local.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/lockfile.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/odict.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/serving.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/tempita/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/tempita/_looper.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/tempita/string_utils.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/duration.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/parse.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/test_parse.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/test_util.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/wms-example-111.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/wms-example-130.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/wms-large-111.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/util.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/fs.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/geom.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/lib.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/lock.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ogr.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/py.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/times.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/yaml.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/version.py +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/requirements-tests.txt +0 -0
- {MapProxy-3.1.3 → mapproxy-3.1.4}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: MapProxy
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.4
|
|
4
4
|
Summary: An accelerating proxy for tile and web map services
|
|
5
5
|
Home-page: https://mapproxy.org
|
|
6
6
|
Author: Oliver Tonnhofer
|
|
@@ -8,7 +8,6 @@ Author-email: olt@omniscale.de
|
|
|
8
8
|
Maintainer: terrestris GmbH & Co. KG
|
|
9
9
|
Maintainer-email: info@terrestris.de
|
|
10
10
|
License: Apache Software License 2.0
|
|
11
|
-
Platform: UNKNOWN
|
|
12
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
12
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
14
13
|
Classifier: Operating System :: OS Independent
|
|
@@ -24,6 +23,25 @@ Description-Content-Type: text/x-rst
|
|
|
24
23
|
License-File: LICENSE.txt
|
|
25
24
|
License-File: COPYING.txt
|
|
26
25
|
License-File: AUTHORS.txt
|
|
26
|
+
Requires-Dist: PyYAML>=3.0
|
|
27
|
+
Requires-Dist: future
|
|
28
|
+
Requires-Dist: pyproj>=2
|
|
29
|
+
Requires-Dist: jsonschema>=4
|
|
30
|
+
Requires-Dist: importlib_resources; python_version <= "3.8"
|
|
31
|
+
Requires-Dist: werkzeug<4
|
|
32
|
+
Requires-Dist: Pillow!=2.4.0,!=8.3.0,!=8.3.1
|
|
33
|
+
Dynamic: author
|
|
34
|
+
Dynamic: author-email
|
|
35
|
+
Dynamic: classifier
|
|
36
|
+
Dynamic: description
|
|
37
|
+
Dynamic: description-content-type
|
|
38
|
+
Dynamic: home-page
|
|
39
|
+
Dynamic: license
|
|
40
|
+
Dynamic: license-file
|
|
41
|
+
Dynamic: maintainer
|
|
42
|
+
Dynamic: maintainer-email
|
|
43
|
+
Dynamic: requires-dist
|
|
44
|
+
Dynamic: summary
|
|
27
45
|
|
|
28
46
|
MapProxy is an open source proxy for geospatial data. It caches, accelerates and transforms data from existing map services and serves any desktop or web GIS client.
|
|
29
47
|
|
|
@@ -37,6 +55,15 @@ The documentation is available at: http://mapproxy.github.io/mapproxy/latest/
|
|
|
37
55
|
|
|
38
56
|
Changes
|
|
39
57
|
-------
|
|
58
|
+
3.1.4 2025-04-10
|
|
59
|
+
~~~~~~~~~~~~~~~~
|
|
60
|
+
|
|
61
|
+
Fixes:
|
|
62
|
+
|
|
63
|
+
- Security fix to prevent XSS injections in demo pages
|
|
64
|
+
- Security fix to prevent reading file urls
|
|
65
|
+
|
|
66
|
+
|
|
40
67
|
3.1.3 2024-11-26
|
|
41
68
|
~~~~~~~~~~~~~~~~
|
|
42
69
|
|
|
@@ -127,31 +154,7 @@ Fixes:
|
|
|
127
154
|
- Fix gh-pages workflow
|
|
128
155
|
|
|
129
156
|
|
|
130
|
-
2.2.0 2024-07-24
|
|
131
|
-
~~~~~~~~~~~~~~~~
|
|
132
|
-
|
|
133
|
-
Improvements:
|
|
134
|
-
|
|
135
|
-
- Add timeout to SQLite connect for geopackages. This helps against locking exceptions
|
|
136
|
-
- Improvement of documentation, typos, wrong cli commands, old python2 stuff
|
|
137
|
-
- The WMTS capabilites will now advertise the WMS GetLegendGraphic as a LegendURL if both services are active
|
|
138
|
-
- It is possible now to configure LegendURLs that should be shown in the WMTS capabilities
|
|
139
|
-
- A new method for plugins to intercept and modify requests made to MapProxy was added.
|
|
140
|
-
|
|
141
|
-
Maintenance:
|
|
142
|
-
|
|
143
|
-
- Removal of debian package information
|
|
144
|
-
- Fix docs workflow
|
|
145
|
-
|
|
146
|
-
Fixes:
|
|
147
|
-
|
|
148
|
-
- Remove import of the packaging library that does not appear in the `install_requires`
|
|
149
|
-
- Only install and use `importlib_resources` in python 3.8
|
|
150
|
-
|
|
151
|
-
|
|
152
157
|
|
|
153
158
|
Older changes
|
|
154
159
|
-------------
|
|
155
160
|
See https://raw.github.com/mapproxy/mapproxy/master/CHANGES.txt
|
|
156
|
-
|
|
157
|
-
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: MapProxy
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.4
|
|
4
4
|
Summary: An accelerating proxy for tile and web map services
|
|
5
5
|
Home-page: https://mapproxy.org
|
|
6
6
|
Author: Oliver Tonnhofer
|
|
@@ -8,7 +8,6 @@ Author-email: olt@omniscale.de
|
|
|
8
8
|
Maintainer: terrestris GmbH & Co. KG
|
|
9
9
|
Maintainer-email: info@terrestris.de
|
|
10
10
|
License: Apache Software License 2.0
|
|
11
|
-
Platform: UNKNOWN
|
|
12
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
12
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
14
13
|
Classifier: Operating System :: OS Independent
|
|
@@ -24,6 +23,25 @@ Description-Content-Type: text/x-rst
|
|
|
24
23
|
License-File: LICENSE.txt
|
|
25
24
|
License-File: COPYING.txt
|
|
26
25
|
License-File: AUTHORS.txt
|
|
26
|
+
Requires-Dist: PyYAML>=3.0
|
|
27
|
+
Requires-Dist: future
|
|
28
|
+
Requires-Dist: pyproj>=2
|
|
29
|
+
Requires-Dist: jsonschema>=4
|
|
30
|
+
Requires-Dist: importlib_resources; python_version <= "3.8"
|
|
31
|
+
Requires-Dist: werkzeug<4
|
|
32
|
+
Requires-Dist: Pillow!=2.4.0,!=8.3.0,!=8.3.1
|
|
33
|
+
Dynamic: author
|
|
34
|
+
Dynamic: author-email
|
|
35
|
+
Dynamic: classifier
|
|
36
|
+
Dynamic: description
|
|
37
|
+
Dynamic: description-content-type
|
|
38
|
+
Dynamic: home-page
|
|
39
|
+
Dynamic: license
|
|
40
|
+
Dynamic: license-file
|
|
41
|
+
Dynamic: maintainer
|
|
42
|
+
Dynamic: maintainer-email
|
|
43
|
+
Dynamic: requires-dist
|
|
44
|
+
Dynamic: summary
|
|
27
45
|
|
|
28
46
|
MapProxy is an open source proxy for geospatial data. It caches, accelerates and transforms data from existing map services and serves any desktop or web GIS client.
|
|
29
47
|
|
|
@@ -37,6 +55,15 @@ The documentation is available at: http://mapproxy.github.io/mapproxy/latest/
|
|
|
37
55
|
|
|
38
56
|
Changes
|
|
39
57
|
-------
|
|
58
|
+
3.1.4 2025-04-10
|
|
59
|
+
~~~~~~~~~~~~~~~~
|
|
60
|
+
|
|
61
|
+
Fixes:
|
|
62
|
+
|
|
63
|
+
- Security fix to prevent XSS injections in demo pages
|
|
64
|
+
- Security fix to prevent reading file urls
|
|
65
|
+
|
|
66
|
+
|
|
40
67
|
3.1.3 2024-11-26
|
|
41
68
|
~~~~~~~~~~~~~~~~
|
|
42
69
|
|
|
@@ -127,31 +154,7 @@ Fixes:
|
|
|
127
154
|
- Fix gh-pages workflow
|
|
128
155
|
|
|
129
156
|
|
|
130
|
-
2.2.0 2024-07-24
|
|
131
|
-
~~~~~~~~~~~~~~~~
|
|
132
|
-
|
|
133
|
-
Improvements:
|
|
134
|
-
|
|
135
|
-
- Add timeout to SQLite connect for geopackages. This helps against locking exceptions
|
|
136
|
-
- Improvement of documentation, typos, wrong cli commands, old python2 stuff
|
|
137
|
-
- The WMTS capabilites will now advertise the WMS GetLegendGraphic as a LegendURL if both services are active
|
|
138
|
-
- It is possible now to configure LegendURLs that should be shown in the WMTS capabilities
|
|
139
|
-
- A new method for plugins to intercept and modify requests made to MapProxy was added.
|
|
140
|
-
|
|
141
|
-
Maintenance:
|
|
142
|
-
|
|
143
|
-
- Removal of debian package information
|
|
144
|
-
- Fix docs workflow
|
|
145
|
-
|
|
146
|
-
Fixes:
|
|
147
|
-
|
|
148
|
-
- Remove import of the packaging library that does not appear in the `install_requires`
|
|
149
|
-
- Only install and use `importlib_resources` in python 3.8
|
|
150
|
-
|
|
151
|
-
|
|
152
157
|
|
|
153
158
|
Older changes
|
|
154
159
|
-------------
|
|
155
160
|
See https://raw.github.com/mapproxy/mapproxy/master/CHANGES.txt
|
|
156
|
-
|
|
157
|
-
|
|
@@ -49,6 +49,8 @@ Behind an HTTP server or proxy
|
|
|
49
49
|
|
|
50
50
|
Both approaches require a configuration that maps your MapProxy configuration with the MapProxy application. You can write a small script file for that.
|
|
51
51
|
|
|
52
|
+
.. note:: In production mode it is recommended to disable the demo service.
|
|
53
|
+
|
|
52
54
|
.. _server_script:
|
|
53
55
|
|
|
54
56
|
Server script
|
|
@@ -2446,6 +2446,10 @@ def load_configuration(mapproxy_conf, seed=False, ignore_warnings=True, renderd=
|
|
|
2446
2446
|
for error in errors:
|
|
2447
2447
|
log.warning(error)
|
|
2448
2448
|
|
|
2449
|
+
services = conf_dict.get('services')
|
|
2450
|
+
if services is not None and 'demo' in services:
|
|
2451
|
+
log.warning('Application has demo page enabled. It is recommended to disable this in production.')
|
|
2452
|
+
|
|
2449
2453
|
return ProxyConfiguration(conf_dict, conf_base_dir=conf_base_dir, seed=seed,
|
|
2450
2454
|
renderd=renderd)
|
|
2451
2455
|
|
|
@@ -20,6 +20,7 @@ from mapproxy.request import Request
|
|
|
20
20
|
from mapproxy.response import Response
|
|
21
21
|
from mapproxy.util.collections import LRU
|
|
22
22
|
from mapproxy.wsgiapp import make_wsgi_app as make_mapproxy_wsgi_app
|
|
23
|
+
from mapproxy.util.escape import escape_html
|
|
23
24
|
|
|
24
25
|
from threading import Lock
|
|
25
26
|
|
|
@@ -95,7 +96,7 @@ class MultiMapProxy(object):
|
|
|
95
96
|
import mapproxy.version
|
|
96
97
|
html = "<html><body><h1>Welcome to MapProxy %s</h1>" % mapproxy.version.version
|
|
97
98
|
|
|
98
|
-
url = req.script_url
|
|
99
|
+
url = escape_html(req.script_url)
|
|
99
100
|
if self.list_apps:
|
|
100
101
|
html += "<h2>available instances:</h2><ul>"
|
|
101
102
|
html += '\n'.join('<li><a href="%(url)s/%(name)s/">%(name)s</a></li>' % {'url': url, 'name': app}
|
|
@@ -18,6 +18,9 @@ Demo service handler
|
|
|
18
18
|
"""
|
|
19
19
|
from __future__ import division
|
|
20
20
|
|
|
21
|
+
import logging
|
|
22
|
+
import re
|
|
23
|
+
|
|
21
24
|
try:
|
|
22
25
|
import importlib_resources
|
|
23
26
|
except ImportError:
|
|
@@ -30,10 +33,12 @@ from mapproxy.config.config import base_config
|
|
|
30
33
|
from mapproxy.util.ext.odict import odict
|
|
31
34
|
from mapproxy.exception import RequestError
|
|
32
35
|
from mapproxy.service.base import Server
|
|
36
|
+
from mapproxy.request.base import Request
|
|
33
37
|
from mapproxy.response import Response
|
|
34
38
|
from mapproxy.srs import SRS, get_epsg_num
|
|
35
39
|
from mapproxy.layer import SRSConditional, CacheMapLayer, ResolutionConditional
|
|
36
40
|
from mapproxy.source.wms import WMSSource
|
|
41
|
+
from mapproxy.util.escape import escape_html
|
|
37
42
|
|
|
38
43
|
from urllib import request as urllib2
|
|
39
44
|
|
|
@@ -44,6 +49,8 @@ get_template = template_loader(__package__, 'templates', namespace=env)
|
|
|
44
49
|
# Used by plugins
|
|
45
50
|
extra_demo_server_handlers = set()
|
|
46
51
|
|
|
52
|
+
logger = logging.getLogger("demo")
|
|
53
|
+
|
|
47
54
|
|
|
48
55
|
def register_extra_demo_server_handler(handler):
|
|
49
56
|
""" Method used by plugins to register a new handler for the demo service.
|
|
@@ -106,7 +113,29 @@ class DemoServer(Server):
|
|
|
106
113
|
self.restful_template = restful_template
|
|
107
114
|
self.background = background
|
|
108
115
|
|
|
109
|
-
|
|
116
|
+
@staticmethod
|
|
117
|
+
def get_capabilities_url(service_path: str, req: Request) -> str:
|
|
118
|
+
if 'type' in req.args and req.args['type'] == 'external':
|
|
119
|
+
url = escape_html(req.script_url) + service_path
|
|
120
|
+
else:
|
|
121
|
+
url = req.server_script_url + service_path
|
|
122
|
+
return url
|
|
123
|
+
|
|
124
|
+
@staticmethod
|
|
125
|
+
def valid_url(url: str) -> bool:
|
|
126
|
+
pattern = re.compile("^https?://")
|
|
127
|
+
if pattern.match(url):
|
|
128
|
+
return True
|
|
129
|
+
else:
|
|
130
|
+
logging.warn(f"A request was blocked that was trying to access a non-http resource: {url}")
|
|
131
|
+
return False
|
|
132
|
+
|
|
133
|
+
@staticmethod
|
|
134
|
+
def read_capabilities(url: str) -> str:
|
|
135
|
+
resp = urllib2.urlopen(url)
|
|
136
|
+
return escape_html(resp.read().decode())
|
|
137
|
+
|
|
138
|
+
def handle(self, req: Request):
|
|
110
139
|
if req.path.startswith('/demo/static/'):
|
|
111
140
|
if '..' in req.path:
|
|
112
141
|
return Response('file not found', content_type='text/plain', status=404)
|
|
@@ -138,56 +167,47 @@ class DemoServer(Server):
|
|
|
138
167
|
elif 'wmts_layer' in req.args:
|
|
139
168
|
demo = self._render_wmts_template('demo/wmts_demo.html', req)
|
|
140
169
|
elif 'wms_capabilities' in req.args:
|
|
141
|
-
|
|
142
|
-
if
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
url = internal_url
|
|
146
|
-
capabilities = urllib2.urlopen(url)
|
|
170
|
+
url = self.get_capabilities_url('/service?REQUEST=GetCapabilities&SERVICE=WMS', req)
|
|
171
|
+
if not self.valid_url(url):
|
|
172
|
+
return Response('bad request', content_type='text/plain', status=400)
|
|
173
|
+
capabilities = self.read_capabilities(url)
|
|
147
174
|
demo = self._render_capabilities_template('demo/capabilities_demo.html', capabilities, 'WMS', url)
|
|
148
175
|
elif 'wmsc_capabilities' in req.args:
|
|
149
|
-
|
|
150
|
-
if
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
url = internal_url
|
|
154
|
-
capabilities = urllib2.urlopen(url)
|
|
176
|
+
url = self.get_capabilities_url('/service?REQUEST=GetCapabilities&SERVICE=WMS&tiled=true', req)
|
|
177
|
+
if not self.valid_url(url):
|
|
178
|
+
return Response('bad request', content_type='text/plain', status=400)
|
|
179
|
+
capabilities = self.read_capabilities(url)
|
|
155
180
|
demo = self._render_capabilities_template('demo/capabilities_demo.html', capabilities, 'WMS-C', url)
|
|
156
181
|
elif 'wmts_capabilities_kvp' in req.args:
|
|
157
|
-
|
|
158
|
-
if
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
url = internal_url
|
|
162
|
-
capabilities = urllib2.urlopen(url)
|
|
182
|
+
url = self.get_capabilities_url('/service?REQUEST=GetCapabilities&SERVICE=WMTS', req)
|
|
183
|
+
if not self.valid_url(url):
|
|
184
|
+
return Response('bad request', content_type='text/plain', status=400)
|
|
185
|
+
capabilities = self.read_capabilities(url)
|
|
163
186
|
demo = self._render_capabilities_template('demo/capabilities_demo.html', capabilities, 'WMTS', url)
|
|
164
187
|
elif 'wmts_capabilities' in req.args:
|
|
165
|
-
|
|
166
|
-
if
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
url = internal_url
|
|
170
|
-
capabilities = urllib2.urlopen(url)
|
|
188
|
+
url = self.get_capabilities_url('/wmts/1.0.0/WMTSCapabilities.xml', req)
|
|
189
|
+
if not self.valid_url(url):
|
|
190
|
+
return Response('bad request', content_type='text/plain', status=400)
|
|
191
|
+
capabilities = self.read_capabilities(url)
|
|
171
192
|
demo = self._render_capabilities_template('demo/capabilities_demo.html', capabilities, 'WMTS', url)
|
|
172
193
|
elif 'tms_capabilities' in req.args:
|
|
173
194
|
if 'layer' in req.args and 'srs' in req.args:
|
|
174
|
-
# prevent dir traversal (seems it's not possible with urllib2, but better safe
|
|
175
|
-
layer = req.args['layer'].replace('..', '')
|
|
176
|
-
srs = req.args['srs'].replace('..', '')
|
|
177
|
-
|
|
178
|
-
else:
|
|
179
|
-
internal_url = '%s/tms/1.0.0/' % (req.server_script_url)
|
|
180
|
-
if 'type' in req.args and req.args['type'] == 'external':
|
|
181
|
-
url = internal_url.replace(req.server_script_url, req.script_url)
|
|
195
|
+
# prevent dir traversal (seems it's not possible with urllib2, but better safe than sorry)
|
|
196
|
+
layer = escape_html(req.args['layer'].replace('..', ''))
|
|
197
|
+
srs = escape_html(req.args['srs'].replace('..', ''))
|
|
198
|
+
service_path = f'/tms/1.0.0/{layer}/{srs}'
|
|
182
199
|
else:
|
|
183
|
-
|
|
184
|
-
|
|
200
|
+
service_path = '/tms/1.0.0/'
|
|
201
|
+
url = self.get_capabilities_url(service_path, req)
|
|
202
|
+
if not self.valid_url(url):
|
|
203
|
+
return Response('bad request', content_type='text/plain', status=400)
|
|
204
|
+
capabilities = self.read_capabilities(url)
|
|
185
205
|
demo = self._render_capabilities_template('demo/capabilities_demo.html', capabilities, 'TMS', url)
|
|
186
206
|
elif req.path == '/demo/':
|
|
187
207
|
demo = self._render_template(req, 'demo/demo.html')
|
|
188
208
|
else:
|
|
189
209
|
resp = Response('', status=301)
|
|
190
|
-
resp.headers['Location'] = req.script_url.rstrip('/') + '/demo/'
|
|
210
|
+
resp.headers['Location'] = escape_html(req.script_url).rstrip('/') + '/demo/'
|
|
191
211
|
return resp
|
|
192
212
|
return Response(demo, content_type='text/html')
|
|
193
213
|
|
|
@@ -258,7 +278,7 @@ class DemoServer(Server):
|
|
|
258
278
|
def _render_wms_template(self, template, req):
|
|
259
279
|
template = get_template(template, default_inherit="demo/static.html")
|
|
260
280
|
layer = self.layers[req.args['wms_layer']]
|
|
261
|
-
srs =
|
|
281
|
+
srs = escape_html(req.args['srs'])
|
|
262
282
|
bbox = layer.extent.bbox_for(SRS(srs))
|
|
263
283
|
width = bbox[2] - bbox[0]
|
|
264
284
|
height = bbox[3] - bbox[1]
|
|
@@ -268,7 +288,7 @@ class DemoServer(Server):
|
|
|
268
288
|
background_url = self.background["url"]
|
|
269
289
|
return template.substitute(layer=layer,
|
|
270
290
|
image_formats=self.image_formats,
|
|
271
|
-
format=
|
|
291
|
+
format=escape_html(req.args['format']),
|
|
272
292
|
srs=srs,
|
|
273
293
|
layer_srs=self.layer_srs,
|
|
274
294
|
bbox=bbox,
|
|
@@ -301,8 +321,8 @@ class DemoServer(Server):
|
|
|
301
321
|
if self.background:
|
|
302
322
|
background_url = self.background["url"]
|
|
303
323
|
return template.substitute(layer=tile_layer,
|
|
304
|
-
srs=
|
|
305
|
-
format=
|
|
324
|
+
srs=escape_html(req.args['srs']),
|
|
325
|
+
format=escape_html(req.args['format']),
|
|
306
326
|
resolutions=res,
|
|
307
327
|
units=units,
|
|
308
328
|
add_res_to_options=add_res_to_options,
|
|
@@ -330,8 +350,8 @@ class DemoServer(Server):
|
|
|
330
350
|
background_url = self.background["url"]
|
|
331
351
|
return template.substitute(layer=wmts_layer,
|
|
332
352
|
matrix_set=wmts_layer.grid.name,
|
|
333
|
-
format=
|
|
334
|
-
srs=
|
|
353
|
+
format=escape_html(req.args['format']),
|
|
354
|
+
srs=escape_html(req.args['srs']),
|
|
335
355
|
resolutions=wmts_layer.grid.resolutions,
|
|
336
356
|
units=units,
|
|
337
357
|
all_tile_layers=self.tile_layers,
|
|
@@ -353,15 +373,3 @@ class DemoServer(Server):
|
|
|
353
373
|
return True
|
|
354
374
|
return False
|
|
355
375
|
return True
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
def escape(data):
|
|
359
|
-
"""
|
|
360
|
-
Escape user-provided input data for safe inclusion in HTML _and_ JS to prevent XSS.
|
|
361
|
-
"""
|
|
362
|
-
data = data.replace('&', '&')
|
|
363
|
-
data = data.replace('>', '>')
|
|
364
|
-
data = data.replace('<', '<')
|
|
365
|
-
data = data.replace("'", '')
|
|
366
|
-
data = data.replace('"', '')
|
|
367
|
-
return data
|
|
@@ -21,6 +21,7 @@ from mapproxy.service.base import Server
|
|
|
21
21
|
from mapproxy.request.tile import TileRequest
|
|
22
22
|
from mapproxy.srs import SRS
|
|
23
23
|
from mapproxy.util.coverage import load_limited_to
|
|
24
|
+
from mapproxy.util.escape import escape_html
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
class KMLRequest(TileRequest):
|
|
@@ -182,7 +183,7 @@ class KMLServer(Server):
|
|
|
182
183
|
|
|
183
184
|
subtiles = self._get_subtiles(map_request, layer)
|
|
184
185
|
tile_size = layer.grid.tile_size[0]
|
|
185
|
-
url = map_request.http.script_url.rstrip('/')
|
|
186
|
+
url = escape_html(map_request.http.script_url.rstrip('/'))
|
|
186
187
|
result = KMLRenderer().render(
|
|
187
188
|
tile=tile, subtiles=subtiles, layer=layer, url=url, name=map_request.layer, format=layer.format,
|
|
188
189
|
name_path=layer.md['name_path'], initial_level=initial_level, tile_size=tile_size)
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2022 Even Rouault
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import re
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from mapproxy.test.http import mock_httpd
|
|
20
|
+
from mapproxy.test.system import SysTest
|
|
21
|
+
from webtest import AppError
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@pytest.fixture(scope="module")
|
|
25
|
+
def config_file():
|
|
26
|
+
return "demo.yaml"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class TestDemo(SysTest):
|
|
30
|
+
|
|
31
|
+
def test_basic(self, app):
|
|
32
|
+
resp = app.get("/demo/", status=200)
|
|
33
|
+
assert resp.content_type == "text/html"
|
|
34
|
+
assert 'href="../service?REQUEST=GetCapabilities&SERVICE=WMS"' in resp
|
|
35
|
+
assert 'href="../service?REQUEST=GetCapabilities&SERVICE=WMS&tiled=true"' in resp
|
|
36
|
+
assert 'href="../demo/?wmts_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
|
|
37
|
+
assert 'href="../demo/?tms_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
|
|
38
|
+
|
|
39
|
+
def test_previewmap(self, app):
|
|
40
|
+
resp = app.get("/demo/?srs=EPSG%3A3857&format=image%2Fpng&wms_layer=wms_cache", status=200)
|
|
41
|
+
assert resp.content_type == "text/html"
|
|
42
|
+
assert '<h2>Layer Preview - wms_cache</h2>' in resp
|
|
43
|
+
|
|
44
|
+
def test_layers_sorted_by_name(self, app):
|
|
45
|
+
resp = app.get("/demo/", status=200)
|
|
46
|
+
|
|
47
|
+
patternTable = re.compile(r'<table class="code">.*?</table>', re.DOTALL)
|
|
48
|
+
patternWMS = r'<td\s+rowspan="2">([\w\d-]+)</td>'
|
|
49
|
+
patternWMTS_TBS = r'<td\s+rowspan="1">([\w\d-]+)</td>'
|
|
50
|
+
tables = patternTable.findall(resp.text)
|
|
51
|
+
|
|
52
|
+
layersWMS = re.findall(patternWMS, resp.text, re.IGNORECASE)
|
|
53
|
+
layersWMTS = re.findall(patternWMTS_TBS, tables[1], re.IGNORECASE)
|
|
54
|
+
layersTBS = re.findall(patternWMTS_TBS, tables[2], re.IGNORECASE)
|
|
55
|
+
|
|
56
|
+
assert layersWMS == sorted(layersWMS)
|
|
57
|
+
assert layersWMTS == sorted(layersWMTS)
|
|
58
|
+
assert layersTBS == sorted(layersTBS)
|
|
59
|
+
|
|
60
|
+
def test_external(self, app):
|
|
61
|
+
expected_req = (
|
|
62
|
+
{
|
|
63
|
+
"path": r"/path/service?REQUEST=GetCapabilities&SERVICE=WMS"
|
|
64
|
+
},
|
|
65
|
+
{"body": b"test-string", "headers": {"content-type": "text/xml"}}
|
|
66
|
+
)
|
|
67
|
+
with mock_httpd(
|
|
68
|
+
("localhost", 42423), [expected_req]
|
|
69
|
+
):
|
|
70
|
+
resp = app.get('/demo/?wms_capabilities&type=external', extra_environ={
|
|
71
|
+
'HTTP_X_FORWARDED_HOST': 'localhost:42423/path'
|
|
72
|
+
})
|
|
73
|
+
content = resp.text
|
|
74
|
+
assert 'test-string' in content
|
|
75
|
+
assert 'http://localhost:42423/path/service?REQUEST=GetCapabilities&SERVICE=WMS' in content
|
|
76
|
+
|
|
77
|
+
def test_external_xss_injection(self, app):
|
|
78
|
+
expected_req = (
|
|
79
|
+
{
|
|
80
|
+
"path": r"/path/><script>alert(XSS)</script>/service?REQUEST=GetCapabilities&SERVICE=WMS"
|
|
81
|
+
},
|
|
82
|
+
{"body": b"test-string", "headers": {"content-type": "text/xml"}}
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
with mock_httpd(
|
|
86
|
+
("localhost", 42423), [expected_req]
|
|
87
|
+
):
|
|
88
|
+
resp = app.get('/demo/?wms_capabilities&type=external', extra_environ={
|
|
89
|
+
'HTTP_X_FORWARDED_HOST': 'localhost:42423/path/"><script>alert(\'XSS\')</script>'
|
|
90
|
+
})
|
|
91
|
+
content = resp.text
|
|
92
|
+
assert 'test-string' in content
|
|
93
|
+
assert '"><script>alert(\'XSS\')' not in content
|
|
94
|
+
assert '><script>alert(XSS)</script>' in content
|
|
95
|
+
|
|
96
|
+
def test_external_file_protocol(self, app):
|
|
97
|
+
try:
|
|
98
|
+
app.get('/demo/?wms_capabilities&type=external', extra_environ={
|
|
99
|
+
'HTTP_X_FORWARDED_PROTO': 'file'
|
|
100
|
+
})
|
|
101
|
+
except AppError as e:
|
|
102
|
+
assert '400 Bad Request' in e.args[0]
|
|
103
|
+
|
|
104
|
+
def test_tms_layer_xss(self, app):
|
|
105
|
+
expected_req = (
|
|
106
|
+
{
|
|
107
|
+
"path": r"/tms/1.0.0/osm><script>alert(XSS)</script>/1.0.0"
|
|
108
|
+
},
|
|
109
|
+
{"body": b"test-string", "headers": {"content-type": "text/xml"}}
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
with mock_httpd(
|
|
113
|
+
("localhost", 42423), [expected_req]
|
|
114
|
+
):
|
|
115
|
+
resp = app.get(
|
|
116
|
+
'/demo/?tms_capabilities&layer=osm"><script>alert(\'XSS\')</script>&type=external&srs=1.0.0',
|
|
117
|
+
extra_environ={
|
|
118
|
+
'HTTP_X_FORWARDED_HOST': 'localhost:42423'
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
content = resp.text
|
|
122
|
+
assert '"><script>alert(\'XSS\')' not in content
|
|
123
|
+
assert '><script>alert(XSS)</script>' in content
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
def escape_html(data):
|
|
2
|
+
"""
|
|
3
|
+
Escape user-provided input data for safe inclusion in HTML _and_ JS to prevent XSS.
|
|
4
|
+
"""
|
|
5
|
+
data = data.replace('&', '&')
|
|
6
|
+
data = data.replace('>', '>')
|
|
7
|
+
data = data.replace('<', '<')
|
|
8
|
+
data = data.replace("'", '')
|
|
9
|
+
data = data.replace('"', '')
|
|
10
|
+
return data
|
|
@@ -34,6 +34,7 @@ from mapproxy.request import Request
|
|
|
34
34
|
from mapproxy.response import Response
|
|
35
35
|
from mapproxy.config import local_base_config
|
|
36
36
|
from mapproxy.config.loader import load_configuration, ConfigurationError
|
|
37
|
+
from mapproxy.util.escape import escape_html
|
|
37
38
|
|
|
38
39
|
log = logging.getLogger('mapproxy.config')
|
|
39
40
|
log_wsgiapp = logging.getLogger('mapproxy.wsgiapp')
|
|
@@ -164,7 +165,7 @@ class MapProxyApp(object):
|
|
|
164
165
|
resp = Response('internal error', status=500)
|
|
165
166
|
if resp is None:
|
|
166
167
|
if req.path in ('', '/'):
|
|
167
|
-
resp = self.welcome_response(req.script_url)
|
|
168
|
+
resp = self.welcome_response(escape_html(req.script_url))
|
|
168
169
|
else:
|
|
169
170
|
resp = Response('not found', mimetype='text/plain', status=404)
|
|
170
171
|
return resp(environ, start_response)
|
|
@@ -63,7 +63,7 @@ def long_description(changelog_releases=10):
|
|
|
63
63
|
|
|
64
64
|
setup(
|
|
65
65
|
name='MapProxy',
|
|
66
|
-
version="3.1.
|
|
66
|
+
version="3.1.4",
|
|
67
67
|
description='An accelerating proxy for tile and web map services',
|
|
68
68
|
long_description=long_description(7),
|
|
69
69
|
long_description_content_type='text/x-rst',
|