Ejemplo n.º 1
0
    def test_unpublished(self):
        """Test permissions on an unpublished layer
        """

        thefile = os.path.join(
            gisdata.VECTOR_DATA,
            'san_andres_y_providencia_poi.shp')
        layer = file_upload(thefile, overwrite=True)
        check_layer(layer)

        # we need some time to have the service up and running
        time.sleep(20)

        # request getCapabilities: layer must be there as it is published and
        # advertised: we need to check if in response there is
        # <Name>geonode:san_andres_y_providencia_water</Name>
        url = 'http://localhost:8080/geoserver/ows?' \
            'service=wms&version=1.3.0&request=GetCapabilities'
        str_to_check = '<Name>geonode:san_andres_y_providencia_poi</Name>'
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        self.assertTrue(any(str_to_check in s for s in response.readlines()))

        # now test with unpublished layer
        resource = layer.get_self_resource()
        resource.is_published = False
        resource.save()

        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        self.assertFalse(any(str_to_check in s for s in response.readlines()))

        # Clean up and completely delete the layer
        layer.delete()
Ejemplo n.º 2
0
    def test_unpublished(self):
        """Test permissions on an unpublished layer
        """

        thefile = os.path.join(gisdata.VECTOR_DATA, "san_andres_y_providencia_poi.shp")
        layer = file_upload(thefile, overwrite=True)
        layer.set_default_permissions()
        check_layer(layer)

        # we need some time to have the service up and running
        time.sleep(20)

        # request getCapabilities: layer must be there as it is published and
        # advertised: we need to check if in response there is
        # <Name>geonode:san_andres_y_providencia_water</Name>
        url = "http://localhost:8080/geoserver/ows?" "service=wms&version=1.3.0&request=GetCapabilities"
        str_to_check = "<Name>geonode:san_andres_y_providencia_poi</Name>"
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        self.assertTrue(any(str_to_check in s for s in response.readlines()))

        # by default the uploaded layer is
        self.assertTrue(layer.is_published, True)

        # Clean up and completely delete the layer
        layer.delete()

        # with settings disabled
        with self.settings(RESOURCE_PUBLISHING=True):

            thefile = os.path.join(gisdata.VECTOR_DATA, "san_andres_y_providencia_administrative.shp")
            layer = file_upload(thefile, overwrite=True)
            layer.set_default_permissions()
            check_layer(layer)

            # we need some time to have the service up and running
            time.sleep(20)

            str_to_check = "<Name>san_andres_y_providencia_administrative</Name>"

            # by default the uploaded layer must be unpublished
            self.assertEqual(layer.is_published, False)

            # check the layer is not in GetCapabilities
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            self.assertFalse(any(str_to_check in s for s in response.readlines()))

            # now test with published layer
            resource = layer.get_self_resource()
            resource.is_published = True
            resource.save()

            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            self.assertTrue(any(str_to_check in s for s in response.readlines()))

            # Clean up and completely delete the layer
            layer.delete()
Ejemplo n.º 3
0
    def test_tiff(self):
        """Uploading a good .tiff
        """
        thefile = os.path.join(gisdata.RASTER_DATA, 'test_grid.tif')
        uploaded = file_upload(thefile, overwrite=True)
        check_layer(uploaded)

        # Clean up and completely delete the layer
        uploaded.delete()
Ejemplo n.º 4
0
    def test_shapefile(self):
        """Test Uploading a good shapefile
        """
        thefile = os.path.join(gisdata.VECTOR_DATA, "san_andres_y_providencia_poi.shp")
        uploaded = file_upload(thefile, overwrite=True)
        check_layer(uploaded)

        # Clean up and completely delete the layer
        uploaded.delete()
Ejemplo n.º 5
0
    def test_tiff(self):
        """Uploading a good .tiff
        """
        thefile = os.path.join(gisdata.RASTER_DATA, 'test_grid.tif')
        uploaded = file_upload(thefile, overwrite=True)
        check_layer(uploaded)

        # Clean up and completely delete the layer
        uploaded.delete()
Ejemplo n.º 6
0
    def test_shapefile(self):
        """Test Uploading a good shapefile
        """
        thefile = os.path.join(gisdata.VECTOR_DATA,
                               'san_andres_y_providencia_poi.shp')
        uploaded = file_upload(thefile, overwrite=True)
        check_layer(uploaded)

        # Clean up and completely delete the layer
        uploaded.delete()
Ejemplo n.º 7
0
    def test_configure_time(self):
        # make sure it's not there (and configured)
        cascading_delete(gs_catalog, 'boxes_with_end_date')

        def get_wms_timepositions():
            metadata = get_wms().contents['geonode:boxes_with_end_date']
            self.assertTrue(metadata is not None)
            return metadata.timepositions

        thefile = os.path.join(GOOD_DATA, 'time', 'boxes_with_end_date.shp')
        uploaded = file_upload(thefile, overwrite=True)
        check_layer(uploaded)
        # initial state is no positions or info
        self.assertTrue(get_wms_timepositions() is None)
        self.assertTrue(get_time_info(uploaded) is None)

        # enable using interval and single attribute
        set_time_info(uploaded, 'date', None, 'DISCRETE_INTERVAL', 3, 'days')
        self.assertEquals(
            ['2000-03-01T00:00:00.000Z/2000-06-08T00:00:00.000Z/P3D'],
            get_wms_timepositions())
        self.assertEquals(
            {
                'end_attribute': None,
                'presentation': 'DISCRETE_INTERVAL',
                'attribute': 'date',
                'enabled': True,
                'precision_value': '3',
                'precision_step': 'days'
            }, get_time_info(uploaded))

        # disable but configure to use enddate attribute in list
        set_time_info(uploaded,
                      'date',
                      'enddate',
                      'LIST',
                      None,
                      None,
                      enabled=False)
        # verify disabled
        self.assertTrue(get_wms_timepositions() is None)
        # test enabling now
        info = get_time_info(uploaded)
        info['enabled'] = True
        set_time_info(uploaded, **info)
        self.assertEquals(100, len(get_wms_timepositions()))
Ejemplo n.º 8
0
    def test_configure_time(self):
        # make sure it's not there (and configured)
        cascading_delete(gs_catalog, 'boxes_with_end_date')

        def get_wms_timepositions():
            metadata = get_wms().contents['geonode:boxes_with_end_date']
            self.assertTrue(metadata is not None)
            return metadata.timepositions

        thefile = os.path.join(
            GOOD_DATA, 'time', 'boxes_with_end_date.shp'
        )
        uploaded = file_upload(thefile, overwrite=True)
        check_layer(uploaded)
        # initial state is no positions or info
        self.assertTrue(get_wms_timepositions() is None)
        self.assertTrue(get_time_info(uploaded) is None)

        # enable using interval and single attribute
        set_time_info(uploaded, 'date', None, 'DISCRETE_INTERVAL', 3, 'days')
        self.assertEquals(
            ['2000-03-01T00:00:00.000Z/2000-06-08T00:00:00.000Z/P3D'],
            get_wms_timepositions()
        )
        self.assertEquals(
            {'end_attribute': None, 'presentation': 'DISCRETE_INTERVAL',
             'attribute': 'date', 'enabled': True, 'precision_value': '3',
             'precision_step': 'days'},
            get_time_info(uploaded)
        )

        # disable but configure to use enddate attribute in list
        set_time_info(uploaded, 'date', 'enddate', 'LIST', None, None, enabled=False)
        # verify disabled
        self.assertTrue(get_wms_timepositions() is None)
        # test enabling now
        info = get_time_info(uploaded)
        info['enabled'] = True
        set_time_info(uploaded, **info)
        self.assertEquals(100, len(get_wms_timepositions()))
