[Git][debian-gis-team/pywps][experimental] 6 commits: New upstream version 4.4.5

Bas Couwenberg (@sebastic) gitlab at salsa.debian.org
Thu Aug 12 05:20:57 BST 2021



Bas Couwenberg pushed to branch experimental at Debian GIS Project / pywps


Commits:
cfae364a by Bas Couwenberg at 2021-08-12T05:58:17+02:00
New upstream version 4.4.5
- - - - -
7b19c7c6 by Bas Couwenberg at 2021-08-12T05:58:19+02:00
Update upstream source from tag 'upstream/4.4.5'

Update to upstream version '4.4.5'
with Debian dir 1ea07845cd61b60496366ed19242954a187c2a02
- - - - -
c2732026 by Bas Couwenberg at 2021-08-12T05:58:44+02:00
New upstream release.

- - - - -
181cdee9 by Bas Couwenberg at 2021-08-12T06:01:29+02:00
Add python3-markupsafe to (build) dependencies.

- - - - -
0fd31470 by Bas Couwenberg at 2021-08-12T06:12:44+02:00
Refresh patches.

- - - - -
ca747b10 by Bas Couwenberg at 2021-08-12T06:12:44+02:00
Set distribution to experimental.

- - - - -


23 changed files:

- VERSION.txt
- debian/changelog
- debian/control
- debian/patches/offline-tests.patch
- pywps/__init__.py
- pywps/app/WPSRequest.py
- pywps/exceptions.py
- pywps/inout/inputs.py
- pywps/inout/outputs.py
- pywps/tests.py
- pywps/validator/complexvalidator.py
- + pywps/xml_util.py
- requirements.txt
- setup.cfg
- tests/test_capabilities.py
- tests/test_complexdata_io.py
- tests/test_exceptions.py
- tests/test_execute.py
- tests/test_formats.py
- tests/test_inout.py
- tests/test_ows.py
- tests/test_wpsrequest.py
- + tests/test_xml_util.py


Changes:

=====================================
VERSION.txt
=====================================
@@ -1 +1 @@
-4.4.4
+4.4.5


=====================================
debian/changelog
=====================================
@@ -1,3 +1,12 @@
+pywps (4.4.5-1~exp1) experimental; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+  * Add python3-markupsafe to (build) dependencies.
+  * Refresh patches.
+
+ -- Bas Couwenberg <sebastic at debian.org>  Thu, 12 Aug 2021 06:01:53 +0200
+
 pywps (4.4.4-1~exp1) experimental; urgency=medium
 
   * Team upload.


=====================================
debian/control
=====================================
@@ -15,6 +15,7 @@ Build-Depends: debhelper (>= 10~),
                python3-jinja2,
                python3-jsonschema,
                python3-lxml,
+               python3-markupsafe,
                python3-netcdf4,
                python3-owslib,
                python3-pytest,
@@ -36,6 +37,7 @@ Depends: python3-dateutil,
          python3-jinja2,
          python3-jsonschema,
          python3-lxml,
+         python3-markupsafe,
          python3-owslib,
          python3-requests,
          python3-sqlalchemy,


=====================================
debian/patches/offline-tests.patch
=====================================
@@ -4,7 +4,7 @@ Forwarded: not-needed
 
 --- a/tests/test_ows.py
 +++ b/tests/test_ows.py
-@@ -128,6 +128,7 @@ def create_sum_one():
+@@ -126,6 +126,7 @@ def create_sum_one():
  
  class ExecuteTests(unittest.TestCase):
  
@@ -12,7 +12,7 @@ Forwarded: not-needed
      def test_wfs(self):
          if not service_ok('https://demo.mapserver.org'):
              self.skipTest("mapserver is unreachable")
-@@ -154,6 +155,7 @@ class ExecuteTests(unittest.TestCase):
+@@ -152,6 +153,7 @@ class ExecuteTests(unittest.TestCase):
          # . the inclusion of output
          # . the type of output
  
@@ -43,7 +43,7 @@ Forwarded: not-needed
          opendap_input = ComplexInput('dods', 'opendap test', [FORMATS.DODS,])
 --- a/tests/test_execute.py
 +++ b/tests/test_execute.py
