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.
Files changed (523) hide show
  1. {MapProxy-3.1.3 → mapproxy-3.1.4}/CHANGES.txt +9 -0
  2. {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/PKG-INFO +30 -27
  3. {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/SOURCES.txt +1 -0
  4. {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/entry_points.txt +0 -1
  5. {MapProxy-3.1.3 → mapproxy-3.1.4}/PKG-INFO +30 -27
  6. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/deployment.rst +2 -0
  7. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/loader.py +4 -0
  8. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/multiapp.py +2 -1
  9. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/demo.py +62 -54
  10. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/kml.py +2 -1
  11. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/capabilities_demo.html +1 -3
  12. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util_grids.yaml +2 -1
  13. mapproxy-3.1.4/mapproxy/test/system/test_demo.py +123 -0
  14. mapproxy-3.1.4/mapproxy/util/escape.py +10 -0
  15. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/wsgiapp.py +2 -1
  16. {MapProxy-3.1.3 → mapproxy-3.1.4}/setup.py +1 -1
  17. MapProxy-3.1.3/mapproxy/test/system/test_demo.py +0 -56
  18. {MapProxy-3.1.3 → mapproxy-3.1.4}/AUTHORS.txt +0 -0
  19. {MapProxy-3.1.3 → mapproxy-3.1.4}/COPYING.txt +0 -0
  20. {MapProxy-3.1.3 → mapproxy-3.1.4}/LICENSE.txt +0 -0
  21. {MapProxy-3.1.3 → mapproxy-3.1.4}/MANIFEST.in +0 -0
  22. {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/dependency_links.txt +0 -0
  23. {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/not-zip-safe +0 -0
  24. {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/requires.txt +2 -2
  25. {MapProxy-3.1.3 → mapproxy-3.1.4}/MapProxy.egg-info/top_level.txt +0 -0
  26. {MapProxy-3.1.3 → mapproxy-3.1.4}/README.md +0 -0
  27. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/GM.txt +0 -0
  28. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/_static/logo.png +0 -0
  29. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/_static/logo_title.png +0 -0
  30. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/_static/mapproxy.css +0 -0
  31. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/_templates/versions.html +0 -0
  32. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/auth.rst +0 -0
  33. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/caches.rst +0 -0
  34. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/caching_layer_dimensions.rst +0 -0
  35. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/conf.py +0 -0
  36. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/configuration.rst +0 -0
  37. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/configuration_examples.rst +0 -0
  38. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/coverages.rst +0 -0
  39. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/decorate_img.rst +0 -0
  40. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/development.rst +0 -0
  41. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/bicubic.png +0 -0
  42. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/bilinear.png +0 -0
  43. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-dynamic.png +0 -0
  44. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-meta-buffer.png +0 -0
  45. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-metatiling-buffer.png +0 -0
  46. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-metatiling.png +0 -0
  47. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-no-clip.png +0 -0
  48. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-no-placement.png +0 -0
  49. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-partial-false.png +0 -0
  50. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/labeling-repeated.png +0 -0
  51. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/mapnik-webmerc-hq.png +0 -0
  52. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/mapnik-webmerc.png +0 -0
  53. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/mapproxy-demo.png +0 -0
  54. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/imgs/nearest.png +0 -0
  55. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/index.rst +0 -0
  56. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/inspire.rst +0 -0
  57. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/install.rst +0 -0
  58. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/install_docker.rst +0 -0
  59. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/install_osgeo4w.rst +0 -0
  60. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/install_windows.rst +0 -0
  61. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/labeling.rst +0 -0
  62. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/mapproxy_util.rst +0 -0
  63. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/mapproxy_util_autoconfig.rst +0 -0
  64. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/plugins.rst +0 -0
  65. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/seed.rst +0 -0
  66. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/services.rst +0 -0
  67. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/sources.rst +0 -0
  68. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/tutorial.rst +0 -0
  69. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/tutorial.yaml +0 -0
  70. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/cache_conf.yaml +0 -0
  71. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/grid_conf.yaml +0 -0
  72. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/merged_conf.yaml +0 -0
  73. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/meta_conf.yaml +0 -0
  74. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/seed.yaml +0 -0
  75. {MapProxy-3.1.3 → mapproxy-3.1.4}/doc/yaml/simple_conf.yaml +0 -0
  76. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/__init__.py +0 -0
  77. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/__init__.py +0 -0
  78. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/azureblob.py +0 -0
  79. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/base.py +0 -0
  80. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/compact.py +0 -0
  81. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/couchdb.py +0 -0
  82. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/dummy.py +0 -0
  83. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/file.py +0 -0
  84. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/geopackage.py +0 -0
  85. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/legend.py +0 -0
  86. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/mbtiles.py +0 -0
  87. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/meta.py +0 -0
  88. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/path.py +0 -0
  89. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/redis.py +0 -0
  90. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/renderd.py +0 -0
  91. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/riak.py +0 -0
  92. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/s3.py +0 -0
  93. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/cache/tile.py +0 -0
  94. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/__init__.py +0 -0
  95. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/arcgis.py +0 -0
  96. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/cgi.py +0 -0
  97. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/http.py +0 -0
  98. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/log.py +0 -0
  99. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/tile.py +0 -0
  100. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/client/wms.py +0 -0
  101. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/compat/__init__.py +0 -0
  102. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/compat/image.py +0 -0
  103. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/__init__.py +0 -0
  104. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/config-schema.json +0 -0
  105. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/config.py +0 -0
  106. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/coverage.py +0 -0
  107. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/defaults.py +0 -0
  108. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/spec.py +0 -0
  109. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config/validator.py +0 -0
  110. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/__init__.py +0 -0
  111. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/config.wsgi +0 -0
  112. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/full_example.yaml +0 -0
  113. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/full_seed_example.yaml +0 -0
  114. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/log.ini +0 -0
  115. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/mapproxy.yaml +0 -0
  116. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/config_template/base_config/seed.yaml +0 -0
  117. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/exception.py +0 -0
  118. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/featureinfo.py +0 -0
  119. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/grid.py +0 -0
  120. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/__init__.py +0 -0
  121. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/fonts/DejaVuSans.ttf +0 -0
  122. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
  123. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/fonts/LICENSE +0 -0
  124. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/fonts/__init__.py +0 -0
  125. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/mask.py +0 -0
  126. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/merge.py +0 -0
  127. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/message.py +0 -0
  128. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/opts.py +0 -0
  129. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/tile.py +0 -0
  130. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/image/transform.py +0 -0
  131. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/layer.py +0 -0
  132. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/proj.py +0 -0
  133. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/__init__.py +0 -0
  134. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/arcgis.py +0 -0
  135. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/base.py +0 -0
  136. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/tile.py +0 -0
  137. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/wms/__init__.py +0 -0
  138. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/wms/exception.py +0 -0
  139. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/request/wmts.py +0 -0
  140. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/response.py +0 -0
  141. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/__init__.py +0 -0
  142. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/__init__.py +0 -0
  143. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/app.py +0 -0
  144. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/caches.py +0 -0
  145. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/geopackage.py +0 -0
  146. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/layers.py +0 -0
  147. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/seeds.py +0 -0
  148. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/sources.py +0 -0
  149. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/conf/utils.py +0 -0
  150. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/defrag.py +0 -0
  151. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/export.py +0 -0
  152. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/grids.py +0 -0
  153. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/scales.py +0 -0
  154. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/util.py +0 -0
  155. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/script/wms_capabilities.py +0 -0
  156. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/__init__.py +0 -0
  157. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/cachelock.py +0 -0
  158. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/cleanup.py +0 -0
  159. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/config.py +0 -0
  160. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/script.py +0 -0
  161. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/seeder.py +0 -0
  162. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/spec.py +0 -0
  163. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/seed/util.py +0 -0
  164. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/__init__.py +0 -0
  165. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/base.py +0 -0
  166. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/ows.py +0 -0
  167. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/template_helper.py +0 -0
  168. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/demo.html +0 -0
  169. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/openlayers-demo.cfg +0 -0
  170. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/blank.gif +0 -0
  171. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
  172. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
  173. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
  174. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
  175. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
  176. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
  177. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
  178. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/logo.png +0 -0
  179. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/ol.css +0 -0
  180. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/ol.js +0 -0
  181. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/proj4.min.js +0 -0
  182. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/proj4defs.js +0 -0
  183. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/site.css +0 -0
  184. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
  185. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/theme/default/google.css +0 -0
  186. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/theme/default/ie6-style.css +0 -0
  187. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static/theme/default/style.css +0 -0
  188. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/static.html +0 -0
  189. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/tms_demo.html +0 -0
  190. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/wms_demo.html +0 -0
  191. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/demo/wmts_demo.html +0 -0
  192. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/ows_exception.xml +0 -0
  193. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/tms_capabilities.xml +0 -0
  194. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/tms_exception.xml +0 -0
  195. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/tms_root_resource.xml +0 -0
  196. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/tms_tilemap_capabilities.xml +0 -0
  197. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms100capabilities.xml +0 -0
  198. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms100exception.xml +0 -0
  199. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms110capabilities.xml +0 -0
  200. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms110exception.xml +0 -0
  201. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms111capabilities.xml +0 -0
  202. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms111exception.xml +0 -0
  203. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms130capabilities.xml +0 -0
  204. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wms130exception.xml +0 -0
  205. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wmts100capabilities.xml +0 -0
  206. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/templates/wmts100exception.xml +0 -0
  207. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/tile.py +0 -0
  208. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/wms.py +0 -0
  209. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/service/wmts.py +0 -0
  210. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/__init__.py +0 -0
  211. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/arcgis.py +0 -0
  212. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/error.py +0 -0
  213. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/mapnik.py +0 -0
  214. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/tile.py +0 -0
  215. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/source/wms.py +0 -0
  216. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/srs.py +0 -0
  217. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/template.py +0 -0
  218. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/__init__.py +0 -0
  219. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/conftest.py +0 -0
  220. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/helper.py +0 -0
  221. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/http.py +0 -0
  222. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/image.py +0 -0
  223. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/mocker.py +0 -0
  224. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/common.xsd +0 -0
  225. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +0 -0
  226. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +0 -0
  227. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +0 -0
  228. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +0 -0
  229. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +0 -0
  230. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +0 -0
  231. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +0 -0
  232. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +0 -0
  233. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +0 -0
  234. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +0 -0
  235. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +0 -0
  236. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +0 -0
  237. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +0 -0
  238. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +0 -0
  239. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +0 -0
  240. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +0 -0
  241. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +0 -0
  242. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +0 -0
  243. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +0 -0
  244. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +0 -0
  245. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +0 -0
  246. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +0 -0
  247. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +0 -0
  248. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/common/1.0/network.xsd +0 -0
  249. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +0 -0
  250. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +0 -0
  251. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +0 -0
  252. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +0 -0
  253. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/kml/2.2.0/xAL.xsd +0 -0
  254. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +0 -0
  255. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +0 -0
  256. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +0 -0
  257. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +0 -0
  258. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +0 -0
  259. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +0 -0
  260. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +0 -0
  261. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +0 -0
  262. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +0 -0
  263. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +0 -0
  264. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +0 -0
  265. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +0 -0
  266. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +0 -0
  267. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +0 -0
  268. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +0 -0
  269. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +0 -0
  270. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +0 -0
  271. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +0 -0
  272. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +0 -0
  273. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +0 -0
  274. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +0 -0
  275. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +0 -0
  276. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +0 -0
  277. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +0 -0
  278. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +0 -0
  279. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +0 -0
  280. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +0 -0
  281. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +0 -0
  282. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +0 -0
  283. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +0 -0
  284. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +0 -0
  285. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +0 -0
  286. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +0 -0
  287. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +0 -0
  288. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +0 -0
  289. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +0 -0
  290. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +0 -0
  291. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +0 -0
  292. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +0 -0
  293. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +0 -0
  294. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +0 -0
  295. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +0 -0
  296. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +0 -0
  297. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +0 -0
  298. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +0 -0
  299. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/ReadMe.txt +0 -0
  300. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmts.xsd +0 -0
  301. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +0 -0
  302. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +0 -0
  303. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +0 -0
  304. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +0 -0
  305. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +0 -0
  306. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +0 -0
  307. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +0 -0
  308. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +0 -0
  309. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +0 -0
  310. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +0 -0
  311. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/schemas/xml.xsd +0 -0
  312. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/__init__.py +0 -0
  313. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/arcgis.yaml +0 -0
  314. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/auth.yaml +0 -0
  315. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache.mbtiles +0 -0
  316. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_azureblob.yaml +0 -0
  317. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_band_merge.yaml +0 -0
  318. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +0 -0
  319. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_coverage.yaml +0 -0
  320. {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
  321. {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
  322. {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
  323. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_geopackage.yaml +0 -0
  324. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_grid_names.yaml +0 -0
  325. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_mbtiles.yaml +0 -0
  326. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_s3.yaml +0 -0
  327. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/cache_source.yaml +0 -0
  328. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/combined_sources.yaml +0 -0
  329. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/coverage.yaml +0 -0
  330. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/demo.yaml +0 -0
  331. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/dimension.yaml +0 -0
  332. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/disable_storage.yaml +0 -0
  333. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/empty_ogrdata.geojson +0 -0
  334. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/formats.yaml +0 -0
  335. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/inspire.yaml +0 -0
  336. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/inspire_full.yaml +0 -0
  337. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/kml_layer.yaml +0 -0
  338. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/layer.yaml +0 -0
  339. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/layergroups.yaml +0 -0
  340. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/layergroups_root.yaml +0 -0
  341. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/legendgraphic.yaml +0 -0
  342. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/mapnik_source.yaml +0 -0
  343. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/mapproxy_export.yaml +0 -0
  344. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/mapserver.yaml +0 -0
  345. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/minimal_cgi.py +0 -0
  346. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/mixed_mode.yaml +0 -0
  347. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/multi_cache_layers.yaml +0 -0
  348. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/multiapp1.yaml +0 -0
  349. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/multiapp2.yaml +0 -0
  350. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/renderd_client.yaml +0 -0
  351. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/scalehints.yaml +0 -0
  352. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seed.yaml +0 -0
  353. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seed_mapproxy.yaml +0 -0
  354. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seed_old.yaml +0 -0
  355. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seed_timeouts.yaml +0 -0
  356. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +0 -0
  357. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/seedonly.yaml +0 -0
  358. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/sld.yaml +0 -0
  359. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/source_errors.yaml +0 -0
  360. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/source_errors_raise.yaml +0 -0
  361. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/tileservice_origin.yaml +0 -0
  362. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/tileservice_refresh.yaml +0 -0
  363. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/tilesource_minmax_res.yaml +0 -0
  364. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util-conf-base-grids.yaml +0 -0
  365. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util-conf-overwrite.yaml +0 -0
  366. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +0 -0
  367. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util_wms_capabilities111.xml +0 -0
  368. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util_wms_capabilities130.xml +0 -0
  369. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +0 -0
  370. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/watermark.yaml +0 -0
  371. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/wms_srs_extent.yaml +0 -0
  372. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/wms_versions.yaml +0 -0
  373. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/wmts.yaml +0 -0
  374. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/wmts_dimensions.yaml +0 -0
  375. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/xslt_featureinfo.yaml +0 -0
  376. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +0 -0
  377. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_arcgis.py +0 -0
  378. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_auth.py +0 -0
  379. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_behind_proxy.py +0 -0
  380. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_bulk_meta_tiles.py +0 -0
  381. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_azureblob.py +0 -0
  382. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_band_merge.py +0 -0
  383. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_coverage.py +0 -0
  384. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_geopackage.py +0 -0
  385. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_grid_names.py +0 -0
  386. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_mbtiles.py +0 -0
  387. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_s3.py +0 -0
  388. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_cache_source.py +0 -0
  389. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_combined_sources.py +0 -0
  390. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_coverage.py +0 -0
  391. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_decorate_img.py +0 -0
  392. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_demo_with_extra_service.py +0 -0
  393. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_dimensions.py +0 -0
  394. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_disable_storage.py +0 -0
  395. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_formats.py +0 -0
  396. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_inspire_vs.py +0 -0
  397. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_kml.py +0 -0
  398. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_layergroups.py +0 -0
  399. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_legendgraphic.py +0 -0
  400. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_mapnik.py +0 -0
  401. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_mapserver.py +0 -0
  402. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_mixed_mode_format.py +0 -0
  403. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_multi_cache_layers.py +0 -0
  404. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_multiapp.py +0 -0
  405. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_refresh.py +0 -0
  406. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_renderd_client.py +0 -0
  407. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_response_headers.py +0 -0
  408. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_scalehints.py +0 -0
  409. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_seed.py +0 -0
  410. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_seed_only.py +0 -0
  411. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_sld.py +0 -0
  412. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_source_errors.py +0 -0
  413. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_tilesource_minmax_res.py +0 -0
  414. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_tms.py +0 -0
  415. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_tms_origin.py +0 -0
  416. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_util_conf.py +0 -0
  417. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_util_export.py +0 -0
  418. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_util_grids.py +0 -0
  419. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_util_wms_capabilities.py +0 -0
  420. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_watermark.py +0 -0
  421. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wms.py +0 -0
  422. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wms_srs_extent.py +0 -0
  423. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wms_version.py +0 -0
  424. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wmsc.py +0 -0
  425. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wmts.py +0 -0
  426. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wmts_dimensions.py +0 -0
  427. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_wmts_restful.py +0 -0
  428. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/system/test_xslt_featureinfo.py +0 -0
  429. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/test_http_helper.py +0 -0
  430. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/__init__.py +0 -0
  431. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/epsg +0 -0
  432. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/polygons/polygons.dbf +0 -0
  433. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/polygons/polygons.shp +0 -0
  434. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/polygons/polygons.shx +0 -0
  435. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_async.py +0 -0
  436. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_auth.py +0 -0
  437. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache.py +0 -0
  438. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_azureblob.py +0 -0
  439. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_compact.py +0 -0
  440. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_couchdb.py +0 -0
  441. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_geopackage.py +0 -0
  442. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_mbtile.py +0 -0
  443. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_redis.py +0 -0
  444. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_riak.py +0 -0
  445. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_s3.py +0 -0
  446. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_cache_tile.py +0 -0
  447. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_client.py +0 -0
  448. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_client_arcgis.py +0 -0
  449. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_client_cgi.py +0 -0
  450. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_collections.py +0 -0
  451. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_concat_legends.py +0 -0
  452. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_conf_loader.py +0 -0
  453. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_conf_validator.py +0 -0
  454. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_config.py +0 -0
  455. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_decorate_img.py +0 -0
  456. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_exceptions.py +0 -0
  457. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_featureinfo.py +0 -0
  458. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_file_lock_load.py +0 -0
  459. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_fs.py +0 -0
  460. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_geom.py +0 -0
  461. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_grid.py +0 -0
  462. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_image.py +0 -0
  463. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_image_mask.py +0 -0
  464. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_image_messages.py +0 -0
  465. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_image_options.py +0 -0
  466. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_isodate.py +0 -0
  467. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_multiapp.py +0 -0
  468. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_ogr_reader.py +0 -0
  469. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_request.py +0 -0
  470. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_request_wmts.py +0 -0
  471. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_response.py +0 -0
  472. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_seed.py +0 -0
  473. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_seed_cachelock.py +0 -0
  474. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_srs.py +0 -0
  475. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_tiled_source.py +0 -0
  476. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_tilefilter.py +0 -0
  477. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_times.py +0 -0
  478. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_timeutils.py +0 -0
  479. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_util_conf_utils.py +0 -0
  480. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_utils.py +0 -0
  481. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_wms_capabilities.py +0 -0
  482. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_wms_layer.py +0 -0
  483. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/test/unit/test_yaml.py +0 -0
  484. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/tilefilter.py +0 -0
  485. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/__init__.py +0 -0
  486. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/async_.py +0 -0
  487. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/collections.py +0 -0
  488. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/coverage.py +0 -0
  489. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/__init__.py +0 -0
  490. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/dictspec/__init__.py +0 -0
  491. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/dictspec/spec.py +0 -0
  492. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/dictspec/test/__init__.py +0 -0
  493. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/dictspec/test/test_validator.py +0 -0
  494. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/dictspec/validator.py +0 -0
  495. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/local.py +0 -0
  496. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/lockfile.py +0 -0
  497. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/odict.py +0 -0
  498. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/serving.py +0 -0
  499. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/tempita/__init__.py +0 -0
  500. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/tempita/_looper.py +0 -0
  501. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/tempita/string_utils.py +0 -0
  502. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/__init__.py +0 -0
  503. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/duration.py +0 -0
  504. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/parse.py +0 -0
  505. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
  506. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/test_parse.py +0 -0
  507. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/test_util.py +0 -0
  508. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/wms-example-111.xml +0 -0
  509. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/wms-example-130.xml +0 -0
  510. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/wms-large-111.xml +0 -0
  511. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +0 -0
  512. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ext/wmsparse/util.py +0 -0
  513. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/fs.py +0 -0
  514. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/geom.py +0 -0
  515. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/lib.py +0 -0
  516. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/lock.py +0 -0
  517. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/ogr.py +0 -0
  518. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/py.py +0 -0
  519. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/times.py +0 -0
  520. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/util/yaml.py +0 -0
  521. {MapProxy-3.1.3 → mapproxy-3.1.4}/mapproxy/version.py +0 -0
  522. {MapProxy-3.1.3 → mapproxy-3.1.4}/requirements-tests.txt +0 -0
  523. {MapProxy-3.1.3 → mapproxy-3.1.4}/setup.cfg +0 -0
@@ -1,3 +1,12 @@
1
+ 3.1.4 2025-04-10
2
+ ~~~~~~~~~~~~~~~~
3
+
4
+ Fixes:
5
+
6
+ - Security fix to prevent XSS injections in demo pages
7
+ - Security fix to prevent reading file urls
8
+
9
+
1
10
  3.1.3 2024-11-26
2
11
  ~~~~~~~~~~~~~~~~
3
12
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: MapProxy
3
- Version: 3.1.3
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
-
@@ -485,6 +485,7 @@ mapproxy/util/__init__.py
485
485
  mapproxy/util/async_.py
486
486
  mapproxy/util/collections.py
487
487
  mapproxy/util/coverage.py
488
+ mapproxy/util/escape.py
488
489
  mapproxy/util/fs.py
489
490
  mapproxy/util/geom.py
490
491
  mapproxy/util/lib.py
@@ -1,4 +1,3 @@
1
1
  [console_scripts]
2
2
  mapproxy-seed = mapproxy.seed.script:main
3
3
  mapproxy-util = mapproxy.script.util:main
4
-
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: MapProxy
3
- Version: 3.1.3
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
- def handle(self, req):
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
- internal_url = '%s/service?REQUEST=GetCapabilities&SERVICE=WMS' % (req.server_script_url)
142
- if 'type' in req.args and req.args['type'] == 'external':
143
- url = internal_url.replace(req.server_script_url, req.script_url)
144
- else:
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
- internal_url = '%s/service?REQUEST=GetCapabilities&SERVICE=WMS&tiled=true' % (req.server_script_url)
150
- if 'type' in req.args and req.args['type'] == 'external':
151
- url = internal_url.replace(req.server_script_url, req.script_url)
152
- else:
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
- internal_url = '%s/service?REQUEST=GetCapabilities&SERVICE=WMTS' % (req.server_script_url)
158
- if 'type' in req.args and req.args['type'] == 'external':
159
- url = internal_url.replace(req.server_script_url, req.script_url)
160
- else:
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
- internal_url = '%s/wmts/1.0.0/WMTSCapabilities.xml' % (req.server_script_url)
166
- if 'type' in req.args and req.args['type'] == 'external':
167
- url = internal_url.replace(req.server_script_url, req.script_url)
168
- else:
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 then sorry)
175
- layer = req.args['layer'].replace('..', '')
176
- srs = req.args['srs'].replace('..', '')
177
- internal_url = '%s/tms/1.0.0/%s/%s' % (req.server_script_url, layer, srs)
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
- url = internal_url
184
- capabilities = urllib2.urlopen(url)
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 = escape(req.args['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=escape(req.args['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=escape(req.args['srs']),
305
- format=escape(req.args['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=escape(req.args['format']),
334
- srs=escape(req.args['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('&', '&amp;')
363
- data = data.replace('>', '&gt;')
364
- data = data.replace('<', '&lt;')
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)
@@ -11,8 +11,6 @@ jscript_functions = None
11
11
  <h2>{{service}} GetCapabilities</h2>
12
12
  <a href="{{url}}">{{url}}</a>
13
13
  <pre>
14
- {{for line in capabilities}}
15
- {{escape(wrapper.fill(line.decode('utf8')))}}
16
- {{endfor}}
14
+ {{capabilities}}
17
15
  </pre>
18
16
 
@@ -1,5 +1,6 @@
1
1
  services:
2
- demo:
2
+ wms:
3
+
3
4
  layers:
4
5
  - name: grid_layer
5
6
  title: Grid Layer
@@ -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/&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;/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 '&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;' 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&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;/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 '&gt;&lt;script&gt;alert(XSS)&lt;/script&gt;' 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('&', '&amp;')
6
+ data = data.replace('>', '&gt;')
7
+ data = data.replace('<', '&lt;')
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.3",
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',