Ejemplo n.º 9
0
    def test_repeated_upload(self):
        """Upload the same file more than once
        """
        thefile = os.path.join(gisdata.RASTER_DATA, 'test_grid.tif')
        uploaded1 = file_upload(thefile, overwrite=True)
        check_layer(uploaded1)
        uploaded2 = file_upload(thefile, overwrite=True)
        check_layer(uploaded2)
        uploaded3 = file_upload(thefile, overwrite=False)
        check_layer(uploaded3)
        msg = ('Expected %s but got %s' % (uploaded1.name, uploaded2.name))
        assert uploaded1.name == uploaded2.name, msg
        msg = ('Expected a different name when uploading %s using '
               'overwrite=False but got %s' % (thefile, uploaded3.name))
        assert uploaded1.name != uploaded3.name, msg

        # Clean up and completely delete the layers

        # uploaded1 is overwritten by uploaded2 ... no need to delete it
        uploaded2.delete()
        uploaded3.delete()
Ejemplo n.º 10
0
    def test_repeated_upload(self):
        """Upload the same file more than once
        """
        thefile = os.path.join(gisdata.RASTER_DATA, 'test_grid.tif')
        uploaded1 = file_upload(thefile, overwrite=True)
        check_layer(uploaded1)
        uploaded2 = file_upload(thefile, overwrite=True)
        check_layer(uploaded2)
        uploaded3 = file_upload(thefile, overwrite=False)
        check_layer(uploaded3)
        msg = ('Expected %s but got %s' % (uploaded1.name, uploaded2.name))
        assert uploaded1.name == uploaded2.name, msg
        msg = ('Expected a different name when uploading %s using '
               'overwrite=False but got %s' % (thefile, uploaded3.name))
        assert uploaded1.name != uploaded3.name, msg

        # Clean up and completely delete the layers

        # uploaded1 is overwritten by uploaded2 ... no need to delete it
        uploaded2.delete()
        uploaded3.delete()
Ejemplo n.º 11
0
    def test_permissions(self):
        """Test permissions on a layer
        """

        # grab norman
        norman = get_user_model().objects.get(username="******")

        thefile = os.path.join(
            gisdata.VECTOR_DATA,
            'san_andres_y_providencia_poi.shp')
        layer = file_upload(thefile, overwrite=True)
        check_layer(layer)

        # we need some time to have the service up and running
        time.sleep(20)

        # Set the layer private for not authenticated users
        layer.set_permissions({'users': {'AnonymousUser': []}})

        url = 'http://localhost:8080/geoserver/geonode/wms?' \
            'LAYERS=geonode%3Asan_andres_y_providencia_poi&STYLES=' \
            '&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap' \
            '&SRS=EPSG%3A4326' \
            '&BBOX=-81.394599749999,13.316009005566,' \
            '-81.370560451855,13.372728455566' \
            '&WIDTH=217&HEIGHT=512'

        # test view_resourcebase permission on anonymous user
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        self.assertTrue(
            response.info().getheader('Content-Type'),
            'application/vnd.ogc.se_xml;charset=UTF-8'
        )

        # test WMS with authenticated user that has not view_resourcebase:
        # the layer must be not accessible (response is xml)
        request = urllib2.Request(url)
        base64string = base64.encodestring(
            '%s:%s' % ('norman', 'norman')).replace('\n', '')
        request.add_header("Authorization", "Basic %s" % base64string)
        response = urllib2.urlopen(request)
        self.assertTrue(
            response.info().getheader('Content-Type'),
            'application/vnd.ogc.se_xml;charset=UTF-8'
        )

        # test WMS with authenticated user that has view_resourcebase: the layer
        # must be accessible (response is image)
        assign_perm('view_resourcebase', norman, layer.get_self_resource())
        request = urllib2.Request(url)
        base64string = base64.encodestring(
            '%s:%s' % ('norman', 'norman')).replace('\n', '')
        request.add_header("Authorization", "Basic %s" % base64string)
        response = urllib2.urlopen(request)
        self.assertTrue(response.info().getheader('Content-Type'), 'image/png')

        # test change_layer_data
        # would be nice to make a WFS/T request and test results, but this
        # would work only on PostGIS layers

        # test change_layer_style
        url = 'http://localhost:8000/gs/rest/styles/san_andres_y_providencia_poi.xml'
        sld = """<?xml version="1.0" encoding="UTF-8"?>
<sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld"
xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
   <sld:NamedLayer>
      <sld:Name>geonode:san_andres_y_providencia_poi</sld:Name>
      <sld:UserStyle>
         <sld:Name>san_andres_y_providencia_poi</sld:Name>
         <sld:Title>san_andres_y_providencia_poi</sld:Title>
         <sld:IsDefault>1</sld:IsDefault>
         <sld:FeatureTypeStyle>
            <sld:Rule>
               <sld:PointSymbolizer>
                  <sld:Graphic>
                     <sld:Mark>
                        <sld:Fill>
                           <sld:CssParameter name="fill">#8A7700
                           </sld:CssParameter>
                        </sld:Fill>
                        <sld:Stroke>
                           <sld:CssParameter name="stroke">#bbffff
                           </sld:CssParameter>
                        </sld:Stroke>
                     </sld:Mark>
                     <sld:Size>10</sld:Size>
                  </sld:Graphic>
               </sld:PointSymbolizer>
            </sld:Rule>
         </sld:FeatureTypeStyle>
      </sld:UserStyle>
   </sld:NamedLayer>
</sld:StyledLayerDescriptor>"""

        # user without change_layer_style cannot edit it
        self.client.login(username='******', password='******')
        response = self.client.put(url, sld, content_type='application/vnd.ogc.sld+xml')
        self.assertEquals(response.status_code, 401)

        # user with change_layer_style can edit it
        assign_perm('change_layer_style', norman, layer)
        response = self.client.put(url, sld, content_type='application/vnd.ogc.sld+xml')
        self.assertEquals(response.status_code, 200)

        # Clean up and completely delete the layer
        layer.delete()
