Skip to content

Commit 2fbd233

Browse files
lpasqualiAlessio Fabiani
and
Alessio Fabiani
authored
[master] bump to GeoServer 2.19.x (GeoNode#8127)
* bump to 2.19.x * [CircleCI] Fix tests * [CircleCI] Fix tests * [CircleCI] Fix tests * fixed remaining dropbox links pointing to artifacts and replaced with correct ones for geoserver 2.19.x * fix for circleci, letsencrypt Dockerfile movced in scripts/docker * [CircleCI] Fix tests * [CircleCI] Fix tests * fix letencrypt new path * [CircleCI] Fix tests * [CircleCI] Fix tests Co-authored-by: Alessio Fabiani <alessio.fabiani@geo-solutions.it>
1 parent 95f8924 commit 2fbd233

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+57
-1828
lines changed

.circleci/config.yml

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ version: 2.1
33
jobs:
44
build:
55

6+
parallelism: 1
7+
68
docker:
79
- image: circleci/buildpack-deps:focal
810

dev_config.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
2-
GEOSERVER_URL: "https://www.dropbox.com/s/xlich7pmneaupqp/geoserver-2.18.2.war?dl=1"
3-
DATA_DIR_URL: "https://www.dropbox.com/s/q0qc2t7d9alo9fk/data-2.18.2.zip?dl=1"
2+
GEOSERVER_URL: "https://artifacts.geonode.org/geoserver/2.19.x/geoserver.war"
3+
DATA_DIR_URL: "https://artifacts.geonode.org/geoserver/2.19.x/geonode-geoserver-ext-web-app-data.zip"
44
JETTY_RUNNER_URL: "https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-runner/9.4.31.v20200723/jetty-runner-9.4.31.v20200723.jar"
55
WINDOWS:
66
py2exe: "http://downloads.sourceforge.net/project/py2exe/py2exe/0.6.9/py2exe-0.6.9.win32-py2.7.exe"

docker-compose-geoserver-server.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ version: '2.2'
22
services:
33

44
data-dir-conf:
5-
image: geonode/geoserver_data:2.18.2
5+
image: geonode/geoserver_data:2.19.x
66
restart: on-failure
77
container_name: gsconf4${COMPOSE_PROJECT_NAME}
88
labels:
@@ -13,7 +13,7 @@ services:
1313
- geoserver-data-dir:/geoserver_data/data
1414

1515
geoserver:
16-
image: geonode/geoserver:2.18.2
16+
image: geonode/geoserver:2.19.x
1717
restart: unless-stopped
1818
container_name: geoserver4${COMPOSE_PROJECT_NAME}
1919
stdin_open: true

docker-compose-test.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ services:
7272
# Gets and installs letsencrypt certificates
7373
letsencrypt:
7474
image: geonode/spcgeonode:letsencrypt-3.1
75-
build: ./scripts/spcgeonode/letsencrypt/
75+
build: ./scripts/docker/letsencrypt/
7676
container_name: letsencrypt4${COMPOSE_PROJECT_NAME}
7777
environment:
7878
- HTTPS_HOST=${HTTPS_HOST}
@@ -85,7 +85,7 @@ services:
8585

8686
# Geoserver backend
8787
geoserver:
88-
image: geonode/geoserver:2.18.2
88+
image: geonode/geoserver:2.19.x
8989
container_name: geoserver4${COMPOSE_PROJECT_NAME}
9090
healthcheck:
9191
test: "curl --fail --silent --write-out 'HTTP CODE : %{http_code}\n' --output /dev/null http://127.0.0.1:8080/geoserver/rest/workspaces/geonode.html"
@@ -104,7 +104,7 @@ services:
104104
restart: on-failure
105105

106106
data-dir-conf:
107-
image: geonode/geoserver_data:2.18.2
107+
image: geonode/geoserver_data:2.19.x
108108
container_name: gsconf4${COMPOSE_PROJECT_NAME}
109109
command: /bin/true
110110
volumes:

docker-compose.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ services:
7272
# Gets and installs letsencrypt certificates
7373
letsencrypt:
7474
image: geonode/spcgeonode:letsencrypt-3.1
75-
build: ./scripts/spcgeonode/letsencrypt/
75+
build: ./scripts/docker/letsencrypt/
7676
container_name: letsencrypt4${COMPOSE_PROJECT_NAME}
7777
environment:
7878
- HTTPS_HOST=${HTTPS_HOST}
@@ -85,7 +85,7 @@ services:
8585

8686
# Geoserver backend
8787
geoserver:
88-
image: geonode/geoserver:2.18.2
88+
image: geonode/geoserver:2.19.x
8989
container_name: geoserver4${COMPOSE_PROJECT_NAME}
9090
healthcheck:
9191
test: "curl --fail --silent --write-out 'HTTP CODE : %{http_code}\n' --output /dev/null http://127.0.0.1:8080/geoserver/rest/workspaces/geonode.html"
@@ -104,7 +104,7 @@ services:
104104
restart: on-failure
105105

106106
data-dir-conf:
107-
image: geonode/geoserver_data:2.18.2
107+
image: geonode/geoserver_data:2.19.x
108108
container_name: gsconf4${COMPOSE_PROJECT_NAME}
109109
command: /bin/true
110110
volumes:

geonode/geoserver/security.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ def purge_geofence_dataset_rules(resource):
229229
headers = {'Content-type': 'application/json'}
230230
workspace = get_dataset_workspace(resource.dataset)
231231
dataset_name = resource.dataset.name if resource.dataset and hasattr(resource.dataset, 'name') \
232-
else resource.dataset.alternate.split(":")[0]
232+
else resource.dataset.alternate
233233
try:
234234
r = requests.get(
235235
f"{url}rest/geofence/rules.json?workspace={workspace}&layer={dataset_name}",
@@ -448,7 +448,7 @@ def set_geofence_all(instance):
448448
logger.debug(f"Inside set_geofence_all for instance {instance}")
449449
workspace = get_dataset_workspace(resource.dataset)
450450
dataset_name = resource.dataset.name if resource.dataset and hasattr(resource.dataset, 'name') \
451-
else resource.dataset.alternate.split(":")[0]
451+
else resource.dataset.alternate
452452
logger.debug(f"going to work in workspace {workspace}")
453453
try:
454454
url = settings.OGC_SERVER['default']['LOCATION']
@@ -493,7 +493,7 @@ def sync_geofence_with_guardian(dataset, perms, user=None, group=None, group_per
493493
"""
494494
Sync Guardian permissions to GeoFence.
495495
"""
496-
_dataset_name = dataset.name if dataset and hasattr(dataset, 'name') else dataset.alternate.split(":")[0]
496+
_dataset_name = dataset.name if dataset and hasattr(dataset, 'name') else dataset.alternate
497497
_dataset_workspace = get_dataset_workspace(dataset)
498498
# Create new rule-set
499499
gf_services = _get_gf_services(dataset, perms)

geonode/geoserver/tests/test_manager.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#
1818
#########################################################################
1919
import os
20+
import base64
2021
import shutil
2122
import gisdata
2223
import requests
@@ -57,15 +58,21 @@ def tearDown(self) -> None:
5758
def test_revise_resource_value_in_append_should_add_expected_rows_in_the_catalog(self):
5859
layer = Dataset.objects.get(name=self.sut.name)
5960
_gs_import_session_info = self.geoserver_manager._revise_resource_value(layer, list(self.files_as_dict.values()), self.user, action_type="append")
60-
result = requests.get(f'{self.geoserver_url}/rest/imports/{_gs_import_session_info.import_session.id}')
61+
basic_auth = base64.b64encode(b'admin:geoserver')
62+
result = requests.get(
63+
f'{self.geoserver_url}/rest/imports/{_gs_import_session_info.import_session.id}',
64+
headers={"Authorization": f"Basic {basic_auth.decode('utf-8')}"})
6165
self.assertEqual(result.status_code, 200)
6266
self.assertEqual(result.json().get('import').get('state'), enumerations.STATE_COMPLETE)
6367

6468
@on_ogc_backend(geoserver.BACKEND_PACKAGE)
6569
def test_revise_resource_value_in_replace_should_add_expected_rows_in_the_catalog(self):
6670
layer = Dataset.objects.get(name=self.sut.name)
6771
_gs_import_session_info = self.geoserver_manager._revise_resource_value(layer, list(self.files_as_dict.values()), self.user, action_type="replace")
68-
result = requests.get(f'{self.geoserver_url}/rest/imports/{_gs_import_session_info.import_session.id}')
72+
basic_auth = base64.b64encode(b'admin:geoserver')
73+
result = requests.get(
74+
f'{self.geoserver_url}/rest/imports/{_gs_import_session_info.import_session.id}',
75+
headers={"Authorization": f"Basic {basic_auth.decode('utf-8')}"})
6976
self.assertEqual(result.status_code, 200)
7077
self.assertEqual(result.json().get('import').get('state'), enumerations.STATE_COMPLETE)
7178

geonode/geoserver/views.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,10 @@ def _response_callback(**kwargs):
543543
# Replace Proxy URL
544544
try:
545545
if isinstance(content, bytes):
546-
_content = content.decode('UTF-8')
546+
try:
547+
_content = content.decode('UTF-8')
548+
except UnicodeDecodeError:
549+
_content = content
547550
else:
548551
_content = content
549552
if re.findall(f"(?=(\\b{'|'.join(content_type_list)}\\b))", content_type):

geonode/security/tests.py

+29-67
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import importlib
2424

2525
from requests.auth import HTTPBasicAuth
26-
from urllib.request import urlopen, Request
2726
from tastypie.test import ResourceTestCaseMixin
2827

2928
from django.db.models import Q
@@ -47,7 +46,6 @@
4746
from geonode.tests.utils import check_dataset
4847
from geonode.decorators import on_ogc_backend
4948
from geonode.geoserver.helpers import gs_slurp
50-
from geonode.people.utils import get_valid_user
5149
from geonode.resource.manager import resource_manager
5250
from geonode.tests.base import GeoNodeBaseTestSupport
5351
from geonode.groups.models import Group, GroupProfile
@@ -667,7 +665,7 @@ def test_perm_specs_synchronization(self):
667665

668666
self.assertTrue('limits' in rule)
669667
rule_limits = rule['limits']
670-
self.assertEqual(rule_limits['allowedArea'], 'MULTIPOLYGON (((145.8046418749977 -42.49606500060302, \
668+
self.assertEqual(rule_limits['allowedArea'], 'SRID=4326;MULTIPOLYGON (((145.8046418749977 -42.49606500060302, \
671669
146.7000276171853 -42.53655428642583, 146.7110139453067 -43.07256577359489, \
672670
145.9804231249952 -43.05651288026286, 145.8046418749977 -42.49606500060302)))')
673671
self.assertEqual(rule_limits['catalogMode'], 'MIXED')
@@ -707,7 +705,7 @@ def test_perm_specs_synchronization(self):
707705

708706
self.assertTrue('limits' in rule)
709707
rule_limits = rule['limits']
710-
self.assertEqual(rule_limits['allowedArea'], 'MULTIPOLYGON (((145.8046418749977 -42.49606500060302, \
708+
self.assertEqual(rule_limits['allowedArea'], 'SRID=4326;MULTIPOLYGON (((145.8046418749977 -42.49606500060302, \
711709
146.7000276171853 -42.53655428642583, 146.7110139453067 -43.07256577359489, \
712710
145.9804231249952 -43.05651288026286, 145.8046418749977 -42.49606500060302)))')
713711
self.assertEqual(rule_limits['catalogMode'], 'MIXED')
@@ -743,7 +741,7 @@ def test_perm_specs_synchronization(self):
743741
self.assertTrue('limits' in rule)
744742
rule_limits = rule['limits']
745743
self.assertEqual(
746-
rule_limits['allowedArea'], 'MULTIPOLYGON (((145.8046418749977 -42.49606500060302, 146.7000276171853 \
744+
rule_limits['allowedArea'], 'SRID=4326;MULTIPOLYGON (((145.8046418749977 -42.49606500060302, 146.7000276171853 \
747745
-42.53655428642583, 146.7110139453067 -43.07256577359489, 145.9804231249952 \
748746
-43.05651288026286, 145.8046418749977 -42.49606500060302)))')
749747
self.assertEqual(rule_limits['catalogMode'], 'MIXED')
@@ -979,59 +977,39 @@ def test_dataset_upload_with_time(self):
979977
def test_dataset_permissions(self):
980978
# Test permissions on a layer
981979
bobby = get_user_model().objects.get(username="bobby")
982-
layer = create_single_dataset('san_andres_y_providencia_poi.shp')
980+
layer = create_single_dataset('san_andres_y_providencia_poi')
983981
layer = resource_manager.update(
984982
layer.uuid,
985983
instance=layer,
986984
notify=False,
987985
vals=dict(
988-
owner=bobby
986+
owner=bobby,
987+
workspace=settings.DEFAULT_WORKSPACE
989988
))
990989

