diff --git a/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html b/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html index a852c864c2988cff7dbfc87921924d0b8801fcee..ae7dfe7e81bf293dd0de58083656bf912d162183 100644 --- a/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html +++ b/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html @@ -16,6 +16,8 @@ <input id="description_id" type="text" matInput formControlName="description" > + <smp-field-error *ngIf="inputDataError('description', 'maxlength')">{{ "group.dialog.error.group.description.length" | translate }} + </smp-field-error > </mat-form-field> diff --git a/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.ts b/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.ts index 7bb18b0fb79550aec3c14b84941a9e43dbff710e..6f24f1b9b81c12356f7607c3f3227dce511b99c8 100644 --- a/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.ts +++ b/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.ts @@ -39,7 +39,7 @@ export class GroupDialogComponent { this.groupForm = formBuilder.group({ 'name': new FormControl({value: null}, Validators.maxLength(512)), - 'description': new FormControl({value: null}), + 'description': new FormControl({value: null}, Validators.maxLength(1024)), 'visibility': new FormControl({value: null}), '': new FormControl({value: null}) }); diff --git a/smp-angular/src/assets/i18n/en.json b/smp-angular/src/assets/i18n/en.json index cf3fc495fde3ef289162c6cb85c9a0bd03d5c199..21eef02b49fd3562839039a75cce41d18920989c 100644 --- a/smp-angular/src/assets/i18n/en.json +++ b/smp-angular/src/assets/i18n/en.json @@ -247,6 +247,7 @@ "group.dialog.placeholder.group.visibility": "Group visibility", "group.dialog.tooltip.group.visibility": "Group visibility.", "group.dialog.error.group.name.length": "Group name must not be empty and shorter than 512 characters.", + "group.dialog.error.group.description.length": "Group description must be shorter than 1024 characters.", "domain.group.button.create": "Create", "domain.group.button.delete": "Delete", "domain.group.button.edit": "Edit data", diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java index 93b25d5d66497fdd9cba54d4bb66bf05a981927a..ec87357c12858a960a1df8e149ae2ad15b511472 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java @@ -155,8 +155,8 @@ public class ResourceDao extends BaseDao<DBResource> { query.setMaxResults(iPageSize); } query.setParameter(PARAM_USER_ID, user != null ? user.getId() : null); - query.setParameter(PARAM_RESOURCE_SCHEME, StringUtils.isBlank(schema) ? null : StringUtils.wrapIfMissing(schema, "%")); - query.setParameter(PARAM_RESOURCE_IDENTIFIER, StringUtils.isBlank(identifier) ? null : StringUtils.wrapIfMissing(identifier, "%")); + query.setParameter(PARAM_RESOURCE_SCHEME, getNormalizedLikeParameter(schema)); + query.setParameter(PARAM_RESOURCE_IDENTIFIER, getNormalizedLikeParameter(identifier)); query.setParameter(PARAM_DOMAIN_CODE, StringUtils.defaultIfBlank(domainCode, null)); query.setParameter(PARAM_DOCUMENT_TYPE, StringUtils.defaultIfBlank(documentType, null)); List<Tuple> resultList = query.getResultList(); @@ -170,6 +170,19 @@ public class ResourceDao extends BaseDao<DBResource> { }).collect(Collectors.toList()); } + /** + * Method 'Escapes' the \ characters of the value and wraps it with % if the value is not empty. + * @param value value to be "Normalized" and wrapped + * @return escaped value + */ + private String getNormalizedLikeParameter(String value) { + if (StringUtils.isBlank(value)){ + return null; + } + String escapedValue = value.replace("\\", "\\\\"); + return StringUtils.wrapIfMissing(escapedValue, "%"); + } + public Long getPublicResourcesSearchCount(DBUser user, String schema, String identifier, String domainCode, String documentType) { LOG.debug("Get resources count for user [{}], search scheme [{}] and search value [{}]", user, schema, identifier); TypedQuery<Long> query = memEManager.createNamedQuery(QUERY_RESOURCE_ALL_FOR_USER_COUNT, Long.class); diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDaoSearchTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDaoSearchTest.java index cbab7cad2186763c8e2139f64b9c6e33b6a94ed0..8aec3d2d51cb5103b394bb75fffbfd103ee7d3af 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDaoSearchTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDaoSearchTest.java @@ -19,11 +19,14 @@ package eu.europa.ec.edelivery.smp.data.dao; +import eu.europa.ec.edelivery.smp.data.enums.VisibilityType; import eu.europa.ec.edelivery.smp.data.model.doc.DBResource; import eu.europa.ec.edelivery.smp.data.model.doc.DBResourceFilter; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -143,4 +146,25 @@ class ResourceDaoSearchTest extends AbstractBaseDao { } + @ParameterizedTest + @CsvSource({ "'Get all public OK',0088:1234556-1234,test-test-test,,,2", + "'Search by identifier OK',0088:1234556-1234,test-test-test,0088:1234556-123,, 1", + "'Search by identifier partial OK',0088:1234556-1234,test-test-test,88:12,, 1", + "'Search by scheme partial OK',0088:1234556,test-test-test,,-test-, 1", + "'Search by chars OK',0088:#$%!@#$-1234,test-test-test,#$%!@#,, 1", + "'Search by '/' OK',0088/1234,test-test-test,88/12,, 1", + "'Search by '\\' OK',0088\\1234,test-test-test,88\\12,, 1", + }) + void testGetSearchSlashCharacter(String testDec, String identifierValue, String identifierScheme, String searchValue, String searcScheme, int cnt) { + LOG.info(testDec); + // given + testUtilsDao.createResource(identifierValue,identifierScheme, VisibilityType.PUBLIC, testUtilsDao.getDomainResourceDefD1R1(), testUtilsDao.getGroupD1G1() ); + // then + List<ResourceDao.DBResourceWrapper> result = testInstance.getPublicResourcesSearch(-1, -1, null, searcScheme, searchValue, null, null); + assertEquals(cnt, result.size()); + result.stream().forEach(val -> { + assertEquals(VisibilityType.PUBLIC, val.getDbResource().getVisibility()); + }); + } + } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/TestUtilsDao.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/TestUtilsDao.java index 995bd1c0a94e4f139395033c8a9626086350eb0b..ea8a02c12d9fe0f0dd307b84c6cc0899465ce38b 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/TestUtilsDao.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/TestUtilsDao.java @@ -373,39 +373,39 @@ public class TestUtilsDao { createUsers(); createResourceDefinitions(); - DBDomain publicDomain = createDomain("publicDomain", VisibilityType.PUBLIC); - DBDomain privateDomain = createDomain("privateDomain", VisibilityType.PRIVATE); + d1 = createDomain("publicDomain", VisibilityType.PUBLIC); + d2 = createDomain("privateDomain", VisibilityType.PRIVATE); - DBDomainResourceDef publicDomainResourceDef = registerDomainResourceDefinition(publicDomain, resourceDefSmp); - DBDomainResourceDef privateDomainResourceDef= registerDomainResourceDefinition(privateDomain, resourceDefSmp); - DBDomainResourceDef privateDomainResourceDef2= registerDomainResourceDefinition(privateDomain, resourceDefCpp); + domainResourceDefD1R1 = registerDomainResourceDefinition(d1, resourceDefSmp); + domainResourceDefD2R1 = registerDomainResourceDefinition(d2, resourceDefSmp); + DBDomainResourceDef privateDomainResourceDef2= registerDomainResourceDefinition(d2, resourceDefCpp); // membership of the domain - createDomainMembership(MembershipRoleType.VIEWER, user3, privateDomain); + createDomainMembership(MembershipRoleType.VIEWER, user3, d2); - DBGroup pubPubGroup = createGroup("pubPubGroup", VisibilityType.PUBLIC, publicDomain); - DBGroup pubPrivGroup = createGroup("pubPrivGroup", VisibilityType.PRIVATE, publicDomain); - DBGroup privPubGroup = createGroup("privPubGroup", VisibilityType.PUBLIC, privateDomain); - DBGroup privPrivGroup = createGroup("privPrivGroup", VisibilityType.PRIVATE, privateDomain); + groupD1G1 = createGroup("pubPubGroup", VisibilityType.PUBLIC, d1); + groupD1G2 = createGroup("pubPrivGroup", VisibilityType.PRIVATE, d1); + groupD2G1 = createGroup("privPubGroup", VisibilityType.PUBLIC, d2); + DBGroup privPrivGroup = createGroup("privPrivGroup", VisibilityType.PRIVATE, d2); createGroupMembership(MembershipRoleType.VIEWER, user4, privPrivGroup); - searchPubPubPubRes = createResource("pubPubPub", "1-1-1", VisibilityType.PUBLIC, publicDomainResourceDef, pubPubGroup); + searchPubPubPubRes = createResource("pubPubPub", "1-1-1", VisibilityType.PUBLIC, domainResourceDefD1R1, groupD1G1); searchPubPubPubSubRes = createSubresource(searchPubPubPubRes, "subres-pubPubPub", "s-1-1-1", DocumentVersionStatusType.PUBLISHED, subresourceDefSmp); - searchPubPubPrivRes = createResource("pubPubPriv", "2-2-2", VisibilityType.PRIVATE, publicDomainResourceDef, pubPubGroup); + searchPubPubPrivRes = createResource("pubPubPriv", "2-2-2", VisibilityType.PRIVATE, domainResourceDefD1R1, groupD1G1); searchPubPubPrivSubRes = createSubresource(searchPubPubPrivRes, "subres-pubPubPriv", "s-2-2-2", DocumentVersionStatusType.PUBLISHED, subresourceDefSmp); - searchPubPrivPubRes = createResource("pubPrivPub", "3-3-3", VisibilityType.PUBLIC, publicDomainResourceDef, pubPrivGroup); + searchPubPrivPubRes = createResource("pubPrivPub", "3-3-3", VisibilityType.PUBLIC, domainResourceDefD1R1, groupD1G2); searchPubPrivPubSubRes = createSubresource(searchPubPrivPubRes, "subres-pubPrivPub", "s-3-3-3", DocumentVersionStatusType.PUBLISHED, subresourceDefSmp); - searchPubPrivPrivRes = createResource("pubPrivPriv", "4-4-4", VisibilityType.PRIVATE, publicDomainResourceDef, pubPrivGroup); + searchPubPrivPrivRes = createResource("pubPrivPriv", "4-4-4", VisibilityType.PRIVATE, domainResourceDefD1R1, groupD1G2); searchPubPrivPrivSubRes = createSubresource(searchPubPrivPrivRes, "subres-pubPrivPriv", "s-4-4-4", DocumentVersionStatusType.PUBLISHED, subresourceDefSmp); - searchPrivPubPubRes = createResource("privPubPub", "5-5-5", VisibilityType.PUBLIC, privateDomainResourceDef, privPubGroup); + searchPrivPubPubRes = createResource("privPubPub", "5-5-5", VisibilityType.PUBLIC, domainResourceDefD2R1, groupD2G1); searchPrivPubPubSubRes = createSubresource(searchPrivPubPubRes, "subres-privPubPub", "s-5-5-5", DocumentVersionStatusType.PUBLISHED, subresourceDefSmp); - searchPrivPubPrivRes = createResource("privPubPriv", "6-6-6", VisibilityType.PRIVATE, privateDomainResourceDef, privPubGroup); + searchPrivPubPrivRes = createResource("privPubPriv", "6-6-6", VisibilityType.PRIVATE, domainResourceDefD2R1, groupD2G1); searchPrivPubPrivSubRes = createSubresource(searchPrivPubPrivRes, "subres-privPubPriv", "s-6-6-6", DocumentVersionStatusType.PUBLISHED, subresourceDefSmp); - searchPrivPrivPubRes = createResource("privPrivPub", "7-7-7", VisibilityType.PUBLIC, privateDomainResourceDef, privPrivGroup); + searchPrivPrivPubRes = createResource("privPrivPub", "7-7-7", VisibilityType.PUBLIC, domainResourceDefD2R1, privPrivGroup); searchPrivPrivPubSubRes = createSubresource(searchPrivPrivPubRes, "subres-privPrivPub", "s-7-7-7", DocumentVersionStatusType.PUBLISHED, subresourceDefSmp); - searchPrivPrivPrivRes = createResource("privPrivPriv", "8-8-8", VisibilityType.PRIVATE, privateDomainResourceDef, privPrivGroup); + searchPrivPrivPrivRes = createResource("privPrivPriv", "8-8-8", VisibilityType.PRIVATE, domainResourceDefD2R1, privPrivGroup); searchPrivPrivPrivSubRes = createSubresource(searchPrivPrivPrivRes, "subres-privPrivPriv", "s-8-8-8", DocumentVersionStatusType.PUBLISHED, subresourceDefSmp);