Ejemplo n.º 12
0
    def test_layer_permissions(self):
        try:
            # Test permissions on a layer

            # grab bobby
            bobby = get_user_model().objects.get(username="******")

            layers = Layer.objects.all()[:2].values_list('id', flat=True)
            test_perm_layer = Layer.objects.get(id=layers[0])
            thefile = os.path.join(
                gisdata.VECTOR_DATA,
                'san_andres_y_providencia_poi.shp')
            layer = geoserver_upload(
                test_perm_layer,
                thefile,
                bobby,
                'san_andres_y_providencia_poi',
                overwrite=True
            )
            self.assertIsNotNone(layer)

            # Reset GeoFence Rules
            purge_geofence_all()
            geofence_rules_count = get_geofence_rules_count()
            self.assertTrue(geofence_rules_count == 0)

            ignore_errors = False
            skip_unadvertised = False
            skip_geonode_registered = False
            remove_deleted = True
            verbosity = 2
            owner = get_valid_user('admin')
            workspace = 'geonode'
            filter = None
            store = None
            permissions = {'users': {"admin": ['change_layer_data']}}
            gs_slurp(
                ignore_errors,
                verbosity=verbosity,
                owner=owner,
                console=StreamToLogger(logger, logging.INFO),
                workspace=workspace,
                store=store,
                filter=filter,
                skip_unadvertised=skip_unadvertised,
                skip_geonode_registered=skip_geonode_registered,
                remove_deleted=remove_deleted,
                permissions=permissions,
                execute_signals=True)

            layer = Layer.objects.get(title='san_andres_y_providencia_poi')
            check_layer(layer)

            geofence_rules_count = get_geofence_rules_count()
            _log("0. geofence_rules_count: %s " % geofence_rules_count)
            self.assertEquals(geofence_rules_count, 2)

            # Set the layer private for not authenticated users
            layer.set_permissions({'users': {'AnonymousUser': []}})

            url = 'http://localhost:8080/geoserver/geonode/ows?' \
                'LAYERS=geonode%3Asan_andres_y_providencia_poi&STYLES=' \
                '&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap' \
                '&SRS=EPSG%3A4326' \
                '&BBOX=-81.394599749999,13.316009005566,' \
                '-81.370560451855,13.372728455566' \
                '&WIDTH=217&HEIGHT=512'

            # test view_resourcebase permission on anonymous user
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            self.assertTrue(
                response.info().getheader('Content-Type'),
                'application/vnd.ogc.se_xml;charset=UTF-8'
            )

            # test WMS with authenticated user that has not view_resourcebase:
            # the layer must be not accessible (response is xml)
            request = urllib2.Request(url)
            base64string = base64.encodestring(
                '%s:%s' % ('bobby', 'bob')).replace('\n', '')
            request.add_header("Authorization", "Basic %s" % base64string)
            response = urllib2.urlopen(request)
            self.assertTrue(
                response.info().getheader('Content-Type'),
                'application/vnd.ogc.se_xml;charset=UTF-8'
            )

            # test WMS with authenticated user that has view_resourcebase: the layer
            # must be accessible (response is image)
            assign_perm('view_resourcebase', bobby, layer.get_self_resource())
            request = urllib2.Request(url)
            base64string = base64.encodestring(
                '%s:%s' % ('bobby', 'bob')).replace('\n', '')
            request.add_header("Authorization", "Basic %s" % base64string)
            response = urllib2.urlopen(request)
            self.assertTrue(response.info().getheader('Content-Type'), 'image/png')

            # test change_layer_data
            # would be nice to make a WFS/T request and test results, but this
            # would work only on PostGIS layers

            # test change_layer_style
            url = 'http://localhost:8000/gs/rest/workspaces/geonode/styles/san_andres_y_providencia_poi.xml'
            sld = """<?xml version="1.0" encoding="UTF-8"?>
        <sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld"
        xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0"
        xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
        <sld:NamedLayer>
          <sld:Name>geonode:san_andres_y_providencia_poi</sld:Name>
          <sld:UserStyle>
             <sld:Name>san_andres_y_providencia_poi</sld:Name>
             <sld:Title>san_andres_y_providencia_poi</sld:Title>
             <sld:IsDefault>1</sld:IsDefault>
             <sld:FeatureTypeStyle>
                <sld:Rule>
                   <sld:PointSymbolizer>
                      <sld:Graphic>
                         <sld:Mark>
                            <sld:Fill>
                               <sld:CssParameter name="fill">#8A7700
                               </sld:CssParameter>
                            </sld:Fill>
                            <sld:Stroke>
                               <sld:CssParameter name="stroke">#bbffff
                               </sld:CssParameter>
                            </sld:Stroke>
                         </sld:Mark>
                         <sld:Size>10</sld:Size>
                      </sld:Graphic>
                   </sld:PointSymbolizer>
                </sld:Rule>
             </sld:FeatureTypeStyle>
          </sld:UserStyle>
        </sld:NamedLayer>
        </sld:StyledLayerDescriptor>"""

            # user without change_layer_style cannot edit it
            self.assertTrue(self.client.login(username='******', password='******'))
            response = self.client.put(url, sld, content_type='application/vnd.ogc.sld+xml')
            self.assertEquals(response.status_code, 401)

            # user with change_layer_style can edit it
            assign_perm('change_layer_style', bobby, layer)
            perm_spec = {
                'users': {
                    'bobby': ['view_resourcebase',
                              'change_resourcebase', ]
                }
            }
            layer.set_permissions(perm_spec)
            response = self.client.get(url)
            self.assertEquals(response.status_code, 200)
            response = self.client.put(url, sld, content_type='application/vnd.ogc.sld+xml')
        finally:
            try:
                layer.delete()
            except BaseException:
                pass
Ejemplo n.º 13
0
    def test_permissions(self):
        """Test permissions on a layer
        """

        # grab norman
        norman = get_user_model().objects.get(username="******")

        thefile = os.path.join(gisdata.VECTOR_DATA,
                               'san_andres_y_providencia_poi.shp')
        layer = file_upload(thefile, overwrite=True)
        check_layer(layer)

        # we need some time to have the service up and running
        time.sleep(20)

        # Set the layer private for not authenticated users
        layer.set_permissions({'users': {'AnonymousUser': []}})

        url = 'http://localhost:8080/geoserver/geonode/wms?' \
            'LAYERS=geonode%3Asan_andres_y_providencia_poi&STYLES=' \
            '&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap' \
            '&SRS=EPSG%3A4326' \
            '&BBOX=-81.394599749999,13.316009005566,' \
            '-81.370560451855,13.372728455566' \
            '&WIDTH=217&HEIGHT=512'

        # test view_resourcebase permission on anonymous user
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        self.assertTrue(response.info().getheader('Content-Type'),
                        'application/vnd.ogc.se_xml;charset=UTF-8')

        # test WMS with authenticated user that has not view_resourcebase:
        # the layer must be not accessible (response is xml)
        request = urllib2.Request(url)
        base64string = base64.encodestring(
            '%s:%s' % ('norman', 'norman')).replace('\n', '')
        request.add_header("Authorization", "Basic %s" % base64string)
        response = urllib2.urlopen(request)
        self.assertTrue(response.info().getheader('Content-Type'),
                        'application/vnd.ogc.se_xml;charset=UTF-8')

        # test WMS with authenticated user that has view_resourcebase: the layer
        # must be accessible (response is image)
        assign_perm('view_resourcebase', norman, layer.get_self_resource())
        request = urllib2.Request(url)
        base64string = base64.encodestring(
            '%s:%s' % ('norman', 'norman')).replace('\n', '')
        request.add_header("Authorization", "Basic %s" % base64string)
        response = urllib2.urlopen(request)
        self.assertTrue(response.info().getheader('Content-Type'), 'image/png')

        # test change_layer_data
        # would be nice to make a WFS/T request and test results, but this
        # would work only on PostGIS layers

        # test change_layer_style
        url = 'http://localhost:8000/gs/rest/styles/san_andres_y_providencia_poi.xml'
        sld = """<?xml version="1.0" encoding="UTF-8"?>
<sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld"
xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
   <sld:NamedLayer>
      <sld:Name>geonode:san_andres_y_providencia_poi</sld:Name>
      <sld:UserStyle>
         <sld:Name>san_andres_y_providencia_poi</sld:Name>
         <sld:Title>san_andres_y_providencia_poi</sld:Title>
         <sld:IsDefault>1</sld:IsDefault>
         <sld:FeatureTypeStyle>
            <sld:Rule>
               <sld:PointSymbolizer>
                  <sld:Graphic>
                     <sld:Mark>
                        <sld:Fill>
                           <sld:CssParameter name="fill">#8A7700
                           </sld:CssParameter>
                        </sld:Fill>
                        <sld:Stroke>
                           <sld:CssParameter name="stroke">#bbffff
                           </sld:CssParameter>
                        </sld:Stroke>
                     </sld:Mark>
                     <sld:Size>10</sld:Size>
                  </sld:Graphic>
               </sld:PointSymbolizer>
            </sld:Rule>
         </sld:FeatureTypeStyle>
      </sld:UserStyle>
   </sld:NamedLayer>
</sld:StyledLayerDescriptor>"""

        # user without change_layer_style cannot edit it
        self.client.login(username='******', password='******')
        response = self.client.put(url,
                                   sld,
                                   content_type='application/vnd.ogc.sld+xml')
        self.assertEquals(response.status_code, 401)

        # user with change_layer_style can edit it
        assign_perm('change_layer_style', norman, layer)
        response = self.client.put(url,
                                   sld,
                                   content_type='application/vnd.ogc.sld+xml')
        self.assertEquals(response.status_code, 200)

        # Clean up and completely delete the layer
        layer.delete()