991990
self.assertIsNotNone(layer)
992991
self.assertIsNotNone(layer.ows_url)
993992
self.assertIsNotNone(layer.ptype)
994993
self.assertIsNotNone(layer.sourcetype)
994+
self.assertEqual(layer.alternate, 'geonode:san_andres_y_providencia_poi')
995995

996996
# Reset GeoFence Rules
997997
purge_geofence_all()
998998
geofence_rules_count = get_geofence_rules_count()
999-
self.assertTrue(geofence_rules_count == 0)
1000-
1001-
ignore_errors = True
1002-
skip_unadvertised = False
1003-
skip_geonode_registered = False
1004-
remove_deleted = True
1005-
verbosity = 2
1006-
owner = get_valid_user('admin')
1007-
workspace = 'geonode'
1008-
filter = None
1009-
store = None
1010-
permissions = {'users': {"admin": ['change_dataset_data']}, 'groups': []}
1011-
gs_slurp(
1012-
ignore_errors=ignore_errors,
1013-
verbosity=verbosity,
1014-
owner=owner,
1015-
console=StreamToLogger(logger, logging.INFO),
1016-
workspace=workspace,
1017-
store=store,
1018-
filter=filter,
1019-
skip_unadvertised=skip_unadvertised,
1020-
skip_geonode_registered=skip_geonode_registered,
1021-
remove_deleted=remove_deleted,
1022-
permissions=permissions,
1023-
execute_signals=True)
999+
self.assertEqual(geofence_rules_count, 0)
10241000