-@@ -231,6 +231,8 @@ def get_output(doc):
+@@ -229,6 +229,8 @@ def get_output(doc):
  class ExecuteTest(unittest.TestCase):
      """Test for Exeucte request KVP request"""
  
@@ -54,7 +54,7 @@ Forwarded: not-needed
          if not WITH_NC4:
 --- a/tests/test_inout.py
 +++ b/tests/test_inout.py
-@@ -132,6 +132,7 @@ class IOHandlerTest(unittest.TestCase):
+@@ -130,6 +130,7 @@ class IOHandlerTest(unittest.TestCase):
          with self.assertRaises(TypeError):
              self.iohandler[0].data = '5'
  
@@ -62,7 +62,7 @@ Forwarded: not-needed
      def test_url(self):
          if not service_ok('https://demo.mapserver.org'):
              self.skipTest("mapserver is unreachable")
-@@ -515,6 +516,7 @@ class ComplexOutputTest(unittest.TestCas
+@@ -513,6 +514,7 @@ class ComplexOutputTest(unittest.TestCas
          b = self.complex_out.base64
          self.assertEqual(base64.b64decode(b).decode(), self.data)
  
@@ -70,3 +70,11 @@ Forwarded: not-needed
      def test_url_handler(self):
          wfsResource = 'http://demo.mapserver.org/cgi-bin/wfs?' \
                        'service=WFS&version=1.1.0&' \
+@@ -755,6 +757,7 @@ class BBoxOutputTest(unittest.TestCase):
+         )
+ 
+ 
++ at unittest.skipIf('OFFLINE_TESTS' in os.environ, "offline tests only")
+ class TestMetaLink(unittest.TestCase):
+     tmp_dir = tempfile.mkdtemp()
+ 


=====================================
pywps/__init__.py
=====================================
@@ -9,7 +9,7 @@ import os
 
 from lxml.builder import ElementMaker
 
-__version__ = "4.4.4"
+__version__ = "4.4.5"
 
 LOGGER = logging.getLogger('PYWPS')
 LOGGER.debug('setting core variables')


=====================================
pywps/app/WPSRequest.py
=====================================
@@ -5,7 +5,7 @@
 
 import logging
 import lxml
-import lxml.etree
+from pywps import xml_util as etree
 from werkzeug.exceptions import MethodNotAllowed
 from pywps import get_ElementMakerForVersion
 import base64
@@ -85,7 +85,7 @@ class WPSRequest(object):
                                    ' Maximum request size allowed: {} megabytes'.format(maxsize / 1024 / 1024))
 
         try:
-            doc = lxml.etree.fromstring(self.http_request.get_data())
+            doc = etree.fromstring(self.http_request.get_data())
         except Exception as e:
             raise NoApplicableCode(e.msg)
 
@@ -571,7 +571,7 @@ def _get_dataelement_value(value_el):
     """
 
     if isinstance(value_el, lxml.etree._Element):
-        return lxml.etree.tostring(value_el, encoding=str)
+        return etree.tostring(value_el, encoding=str)
     else:
         return value_el
 


=====================================
pywps/exceptions.py
=====================================
@@ -14,7 +14,7 @@ http://lists.opengeospatial.org/pipermail/wps-dev/2013-October/000335.html
 
 from werkzeug.wrappers import Response
 from werkzeug.exceptions import HTTPException
-from werkzeug.utils import escape
+from markupsafe import escape
 
 import logging
 


=====================================
pywps/inout/inputs.py
=====================================
@@ -4,7 +4,7 @@
 ##################################################################
 
 import re
-import lxml.etree as etree
+from pywps import xml_util as etree
 
 from pywps.app.Common import Metadata
 from pywps.exceptions import InvalidParameterValue


=====================================
pywps/inout/outputs.py
=====================================
@@ -6,7 +6,7 @@
 WPS Output classes
 """
 
-import lxml.etree as etree
+from pywps import xml_util as etree
 import os
 import re
 from pywps.app.Common import Metadata