Ejemplo n.º 14
0
    def test_unpublished(self):
        """Test permissions on an unpublished layer
        """
        thefile = os.path.join(
            gisdata.VECTOR_DATA,
            'san_andres_y_providencia_poi.shp')
        layer = file_upload(thefile, overwrite=True)
        layer.set_default_permissions()
        check_layer(layer)

        # we need some time to have the service up and running
        time.sleep(20)

        try:
            # request getCapabilities: layer must be there as it is published and
            # advertised: we need to check if in response there is
            # <Name>geonode:san_andres_y_providencia_water</Name>
            geoserver_base_url = settings.OGC_SERVER['default']['LOCATION']
            get_capabilities_url = 'ows?' \
                'service=wms&version=1.3.0&request=GetCapabilities'
            url = urljoin(geoserver_base_url, get_capabilities_url)
            str_to_check = '<Name>geonode:san_andres_y_providencia_poi</Name>'
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            self.assertTrue(any(str_to_check in s for s in response.readlines()))

            # by default the uploaded layer is
            self.assertTrue(layer.is_published, True)
        finally:
            # Clean up and completely delete the layer
            layer.delete()

        # with settings disabled
        with self.settings(RESOURCE_PUBLISHING=True):
            layer = file_upload(thefile)
            layer.set_default_permissions()
            check_layer(layer)

            # we need some time to have the service up and running
            time.sleep(20)

            try:
                # by default the uploaded layer must be unpublished
                self.assertEqual(layer.is_published, False)

                # check the layer is not in GetCapabilities
                request = urllib2.Request(url)
                response = urllib2.urlopen(request)
                self.assertFalse(any(str_to_check in s for s in response.readlines()))

                # now test with published layer
                layer = Layer.objects.get(pk=layer.pk)
                layer.is_published = True
                layer.save()

                # we need some time to have the service up and running
                time.sleep(20)

                request = urllib2.Request(url)
                response = urllib2.urlopen(request)
                self.assertTrue(any(str_to_check in s for s in response.readlines()))
            finally:
                # Clean up and completely delete the layer
                layer.delete()
Ejemplo n.º 15
0
    def test_permissions(self):
        """Test permissions on a layer
        """

        # grab norman
        norman = get_user_model().objects.get(username="******")

        thefile = os.path.join(
            gisdata.VECTOR_DATA,
            'san_andres_y_providencia_poi.shp')
        layer = file_upload(thefile, overwrite=True)
        check_layer(layer)

        # we need some time to have the service up and running
        time.sleep(20)

        # Set the layer private for not authenticated users
        layer.set_permissions({'users': {'AnonymousUser': []}})

        url = 'http://localhost:8080/geoserver/geonode/wms?' \
            'LAYERS=geonode%3Asan_andres_y_providencia_poi&STYLES=' \
            '&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap' \
            '&SRS=EPSG%3A4326' \
            '&BBOX=-81.394599749999,13.316009005566,' \
            '-81.370560451855,13.372728455566' \
            '&WIDTH=217&HEIGHT=512'

        # test view_resourcebase permission on anonymous user
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        self.assertTrue(
            response.info().getheader('Content-Type'),
            'application/vnd.ogc.se_xml;charset=UTF-8'
        )

        # test WMS with authenticated user that has not view_resourcebase:
        # the layer must be not accessible (response is xml)
        request = urllib2.Request(url)
        base64string = base64.encodestring(
            '%s:%s' % ('norman', 'norman')).replace('\n', '')
        request.add_header("Authorization", "Basic %s" % base64string)
        response = urllib2.urlopen(request)
        self.assertTrue(
            response.info().getheader('Content-Type'),
            'application/vnd.ogc.se_xml;charset=UTF-8'
        )

        # test WMS with authenticated user that has view_resourcebase: the layer
        # must be accessible (response is image)
        assign_perm('view_resourcebase', norman, layer.get_self_resource())
        request = urllib2.Request(url)
        base64string = base64.encodestring(
            '%s:%s' % ('norman', 'norman')).replace('\n', '')
        request.add_header("Authorization", "Basic %s" % base64string)
        response = urllib2.urlopen(request)
        self.assertTrue(response.info().getheader('Content-Type'), 'image/png')

        # test change_layer_data
        # would be nice to make a WFS/T request and test results, but this
        # would work only on PostGIS layers

        # Clean up and completely delete the layer
        layer.delete()