1025-
layer = Dataset.objects.get(name='san_andres_y_providencia_poi.shp')
1001+
layer = Dataset.objects.get(name='san_andres_y_providencia_poi')
1002+
layer.set_default_permissions(owner=bobby)
10261003
check_dataset(layer)
10271004
geofence_rules_count = get_geofence_rules_count()
10281005
_log(f"0. geofence_rules_count: {geofence_rules_count} ")
1029-
self.assertTrue(geofence_rules_count >= 2)
1006+
self.assertGreaterEqual(geofence_rules_count, 4)
10301007

10311008
# Set the layer private for not authenticated users
1032-
layer.set_permissions({'users': {'AnonymousUser': []}, 'groups': []})
1009+
perm_spec = {'users': {'AnonymousUser': []}, 'groups': []}
1010+
layer.set_permissions(perm_spec)
10331011

1034-
url = f'{settings.GEOSERVER_LOCATION}geonode/ows?' \
1012+
url = f'{settings.SITEURL}gs/ows?' \
10351013
'LAYERS=geonode%3Asan_andres_y_providencia_poi&STYLES=' \
10361014
'&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap' \
10371015
'&SRS=EPSG%3A4326' \
@@ -1040,44 +1018,28 @@ def test_dataset_permissions(self):
10401018
'&WIDTH=217&HEIGHT=512'
10411019