=====================================
pywps/tests.py
=====================================
@@ -5,10 +5,11 @@
 import tempfile
 from pathlib import Path
 
-import lxml.etree
+import lxml
+from pywps import xml_util as etree
 import requests
 from werkzeug.test import Client
-from werkzeug.wrappers import BaseResponse
+from werkzeug.wrappers import Response
 from pywps import __version__
 from pywps import Process
 from pywps.inout import LiteralInput, LiteralOutput, ComplexInput, ComplexOutput, BoundingBoxInput, BoundingBoxOutput
@@ -93,17 +94,17 @@ class WpsClient(Client):
 
     def post_xml(self, *args, **kwargs):
         doc = kwargs.pop('doc')
-        data = lxml.etree.tostring(doc, pretty_print=True)
+        data = etree.tostring(doc, pretty_print=True)
         kwargs['data'] = data
         return self.post(*args, **kwargs)
 
 
-class WpsTestResponse(BaseResponse):
+class WpsTestResponse(Response):
 
     def __init__(self, *args):
         super(WpsTestResponse, self).__init__(*args)
         if re.match(r'text/xml(;\s*charset=.*)?', self.headers.get('Content-Type')):
-            self.xml = lxml.etree.fromstring(self.get_data())
+            self.xml = etree.fromstring(self.get_data())
 
     def xpath(self, path):
         version = self.xml.attrib["version"]


=====================================
pywps/validator/complexvalidator.py
=====================================
@@ -11,6 +11,8 @@ import logging
 
 from pywps.validator.mode import MODE
 from pywps.inout.formats import FORMATS
+from lxml.etree import XMLSchema
+from pywps import xml_util as etree
 from urllib.request import urlopen
 import mimetypes
 import os
@@ -61,13 +63,10 @@ def validategml(data_input, mode):
             passed = False
 
     if mode >= MODE.VERYSTRICT:
-
-        from lxml import etree
-
         try:
             schema_url = data_input.data_format.schema
             gmlschema_doc = etree.parse(urlopen(schema_url))
-            gmlschema = etree.XMLSchema(gmlschema_doc)
+            gmlschema = XMLSchema(gmlschema_doc)
             passed = gmlschema.validate(etree.parse(data_input.stream))
         except Exception as e:
             LOGGER.warning(e)
@@ -118,13 +117,10 @@ def validategpx(data_input, mode):
             passed = False
 
     if mode >= MODE.VERYSTRICT:
-
-        from lxml import etree
-
         try:
             schema_url = data_input.data_format.schema
             gpxschema_doc = etree.parse(urlopen(schema_url))
-            gpxschema = etree.XMLSchema(gpxschema_doc)
+            gpxschema = XMLSchema(gpxschema_doc)
             passed = gpxschema.validate(etree.parse(data_input.stream))
         except Exception as e:
             LOGGER.warning(e)
@@ -164,15 +160,13 @@ def validatexml(data_input, mode):
         passed = data_input.data_format.mime_type in {mtype, FORMATS.GML.mime_type}
 
     if mode >= MODE.STRICT:
-        from lxml import etree
-
         # TODO: Raise the actual validation exception to make it easier to spot the error.
         #  xml = etree.parse(data_input.file)
         #  schema.assertValid(xml)
         try:
             fn = os.path.join(_get_schemas_home(), data_input.data_format.schema)
             schema_doc = etree.parse(fn)
-            schema = etree.XMLSchema(schema_doc)
+            schema = XMLSchema(schema_doc)
             passed = schema.validate(etree.parse(data_input.file))
         except Exception as e:
             LOGGER.warning(e)


=====================================
pywps/xml_util.py
=====================================
@@ -0,0 +1,16 @@
+from lxml import etree as _etree
+
+
+PARSER = _etree.XMLParser(
+    resolve_entities=False,
+)
+
+tostring = _etree.tostring
+
+
+def fromstring(text):
+    return _etree.fromstring(text, parser=PARSER)
+
+
+def parse(source):
+    return _etree.parse(source, parser=PARSER)