Ejemplo n.º 16
0
    def test_layer_upload_with_time(self):
        """ Try uploading a layer and verify that the user can administrate
        his own layer despite not being a site administrator.
        """
        try:
            # user without change_layer_style cannot edit it
            self.assertTrue(self.client.login(username='******',
                                              password='******'))

            # grab bobby
            bobby = get_user_model().objects.get(username="******")
            anonymous_group, created = Group.objects.get_or_create(
                name='anonymous')

            # Upload to GeoServer
            saved_layer = geoserver_upload(Layer(),
                                           os.path.join(
                                               gisdata.GOOD_DATA, 'time/'
                                               "boxes_with_date.shp"),
                                           bobby,
                                           'boxes_with_date_by_bobby',
                                           overwrite=True)

            # Test that layer owner can wipe GWC Cache
            ignore_errors = False
            skip_unadvertised = False
            skip_geonode_registered = False
            remove_deleted = True
            verbosity = 2
            owner = bobby
            workspace = 'geonode'
            filter = None
            store = None
            permissions = {
                'users': {
                    "bobby": ['view_resourcebase', 'change_layer_data']
                },
                'groups': {
                    anonymous_group: ['view_resourcebase']
                },
            }
            gs_slurp(ignore_errors,
                     verbosity=verbosity,
                     owner=owner,
                     workspace=workspace,
                     store=store,
                     filter=filter,
                     skip_unadvertised=skip_unadvertised,
                     skip_geonode_registered=skip_geonode_registered,
                     remove_deleted=remove_deleted,
                     permissions=permissions,
                     execute_signals=True)

            saved_layer = Layer.objects.get(title='boxes_with_date_by_bobby')
            check_layer(saved_layer)

            from lxml import etree
            from geonode.geoserver.helpers import get_store
            from geonode.geoserver.signals import gs_catalog

            self.assertIsNotNone(saved_layer)
            workspace, name = saved_layer.alternate.split(':')
            self.assertIsNotNone(workspace)
            self.assertIsNotNone(name)
            ws = gs_catalog.get_workspace(workspace)
            self.assertIsNotNone(ws)
            store = get_store(gs_catalog, saved_layer.store, workspace=ws)
            self.assertIsNotNone(store)

            url = settings.OGC_SERVER['default']['LOCATION']
            user = settings.OGC_SERVER['default']['USER']
            passwd = settings.OGC_SERVER['default']['PASSWORD']

            rest_path = 'rest/workspaces/geonode/datastores/{lyr_name}/featuretypes/{lyr_name}.xml'.\
                format(lyr_name=name)
            import requests
            from requests.auth import HTTPBasicAuth
            r = requests.get(url + rest_path, auth=HTTPBasicAuth(user, passwd))
            self.assertEquals(r.status_code, 200)
            _log(r.text)

            featureType = etree.ElementTree(etree.fromstring(r.text))
            metadata = featureType.findall('./[metadata]')
            self.assertEquals(len(metadata), 0)

            payload = """<featureType>
            <metadata>
                <entry key="elevation">
                    <dimensionInfo>
                        <enabled>false</enabled>
                    </dimensionInfo>
                </entry>
                <entry key="time">
                    <dimensionInfo>
                        <enabled>true</enabled>
                        <attribute>date</attribute>
                        <presentation>LIST</presentation>
                        <units>ISO8601</units>
                        <defaultValue/>
                        <nearestMatchEnabled>false</nearestMatchEnabled>
                    </dimensionInfo>
                </entry>
            </metadata></featureType>"""

            r = requests.put(url + rest_path,
                             data=payload,
                             headers={'Content-type': 'application/xml'},
                             auth=HTTPBasicAuth(user, passwd))
            self.assertEquals(r.status_code, 200)

            r = requests.get(url + rest_path, auth=HTTPBasicAuth(user, passwd))
            self.assertEquals(r.status_code, 200)
            _log(r.text)

            featureType = etree.ElementTree(etree.fromstring(r.text))
            metadata = featureType.findall('./[metadata]')
            _log(etree.tostring(metadata[0], encoding='utf8', method='xml'))
            self.assertEquals(len(metadata), 1)

            saved_layer.set_default_permissions()

            from geonode.geoserver.views import get_layer_capabilities
            capab = get_layer_capabilities(saved_layer, tolerant=True)
            self.assertIsNotNone(capab)
            wms_capabilities_url = reverse('capabilities_layer',
                                           args=[saved_layer.id])
            wms_capabilities_resp = self.client.get(wms_capabilities_url)
            self.assertTrue(wms_capabilities_resp.status_code, 200)

            all_times = None

            if wms_capabilities_resp.status_code >= 200 and wms_capabilities_resp.status_code < 400:
                wms_capabilities = wms_capabilities_resp.getvalue()
                if wms_capabilities:
                    namespaces = {
                        'wms': 'http://www.opengis.net/wms',
                        'xlink': 'http://www.w3.org/1999/xlink',
                        'xsi': 'http://www.w3.org/2001/XMLSchema-instance'
                    }

                    e = etree.fromstring(wms_capabilities)
                    for atype in e.findall(
                            "./[wms:Name='%s']/wms:Dimension[@name='time']" %
                        (saved_layer.alternate), namespaces):
                        dim_name = atype.get('name')
                        if dim_name:
                            dim_name = str(dim_name).lower()
                            if dim_name == 'time':
                                dim_values = atype.text
                                if dim_values:
                                    all_times = dim_values.split(",")
                                    break

            self.assertIsNotNone(all_times)
            self.assertEquals(all_times, [
                '2000-03-01T00:00:00.000Z', '2000-03-02T00:00:00.000Z',
                '2000-03-03T00:00:00.000Z', '2000-03-04T00:00:00.000Z',
                '2000-03-05T00:00:00.000Z', '2000-03-06T00:00:00.000Z',
                '2000-03-07T00:00:00.000Z', '2000-03-08T00:00:00.000Z',
                '2000-03-09T00:00:00.000Z', '2000-03-10T00:00:00.000Z',
                '2000-03-11T00:00:00.000Z', '2000-03-12T00:00:00.000Z',
                '2000-03-13T00:00:00.000Z', '2000-03-14T00:00:00.000Z',
                '2000-03-15T00:00:00.000Z', '2000-03-16T00:00:00.000Z',
                '2000-03-17T00:00:00.000Z', '2000-03-18T00:00:00.000Z',
                '2000-03-19T00:00:00.000Z', '2000-03-20T00:00:00.000Z',
                '2000-03-21T00:00:00.000Z', '2000-03-22T00:00:00.000Z',
                '2000-03-23T00:00:00.000Z', '2000-03-24T00:00:00.000Z',
                '2000-03-25T00:00:00.000Z', '2000-03-26T00:00:00.000Z',
                '2000-03-27T00:00:00.000Z', '2000-03-28T00:00:00.000Z',
                '2000-03-29T00:00:00.000Z', '2000-03-30T00:00:00.000Z',
                '2000-03-31T00:00:00.000Z', '2000-04-01T00:00:00.000Z',
                '2000-04-02T00:00:00.000Z', '2000-04-03T00:00:00.000Z',
                '2000-04-04T00:00:00.000Z', '2000-04-05T00:00:00.000Z',
                '2000-04-06T00:00:00.000Z', '2000-04-07T00:00:00.000Z',
                '2000-04-08T00:00:00.000Z', '2000-04-09T00:00:00.000Z',
                '2000-04-10T00:00:00.000Z', '2000-04-11T00:00:00.000Z',
                '2000-04-12T00:00:00.000Z', '2000-04-13T00:00:00.000Z',
                '2000-04-14T00:00:00.000Z', '2000-04-15T00:00:00.000Z',
                '2000-04-16T00:00:00.000Z', '2000-04-17T00:00:00.000Z',
                '2000-04-18T00:00:00.000Z', '2000-04-19T00:00:00.000Z',
                '2000-04-20T00:00:00.000Z', '2000-04-21T00:00:00.000Z',
                '2000-04-22T00:00:00.000Z', '2000-04-23T00:00:00.000Z',
                '2000-04-24T00:00:00.000Z', '2000-04-25T00:00:00.000Z',
                '2000-04-26T00:00:00.000Z', '2000-04-27T00:00:00.000Z',
                '2000-04-28T00:00:00.000Z', '2000-04-29T00:00:00.000Z',
                '2000-04-30T00:00:00.000Z', '2000-05-01T00:00:00.000Z',
                '2000-05-02T00:00:00.000Z', '2000-05-03T00:00:00.000Z',
                '2000-05-04T00:00:00.000Z', '2000-05-05T00:00:00.000Z',
                '2000-05-06T00:00:00.000Z', '2000-05-07T00:00:00.000Z',
                '2000-05-08T00:00:00.000Z', '2000-05-09T00:00:00.000Z',
                '2000-05-10T00:00:00.000Z', '2000-05-11T00:00:00.000Z',
                '2000-05-12T00:00:00.000Z', '2000-05-13T00:00:00.000Z',
                '2000-05-14T00:00:00.000Z', '2000-05-15T00:00:00.000Z',
                '2000-05-16T00:00:00.000Z', '2000-05-17T00:00:00.000Z',
                '2000-05-18T00:00:00.000Z', '2000-05-19T00:00:00.000Z',
                '2000-05-20T00:00:00.000Z', '2000-05-21T00:00:00.000Z',
                '2000-05-22T00:00:00.000Z', '2000-05-23T00:00:00.000Z',
                '2000-05-24T00:00:00.000Z', '2000-05-25T00:00:00.000Z',
                '2000-05-26T00:00:00.000Z', '2000-05-27T00:00:00.000Z',
                '2000-05-28T00:00:00.000Z', '2000-05-29T00:00:00.000Z',
                '2000-05-30T00:00:00.000Z', '2000-05-31T00:00:00.000Z',
                '2000-06-01T00:00:00.000Z', '2000-06-02T00:00:00.000Z',
                '2000-06-03T00:00:00.000Z', '2000-06-04T00:00:00.000Z',
                '2000-06-05T00:00:00.000Z', '2000-06-06T00:00:00.000Z',
                '2000-06-07T00:00:00.000Z', '2000-06-08T00:00:00.000Z'
            ])

            saved_layer.set_default_permissions()
            url = reverse('layer_metadata',
                          args=[saved_layer.service_typename])
            resp = self.client.get(url)
            self.assertEquals(resp.status_code, 200)
        finally:
            # Clean up and completely delete the layer
            try:
                saved_layer.delete()
                if check_ogc_backend(geoserver.BACKEND_PACKAGE):
                    from geonode.geoserver.helpers import cleanup
                    cleanup(saved_layer.name, saved_layer.uuid)
            except BaseException:
                pass
