def test_get_legend_graphic(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_dummy_request()
        request.params.update(
            dict(service="wms",
                 version="1.1.1",
                 request="getlegendgraphic",
                 layer="testpoint_unprotected",
                 srs="EPSG:21781",
                 format="image/png",
                 extraparam="with spéciàl chârs"))
        response = MapservProxy(request).proxy()
        self.assertTrue(response.cache_control.public)
        self.assertEqual(response.cache_control.max_age, 3600)
    def test_wfs_get_capabilities(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_getcap_request()
        request.params.update(
            dict(
                service="wfs",
                version="1.1.1",
                request="getcapabilities",
            ))
        response = MapservProxy(request).proxy()
        assert "<Name>testpoint_protected</Name>" not in response.body.decode(
            "utf-8")

        request = self._create_getcap_request(username="******")
        request.params.update(
            dict(
                service="wfs",
                version="1.1.1",
                request="getcapabilities",
            ))
        response = MapservProxy(request).proxy()
        assert "<Name>testpoint_protected</Name>" in response.body.decode(
            "utf-8")
    def _get_feature_is_not_equal_to(self, value):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_dummy_request()
        request.headers["Content-Type"] = "application/xml; charset=UTF-8"

        request.method = "POST"
        request.body = (GETFEATURE_REQUEST % {
            "feature": "testpoint_unprotected",
            "function": "NotEqualTo",
            "arguments": "",
            "property": "name",
            "value": value,
        }).encode("utf-8")
        return MapservProxy(request).proxy()
    def test_get_map_protected_layer_user2(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_dummy_request(username="******")
        request.params.update(dict(
            service="wms", version="1.1.1", request="getmap",
            bbox="599820,199910,600180,200090", layers="testpoint_protected",
            width="600", height="400", srs="EPSG:21781", format="image/png"
        ))
        response = MapservProxy(request).proxy()

        self.assertEqual(str(response.cache_control), "max-age=0, must-revalidate, no-cache, no-store")
        # empty
        md5sum = hashlib.md5(response.body).hexdigest()
        self.assertIn(md5sum, NO_POINT)
    def test_geoserver(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_getcap_request(
            username="******",
            additional_settings={
                "mapserverproxy": {
                    "default_ogc_server": "__test_ogc_server_geoserver",
                }
            })
        request.params.update(
            dict(
                service="wms",
                version="1.1.1",
                request="getcapabilities",
            ))
        response = MapservProxy(request).proxy()
        assert "<Name>testpoint_protected</Name>" in response.body.decode(
            "utf-8")
    def test_get_feature_external_wfs_url(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_dummy_request()

        featureid = "{typename!s}.{fid1!s},{typename!s}.{fid2!s}".format(
            typename="testpoint_unprotected",
            fid1=self.id_lausanne,
            fid2=self.id_paris
        )
        request.params.update(dict(
            service="wfs", version="1.0.0",
            request="getfeature", typename="testpoint_unprotected",
            featureid=featureid, callback="cb", EXTERNAL=1
        ))
        response = MapservProxy(request).proxy()

        self.assertTrue(response.body != "")
        self.assertEqual(str(response.cache_control), "max-age=0, must-revalidate, no-cache, no-store")
    def test_get_feature_feature_id_get(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_dummy_request()

        featureid = "{typename!s}.{fid1!s},{typename!s}.{fid2!s}".format(
            typename="testpoint_unprotected",
            fid1=self.id_lausanne,
            fid2=self.id_paris)
        request.params.update(
            dict(service="wfs",
                 version="1.0.0",
                 request="getfeature",
                 typename="testpoint_unprotected",
                 featureid=featureid))
        response = MapservProxy(request).proxy()
        assert "Lausanne" in response.body.decode("utf-8")
        assert "Paris" in response.body.decode("utf-8")
        assert "Londre" not in response.body.decode("utf-8")
        assert "Chambéry" not in response.body.decode("utf-8")
        self.assertEqual(response.content_type, "text/xml")
    def test_get_map_protected_layer_collect_query_user3(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_dummy_request(username="******")
        request.params.update(
            dict(service="wms",
                 version="1.1.1",
                 request="getmap",
                 bbox="599820,199910,600180,200090",
                 layers="testpoint_protected_query_with_collect",
                 width="600",
                 height="400",
                 srs="EPSG:21781",
                 format="image/png"))
        response = MapservProxy(request).proxy()

        self.assertTrue(response.status_int, 200)
        self.assertEqual(str(response.cache_control), "max-age=0, no-cache")
        # two points
        md5sum = hashlib.md5(response.body).hexdigest()
        self.assertIn(md5sum, TWO_POINTS)
    def _wms_get_capabilities(ogcserver, service="wms", username=None):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = create_dummy_request(
            {
                "admin_interface": {
                    "available_functionalities": [
                        "mapserver_substitution",
                        "print_template",
                    ]
                },
                "servers": {
                    "srv": "http://example.com"
                }
            },
            user=username)
        request.params.update(
            dict(service=service,
                 version="1.1.1",
                 request="getcapabilities",
                 ogcserver=ogcserver))
        return MapservProxy(request).proxy()
    def test_getlegendgraphic_custom_nocache(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_dummy_request()
        request.registry.settings.update({
            "headers": {
                "mapserver": {
                    "cache_control_max_age": 0,
                    "access_control_allow_origin": "*"
                }
            }
        })
        request.params.update(
            dict(service="wms",
                 version="1.1.1",
                 request="getlegendgraphic",
                 layer="testpoint_unprotected",
                 srs="EPSG:21781",
                 format="image/png",
                 extraparam="with spéciàl chârs"))
        response = MapservProxy(request).proxy()
        self.assertTrue(response.cache_control.public)
        self.assertTrue(response.cache_control.no_cache)
    def test_substitution(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_dummy_request()
        request.method = "POST"
        request.headers["Content-Type"] = "application/xml; charset=UTF-8"
        request.body = SUBSTITUTION_GETFEATURE_REQUEST

        response = MapservProxy(request).proxy()
        self.assertTrue(response.status_int, 200)
        assert "foo" in response.body.decode("utf-8")
        assert "bar" not in response.body.decode("utf-8")
        assert "éàè" not in response.body.decode("utf-8")
        assert "123" not in response.body.decode("utf-8")

        request.params.update(dict(s_name="bar"))
        response = MapservProxy(request).proxy()
        self.assertTrue(response.status_int, 200)
        assert "foo" in response.body.decode("utf-8")
        assert "bar" not in response.body.decode("utf-8")
        assert "éàè" not in response.body.decode("utf-8")
        assert "123" not in response.body.decode("utf-8")

        request = self._create_dummy_request()
        request.method = "POST"
        request.body = SUBSTITUTION_GETFEATURE_REQUEST
        request.params.update(dict(S_NAME="bar"))
        response = MapservProxy(request).proxy()
        self.assertTrue(response.status_int, 200)
        assert "foo" in response.body.decode("utf-8")
        assert "bar" not in response.body.decode("utf-8")
        assert "éàè" not in response.body.decode("utf-8")
        assert "123" not in response.body.decode("utf-8")

        request = self._create_dummy_request()
        request.method = "POST"
        request.body = SUBSTITUTION_GETFEATURE_REQUEST
        request.registry.settings["functionalities"]["anonymous"] = {
            "mapserver_substitution": ["name=bar"]
        }
        response = MapservProxy(request).proxy()
        self.assertTrue(response.status_int, 200)
        assert "foo" not in response.body.decode("utf-8")
        assert "bar" in response.body.decode("utf-8")
        assert "éàè" not in response.body.decode("utf-8")
        assert "123" not in response.body.decode("utf-8")

        request.body = COLUMN_RESTRICTION_GETFEATURE_REQUEST
        request.registry.settings["functionalities"]["anonymous"] = {
            "mapserver_substitution":
            ["cols=name", "cols=city", "cols=country"]
        }
        response = MapservProxy(request).proxy()
        self.assertTrue(response.status_int, 200)
        assert "Lausanne" in response.body.decode("utf-8")
        assert "Swiss" in response.body.decode("utf-8")

        request.registry.settings["functionalities"]["anonymous"] = {
            "mapserver_substitution": ["cols=name", "cols=city"]
        }
        response = MapservProxy(request).proxy()
        self.assertTrue(response.status_int, 200)
        assert "Lausanne" in response.body.decode("utf-8")
        assert "Swiss" not in response.body.decode("utf-8")

        request.registry.settings["functionalities"]["anonymous"] = {
            "mapserver_substitution": ["cols=name", "cols=country"]
        }
        response = MapservProxy(request).proxy()
        self.assertTrue(response.status_int, 200)
        assert "Lausanne" not in response.body.decode("utf-8")
        assert "Swiss" in response.body.decode("utf-8")

        request.registry.settings["functionalities"]["anonymous"] = {
            "mapserver_substitution": ["cols=name"]
        }
        response = MapservProxy(request).proxy()
        self.assertTrue(response.status_int, 200)
        assert "Lausanne" not in response.body.decode("utf-8")
        assert "Swiss" not in response.body.decode("utf-8")

        request = self._create_dummy_request()
        request.registry.settings["admin_interface"] = {
            "available_functionalities": [{
                "name": "mapserver_substitution"
            }]
        }
        request.method = "POST"
        request.body = SUBSTITUTION_GETFEATURE_REQUEST
        request.registry.settings["functionalities"]["anonymous"] = {
            "mapserver_substitution": ["foo_bar"]
        }
        request.params.update(
            dict(s_test1="to be removed", S_TEST2="to be removed"))
        # just pass in the log message
        response = MapservProxy(request).proxy()
    def test_no_params(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_dummy_request()
        response = MapservProxy(request).proxy()
        self.assertEqual(response.status_code, 200)
    def test_get_feature_info(self):
        from c2cgeoportal_geoportal.views.mapserverproxy import MapservProxy

        request = self._create_dummy_request()
        request.params.update(
            dict(
                service="wms",
                version="1.1.1",
                request="getfeatureinfo",
                bbox="599910,199955,600090,200000",
                layers="testpoint_unprotected",
                query_layers="testpoint_unprotected",
                srs="EPSG:21781",
                format="image/png",
                info_format="application/vnd.ogc.gml",
                width="600",
                height="400",
                x="0",
                y="400",
            ))
        response = MapservProxy(request).proxy()

        expected_response = """
        <?xmlversion="1.0"encoding="UTF-8"?>
        <msGMLOutput
         xmlns:gml="http://www.opengis.net/gml"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <testpoint_unprotected_layer>
        <gml:name>countries</gml:name>
                <testpoint_unprotected_feature>
                        <gml:boundedBy>
                                <gml:Box srsName="EPSG:21781">
                                        <gml:coordinates>599910.000000,199955.000000 599910.000000,199955.000000</gml:coordinates>
                                </gml:Box>
                        </gml:boundedBy>
                        <geom>
                        <gml:Point srsName="EPSG:21781">
                          <gml:coordinates>599910.000000,199955.000000</gml:coordinates>
                        </gml:Point>
                        </geom>
                        <name>foo</name>
                        <city>Lausanne</city>
                        <country>Swiss</country>
                </testpoint_unprotected_feature>
        </testpoint_unprotected_layer>
        </msGMLOutput>
        """
        import re

        pattern = re.compile(r"\s+")
        expected_response = "".join(
            re.sub(pattern, "", l) for l in expected_response.splitlines())
        response_body = "".join(
            re.sub(pattern, "", l) for l in response.body.decode(
                "utf-8").splitlines()).encode("utf-8")
        self.assertEqual(response_body.decode("utf-8"), expected_response)
        self.assertTrue(response.cache_control.public)
        self.assertEqual(response.cache_control.max_age, 10)
        self.assertEqual(
            str(response.cache_control),
            "max-age=10, must-revalidate, no-cache, no-store, public")