10421020
# test view_resourcebase permission on anonymous user
1043-
request = Request(url)
1044-
response = urlopen(request)
1045-
_content_type = response.getheader('Content-Type').lower()
1021+
response = requests.get(url)
1022+
self.assertTrue(response.status_code, 404)
10461023
self.assertEqual(
1047-
_content_type,
1048-
'application/vnd.ogc.se_xml;charset=utf-8'
1024+
response.headers.get('Content-Type'),
1025+
'application/vnd.ogc.se_xml;charset=UTF-8'
10491026
)
10501027

1051-
# test WMS with authenticated user that has not view_resourcebase:
1052-
# the layer must be not accessible (response is xml)
1053-
request = Request(url)
1054-
basic_auth = base64.b64encode(b'bobby:bob')
1055-
request.add_header("Authorization", f"Basic {basic_auth.decode('utf-8')}")
1056-
response = urlopen(request)
1057-
_content_type = response.getheader('Content-Type').lower()
1028+
# test WMS with authenticated user that has access to the Layer
1029+
response = requests.get(url, auth=HTTPBasicAuth(username=settings.OGC_SERVER['default']['USER'], password=settings.OGC_SERVER['default']['PASSWORD']))
1030+
self.assertTrue(response.status_code, 200)
10581031
self.assertEqual(
1059-
_content_type,
1060-
'application/vnd.ogc.se_xml;charset=utf-8'
1032+
response.headers.get('Content-Type'),
1033+
'image/png'
10611034
)
10621035

1063-
# test WMS with authenticated user that has view_resourcebase: the layer
1064-
# must be accessible (response is image)
1065-
perm_spec = {
1066-
'users': {
1067-
'bobby': ['view_resourcebase',
1068-
'download_resourcebase']
1069-
},
1070-
'groups': []
1071-
}
1072-
layer.set_permissions(perm_spec)
1073-
request = Request(url)
1074-
basic_auth = base64.b64encode(b'bobby:bob')
1075-
request.add_header("Authorization", f"Basic {basic_auth.decode('utf-8')}")
1076-
response = urlopen(request)
1077-
_content_type = response.getheader('Content-Type').lower()
1036+
# test WMS with authenticated user that has no view_resourcebase:
1037+
# the layer should be not accessible
1038+
response = requests.get(url, auth=HTTPBasicAuth(username='norman', password='norman'))
1039+
self.assertTrue(response.status_code, 404)
10781040
self.assertEqual(
1079-
_content_type,
1080-
'application/vnd.ogc.se_xml;charset=utf-8'
1041+
response.headers.get('Content-Type'),
1042+
'text/html;charset=utf-8'
10811043
)
10821044

10831045
# test change_dataset_style
File renamed without changes.
File renamed without changes.

scripts/spcgeonode/.dockerignore

-7
This file was deleted.

0 commit comments

Comments
 (0)