Ejemplo n.º 17
0
    def test_unpublished(self):
        """Test permissions on an unpublished layer
        """
        layer = Layer.objects.first()
        layer.set_default_permissions()
        check_layer(layer)

        # we need some time to have the service up and running
        # time.sleep(20)

        try:
            # request getCapabilities: layer must be there as it is published and
            # advertised: we need to check if in response there is
            # <Name>geonode:san_andres_y_providencia_water</Name>
            geoserver_base_url = settings.OGC_SERVER['default']['LOCATION']
            get_capabilities_url = 'ows?' \
                'service=wms&version=1.3.0&request=GetCapabilities'
            url = urljoin(geoserver_base_url, get_capabilities_url)
            str_to_check = f'<Name>geonode:{layer.name}</Name>'
            request = Request(url)
            response = urlopen(request)

            # by default the uploaded layer is published
            self.assertTrue(layer.is_published)
            self.assertTrue(any(str_to_check in ensure_string(s) for s in response.readlines()))
        finally:
            # Clean up and completely delete the layer
            layer.delete()

        # with settings disabled
        with self.settings(RESOURCE_PUBLISHING=True):
            layer = Layer.objects.first()
            layer.is_approved = False
            layer.is_published = False
            layer.save()
            layer.set_default_permissions()
            check_layer(layer)

            # we need some time to have the service up and running
            time.sleep(20)

            try:
                # by default the uploaded layer must be unpublished
                self.assertEqual(layer.is_published, False)

                # check the layer is not in GetCapabilities
                request = Request(url)
                response = urlopen(request)

                # now test with published layer
                layer = Layer.objects.get(pk=layer.pk)
                layer.is_published = True
                layer.save()

                # we need some time to have the service up and running
                time.sleep(20)

                request = Request(url)
                response = urlopen(request)
                self.assertTrue(any(str_to_check in ensure_string(s) for s in response.readlines()))
            finally:
                # Clean up and completely delete the layer
                layer.delete()
Ejemplo n.º 18
0
    def test_layer_permissions(self):
        try:
            # Test permissions on a layer

            # grab bobby
            bobby = get_user_model().objects.get(username="******")

            layers = Layer.objects.all()[:2].values_list('id', flat=True)
            test_perm_layer = Layer.objects.get(id=layers[0])
            thefile = os.path.join(gisdata.VECTOR_DATA,
                                   'san_andres_y_providencia_poi.shp')
            layer = geoserver_upload(test_perm_layer,
                                     thefile,
                                     bobby,
                                     'san_andres_y_providencia_poi',
                                     overwrite=True)
            self.assertIsNotNone(layer)
            _log(
                " ------------------------------------------------------------- "
            )
            _log(layer)
            _log(
                " ------------------------------------------------------------- "
            )

            # Reset GeoFence Rules
            purge_geofence_all()
            geofence_rules_count = get_geofence_rules_count()
            self.assertTrue(geofence_rules_count == 0)

            ignore_errors = False
            skip_unadvertised = False
            skip_geonode_registered = False
            remove_deleted = True
            verbosity = 2
            owner = get_valid_user('admin')
            workspace = 'geonode'
            filter = None
            store = None
            permissions = {'users': {"admin": ['change_layer_data']}}
            gs_slurp(ignore_errors,
                     verbosity=verbosity,
                     owner=owner,
                     console=StreamToLogger(logger, logging.INFO),
                     workspace=workspace,
                     store=store,
                     filter=filter,
                     skip_unadvertised=skip_unadvertised,
                     skip_geonode_registered=skip_geonode_registered,
                     remove_deleted=remove_deleted,
                     permissions=permissions,
                     execute_signals=True)

            layer = Layer.objects.get(title='san_andres_y_providencia_poi')
            check_layer(layer)

            geofence_rules_count = get_geofence_rules_count()
            _log("0. geofence_rules_count: %s " % geofence_rules_count)
            self.assertEquals(geofence_rules_count, 2)

            # Set the layer private for not authenticated users
            layer.set_permissions({'users': {'AnonymousUser': []}})

            url = 'http://localhost:8080/geoserver/geonode/ows?' \
                'LAYERS=geonode%3Asan_andres_y_providencia_poi&STYLES=' \
                '&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap' \
                '&SRS=EPSG%3A4326' \
                '&BBOX=-81.394599749999,13.316009005566,' \
                '-81.370560451855,13.372728455566' \
                '&WIDTH=217&HEIGHT=512'

            # test view_resourcebase permission on anonymous user
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            self.assertTrue(response.info().getheader('Content-Type'),
                            'application/vnd.ogc.se_xml;charset=UTF-8')

            # test WMS with authenticated user that has not view_resourcebase:
            # the layer must be not accessible (response is xml)
            request = urllib2.Request(url)
            base64string = base64.encodestring(
                '%s:%s' % ('bobby', 'bob')).replace('\n', '')
            request.add_header("Authorization", "Basic %s" % base64string)
            response = urllib2.urlopen(request)
            self.assertTrue(response.info().getheader('Content-Type'),
                            'application/vnd.ogc.se_xml;charset=UTF-8')

            # test WMS with authenticated user that has view_resourcebase: the layer
            # must be accessible (response is image)
            assign_perm('view_resourcebase', bobby, layer.get_self_resource())
            request = urllib2.Request(url)
            base64string = base64.encodestring(
                '%s:%s' % ('bobby', 'bob')).replace('\n', '')
            request.add_header("Authorization", "Basic %s" % base64string)
            response = urllib2.urlopen(request)
            self.assertTrue(response.info().getheader('Content-Type'),
                            'image/png')

            # test change_layer_data
            # would be nice to make a WFS/T request and test results, but this
            # would work only on PostGIS layers

            # test change_layer_style
            url = 'http://localhost:8000/gs/rest/workspaces/geonode/styles/san_andres_y_providencia_poi.xml'
            sld = """<?xml version="1.0" encoding="UTF-8"?>
        <sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld"
        xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0"
        xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
        <sld:NamedLayer>
          <sld:Name>geonode:san_andres_y_providencia_poi</sld:Name>
          <sld:UserStyle>
             <sld:Name>san_andres_y_providencia_poi</sld:Name>
             <sld:Title>san_andres_y_providencia_poi</sld:Title>
             <sld:IsDefault>1</sld:IsDefault>
             <sld:FeatureTypeStyle>
                <sld:Rule>
                   <sld:PointSymbolizer>
                      <sld:Graphic>
                         <sld:Mark>
                            <sld:Fill>
                               <sld:CssParameter name="fill">#8A7700
                               </sld:CssParameter>
                            </sld:Fill>
                            <sld:Stroke>
                               <sld:CssParameter name="stroke">#bbffff
                               </sld:CssParameter>
                            </sld:Stroke>
                         </sld:Mark>
                         <sld:Size>10</sld:Size>
                      </sld:Graphic>
                   </sld:PointSymbolizer>
                </sld:Rule>
             </sld:FeatureTypeStyle>
          </sld:UserStyle>
        </sld:NamedLayer>
        </sld:StyledLayerDescriptor>"""

            # user without change_layer_style cannot edit it
            self.assertTrue(self.client.login(username='******',
                                              password='******'))
            response = self.client.put(
                url, sld, content_type='application/vnd.ogc.sld+xml')
            self.assertEquals(response.status_code, 401)

            # user with change_layer_style can edit it
            assign_perm('change_layer_style', bobby, layer)
            perm_spec = {
                'users': {
                    'bobby': [
                        'view_resourcebase',
                        'change_resourcebase',
                    ]
                }
            }
            layer.set_permissions(perm_spec)
            response = self.client.get(url)
            self.assertEquals(response.status_code, 200)
            response = self.client.put(
                url, sld, content_type='application/vnd.ogc.sld+xml')
        finally:
            try:
                layer.delete()
            except BaseException:
                pass
