Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit c1ef3b2b authored by Joze RIHTARSIC's avatar Joze RIHTARSIC
Browse files

Pull request #48: UI domain administration update, fix pom schema location

Merge in EDELIVERY/smp from EDELIVERY-11646-smp-ui-improvements to development

* commit '8a7b3681':
  PR Updates
  UI domain administration update, fix pom schema location
parents 5690ec92 8a7b3681
No related branches found
No related tags found
No related merge requests found
Pipeline #120218 passed with warnings
Showing
with 78 additions and 64 deletions
package eu.europa.ec.edelivery.smp.conversion;
import eu.europa.ec.edelivery.smp.data.dao.DomainMemberDao;
import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType;
import eu.europa.ec.edelivery.smp.data.model.DBDomain;
import eu.europa.ec.edelivery.smp.data.ui.DomainRO;
import eu.europa.ec.edelivery.smp.logging.SMPLogger;
......@@ -15,18 +17,30 @@ import java.util.stream.Collectors;
/**
* Converter for domain DAO entity {@link DBDomain} to enriched webservice object {@link DomainRO}.
*
* @author Joze Rihtarsic
* @since 5.0
*/
@Component
public class DBDomainToDomainROConverter implements Converter<DBDomain, DomainRO> {
private static final SMPLogger LOG = SMPLoggerFactory.getLogger(DBDomainToDomainROConverter.class);
private final DomainMemberDao domainMemberDao;
public DBDomainToDomainROConverter(DomainMemberDao domainMemberDao) {
this.domainMemberDao = domainMemberDao;
}
@Override
public DomainRO convert(DBDomain source) {
DomainRO target = new DomainRO();
try {
BeanUtils.copyProperties(target, source);
Long memberCount = domainMemberDao.getDomainMemberCount(source.getId(), null, MembershipRoleType.ADMIN);
target.setAdminMemberCount(memberCount);
List<String> domainDocuments = source.getDomainResourceDefs().stream().map(dbDomainResourceDef -> dbDomainResourceDef.getResourceDef().getIdentifier()).collect(Collectors.toList());
target.getResourceDefinitions().addAll(domainDocuments);
target.setDomainId(SessionSecurityUtils.encryptedEntityId(source.getId()));
......
......@@ -31,6 +31,7 @@ import java.util.Optional;
import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*;
import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.DOMAIN_NOT_EXISTS;
import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.ILLEGAL_STATE_DOMAIN_MULTIPLE_ENTRY;
import static eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType.toList;
/**
* @author gutowpa
......@@ -175,11 +176,6 @@ public class DomainDao extends BaseDao<DBDomain> {
return query.getResultList();
}
public List<MembershipRoleType> toList(MembershipRoleType ... roleTypes){
return Arrays.asList(roleTypes ==null || roleTypes.length==0 ?MembershipRoleType.values(): roleTypes);
}
/**
* Check if domain for domain code exists. If not SMPRuntimeException with DOMAIN_NOT_EXISTS is thrown.
* If code is null or blank - then null is returned.
......
......@@ -26,6 +26,7 @@ import java.util.List;
import java.util.stream.Collectors;
import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*;
import static eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType.toList;
/**
* @author Joze Rihtarsic
......@@ -92,10 +93,11 @@ public class DomainMemberDao extends BaseDao<DBDomainMember> {
return query.getResultList();
}
public Long getDomainMemberCount(Long domainId, String filter) {
public Long getDomainMemberCount(Long domainId, String filter, MembershipRoleType ... roleTypes) {
boolean hasFilter = StringUtils.isNotBlank(filter);
TypedQuery<Long> query = memEManager.createNamedQuery(hasFilter ? QUERY_DOMAIN_MEMBERS_FILTER_COUNT : QUERY_DOMAIN_MEMBERS_COUNT, Long.class);
query.setParameter(PARAM_DOMAIN_ID, domainId);
query.setParameter(PARAM_MEMBERSHIP_ROLES, toList(roleTypes));
if (hasFilter) {
query.setParameter(PARAM_USER_FILTER, StringUtils.wrapIfMissing(StringUtils.trim(filter),"%" ));
}
......
package eu.europa.ec.edelivery.smp.data.enums;
import java.util.Arrays;
import java.util.List;
/**
* Enum for membership role types. At the moment there are two types of roles:
* <ul>
* <li>VIEWER - user is the readonly member of the the domain.</li>
* <li>ADMIN - user is administrator of the domain and can view and edit the domain data.</li>
* </ul>
*
* @author Joze Rihtarsic
* @since 5.0
*/
public enum MembershipRoleType {
VIEWER,
ADMIN
ADMIN;
/**
* Method to convert MembershipRoleType to List<MembershipRoleType>. if roleTypes is null or empty,
* all values are returned as list
*
* @param roleTypes - list of role types
* @return list of role types
*/
public static List<MembershipRoleType> toList(MembershipRoleType... roleTypes) {
return Arrays.asList(roleTypes == null || roleTypes.length == 0 ? values() : roleTypes);
}
}
......@@ -30,13 +30,18 @@ import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*;
@NamedQuery(name = QUERY_DOMAIN_MEMBER_BY_USER_DOMAINS, query = "SELECT c FROM DBDomainMember c " +
"WHERE c.user.id = :user_id and c.domain.id in (:domain_ids)")
@NamedQuery(name = QUERY_DOMAIN_MEMBERS_COUNT, query = "SELECT count(c) FROM DBDomainMember c " +
" WHERE c.domain.id = :domain_id")
" WHERE c.domain.id = :domain_id AND c.role in (:membership_roles)")
@NamedQuery(name = QUERY_DOMAIN_MEMBERS, query = "SELECT c FROM DBDomainMember c " +
" WHERE c.domain.id = :domain_id order by c.user.username")
@NamedQuery(name = QUERY_DOMAIN_MEMBERS_FILTER_COUNT, query = "SELECT count(c) FROM DBDomainMember c " +
" WHERE c.domain.id = :domain_id AND (lower(c.user.fullName) like lower(:user_filter) OR lower(c.user.username) like lower(:user_filter))")
" WHERE c.domain.id = :domain_id " +
" AND c.role in (:membership_roles)" +
" AND (lower(c.user.fullName) like lower(:user_filter) " +
" OR lower(c.user.username) like lower(:user_filter))")
@NamedQuery(name = QUERY_DOMAIN_MEMBERS_FILTER, query = "SELECT c FROM DBDomainMember c " +
" WHERE c.domain.id = :domain_id AND (lower(c.user.fullName) like lower(:user_filter) OR lower(c.user.username) like lower(:user_filter)) order by c.user.username")
" WHERE c.domain.id = :domain_id " +
" AND (lower(c.user.fullName) like lower(:user_filter) " +
" OR lower(c.user.username) like lower(:user_filter)) order by c.user.username")
public class DBDomainMember extends BaseEntity {
@Id
......
......@@ -27,6 +27,7 @@ public class DomainRO extends BaseRO {
private String defaultResourceTypeIdentifier;
private final List<GroupRO> groups = new ArrayList<>();
private final List<String> resourceDefinitions = new ArrayList<>();
private long adminMemberCount = -1;
public String getDomainId() {
return domainId;
......@@ -115,4 +116,12 @@ public class DomainRO extends BaseRO {
public List<String> getResourceDefinitions() {
return resourceDefinitions;
}
public long getAdminMemberCount() {
return adminMemberCount;
}
public void setAdminMemberCount(long adminMemberCount) {
this.adminMemberCount = adminMemberCount;
}
}
package eu.europa.ec.edelivery.smp.services.ui;
import eu.europa.ec.edelivery.security.utils.KeystoreUtils;
import eu.europa.ec.edelivery.security.utils.X509CertificateUtils;
import eu.europa.ec.edelivery.smp.data.dao.UserDao;
import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
import eu.europa.ec.edelivery.smp.data.ui.CertificateRO;
......@@ -13,7 +11,6 @@ import org.apache.commons.io.FileUtils;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
......@@ -22,14 +19,15 @@ import org.springframework.core.convert.ConversionService;
import javax.security.auth.x500.X500Principal;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyStore;
import java.security.cert.*;
import java.util.*;
import java.util.Base64;
import java.util.Collections;
import java.util.Optional;
import java.util.UUID;
import java.util.regex.Pattern;
import static org.junit.jupiter.api.Assertions.*;
......@@ -371,7 +369,7 @@ public class UITruststoreServiceTest {
@Test
public void testAddCertificate() throws Exception {
public void testAddCertificate() throws Exception {
String subject = "CN=Something,O=test,C=EU";
X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject);
......@@ -386,7 +384,7 @@ public class UITruststoreServiceTest {
}
@Test
public void testDeleteCertificate() throws Exception {
public void testDeleteCertificate() throws Exception {
String subject = "CN=Something,O=test,C=EU";
X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject);
doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile();
......@@ -402,30 +400,6 @@ public class UITruststoreServiceTest {
assertEquals(count - 1, testInstance.getNormalizedTrustedList().size());
}
/**
* This method is not a tests is it done for generating the tests Soapui certificates
*
* @throws Exception if an error occurs
*/
@Test
@Disabled
public void generateSoapUITestCertificates() throws Exception {
List<String[]> listCerts = Arrays.asList(new String[]{"f71ee8b11cb3b787", "CN=EHEALTH_SMP_EC,O=European Commission,C=BE", "ehealth_smp_ec",},
new String[]{"E07B6b956330a19a", "CN=blue_gw,O=eDelivery,C=BE", "blue_gw"},
new String[]{"9792ce69BC89F14C", "CN=red_gw,O=eDelivery,C=BE", "red_gw"}
);
String token = "test123";
File keystoreFile = new File("./target/smp-test-examples.p12");
KeyStore keyStore = KeystoreUtils.createNewKeystore(keystoreFile, token);
for (String[] data : listCerts) {
BigInteger serial = new BigInteger(data[0], 16);
X509CertificateUtils.createAndStoreSelfSignedCertificate(serial, data[1], data[2], keyStore, token);
}
try (FileOutputStream fos = new FileOutputStream(keystoreFile)) {
keyStore.store(fos, token.toCharArray());
}
}
protected void resetKeystore() throws IOException {
FileUtils.deleteDirectory(targetDirectory.toFile());
......
......@@ -6,7 +6,7 @@
<property name="consolePattern" value="%d{ISO8601} [%X{smp_user}] [%X{smp_session_id}] [%X{smp_request_id}] [%thread] %5p %c{1}:%L - %m%n" scope="global"/>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${project.build.directory}/logs/edelivery-smp.log</file>
<file>${buildDirectory}/logs/edelivery-smp.log</file>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<marker>SECURITY</marker>
......@@ -17,7 +17,7 @@
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${project.build.directory}/logs/edelivery-smp-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<fileNamePattern>${buildDirectory}/logs/edelivery-smp-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- each file should be at most 30MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>30MB</maxFileSize>
<maxHistory>60</maxHistory>
......@@ -40,4 +40,4 @@
<appender-ref ref="file"/>
<appender-ref ref="stdout"/>
</root>
</configuration>
\ No newline at end of file
</configuration>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>eu.europa.ec.edelivery</groupId>
......
......@@ -12,7 +12,7 @@
~ See the Licence for the specific language governing permissions and limitations under the Licence.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>eu.europa.ec.edelivery</groupId>
......
......@@ -15,7 +15,7 @@ See the License for the specific language governing permissions and
limitations under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>eu.europa.ec.edelivery</groupId>
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.smp</groupId>
......@@ -139,4 +139,4 @@
</profiles>
</project>
\ No newline at end of file
</project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>eu.europa.ec.edelivery</groupId>
......@@ -145,8 +145,6 @@
<targetPath>${project.build.directory}/webapp-classes</targetPath>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
......@@ -160,14 +158,6 @@
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
......
......@@ -6,7 +6,7 @@
<property name="consolePattern" value="%d{ISO8601} [%X{smp_user}] [%X{smp_session_id}] [%X{smp_request_id}] [%thread] %5p %c{1}:%L - %m%n" scope="global"/>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${project.build.directory}/logs/edelivery-smp.log</file>
<file>${buildDirectory}/logs/edelivery-smp.log</file>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<marker>SECURITY</marker>
......@@ -17,7 +17,7 @@
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${project.build.directory}/logs/edelivery-smp-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<fileNamePattern>${buildDirectory}/logs/edelivery-smp-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- each file should be at most 30MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>30MB</maxFileSize>
<maxHistory>60</maxHistory>
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>eu.europa.ec.edelivery</groupId>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment