From cb75c6e800e3474125eda7d7524adbd600616345 Mon Sep 17 00:00:00 2001 From: Marco Volpini Date: Mon, 14 Dec 2020 08:24:53 +0100 Subject: [PATCH] #161 Preserve the SRID of allowed area when retrieving it through AccessInfo --- .../services/util/AccessInfoInternal.java | 9 ++- .../services/RuleAdminServiceImplTest.java | 4 ++ .../services/RuleReaderServiceImplTest.java | 59 ++++++++++++++++--- 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/src/services/core/services-impl/src/main/java/org/geoserver/geofence/services/util/AccessInfoInternal.java b/src/services/core/services-impl/src/main/java/org/geoserver/geofence/services/util/AccessInfoInternal.java index 42963a56..cfe4a5af 100644 --- a/src/services/core/services-impl/src/main/java/org/geoserver/geofence/services/util/AccessInfoInternal.java +++ b/src/services/core/services-impl/src/main/java/org/geoserver/geofence/services/util/AccessInfoInternal.java @@ -148,8 +148,13 @@ public AccessInfo toAccessInfo() { ret.setAttributes(attributes == null ? null : new HashSet(attributes)); ret.setCqlFilterRead(cqlFilterRead); ret.setCqlFilterWrite(cqlFilterWrite); - if(area != null) - ret.setAreaWkt(area.toText()); + if(area != null) { + String txtArea = area.toText(); + if (area.getSRID()!=0){ + txtArea="SRID="+area.getSRID()+";"+txtArea; + } + ret.setAreaWkt(txtArea); + } ret.setCatalogMode(mapCatalogModeDTO(catalogMode)); return ret; diff --git a/src/services/core/services-impl/src/test/java/org/geoserver/geofence/services/RuleAdminServiceImplTest.java b/src/services/core/services-impl/src/test/java/org/geoserver/geofence/services/RuleAdminServiceImplTest.java index ef630582..97f4b7f0 100644 --- a/src/services/core/services-impl/src/test/java/org/geoserver/geofence/services/RuleAdminServiceImplTest.java +++ b/src/services/core/services-impl/src/test/java/org/geoserver/geofence/services/RuleAdminServiceImplTest.java @@ -28,6 +28,10 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.MultiPolygon; +import org.locationtech.jts.io.ParseException; +import org.locationtech.jts.io.WKTReader; /** * diff --git a/src/services/core/services-impl/src/test/java/org/geoserver/geofence/services/RuleReaderServiceImplTest.java b/src/services/core/services-impl/src/test/java/org/geoserver/geofence/services/RuleReaderServiceImplTest.java index 2944ed43..94c9af74 100644 --- a/src/services/core/services-impl/src/test/java/org/geoserver/geofence/services/RuleReaderServiceImplTest.java +++ b/src/services/core/services-impl/src/test/java/org/geoserver/geofence/services/RuleReaderServiceImplTest.java @@ -5,15 +5,11 @@ package org.geoserver.geofence.services; +import org.geoserver.geofence.core.model.*; +import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; -import org.geoserver.geofence.core.model.GSUser; -import org.geoserver.geofence.core.model.IPAddressRange; -import org.geoserver.geofence.core.model.LayerAttribute; -import org.geoserver.geofence.core.model.LayerDetails; -import org.geoserver.geofence.core.model.UserGroup; -import org.geoserver.geofence.core.model.Rule; import org.geoserver.geofence.core.model.enums.AccessType; import org.geoserver.geofence.core.model.enums.GrantType; import org.geoserver.geofence.services.dto.AccessInfo; @@ -26,7 +22,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; -import org.geoserver.geofence.core.model.AdminRule; + import org.geoserver.geofence.core.model.enums.AdminGrantType; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -740,4 +736,53 @@ public void testAdminRules() { assertTrue(accessInfo.getAdminRights()); } + @Test + public void testRuleLimitsAllowedAreaSRIDIsPreserved() throws NotFoundServiceEx, ParseException { + // test that the original SRID is present in the allowedArea wkt representation, + // when retrieving it from the AccessInfo object + Long id =null; + Long id2=null; + try { + { + Rule r1 = new Rule(10, null, null, null, null, "s1", "r1", "w1", "l1", GrantType.LIMIT); + ruleAdminService.insert(r1); + id = r1.getId(); + } + + { + Rule r2 = new Rule(11, null, null, null, null, "s1", "r1", "w1", "l1", GrantType.ALLOW); + id2 = ruleAdminService.insert(r2); + } + + // save limits and check it has been saved + { + RuleLimits limits = new RuleLimits(); + String wkt = "MULTIPOLYGON(((0.0016139656066815888 -0.0006386457758059581,0.0019599705696027314 -0.0006386457758059581,0.0019599705696027314 -0.0008854090051601674,0.0016139656066815888 -0.0008854090051601674,0.0016139656066815888 -0.0006386457758059581)))"; + Geometry allowedArea = new WKTReader().read(wkt); + allowedArea.setSRID(3857); + limits.setAllowedArea((MultiPolygon) allowedArea); + ruleAdminService.setLimits(id, limits); + } + + { + RuleFilter filter = new RuleFilter(SpecialFilterType.ANY, true); + filter.setWorkspace("w1"); + filter.setService("s1"); + filter.setRequest("r1"); + filter.setLayer("l1"); + AccessInfo accessInfo = ruleReaderService.getAccessInfo(filter); + String[] wktAr = accessInfo.getAreaWkt().split(";"); + assertEquals("SRID=3857", wktAr[0]); + + } + } finally { + + if(id!=null) + ruleAdminService.delete(id); + if (id2!=null) + ruleAdminService.delete(id2); + + } + } + }