Ejemplo n.º 19
0
    def test_unpublished(self):
        """Test permissions on an unpublished layer
        """

        thefile = os.path.join(gisdata.VECTOR_DATA,
                               'san_andres_y_providencia_poi.shp')
        layer = file_upload(thefile, overwrite=True)
        layer.set_default_permissions()
        check_layer(layer)

        # we need some time to have the service up and running
        time.sleep(20)

        # request getCapabilities: layer must be there as it is published and
        # advertised: we need to check if in response there is
        # <Name>geonode:san_andres_y_providencia_water</Name>
        url = 'http://localhost:8080/geoserver/ows?' \
            'service=wms&version=1.3.0&request=GetCapabilities'
        str_to_check = '<Name>geonode:san_andres_y_providencia_poi</Name>'
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        self.assertTrue(any(str_to_check in s for s in response.readlines()))

        # by default the uploaded layer is
        self.assertTrue(layer.is_published, True)

        # Clean up and completely delete the layer
        layer.delete()

        # with settings disabled
        with self.settings(RESOURCE_PUBLISHING=True):

            thefile = os.path.join(
                gisdata.VECTOR_DATA,
                'san_andres_y_providencia_administrative.shp')
            layer = file_upload(thefile, overwrite=True)
            layer.set_default_permissions()
            check_layer(layer)

            # we need some time to have the service up and running
            time.sleep(20)

            str_to_check = '<Name>san_andres_y_providencia_administrative</Name>'

            # by default the uploaded layer must be unpublished
            self.assertEqual(layer.is_published, False)

            # check the layer is not in GetCapabilities
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            self.assertFalse(
                any(str_to_check in s for s in response.readlines()))

            # now test with published layer
            resource = layer.get_self_resource()
            resource.is_published = True
            resource.save()

            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            self.assertTrue(
                any(str_to_check in s for s in response.readlines()))

            # Clean up and completely delete the layer
            layer.delete()