=====================================
requirements.txt
=====================================
@@ -6,4 +6,5 @@ python-dateutil
 requests
 SQLAlchemy
 werkzeug
+MarkupSafe
 humanize


=====================================
setup.cfg
=====================================
@@ -1,9 +1,9 @@
 [bumpversion]
-current_version = 4.4.4
+current_version = 4.4.5
 commit = False
 tag = False
 parse = (?P<major>\d+)\.(?P<minor>\d+).(?P<patch>\d+)
-serialize = 
+serialize =
 	{major}.{minor}.{patch}
 
 [flake8]


=====================================
tests/test_capabilities.py
=====================================
@@ -4,13 +4,11 @@
 ##################################################################
 
 import unittest
-import lxml
-import lxml.etree
 from pywps import configuration
 from pywps.app import Process, Service
 from pywps.app.Common import Metadata
 from pywps import get_ElementMakerForVersion
-from pywps.tests import assert_pywps_version, client_for, assert_wps_version
+from pywps.tests import client_for, assert_wps_version
 
 WPS, OWS = get_ElementMakerForVersion("1.0.0")
 


=====================================
tests/test_complexdata_io.py
=====================================
@@ -2,12 +2,12 @@
 
 import unittest
 import os
-from pywps import get_ElementMakerForVersion, E
+from pywps import get_ElementMakerForVersion
 from pywps.app.basic import get_xpath_ns
 from pywps import Service, Process, ComplexInput, ComplexOutput, FORMATS
 from pywps.tests import client_for, assert_response_success
 from owslib.wps import WPSExecution, ComplexDataInput
-from lxml import etree
+from pywps import xml_util as etree
 
 VERSION = "1.0.0"
 WPS, OWS = get_ElementMakerForVersion(VERSION)


=====================================
tests/test_exceptions.py
=====================================
@@ -4,10 +4,9 @@
 ##################################################################
 
 import unittest
-from pywps import Process, Service, get_ElementMakerForVersion
+from pywps import Service, get_ElementMakerForVersion
 from pywps.app.basic import get_xpath_ns
 from pywps.tests import assert_pywps_version, client_for
-import lxml.etree
 
 import re
 


=====================================
tests/test_execute.py
=====================================
@@ -5,7 +5,7 @@
 
 import unittest
 import pytest
-import lxml.etree
+from pywps import xml_util as etree
 import json
 import tempfile
 import os.path
@@ -13,16 +13,14 @@ from pywps import Service, Process, LiteralOutput, LiteralInput,\
     BoundingBoxOutput, BoundingBoxInput, Format, ComplexInput, ComplexOutput, FORMATS
 from pywps.validator.base import emptyvalidator
 from pywps.validator.complexvalidator import validategml
-from pywps.validator.mode import MODE
 from pywps.exceptions import InvalidParameterValue
-from pywps import get_inputs_from_xml, get_output_from_xml
+from pywps import get_inputs_from_xml
 from pywps import E, get_ElementMakerForVersion
 from pywps.app.basic import get_xpath_ns
 from pywps.tests import client_for, assert_response_success
 from pywps import configuration
 
 from io import StringIO
-from owslib.ows import BoundingBox
 
 try:
     import netCDF4
@@ -223,7 +221,7 @@ def get_output(doc):
                 output[identifier_el.text] = data_el[0].text
             else:  # XML children
                 ch = list(data_el[0])[0]
-                output[identifier_el.text] = lxml.etree.tostring(ch)
+                output[identifier_el.text] = etree.tostring(ch)
 
     return output
 
@@ -600,7 +598,7 @@ class ExecuteXmlParserTest(unittest.TestCase):
                         WPS.ComplexData(the_data, mimeType='text/foobar')))))
         rv = get_inputs_from_xml(request_doc)
         self.assertEqual(rv['name'][0]['mimeType'], 'text/foobar')
-        rv_doc = lxml.etree.parse(StringIO(rv['name'][0]['data'])).getroot()
+        rv_doc = etree.parse(StringIO(rv['name'][0]['data'])).getroot()
         self.assertEqual(rv_doc.tag, 'TheData')
         self.assertEqual(rv_doc.text, 'hello world')
 