Ejemplo n.º 20
0
    def test_layer_upload_with_time(self):
        """ Try uploading a layer and verify that the user can administrate
        his own layer despite not being a site administrator.
        """
        try:
            # user without change_layer_style cannot edit it
            self.assertTrue(self.client.login(username='******', password='******'))

            # grab bobby
            bobby = get_user_model().objects.get(username="******")
            anonymous_group, created = Group.objects.get_or_create(name='anonymous')

            # Upload to GeoServer
            saved_layer = geoserver_upload(
                Layer(),
                os.path.join(
                    gisdata.GOOD_DATA,
                    'time/'
                    "boxes_with_date.shp"),
                bobby,
                'boxes_with_date_by_bobby',
                overwrite=True
            )

            # Test that layer owner can wipe GWC Cache
            ignore_errors = False
            skip_unadvertised = False
            skip_geonode_registered = False
            remove_deleted = True
            verbosity = 2
            owner = bobby
            workspace = 'geonode'
            filter = None
            store = None
            permissions = {
                'users': {"bobby": ['view_resourcebase', 'change_layer_data']},
                'groups': {anonymous_group: ['view_resourcebase']},
            }
            gs_slurp(
                ignore_errors,
                verbosity=verbosity,
                owner=owner,
                workspace=workspace,
                store=store,
                filter=filter,
                skip_unadvertised=skip_unadvertised,
                skip_geonode_registered=skip_geonode_registered,
                remove_deleted=remove_deleted,
                permissions=permissions,
                execute_signals=True)

            saved_layer = Layer.objects.get(title='boxes_with_date_by_bobby')
            check_layer(saved_layer)

            from lxml import etree
            from geonode.geoserver.helpers import get_store
            from geonode.geoserver.signals import gs_catalog

            self.assertIsNotNone(saved_layer)
            workspace, name = saved_layer.alternate.split(':')
            self.assertIsNotNone(workspace)
            self.assertIsNotNone(name)
            ws = gs_catalog.get_workspace(workspace)
            self.assertIsNotNone(ws)
            store = get_store(gs_catalog, saved_layer.store, workspace=ws)
            self.assertIsNotNone(store)

            url = settings.OGC_SERVER['default']['LOCATION']
            user = settings.OGC_SERVER['default']['USER']
            passwd = settings.OGC_SERVER['default']['PASSWORD']

            rest_path = 'rest/workspaces/geonode/datastores/{lyr_name}/featuretypes/{lyr_name}.xml'.\
                format(lyr_name=name)
            import requests
            from requests.auth import HTTPBasicAuth
            r = requests.get(url + rest_path,
                             auth=HTTPBasicAuth(user, passwd))
            self.assertEquals(r.status_code, 200)
            _log(r.text)

            featureType = etree.ElementTree(etree.fromstring(r.text))
            metadata = featureType.findall('./[metadata]')
            self.assertEquals(len(metadata), 0)

            payload = """<featureType>
            <metadata>
                <entry key="elevation">
                    <dimensionInfo>
                        <enabled>false</enabled>
                    </dimensionInfo>
                </entry>
                <entry key="time">
                    <dimensionInfo>
                        <enabled>true</enabled>
                        <attribute>date</attribute>
                        <presentation>LIST</presentation>
                        <units>ISO8601</units>
                        <defaultValue/>
                        <nearestMatchEnabled>false</nearestMatchEnabled>
                    </dimensionInfo>
                </entry>
            </metadata></featureType>"""

            r = requests.put(url + rest_path,
                             data=payload,
                             headers={
                                 'Content-type': 'application/xml'
                             },
                             auth=HTTPBasicAuth(user, passwd))
            self.assertEquals(r.status_code, 200)

            r = requests.get(url + rest_path,
                             auth=HTTPBasicAuth(user, passwd))
            self.assertEquals(r.status_code, 200)
            _log(r.text)

            featureType = etree.ElementTree(etree.fromstring(r.text))
            metadata = featureType.findall('./[metadata]')
            _log(etree.tostring(metadata[0], encoding='utf8', method='xml'))
            self.assertEquals(len(metadata), 1)

            saved_layer.set_default_permissions()

            from geonode.geoserver.views import get_layer_capabilities
            capab = get_layer_capabilities(saved_layer, tolerant=True)
            self.assertIsNotNone(capab)
            wms_capabilities_url = reverse('capabilities_layer', args=[saved_layer.id])
            wms_capabilities_resp = self.client.get(wms_capabilities_url)
            self.assertTrue(wms_capabilities_resp.status_code, 200)

            all_times = None

            if wms_capabilities_resp.status_code >= 200 and wms_capabilities_resp.status_code < 400:
                wms_capabilities = wms_capabilities_resp.getvalue()
                if wms_capabilities:
                    namespaces = {'wms': 'http://www.opengis.net/wms',
                                  'xlink': 'http://www.w3.org/1999/xlink',
                                  'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}

                    e = etree.fromstring(wms_capabilities)
                    for atype in e.findall(
                            "./[wms:Name='%s']/wms:Dimension[@name='time']" % (saved_layer.alternate), namespaces):
                        dim_name = atype.get('name')
                        if dim_name:
                            dim_name = str(dim_name).lower()
                            if dim_name == 'time':
                                dim_values = atype.text
                                if dim_values:
                                    all_times = dim_values.split(",")
                                    break

            self.assertIsNotNone(all_times)
            self.assertEquals(all_times,
                              ['2000-03-01T00:00:00.000Z', '2000-03-02T00:00:00.000Z',
                               '2000-03-03T00:00:00.000Z', '2000-03-04T00:00:00.000Z',
                               '2000-03-05T00:00:00.000Z', '2000-03-06T00:00:00.000Z',
                               '2000-03-07T00:00:00.000Z', '2000-03-08T00:00:00.000Z',
                               '2000-03-09T00:00:00.000Z', '2000-03-10T00:00:00.000Z',
                               '2000-03-11T00:00:00.000Z', '2000-03-12T00:00:00.000Z',
                               '2000-03-13T00:00:00.000Z', '2000-03-14T00:00:00.000Z',
                               '2000-03-15T00:00:00.000Z', '2000-03-16T00:00:00.000Z',
                               '2000-03-17T00:00:00.000Z', '2000-03-18T00:00:00.000Z',
                               '2000-03-19T00:00:00.000Z', '2000-03-20T00:00:00.000Z',
                               '2000-03-21T00:00:00.000Z', '2000-03-22T00:00:00.000Z',
                               '2000-03-23T00:00:00.000Z', '2000-03-24T00:00:00.000Z',
                               '2000-03-25T00:00:00.000Z', '2000-03-26T00:00:00.000Z',
                               '2000-03-27T00:00:00.000Z', '2000-03-28T00:00:00.000Z',
                               '2000-03-29T00:00:00.000Z', '2000-03-30T00:00:00.000Z',
                               '2000-03-31T00:00:00.000Z', '2000-04-01T00:00:00.000Z',
                               '2000-04-02T00:00:00.000Z', '2000-04-03T00:00:00.000Z',
                               '2000-04-04T00:00:00.000Z', '2000-04-05T00:00:00.000Z',
                               '2000-04-06T00:00:00.000Z', '2000-04-07T00:00:00.000Z',
                               '2000-04-08T00:00:00.000Z', '2000-04-09T00:00:00.000Z',
                               '2000-04-10T00:00:00.000Z', '2000-04-11T00:00:00.000Z',
                               '2000-04-12T00:00:00.000Z', '2000-04-13T00:00:00.000Z',
                               '2000-04-14T00:00:00.000Z', '2000-04-15T00:00:00.000Z',
                               '2000-04-16T00:00:00.000Z', '2000-04-17T00:00:00.000Z',
                               '2000-04-18T00:00:00.000Z', '2000-04-19T00:00:00.000Z',
                               '2000-04-20T00:00:00.000Z', '2000-04-21T00:00:00.000Z',
                               '2000-04-22T00:00:00.000Z', '2000-04-23T00:00:00.000Z',
                               '2000-04-24T00:00:00.000Z', '2000-04-25T00:00:00.000Z',
                               '2000-04-26T00:00:00.000Z', '2000-04-27T00:00:00.000Z',
                               '2000-04-28T00:00:00.000Z', '2000-04-29T00:00:00.000Z',
                               '2000-04-30T00:00:00.000Z', '2000-05-01T00:00:00.000Z',
                               '2000-05-02T00:00:00.000Z', '2000-05-03T00:00:00.000Z',
                               '2000-05-04T00:00:00.000Z', '2000-05-05T00:00:00.000Z',
                               '2000-05-06T00:00:00.000Z', '2000-05-07T00:00:00.000Z',
                               '2000-05-08T00:00:00.000Z', '2000-05-09T00:00:00.000Z',
                               '2000-05-10T00:00:00.000Z', '2000-05-11T00:00:00.000Z',
                               '2000-05-12T00:00:00.000Z', '2000-05-13T00:00:00.000Z',
                               '2000-05-14T00:00:00.000Z', '2000-05-15T00:00:00.000Z',
                               '2000-05-16T00:00:00.000Z', '2000-05-17T00:00:00.000Z',
                               '2000-05-18T00:00:00.000Z', '2000-05-19T00:00:00.000Z',
                               '2000-05-20T00:00:00.000Z', '2000-05-21T00:00:00.000Z',
                               '2000-05-22T00:00:00.000Z', '2000-05-23T00:00:00.000Z',
                               '2000-05-24T00:00:00.000Z', '2000-05-25T00:00:00.000Z',
                               '2000-05-26T00:00:00.000Z', '2000-05-27T00:00:00.000Z',
                               '2000-05-28T00:00:00.000Z', '2000-05-29T00:00:00.000Z',
                               '2000-05-30T00:00:00.000Z', '2000-05-31T00:00:00.000Z',
                               '2000-06-01T00:00:00.000Z', '2000-06-02T00:00:00.000Z',
                               '2000-06-03T00:00:00.000Z', '2000-06-04T00:00:00.000Z',
                               '2000-06-05T00:00:00.000Z', '2000-06-06T00:00:00.000Z',
                               '2000-06-07T00:00:00.000Z', '2000-06-08T00:00:00.000Z'])

            saved_layer.set_default_permissions()
            url = reverse('layer_metadata', args=[saved_layer.service_typename])
            resp = self.client.get(url)
            self.assertEquals(resp.status_code, 200)
        finally:
            # Clean up and completely delete the layer
            try:
                saved_layer.delete()
                if check_ogc_backend(geoserver.BACKEND_PACKAGE):
                    from geonode.geoserver.helpers import cleanup
                    cleanup(saved_layer.name, saved_layer.uuid)
            except BaseException:
                pass