=====================================
tests/test_formats.py
=====================================
@@ -8,9 +8,8 @@
 import unittest
 
 from pywps.inout.formats import Format, get_format, FORMATS
-from lxml import etree
 from pywps.app.basic import get_xpath_ns
-from pywps.validator.base import emptyvalidator
+
 
 xpath_ns = get_xpath_ns("1.0.0")
 
@@ -121,4 +120,3 @@ def load_tests(loader=None, tests=None, pattern=None):
         loader.loadTestsFromTestCase(FormatsTest)
     ]
     return unittest.TestSuite(suite_list)
-


=====================================
tests/test_inout.py
=====================================
@@ -11,7 +11,6 @@
 import requests
 import os
 import tempfile
-import datetime
 import unittest
 import json
 from pywps import inout
@@ -35,7 +34,6 @@ from pywps.inout.storage.file import FileStorageBuilder
 from pywps.tests import service_ok
 from pywps.translations import get_translation
 
-from lxml import etree
 
 DATA_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'data')
 


=====================================
tests/test_ows.py
=====================================
@@ -9,8 +9,6 @@ __date__ = "10-03-2015"
 import os
 import tempfile
 import unittest
-import lxml.etree
-import sys
 from pywps import Service, Process, ComplexInput, ComplexOutput, Format, FORMATS, get_format
 from pywps.dependencies import ogr
 from pywps.exceptions import NoApplicableCode


=====================================
tests/test_wpsrequest.py
=====================================
@@ -4,7 +4,6 @@
 ##################################################################
 
 import unittest
-import lxml.etree
 from pywps.app import WPSRequest
 import tempfile
 import datetime


=====================================
tests/test_xml_util.py
=====================================
@@ -0,0 +1,52 @@
+from pywps import xml_util as etree
+
+from io import StringIO
+
+
+XML_EXECUTE = """
+<!DOCTYPE foo [
+  <!ELEMENT foo ANY >
+  <!ENTITY xxe SYSTEM "file:///PATH/TO/input.txt">
+]>
+<wps:Execute
+    service="WPS"
+    version="1.0.0"
+    xmlns:wps="http://www.opengis.net/wps/1.0.0"
+    xmlns:ows="http://www.opengis.net/ows/1.1"
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://schemas.opengis.net/wps/1.0.0/wpsExecute_request.xsd">
+    <ows:Identifier>test_process</ows:Identifier>
+    <wps:DataInputs>
+        <wps:Input>
+            <ows:Identifier>name</ows:Identifier>
+            <wps:Data>
+                <wps:LiteralData>&xxe;</wps:LiteralData>
+            </wps:Data>
+        </wps:Input>
+    </wps:DataInputs>
+    <wps:ResponseForm>
+        <wps:ResponseDocument
+            storeExecuteResponse="true"
+            status="true">
+            <wps:Output asReference="false">
+                <ows:Identifier>output</ows:Identifier>
+            </wps:Output>
+        </wps:ResponseDocument>
+    </wps:ResponseForm>
+</wps:Execute>
+"""
+
+
+def test_etree_fromstring():
+    xml = etree.tostring(etree.fromstring(XML_EXECUTE))
+    # don't replace entities
+    # https://lxml.de/parsing.html
+    assert b"<wps:LiteralData>&xxe;</wps:LiteralData>" in xml
+
+
+def test_etree_parse():
+    xml = etree.tostring(etree.parse(StringIO(XML_EXECUTE)))
+    # don't replace entities
+    # https://lxml.de/parsing.html
+    assert b"<wps:LiteralData>&xxe;</wps:LiteralData>" in xml



View it on GitLab: https://salsa.debian.org/debian-gis-team/pywps/-/compare/dbac0c4710b30f62787cd8212e07433bccb5423a...ca747b100bb3c92551dbff5358b1798b14d4859e

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/pywps/-/compare/dbac0c4710b30f62787cd8212e07433bccb5423a...ca747b100bb3c92551dbff5358b1798b14d4859e
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20210812/bad1912c/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list