From ce98678431267ec528efaccea83f0aeb6696dca8 Mon Sep 17 00:00:00 2001 From: Petro Ravlinko Date: Sun, 15 Sep 2024 22:43:22 +0300 Subject: [PATCH] migrate on newer java and springboot --- README.md | 8 +- docker-compose.yaml | 9 ++ pom.xml | 139 ++++++++++++------ .../org/swarmcom/jsynapse/JSynapseServer.java | 10 -- .../jsynapse/controller/CorsFilter.java | 4 +- .../jsynapse/controller/JsynapseApi.java | 3 +- .../client/api/v1/AuthenticationRestApi.java | 28 ++-- .../client/api/v1/DirectoryRestApi.java | 36 ++--- .../client/api/v1/MessageRestApi.java | 15 +- .../client/api/v1/PresenceRestApi.java | 5 +- .../controller/client/api/v1/RoomRestApi.java | 8 +- .../controller/client/api/v1/UserRestApi.java | 5 +- .../media/api/v1/ContentRestApi.java | 11 +- .../jsynapse/dao/ContentRepositoryImpl.java | 24 ++- .../swarmcom/jsynapse/domain/AccessToken.java | 45 ++---- .../jsynapse/domain/Authentication.java | 37 ++--- .../jsynapse/domain/ContentUpload.java | 6 +- .../org/swarmcom/jsynapse/domain/Message.java | 59 +++----- .../swarmcom/jsynapse/domain/Presence.java | 2 +- .../org/swarmcom/jsynapse/domain/Room.java | 56 ++----- .../swarmcom/jsynapse/domain/RoomAlias.java | 16 +- .../accesstoken/AccessTokenService.java | 6 +- .../accesstoken/AccessTokenServiceImpl.java | 10 +- .../AuthenticationServiceImpl.java | 2 +- .../authentication/password/PasswordInfo.java | 6 +- .../password/PasswordProvider.java | 7 +- .../recaptcha/RecaptchaInfo.java | 6 +- .../recaptcha/RecaptchaProvider.java | 9 +- .../service/content/ContentServiceImpl.java | 19 +-- .../service/message/MessageServiceImpl.java | 2 +- .../service/presence/PresenceServiceImpl.java | 7 +- .../service/room/RoomAliasServiceImpl.java | 25 ++-- .../jsynapse/service/room/RoomService.java | 4 +- .../service/room/RoomServiceImpl.java | 30 ++-- .../jsynapse/service/room/RoomUtils.java | 6 +- .../jsynapse/service/user/UserService.java | 12 +- .../service/user/UserServiceImpl.java | 10 +- .../jsynapse/service/user/UserUtils.java | 13 +- .../jsynapse/validator/EnumValue.java | 5 +- .../validator/EnumValueValidator.java | 4 +- src/main/resources/jsynapse.properties | 1 + .../java/org/swarmcom/jsynapse/TestBase.java | 49 +++--- .../api/v1/AuthenticationRestApiTest.java | 34 ++--- .../client/api/v1/DirectoryRestApiTest.java | 22 ++- .../client/api/v1/MessageRestApiTest.java | 25 ++-- .../client/api/v1/RoomRestApiTest.java | 23 ++- .../client/api/v1/UserRestApiTest.java | 24 ++- .../service/message/MessageServiceTest.java | 13 +- .../service/room/RoomAliasServiceTest.java | 29 ++-- .../service/room/RoomServiceTest.java | 29 ++-- .../swarmcom/jsynapse/util/UserUtilsTest.java | 18 +-- .../resources/application-test.properties | 2 +- src/test/resources/auth/GetAuthSchemas.json | 4 +- src/test/resources/logback-test.xml | 13 ++ 54 files changed, 474 insertions(+), 521 deletions(-) create mode 100644 docker-compose.yaml create mode 100644 src/main/resources/jsynapse.properties create mode 100644 src/test/resources/logback-test.xml diff --git a/README.md b/README.md index c731404..1549ecb 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ You can run a farm of jSynapse servers, pointing all to the same MongoDB instanc By deafult jSynapse homeserver accepts requests on port 5555. You can change this by passing --port.server={PORT} To start with a different domain (default swarmcom.org) use --domain=mydomain.org -To check server health point browser to http://localhost:5555/health +To check server health point browser to http://localhost:5555/actuator/health Examples to get/set user display name and avatar url @@ -43,3 +43,9 @@ curl http://localhost:5555/_matrix/client/api/v1/profile/@mirceac:swarmcom.org/a {"avatar_url":"url"} +## Check + +```shell + mvn versions:display-plugin-updates +``` + diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..ed4aa16 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,9 @@ +services: + mongo: + image: mongo:4.4.6 + container_name: mongo_container + restart: always + environment: + MONGO_INITDB_DATABASE: matrix + ports: + - "27017:27017" \ No newline at end of file diff --git a/pom.xml b/pom.xml index 62131f3..3f2f469 100644 --- a/pom.xml +++ b/pom.xml @@ -13,23 +13,23 @@ org.springframework.boot spring-boot-starter-parent - 1.2.2.RELEASE + 3.3.3 - + + + central + https://repo.maven.apache.org/maven2 + + + - + org.springframework.boot spring-boot-starter - - org.springframework.boot - spring-boot-starter-test - test - - org.springframework.boot spring-boot-starter-web @@ -45,60 +45,77 @@ spring-boot-starter-actuator - - - - - org.hibernate + org.hibernate.validator hibernate-validator + 8.0.1.Final org.apache.commons commons-lang3 - 3.3.2 + 3.17.0 + + + + com.google.code.maven-play-plugin.net.tanesha.recaptcha4j + recaptcha4j + 0.0.8 + + + + net.coobird + thumbnailator + 0.4.20 + + + + jakarta.inject + jakarta.inject-api + 2.0.1 + + + + org.projectlombok + lombok + - junit - junit - 4.11 + org.springframework.boot + spring-boot-starter-test test commons-io commons-io - 2.4 + 2.16.1 test - com.google.code.maven-play-plugin.net.tanesha.recaptcha4j - recaptcha4j - 0.0.8 + org.springframework.boot + spring-boot-testcontainers + test - net.coobird - thumbnailator - 0.4.8 + org.testcontainers + junit-jupiter + test - javax.inject - javax.inject - 1 + org.testcontainers + mongodb + test - 1.7 + 21 UTF-8 UTF-8 @@ -110,25 +127,53 @@ spring-boot-maven-plugin - org.codehaus.mojo - cobertura-maven-plugin - 2.7 - - - 90 - 90 - false - 90 - 90 - 90 - 90 - - + org.jacoco + jacoco-maven-plugin + 0.8.12 + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.5.0 + enforce-maven - check + enforce + + + + 3.9.5 + + + diff --git a/src/main/java/org/swarmcom/jsynapse/JSynapseServer.java b/src/main/java/org/swarmcom/jsynapse/JSynapseServer.java index 05752a3..313e017 100644 --- a/src/main/java/org/swarmcom/jsynapse/JSynapseServer.java +++ b/src/main/java/org/swarmcom/jsynapse/JSynapseServer.java @@ -24,28 +24,18 @@ import org.springframework.data.mongodb.config.EnableMongoAuditing; import static org.springframework.boot.SpringApplication.run; -import static org.apache.commons.lang3.StringUtils.substringAfter; @SpringBootApplication @Configuration @PropertySource(value = "classpath:jsynapse.properties", ignoreResourceNotFound = true) @EnableMongoAuditing public class JSynapseServer { - public static String DOMAIN = "swarmcom.org"; - @Bean(name = "customProps") public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } public static void main(String[] args) { - if (args.length > 0) { - for (String arg : args) { - if (arg.startsWith("--domain")) { - DOMAIN = substringAfter(arg, "="); - } - } - } run(JSynapseServer.class, args); } } diff --git a/src/main/java/org/swarmcom/jsynapse/controller/CorsFilter.java b/src/main/java/org/swarmcom/jsynapse/controller/CorsFilter.java index feac242..34398f0 100644 --- a/src/main/java/org/swarmcom/jsynapse/controller/CorsFilter.java +++ b/src/main/java/org/swarmcom/jsynapse/controller/CorsFilter.java @@ -16,10 +16,10 @@ */ package org.swarmcom.jsynapse.controller; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; -import javax.servlet.*; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component diff --git a/src/main/java/org/swarmcom/jsynapse/controller/JsynapseApi.java b/src/main/java/org/swarmcom/jsynapse/controller/JsynapseApi.java index 412bb6c..e178ffa 100644 --- a/src/main/java/org/swarmcom/jsynapse/controller/JsynapseApi.java +++ b/src/main/java/org/swarmcom/jsynapse/controller/JsynapseApi.java @@ -16,6 +16,7 @@ */ package org.swarmcom.jsynapse.controller; +import jakarta.validation.ValidationException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.swarmcom.jsynapse.service.exception.EntityAlreadyExistsException; @@ -23,8 +24,6 @@ import org.swarmcom.jsynapse.service.exception.InvalidRequestException; import org.swarmcom.jsynapse.service.exception.TokenNotFoundException; -import javax.validation.ValidationException; - import static org.springframework.http.HttpStatus.*; public class JsynapseApi { diff --git a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/AuthenticationRestApi.java b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/AuthenticationRestApi.java index add702f..31b0824 100644 --- a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/AuthenticationRestApi.java +++ b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/AuthenticationRestApi.java @@ -16,17 +16,15 @@ */ package org.swarmcom.jsynapse.controller.client.api.v1; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.*; import org.swarmcom.jsynapse.controller.JsynapseApi; +import org.swarmcom.jsynapse.domain.Authentication.AuthenticationFlows; import org.swarmcom.jsynapse.domain.Authentication.AuthenticationResult; import org.swarmcom.jsynapse.domain.Authentication.AuthenticationSubmission; -import org.swarmcom.jsynapse.domain.Authentication.AuthenticationFlows; import org.swarmcom.jsynapse.service.authentication.AuthenticationService; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; - -import static org.springframework.web.bind.annotation.RequestMethod.*; import static org.swarmcom.jsynapse.controller.JsynapseApi.CLIENT_V1_API; @RestController @@ -40,28 +38,24 @@ public AuthenticationRestApi(final AuthenticationService authenticationService) this.authenticationService = authenticationService; } - @RequestMapping(value = "/login", method = GET) - public @ResponseBody - AuthenticationFlows getLoginSchemas() { + @GetMapping("/login") + public AuthenticationFlows getLoginSchemas() { return authenticationService.getSupportedFlows(); } - @RequestMapping(value = "/login", method = POST) - public @ResponseBody - AuthenticationResult login(@RequestBody final AuthenticationSubmission login, HttpServletRequest request) { + @PostMapping("/login") + public AuthenticationResult login(@RequestBody final AuthenticationSubmission login, HttpServletRequest request) { login.setRemoteAddr(request.getRemoteAddr()); return authenticationService.login(login); } - @RequestMapping(value = "/register", method = GET) - public @ResponseBody - AuthenticationFlows getRegistrationSchemas() { + @GetMapping("/register") + public AuthenticationFlows getRegistrationSchemas() { return authenticationService.getSupportedFlows(); } - @RequestMapping(value = "/register", method = POST) - public @ResponseBody - AuthenticationResult register(@RequestBody final AuthenticationSubmission registration, HttpServletRequest request) { + @PostMapping("/register") + public AuthenticationResult register(@RequestBody final AuthenticationSubmission registration, HttpServletRequest request) { registration.setRemoteAddr(request.getRemoteAddr()); return authenticationService.register(registration); } diff --git a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/DirectoryRestApi.java b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/DirectoryRestApi.java index 33c656d..b3146f6 100644 --- a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/DirectoryRestApi.java +++ b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/DirectoryRestApi.java @@ -15,49 +15,43 @@ * limitations under the License. * */ -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + +import jakarta.inject.Inject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.swarmcom.jsynapse.controller.JsynapseApi; import org.swarmcom.jsynapse.domain.Room; import org.swarmcom.jsynapse.domain.RoomAlias; import org.swarmcom.jsynapse.service.room.RoomAliasService; import org.swarmcom.jsynapse.service.room.RoomService; -import javax.inject.Inject; -import static org.swarmcom.jsynapse.domain.RoomAlias.AliasServers; -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static java.lang.String.format; import static org.swarmcom.jsynapse.controller.JsynapseApi.CLIENT_V1_API; +import static org.swarmcom.jsynapse.domain.RoomAlias.AliasServers; +@Slf4j +@RequiredArgsConstructor(onConstructor_ = {@Inject}) @RestController @RequestMapping(value = CLIENT_V1_API + "/directory/room/{roomAlias}") public class DirectoryRestApi extends JsynapseApi { - private static final Logger LOGGER = LoggerFactory.getLogger(DirectoryRestApi.class); private final RoomService roomService; private final RoomAliasService roomAliasService; - @Inject - public DirectoryRestApi(final RoomService roomService, final RoomAliasService roomAliasService) { - this.roomService = roomService; - this.roomAliasService = roomAliasService; - } - - @RequestMapping(method = GET) - public @ResponseBody AliasServers getRoomByAlias(@PathVariable String roomAlias) { - LOGGER.debug(format("Get room with alias %s", roomAlias)); + @GetMapping + public AliasServers getRoomByAlias(@PathVariable String roomAlias) { + log.debug("Get room with alias {}", roomAlias); return roomAliasService.findByAlias(roomAlias); } - @RequestMapping(method = PUT) - public @ResponseBody RoomAlias saveRoomAlias(@PathVariable String roomAlias, @RequestBody final Room room) { - LOGGER.debug(format("PUT alias %s for room id %s", roomAlias, room.getRoomId())); + @PutMapping + public RoomAlias saveRoomAlias(@PathVariable String roomAlias, @RequestBody final Room room) { + log.debug("PUT alias {} for room id {}", roomAlias, room.getRoomId()); return roomAliasService.createAlias(room.getRoomId(), roomAlias); } - @RequestMapping(method = DELETE) + @DeleteMapping public void deleteRoomAlias(@PathVariable String roomAlias, @RequestBody final Room room) { - LOGGER.debug(format("DELETE alias %s for room id %s", roomAlias, room.getRoomId())); + log.debug("DELETE alias {} for room id {}", roomAlias, room.getRoomId()); roomService.deleteAlias(room.getRoomId(), roomAlias); } } \ No newline at end of file diff --git a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/MessageRestApi.java b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/MessageRestApi.java index a16b436..47fa004 100644 --- a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/MessageRestApi.java +++ b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/MessageRestApi.java @@ -16,19 +16,22 @@ */ package org.swarmcom.jsynapse.controller.client.api.v1; +import jakarta.inject.Inject; +import jakarta.validation.Valid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.swarmcom.jsynapse.controller.JsynapseApi; import org.swarmcom.jsynapse.domain.Message; import org.swarmcom.jsynapse.service.message.MessageService; -import javax.inject.Inject; -import javax.validation.Valid; - -import static org.springframework.web.bind.annotation.RequestMethod.*; -import static org.swarmcom.jsynapse.domain.Message.Messages; +import static org.springframework.web.bind.annotation.RequestMethod.GET; +import static org.springframework.web.bind.annotation.RequestMethod.POST; import static org.swarmcom.jsynapse.controller.JsynapseApi.CLIENT_V1_API; +import static org.swarmcom.jsynapse.domain.Message.Messages; @RestController @RequestMapping(value = CLIENT_V1_API) diff --git a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/PresenceRestApi.java b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/PresenceRestApi.java index 0860e90..c824577 100644 --- a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/PresenceRestApi.java +++ b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/PresenceRestApi.java @@ -17,6 +17,8 @@ package org.swarmcom.jsynapse.controller.client.api.v1; import com.fasterxml.jackson.annotation.JsonView; +import jakarta.inject.Inject; +import jakarta.validation.Valid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.PathVariable; @@ -28,9 +30,6 @@ import org.swarmcom.jsynapse.domain.Presence.PresenceSummary; import org.swarmcom.jsynapse.service.presence.PresenceService; -import javax.inject.Inject; -import javax.validation.Valid; - import static java.lang.String.format; import static org.springframework.web.bind.annotation.RequestMethod.GET; import static org.springframework.web.bind.annotation.RequestMethod.PUT; diff --git a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/RoomRestApi.java b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/RoomRestApi.java index b664e31..8809126 100644 --- a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/RoomRestApi.java +++ b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/RoomRestApi.java @@ -17,6 +17,8 @@ package org.swarmcom.jsynapse.controller.client.api.v1; import com.fasterxml.jackson.annotation.JsonView; +import jakarta.inject.Inject; +import jakarta.validation.Valid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; @@ -26,12 +28,8 @@ import org.swarmcom.jsynapse.service.room.RoomAliasService; import org.swarmcom.jsynapse.service.room.RoomService; -import javax.inject.Inject; -import javax.validation.Valid; - - -import static org.springframework.web.bind.annotation.RequestMethod.*; import static java.lang.String.format; +import static org.springframework.web.bind.annotation.RequestMethod.*; import static org.swarmcom.jsynapse.controller.JsynapseApi.CLIENT_V1_API; @RestController diff --git a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/UserRestApi.java b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/UserRestApi.java index df66bd3..10fce1b 100644 --- a/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/UserRestApi.java +++ b/src/main/java/org/swarmcom/jsynapse/controller/client/api/v1/UserRestApi.java @@ -17,6 +17,7 @@ package org.swarmcom.jsynapse.controller.client.api.v1; import com.fasterxml.jackson.annotation.JsonView; +import jakarta.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; @@ -24,9 +25,6 @@ import org.swarmcom.jsynapse.domain.User; import org.swarmcom.jsynapse.service.user.UserService; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; - import static java.lang.String.format; import static org.springframework.web.bind.annotation.RequestMethod.GET; import static org.springframework.web.bind.annotation.RequestMethod.PUT; @@ -39,7 +37,6 @@ public class UserRestApi extends JsynapseApi { private static final String ACCESS_TOKEN = "access_token"; private final UserService userService; - @Inject public UserRestApi(final UserService userService) { this.userService = userService; } diff --git a/src/main/java/org/swarmcom/jsynapse/controller/media/api/v1/ContentRestApi.java b/src/main/java/org/swarmcom/jsynapse/controller/media/api/v1/ContentRestApi.java index a50d0c2..d2e199b 100644 --- a/src/main/java/org/swarmcom/jsynapse/controller/media/api/v1/ContentRestApi.java +++ b/src/main/java/org/swarmcom/jsynapse/controller/media/api/v1/ContentRestApi.java @@ -1,5 +1,7 @@ package org.swarmcom.jsynapse.controller.media.api.v1; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.core.io.Resource; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,16 +12,13 @@ import org.swarmcom.jsynapse.service.content.ContentResource; import org.swarmcom.jsynapse.service.content.ContentService; -import javax.inject.Inject; -import javax.servlet.http.HttpServletResponse; - import java.io.IOException; -import static org.springframework.web.bind.annotation.RequestMethod.POST; +import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND; +import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM_VALUE; import static org.springframework.web.bind.annotation.RequestMethod.GET; +import static org.springframework.web.bind.annotation.RequestMethod.POST; import static org.swarmcom.jsynapse.controller.JsynapseApi.CONTENT_V1_API; -import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM_VALUE; -import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; @RestController @RequestMapping(value = CONTENT_V1_API) diff --git a/src/main/java/org/swarmcom/jsynapse/dao/ContentRepositoryImpl.java b/src/main/java/org/swarmcom/jsynapse/dao/ContentRepositoryImpl.java index 37c9c87..0cfceac 100644 --- a/src/main/java/org/swarmcom/jsynapse/dao/ContentRepositoryImpl.java +++ b/src/main/java/org/swarmcom/jsynapse/dao/ContentRepositoryImpl.java @@ -16,8 +16,8 @@ */ package org.swarmcom.jsynapse.dao; -import com.mongodb.gridfs.GridFSDBFile; -import com.mongodb.gridfs.GridFSFile; +import com.mongodb.client.gridfs.model.GridFSFile; +import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; @@ -35,17 +35,25 @@ public class ContentRepositoryImpl implements ContentRepository { @Override public String upload(InputStream content, String fileName, String contentType) { - GridFSFile file = gridFsTemplate.store(content, fileName, contentType); - return file.getId().toString(); + var fileId = gridFsTemplate.store(content, fileName, contentType); + return fileId.toString(); } @Override public ContentResource download(String mediaId) { - GridFSDBFile file = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(mediaId))); - if (null == file) { + GridFSFile file = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(mediaId))); + + if (file == null) { + return null; + } + + GridFsResource gridFsResource = gridFsTemplate.getResource(file); + + try { + return new ContentResource(gridFsResource.getContentType(), gridFsResource.contentLength(), gridFsResource); + } catch (Exception e) { + // Handle exceptions (such as I/O issues) return null; } - GridFsResource gridFsResource = new GridFsResource(file); - return new ContentResource(gridFsResource.getContentType(), file.getLength(), gridFsResource); } } diff --git a/src/main/java/org/swarmcom/jsynapse/domain/AccessToken.java b/src/main/java/org/swarmcom/jsynapse/domain/AccessToken.java index 6478bf5..d109b46 100644 --- a/src/main/java/org/swarmcom/jsynapse/domain/AccessToken.java +++ b/src/main/java/org/swarmcom/jsynapse/domain/AccessToken.java @@ -17,20 +17,24 @@ package org.swarmcom.jsynapse.domain; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; import org.springframework.data.annotation.Id; -import javax.validation.constraints.NotNull; import java.util.Date; +@Setter +@Getter public class AccessToken { @Id - String id; + private String id; - String userId; + private String userId; - String token; + private String token; - Date lastUsed; + private Date lastUsed; public AccessToken(@NotNull String userId, @NotNull String token, @NotNull Date lastUsed) { this.userId = userId; @@ -38,35 +42,4 @@ public AccessToken(@NotNull String userId, @NotNull String token, @NotNull Date this.lastUsed = lastUsed; } - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - - public Date getLastUsed() { - return lastUsed; - } - - public void setLastUsed(Date lastUsed) { - this.lastUsed = lastUsed; - } } diff --git a/src/main/java/org/swarmcom/jsynapse/domain/Authentication.java b/src/main/java/org/swarmcom/jsynapse/domain/Authentication.java index 24684c2..5bf67e9 100644 --- a/src/main/java/org/swarmcom/jsynapse/domain/Authentication.java +++ b/src/main/java/org/swarmcom/jsynapse/domain/Authentication.java @@ -18,46 +18,45 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; public class Authentication { + @Getter + @Setter public static class AuthenticationInfo { @JsonProperty - String type; + private String type; @JsonProperty @JsonInclude(JsonInclude.Include.NON_NULL) - List stages; - - public void setStages(List stages) { - this.stages = stages; - } - - public void setType(String type) { - this.type = type; - } + private List stages; public boolean validateKeys(AuthenticationSubmission authentication) { return true; } } + @Getter + @Setter public static class AuthenticationFlows { @JsonProperty - List flows = new LinkedList<>(); + private List flows; public AuthenticationFlows(List flows) { this.flows = flows; } } + @Getter public static class AuthenticationResult { + @Setter @JsonProperty("user_id") String user; @@ -69,26 +68,12 @@ public AuthenticationResult(String user, String accessToken) { this.accessToken = accessToken; } - public String getUser() { - return user; - } - - public void setUser(String user) { - this.user = user; - } - - public String getAccessToken() { - return accessToken; - } } public static class AuthenticationSubmission extends HashMap { static final String TYPE = "type"; static final String REMOTE_ADDR = "remoteAddr"; - public AuthenticationSubmission() { - } - public String getType() { return get(TYPE); } diff --git a/src/main/java/org/swarmcom/jsynapse/domain/ContentUpload.java b/src/main/java/org/swarmcom/jsynapse/domain/ContentUpload.java index a82dd58..86d67f0 100644 --- a/src/main/java/org/swarmcom/jsynapse/domain/ContentUpload.java +++ b/src/main/java/org/swarmcom/jsynapse/domain/ContentUpload.java @@ -1,10 +1,14 @@ package org.swarmcom.jsynapse.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter public class ContentUpload { @JsonProperty("content_uri") - String contentUri; + private String contentUri; public ContentUpload(String contentUri) { this.contentUri = contentUri; diff --git a/src/main/java/org/swarmcom/jsynapse/domain/Message.java b/src/main/java/org/swarmcom/jsynapse/domain/Message.java index e0b1f01..3454ffd 100644 --- a/src/main/java/org/swarmcom/jsynapse/domain/Message.java +++ b/src/main/java/org/swarmcom/jsynapse/domain/Message.java @@ -17,52 +17,40 @@ package org.swarmcom.jsynapse.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.lang3.StringUtils; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.Indexed; -import javax.validation.constraints.NotNull; -import java.util.*; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; public class Message { @Id - String id; + private String id; + @Setter + @Getter @NotNull @JsonProperty - String msgtype; + private String msgtype; + @Setter + @Getter @Indexed - String roomId; + private String roomId; - String body; - - public String getMsgtype() { - return msgtype; - } - - public void setMsgtype(String msgtype) { - this.msgtype = msgtype; - } - - public String getRoomId() { - return roomId; - } - - public void setRoomId(String roomId) { - this.roomId = roomId; - } - - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } + @Setter + @Getter + private String body; + @Getter public static class Messages { - List chunk = new LinkedList<>(); + private final List chunk = new LinkedList<>(); public Messages(List messages) { for (Message message : messages) { @@ -70,17 +58,15 @@ public Messages(List messages) { } } - public List getChunk() { - return chunk; - } } + @Getter public static class MessageSummary { public static final String MSG_TYPE = "msgtype"; public static final String BODY = "body"; @JsonProperty - Map content = new LinkedHashMap<>(); + private final Map content = new LinkedHashMap<>(); public MessageSummary(Message message) { content.put(MSG_TYPE, message.getMsgtype()); @@ -89,8 +75,5 @@ public MessageSummary(Message message) { } } - public Map getContent() { - return content; - } } } diff --git a/src/main/java/org/swarmcom/jsynapse/domain/Presence.java b/src/main/java/org/swarmcom/jsynapse/domain/Presence.java index 48d1d8c..b8fdd89 100644 --- a/src/main/java/org/swarmcom/jsynapse/domain/Presence.java +++ b/src/main/java/org/swarmcom/jsynapse/domain/Presence.java @@ -18,12 +18,12 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; +import jakarta.validation.constraints.NotNull; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.mongodb.core.index.Indexed; import org.swarmcom.jsynapse.validator.EnumValue; -import javax.validation.constraints.NotNull; import java.util.Date; public class Presence { diff --git a/src/main/java/org/swarmcom/jsynapse/domain/Room.java b/src/main/java/org/swarmcom/jsynapse/domain/Room.java index 0c37cfb..3b7ad9b 100644 --- a/src/main/java/org/swarmcom/jsynapse/domain/Room.java +++ b/src/main/java/org/swarmcom/jsynapse/domain/Room.java @@ -18,74 +18,42 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.Indexed; -import javax.validation.constraints.NotNull; -import java.util.ArrayList; import java.util.List; +@Getter +@Setter public class Room { @Id - String id; + private String id; @JsonProperty("room_id") @JsonView({CreateSummary.class, DirectorySummary.class}) @Indexed - String roomId; + private String roomId; @NotNull @JsonView(NameSummary.class) - String name; + private String name; @JsonProperty - String visibility = "private"; + private String visibility = "private"; @JsonProperty("room_alias_name") @JsonView(CreateSummary.class) - String alias; + private String alias; @JsonProperty @JsonView(TopicSummary.class) - String topic; + private String topic; @JsonProperty - List invite; - - public Room() { - } - - public void setRoomId(String roomId) { - this.roomId = roomId; - } - - public String getRoomId() { - return roomId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getAlias() { - return alias; - } - - public void setAlias(String alias) { - this.alias = alias; - } - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } + private List invite; public interface CreateSummary {} diff --git a/src/main/java/org/swarmcom/jsynapse/domain/RoomAlias.java b/src/main/java/org/swarmcom/jsynapse/domain/RoomAlias.java index b4fc318..32fceb1 100644 --- a/src/main/java/org/swarmcom/jsynapse/domain/RoomAlias.java +++ b/src/main/java/org/swarmcom/jsynapse/domain/RoomAlias.java @@ -17,6 +17,7 @@ package org.swarmcom.jsynapse.domain; import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.index.Indexed; @@ -31,12 +32,15 @@ public class RoomAlias { @Id String id; + @Getter @Indexed @JsonProperty("room_id") String roomId; + @Getter String alias; + @Getter String server; public RoomAlias(String roomId, String alias, String server) { @@ -45,18 +49,6 @@ public RoomAlias(String roomId, String alias, String server) { this.server = server; } - public String getRoomId() { - return roomId; - } - - public String getAlias() { - return alias; - } - - public String getServer() { - return server; - } - public static class RoomAliases { @JsonProperty List aliases = new LinkedList<>(); diff --git a/src/main/java/org/swarmcom/jsynapse/service/accesstoken/AccessTokenService.java b/src/main/java/org/swarmcom/jsynapse/service/accesstoken/AccessTokenService.java index ca1b8f3..816e6fd 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/accesstoken/AccessTokenService.java +++ b/src/main/java/org/swarmcom/jsynapse/service/accesstoken/AccessTokenService.java @@ -16,10 +16,12 @@ */ package org.swarmcom.jsynapse.service.accesstoken; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; import org.swarmcom.jsynapse.domain.AccessToken; public interface AccessTokenService { - public boolean isTokenAssigned(String userId, String token); + boolean isTokenAssigned(@NotNull String userId, @NotNull String token); - public AccessToken createOrUpdateToken(AccessToken accessToken); + AccessToken createOrUpdateToken(@NotNull @Valid AccessToken accessToken); } diff --git a/src/main/java/org/swarmcom/jsynapse/service/accesstoken/AccessTokenServiceImpl.java b/src/main/java/org/swarmcom/jsynapse/service/accesstoken/AccessTokenServiceImpl.java index dcc1a06..c8343fc 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/accesstoken/AccessTokenServiceImpl.java +++ b/src/main/java/org/swarmcom/jsynapse/service/accesstoken/AccessTokenServiceImpl.java @@ -16,9 +16,13 @@ */ package org.swarmcom.jsynapse.service.accesstoken; +import jakarta.annotation.PostConstruct; +import jakarta.inject.Inject; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.domain.Sort;; +import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.index.Index; import org.springframework.stereotype.Service; @@ -26,10 +30,6 @@ import org.swarmcom.jsynapse.dao.AccessTokenRepository; import org.swarmcom.jsynapse.domain.AccessToken; -import javax.annotation.PostConstruct; -import javax.inject.Inject; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; import java.util.concurrent.TimeUnit; @Service diff --git a/src/main/java/org/swarmcom/jsynapse/service/authentication/AuthenticationServiceImpl.java b/src/main/java/org/swarmcom/jsynapse/service/authentication/AuthenticationServiceImpl.java index e6e8b29..4d4fc7b 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/authentication/AuthenticationServiceImpl.java +++ b/src/main/java/org/swarmcom/jsynapse/service/authentication/AuthenticationServiceImpl.java @@ -16,13 +16,13 @@ */ package org.swarmcom.jsynapse.service.authentication; +import jakarta.inject.Inject; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.swarmcom.jsynapse.domain.Authentication.*; import org.swarmcom.jsynapse.service.exception.InvalidRequestException; -import javax.inject.Inject; import java.util.ArrayList; import java.util.List; import java.util.Map; diff --git a/src/main/java/org/swarmcom/jsynapse/service/authentication/password/PasswordInfo.java b/src/main/java/org/swarmcom/jsynapse/service/authentication/password/PasswordInfo.java index 91317a5..bf2815e 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/authentication/password/PasswordInfo.java +++ b/src/main/java/org/swarmcom/jsynapse/service/authentication/password/PasswordInfo.java @@ -19,9 +19,9 @@ import org.swarmcom.jsynapse.domain.Authentication.*; public class PasswordInfo extends AuthenticationInfo { - final static String PASSWORD_TYPE = "m.login.password"; - final static String USER = "user"; - final static String PASSWORD = "password"; + static final String PASSWORD_TYPE = "m.login.password"; + static final String USER = "user"; + static final String PASSWORD = "password"; public PasswordInfo() { setType(PASSWORD_TYPE); diff --git a/src/main/java/org/swarmcom/jsynapse/service/authentication/password/PasswordProvider.java b/src/main/java/org/swarmcom/jsynapse/service/authentication/password/PasswordProvider.java index ab61a9c..2701a5c 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/authentication/password/PasswordProvider.java +++ b/src/main/java/org/swarmcom/jsynapse/service/authentication/password/PasswordProvider.java @@ -16,6 +16,7 @@ */ package org.swarmcom.jsynapse.service.authentication.password; +import jakarta.inject.Inject; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import org.swarmcom.jsynapse.domain.AccessToken; @@ -24,20 +25,18 @@ import org.swarmcom.jsynapse.domain.Authentication.AuthenticationSubmission; import org.swarmcom.jsynapse.domain.User; import org.swarmcom.jsynapse.service.accesstoken.AccessTokenService; -import org.swarmcom.jsynapse.service.exception.LoginFailureException; import org.swarmcom.jsynapse.service.authentication.AuthenticationProvider; +import org.swarmcom.jsynapse.service.exception.LoginFailureException; import org.swarmcom.jsynapse.service.user.UserService; import org.swarmcom.jsynapse.service.user.UserUtils; -import javax.inject.Inject; - import java.util.Date; import static org.swarmcom.jsynapse.service.authentication.password.PasswordInfo.*; @Component(PASSWORD_TYPE) public class PasswordProvider implements AuthenticationProvider { - final static AuthenticationInfo flow = new PasswordInfo(); + static final AuthenticationInfo flow = new PasswordInfo(); private final UserService userService; private final AccessTokenService accessTokenService; public UserUtils userUtils; diff --git a/src/main/java/org/swarmcom/jsynapse/service/authentication/recaptcha/RecaptchaInfo.java b/src/main/java/org/swarmcom/jsynapse/service/authentication/recaptcha/RecaptchaInfo.java index 24ebef4..88445d9 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/authentication/recaptcha/RecaptchaInfo.java +++ b/src/main/java/org/swarmcom/jsynapse/service/authentication/recaptcha/RecaptchaInfo.java @@ -19,9 +19,9 @@ import org.swarmcom.jsynapse.domain.Authentication.*; public class RecaptchaInfo extends AuthenticationInfo { - final static String RECAPTCHA_TYPE = "m.login.recaptcha"; - final static String CHALLENGE = "challenge"; - final static String RESPONSE = "response"; + static final String RECAPTCHA_TYPE = "m.login.recaptcha"; + static final String CHALLENGE = "challenge"; + static final String RESPONSE = "response"; public RecaptchaInfo() { setType(RECAPTCHA_TYPE); diff --git a/src/main/java/org/swarmcom/jsynapse/service/authentication/recaptcha/RecaptchaProvider.java b/src/main/java/org/swarmcom/jsynapse/service/authentication/recaptcha/RecaptchaProvider.java index 05e4f75..ef94e84 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/authentication/recaptcha/RecaptchaProvider.java +++ b/src/main/java/org/swarmcom/jsynapse/service/authentication/recaptcha/RecaptchaProvider.java @@ -16,6 +16,7 @@ */ package org.swarmcom.jsynapse.service.authentication.recaptcha; +import jakarta.inject.Inject; import net.tanesha.recaptcha.ReCaptchaImpl; import net.tanesha.recaptcha.ReCaptchaResponse; import org.slf4j.Logger; @@ -28,21 +29,19 @@ import org.swarmcom.jsynapse.domain.Authentication.AuthenticationSubmission; import org.swarmcom.jsynapse.domain.User; import org.swarmcom.jsynapse.service.accesstoken.AccessTokenService; -import org.swarmcom.jsynapse.service.exception.InvalidRequestException; import org.swarmcom.jsynapse.service.authentication.AuthenticationProvider; +import org.swarmcom.jsynapse.service.exception.InvalidRequestException; import org.swarmcom.jsynapse.service.user.UserService; import org.swarmcom.jsynapse.service.user.UserUtils; -import javax.inject.Inject; - import java.util.Date; -import static org.swarmcom.jsynapse.service.authentication.recaptcha.RecaptchaInfo.*; import static java.lang.String.format; +import static org.swarmcom.jsynapse.service.authentication.recaptcha.RecaptchaInfo.*; @Component(RECAPTCHA_TYPE) public class RecaptchaProvider implements AuthenticationProvider { - final static AuthenticationInfo flow = new RecaptchaInfo(); + static final AuthenticationInfo flow = new RecaptchaInfo(); private static final Logger LOGGER = LoggerFactory.getLogger(RecaptchaProvider.class); private final UserService userService; diff --git a/src/main/java/org/swarmcom/jsynapse/service/content/ContentServiceImpl.java b/src/main/java/org/swarmcom/jsynapse/service/content/ContentServiceImpl.java index 32b0179..2f6911f 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/content/ContentServiceImpl.java +++ b/src/main/java/org/swarmcom/jsynapse/service/content/ContentServiceImpl.java @@ -1,33 +1,30 @@ package org.swarmcom.jsynapse.service.content; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import jakarta.inject.Inject; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.swarmcom.jsynapse.dao.ContentRepository; import org.swarmcom.jsynapse.domain.ContentUpload; -import javax.inject.Inject; import java.io.InputStream; import static java.lang.String.format; -import static org.swarmcom.jsynapse.JSynapseServer.DOMAIN; +@RequiredArgsConstructor(onConstructor_ = {@Inject}) @Service @Validated public class ContentServiceImpl implements ContentService { - private static final Logger LOGGER = LoggerFactory.getLogger(ContentServiceImpl.class); - private final ContentRepository contentRepository; + @Value("${jsynapse.domain}") + private String domain; - @Inject - public ContentServiceImpl(final ContentRepository contentRepository) { - this.contentRepository = contentRepository; - } + private final ContentRepository contentRepository; @Override public ContentUpload upload(InputStream body, String fileName, String contentType) { String mediaId = contentRepository.upload(body, fileName, contentType); - return new ContentUpload(format("mxc://%s/%s", DOMAIN, mediaId)); + return new ContentUpload(format("mxc://%s/%s", domain, mediaId)); } @Override diff --git a/src/main/java/org/swarmcom/jsynapse/service/message/MessageServiceImpl.java b/src/main/java/org/swarmcom/jsynapse/service/message/MessageServiceImpl.java index aaea465..71c7853 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/message/MessageServiceImpl.java +++ b/src/main/java/org/swarmcom/jsynapse/service/message/MessageServiceImpl.java @@ -16,6 +16,7 @@ */ package org.swarmcom.jsynapse.service.message; +import jakarta.inject.Inject; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.swarmcom.jsynapse.dao.MessageRepository; @@ -23,7 +24,6 @@ import org.swarmcom.jsynapse.domain.Room; import org.swarmcom.jsynapse.service.room.RoomService; -import javax.inject.Inject; import static org.swarmcom.jsynapse.domain.Message.Messages; @Service diff --git a/src/main/java/org/swarmcom/jsynapse/service/presence/PresenceServiceImpl.java b/src/main/java/org/swarmcom/jsynapse/service/presence/PresenceServiceImpl.java index ce33cbc..fe7e97c 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/presence/PresenceServiceImpl.java +++ b/src/main/java/org/swarmcom/jsynapse/service/presence/PresenceServiceImpl.java @@ -16,6 +16,9 @@ */ package org.swarmcom.jsynapse.service.presence; +import jakarta.inject.Inject; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.swarmcom.jsynapse.dao.PresenceRepository; @@ -23,10 +26,6 @@ import org.swarmcom.jsynapse.domain.User; import org.swarmcom.jsynapse.service.user.UserService; -import javax.inject.Inject; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - @Service @Validated public class PresenceServiceImpl implements PresenceService { diff --git a/src/main/java/org/swarmcom/jsynapse/service/room/RoomAliasServiceImpl.java b/src/main/java/org/swarmcom/jsynapse/service/room/RoomAliasServiceImpl.java index 7d72650..6a62cf9 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/room/RoomAliasServiceImpl.java +++ b/src/main/java/org/swarmcom/jsynapse/service/room/RoomAliasServiceImpl.java @@ -16,7 +16,10 @@ */ package org.swarmcom.jsynapse.service.room; +import jakarta.inject.Inject; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; @@ -24,26 +27,20 @@ import org.swarmcom.jsynapse.domain.RoomAlias; import org.swarmcom.jsynapse.service.exception.EntityAlreadyExistsException; -import javax.inject.Inject; - import java.util.List; -import java.util.regex.Pattern; - -import static org.swarmcom.jsynapse.JSynapseServer.DOMAIN; +@RequiredArgsConstructor(onConstructor_ = {@Inject}) @Service @Validated public class RoomAliasServiceImpl implements RoomAliasService { - private RoomAliasRepository roomAliasRepository; + @Value("${jsynapse.domain}") + private String domain; - @Inject - public RoomAliasServiceImpl(final RoomAliasRepository rAliasRepository) { - this.roomAliasRepository = rAliasRepository; - } + private final RoomAliasRepository roomAliasRepository; public RoomAlias createAlias(String roomId, String alias) { - RoomAlias roomAlias = new RoomAlias(roomId, alias, DOMAIN); - RoomAlias existingRoomAlias = roomAliasRepository.findByAliasAndServer(alias, DOMAIN); + RoomAlias roomAlias = new RoomAlias(roomId, alias, domain); + RoomAlias existingRoomAlias = roomAliasRepository.findByAliasAndServer(alias, domain); if (existingRoomAlias == null) { return roomAliasRepository.save(roomAlias); } else { @@ -52,7 +49,7 @@ public RoomAlias createAlias(String roomId, String alias) { } public void deleteAlias(String alias) { - RoomAlias roomAlias = roomAliasRepository.findByAliasAndServer(alias, DOMAIN); + RoomAlias roomAlias = roomAliasRepository.findByAliasAndServer(alias, domain); roomAliasRepository.delete(roomAlias); } @@ -60,7 +57,7 @@ public RoomAlias.AliasServers findByAlias(String alias) { List roomAliases = roomAliasRepository.findByAlias(alias); String roomId = StringUtils.EMPTY; if(!CollectionUtils.isEmpty(roomAliases)) { - roomId = roomAliases.get(0).getRoomId(); + roomId = roomAliases.getFirst().getRoomId(); } return new RoomAlias.AliasServers(roomId, roomAliases); diff --git a/src/main/java/org/swarmcom/jsynapse/service/room/RoomService.java b/src/main/java/org/swarmcom/jsynapse/service/room/RoomService.java index 7dd0e69..30594d9 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/room/RoomService.java +++ b/src/main/java/org/swarmcom/jsynapse/service/room/RoomService.java @@ -16,10 +16,12 @@ */ package org.swarmcom.jsynapse.service.room; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; import org.swarmcom.jsynapse.domain.Room; public interface RoomService { - Room createRoom(Room room); + Room createRoom(@NotNull @Valid Room room); Room findRoomByAlias(String alias); diff --git a/src/main/java/org/swarmcom/jsynapse/service/room/RoomServiceImpl.java b/src/main/java/org/swarmcom/jsynapse/service/room/RoomServiceImpl.java index e845883..c2aa705 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/room/RoomServiceImpl.java +++ b/src/main/java/org/swarmcom/jsynapse/service/room/RoomServiceImpl.java @@ -16,36 +16,28 @@ */ package org.swarmcom.jsynapse.service.room; +import jakarta.inject.Inject; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.swarmcom.jsynapse.dao.RoomRepository; import org.swarmcom.jsynapse.domain.Room; import org.swarmcom.jsynapse.domain.RoomAlias; -import org.swarmcom.jsynapse.service.exception.EntityAlreadyExistsException; import org.swarmcom.jsynapse.service.exception.EntityNotFoundException; import org.swarmcom.jsynapse.service.exception.InvalidRequestException; -import javax.inject.Inject; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - import static java.lang.String.format; -import static org.swarmcom.jsynapse.JSynapseServer.DOMAIN; +@RequiredArgsConstructor(onConstructor_ = {@Inject}) @Service @Validated public class RoomServiceImpl implements RoomService { private final RoomRepository roomRepository; private final RoomAliasService roomAliasService; - public RoomUtils utils; - - @Inject - public RoomServiceImpl(final RoomRepository repository, final RoomAliasService rAliasService, final RoomUtils utils) { - roomRepository = repository; - roomAliasService = rAliasService; - this.utils = utils; - } + private final RoomUtils utils; @Override public Room createRoom(@NotNull @Valid final Room room) { @@ -55,11 +47,7 @@ public Room createRoom(@NotNull @Valid final Room room) { if (!StringUtils.isEmpty(initialAlias)) { roomAliasService.createAlias(roomId, room.getAlias()); } - Room createdRoom = roomRepository.save(room); - if (null == createdRoom) { - throw new EntityAlreadyExistsException(format("Failed to create room %s", room.toString())); - } - return createdRoom; + return roomRepository.save(room); } @Override @@ -94,7 +82,7 @@ public Room findRoomById(String roomId) { @Override public Room saveTopic(String roomId, String topic) { if (null == topic) { - throw new InvalidRequestException(format("Topic to set is null")); + throw new InvalidRequestException("Topic to set is null"); } Room room = findRoomById(roomId); room.setTopic(topic); @@ -104,7 +92,7 @@ public Room saveTopic(String roomId, String topic) { @Override public Room saveName(String roomId, String name) { if (null == name) { - throw new InvalidRequestException(format("Name to set is null")); + throw new InvalidRequestException("Name to set is null"); } Room room = findRoomById(roomId); room.setName(name); diff --git a/src/main/java/org/swarmcom/jsynapse/service/room/RoomUtils.java b/src/main/java/org/swarmcom/jsynapse/service/room/RoomUtils.java index 71470c8..3717c6b 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/room/RoomUtils.java +++ b/src/main/java/org/swarmcom/jsynapse/service/room/RoomUtils.java @@ -17,16 +17,18 @@ package org.swarmcom.jsynapse.service.room; import org.apache.commons.lang3.RandomStringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import static java.lang.String.format; -import static org.swarmcom.jsynapse.JSynapseServer.DOMAIN; @Component public class RoomUtils { + @Value("${jsynapse.domain}") + private String domain; public String generateRoomId() { - return format("!%s:%s", RandomStringUtils.random(18, true, false), DOMAIN); + return format("!%s:%s", RandomStringUtils.secureStrong().next(18, true, false), domain); } } diff --git a/src/main/java/org/swarmcom/jsynapse/service/user/UserService.java b/src/main/java/org/swarmcom/jsynapse/service/user/UserService.java index 948c485..223cfb0 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/user/UserService.java +++ b/src/main/java/org/swarmcom/jsynapse/service/user/UserService.java @@ -16,16 +16,18 @@ */ package org.swarmcom.jsynapse.service.user; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; import org.swarmcom.jsynapse.domain.User; public interface UserService { - public User createUser(User user); + User createUser(@NotNull @Valid User user); - public User findUserById(String userId); + User findUserById(String userId); - public void saveDisplayName(String userId, String displayName, String accessToken); + void saveDisplayName(String userId, String displayName, String accessToken); - public void saveAvatarUrl(String userId, String avatarUrl, String accessToken); + void saveAvatarUrl(String userId, String avatarUrl, String accessToken); - public User findLoggedUserById(String userId, String accessToken); + User findLoggedUserById(String userId, String accessToken); } diff --git a/src/main/java/org/swarmcom/jsynapse/service/user/UserServiceImpl.java b/src/main/java/org/swarmcom/jsynapse/service/user/UserServiceImpl.java index 5270ba3..794b35b 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/user/UserServiceImpl.java +++ b/src/main/java/org/swarmcom/jsynapse/service/user/UserServiceImpl.java @@ -16,6 +16,9 @@ */ package org.swarmcom.jsynapse.service.user; +import jakarta.inject.Inject; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.swarmcom.jsynapse.dao.UserRepository; @@ -27,9 +30,7 @@ import org.swarmcom.jsynapse.service.exception.InvalidRequestException; import org.swarmcom.jsynapse.service.exception.TokenNotFoundException; -import javax.inject.Inject; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; + import java.util.Date; @@ -51,8 +52,7 @@ public User createUser(@NotNull @Valid final User user) { if (existingUser != null) { throw new EntityAlreadyExistsException("User already created"); } - User createdUser = repository.save(user); - return createdUser; + return repository.save(user); } @Override diff --git a/src/main/java/org/swarmcom/jsynapse/service/user/UserUtils.java b/src/main/java/org/swarmcom/jsynapse/service/user/UserUtils.java index 53d02cc..fefe73e 100644 --- a/src/main/java/org/swarmcom/jsynapse/service/user/UserUtils.java +++ b/src/main/java/org/swarmcom/jsynapse/service/user/UserUtils.java @@ -17,27 +17,30 @@ package org.swarmcom.jsynapse.service.user; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static org.swarmcom.jsynapse.JSynapseServer.DOMAIN; +import static org.apache.commons.lang3.RandomStringUtils.secureStrong; import static org.apache.commons.lang3.StringUtils.join; -import static org.apache.commons.lang3.RandomStringUtils.random; @Component public class UserUtils { + @Value("${jsynapse.domain}") + private String domain; + public String generateUserId(String userIdOrLocalPart) { - String userIdRegular = String.format("^@\\S*:%s$", StringUtils.replace(DOMAIN, ".", "\\.")); + String userIdRegular = String.format("^@\\S*:%s$", StringUtils.replace(domain, ".", "\\.")); Pattern p = Pattern.compile(userIdRegular); Matcher m = p.matcher(userIdOrLocalPart); - return m.matches() ? userIdOrLocalPart : join(new String[]{"@", userIdOrLocalPart,":", DOMAIN}); + return m.matches() ? userIdOrLocalPart : join("@", userIdOrLocalPart, ":", domain); } public String generateAccessToken() { - return random(16, true, false); + return secureStrong().next(16, true, false); } } diff --git a/src/main/java/org/swarmcom/jsynapse/validator/EnumValue.java b/src/main/java/org/swarmcom/jsynapse/validator/EnumValue.java index 73232ed..574d5f1 100644 --- a/src/main/java/org/swarmcom/jsynapse/validator/EnumValue.java +++ b/src/main/java/org/swarmcom/jsynapse/validator/EnumValue.java @@ -16,8 +16,9 @@ */ package org.swarmcom.jsynapse.validator; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + import java.lang.annotation.*; @Documented diff --git a/src/main/java/org/swarmcom/jsynapse/validator/EnumValueValidator.java b/src/main/java/org/swarmcom/jsynapse/validator/EnumValueValidator.java index f4a812e..4b5b71f 100644 --- a/src/main/java/org/swarmcom/jsynapse/validator/EnumValueValidator.java +++ b/src/main/java/org/swarmcom/jsynapse/validator/EnumValueValidator.java @@ -16,8 +16,8 @@ */ package org.swarmcom.jsynapse.validator; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; public class EnumValueValidator implements ConstraintValidator { private EnumValue annotation; diff --git a/src/main/resources/jsynapse.properties b/src/main/resources/jsynapse.properties new file mode 100644 index 0000000..b5dad94 --- /dev/null +++ b/src/main/resources/jsynapse.properties @@ -0,0 +1 @@ +jsynapse.domain=swarmcom.org \ No newline at end of file diff --git a/src/test/java/org/swarmcom/jsynapse/TestBase.java b/src/test/java/org/swarmcom/jsynapse/TestBase.java index f91d912..f60b2c3 100644 --- a/src/test/java/org/swarmcom/jsynapse/TestBase.java +++ b/src/test/java/org/swarmcom/jsynapse/TestBase.java @@ -16,20 +16,23 @@ */ package org.swarmcom.jsynapse; -import org.apache.commons.io.IOUtils; -import org.junit.After; -import org.junit.Before; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.Resource; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.http.HttpStatus; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.util.StreamUtils; import org.springframework.web.context.WebApplicationContext; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.utility.DockerImageName; import java.io.InputStream; @@ -40,11 +43,12 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup; -@RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = JSynapseServer.class) +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = JSynapseServer.class) @WebAppConfiguration @ActiveProfiles(profiles = "test") -public class TestBase { +public abstract class TestBase { + static MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.4.6")); @Autowired private WebApplicationContext wac; @@ -53,24 +57,31 @@ public class TestBase { @Autowired MongoTemplate mongoTemplate; - @Before + @BeforeAll + public static void startContainer() { + mongoDBContainer.start(); + System.setProperty("spring.data.mongodb.uri", mongoDBContainer.getReplicaSetUrl()); + } + + @BeforeEach public void setup() { this.mockMvc = webAppContextSetup(this.wac).build(); + mongoTemplate.getDb().drop(); } - @After - public void after() throws Exception { - mongoTemplate.getDb().dropDatabase(); + @AfterEach + public void after() { + mongoTemplate.getDb().drop(); } public void postAndCompareResult(String path, Resource req, Resource res) throws Exception { try (InputStream request = req.getInputStream()) { try (InputStream response = res.getInputStream()) { mockMvc.perform(post(path) - .contentType(APPLICATION_JSON).content(IOUtils.toString(request))) + .contentType(APPLICATION_JSON).content(StreamUtils.copyToString(request, java.nio.charset.StandardCharsets.UTF_8))) .andExpect(status().isOk()) .andExpect(content() - .string(deleteWhitespace(IOUtils.toString(response)))) + .string(deleteWhitespace(StreamUtils.copyToString(response, java.nio.charset.StandardCharsets.UTF_8)))) .andReturn(); } } @@ -79,7 +90,7 @@ public void postAndCompareResult(String path, Resource req, Resource res) throws public void postAndCheckStatus(String path, Resource req, HttpStatus status) throws Exception { try (InputStream request = req.getInputStream()) { mockMvc.perform(post(path) - .contentType(APPLICATION_JSON).content(IOUtils.toString(request))) + .contentType(APPLICATION_JSON).content(StreamUtils.copyToString(request, java.nio.charset.StandardCharsets.UTF_8))) .andExpect(status().is(status.value())) .andReturn(); } @@ -89,7 +100,7 @@ public void putAndCheckStatus(String path, Resource req, HttpStatus status) thro try (InputStream request = req.getInputStream()) { mockMvc.perform( put(path) - .contentType(APPLICATION_JSON).content(IOUtils.toString(request))) + .contentType(APPLICATION_JSON).content(StreamUtils.copyToString(request, java.nio.charset.StandardCharsets.UTF_8))) .andExpect(status().is(status.value())) .andReturn(); @@ -102,7 +113,7 @@ public void getAndCompareResult(String path, Resource req) throws Exception { get(path)) .andExpect(status().isOk()) .andExpect(content() - .string(deleteWhitespace(IOUtils.toString(response)))) + .string(deleteWhitespace(StreamUtils.copyToString(response, java.nio.charset.StandardCharsets.UTF_8)))) .andReturn(); } @@ -110,7 +121,7 @@ public void getAndCompareResult(String path, Resource req) throws Exception { public void deleteAndCheckStatus(String path, Resource req, HttpStatus status) throws Exception { try (InputStream request = req.getInputStream()) { - mockMvc.perform(delete(path).contentType(APPLICATION_JSON).content(IOUtils.toString(request))) + mockMvc.perform(delete(path).contentType(APPLICATION_JSON).content(StreamUtils.copyToString(request, java.nio.charset.StandardCharsets.UTF_8))) .andExpect(status().is(status.value())) .andReturn(); } diff --git a/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/AuthenticationRestApiTest.java b/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/AuthenticationRestApiTest.java index 91478f1..0d85040 100644 --- a/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/AuthenticationRestApiTest.java +++ b/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/AuthenticationRestApiTest.java @@ -16,22 +16,18 @@ */ package org.swarmcom.jsynapse.controller.client.api.v1; -import org.junit.Before; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.Resource; import org.springframework.http.HttpStatus; import org.swarmcom.jsynapse.TestBase; -import org.swarmcom.jsynapse.service.authentication.password.PasswordProvider; import org.swarmcom.jsynapse.service.user.UserUtils; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class AuthenticationRestApiTest extends TestBase { - @Autowired - private PasswordProvider provider; +class AuthenticationRestApiTest extends TestBase { @Value("classpath:auth/GetAuthSchemas.json") private Resource getLoginSchemas; @@ -43,40 +39,42 @@ public class AuthenticationRestApiTest extends TestBase { private Resource postLoginResponse; @Value("classpath:auth/PostMissingKeys.json") - private Resource postMisingKeys; + private Resource postMissingKeys; @Value("classpath:auth/PostUnknownSchema.json") private Resource postUnknownSchema; - @Before + @MockBean + UserUtils utils; + + @Override + @BeforeEach public void setup() { super.setup(); - UserUtils utils = mock(UserUtils.class); when(utils.generateUserId("user_id")).thenReturn("@user:swarmcom.org"); when(utils.generateAccessToken()).thenReturn("abcdef0123456789"); - provider.userUtils = utils; } @Test - public void testGetSchemas() throws Exception { + void testGetSchemas() throws Exception { getAndCompareResult("/_matrix/client/api/v1/login", getLoginSchemas); getAndCompareResult("/_matrix/client/api/v1/register", getLoginSchemas); } @Test - public void testUnknownSchema() throws Exception { + void testUnknownSchema() throws Exception { postAndCheckStatus("/_matrix/client/api/v1/login", postUnknownSchema, HttpStatus.BAD_REQUEST); postAndCheckStatus("/_matrix/client/api/v1/register", postUnknownSchema, HttpStatus.BAD_REQUEST); } @Test - public void testMissingKeys() throws Exception { - postAndCheckStatus("/_matrix/client/api/v1/register", postMisingKeys, HttpStatus.BAD_REQUEST); - postAndCheckStatus("/_matrix/client/api/v1/login", postMisingKeys, HttpStatus.BAD_REQUEST); + void testMissingKeys() throws Exception { + postAndCheckStatus("/_matrix/client/api/v1/register", postMissingKeys, HttpStatus.BAD_REQUEST); + postAndCheckStatus("/_matrix/client/api/v1/login", postMissingKeys, HttpStatus.BAD_REQUEST); } @Test - public void testRegisterAndLoginPassword() throws Exception { + void testRegisterAndLoginPassword() throws Exception { // login with user not registered postAndCheckStatus("/_matrix/client/api/v1/login", postLoginRequest, HttpStatus.NOT_FOUND); diff --git a/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/DirectoryRestApiTest.java b/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/DirectoryRestApiTest.java index 55f142c..7377b07 100644 --- a/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/DirectoryRestApiTest.java +++ b/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/DirectoryRestApiTest.java @@ -16,21 +16,18 @@ */ package org.swarmcom.jsynapse.controller.client.api.v1; -import org.junit.Before; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.Resource; import org.springframework.http.HttpStatus; import org.swarmcom.jsynapse.TestBase; -import org.swarmcom.jsynapse.service.room.RoomService; -import org.swarmcom.jsynapse.service.room.RoomServiceImpl; import org.swarmcom.jsynapse.service.room.RoomUtils; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class DirectoryRestApiTest extends TestBase { +class DirectoryRestApiTest extends TestBase { @Value("classpath:room/CreateRoom.json") private Resource createRoomJSON; @@ -44,19 +41,18 @@ public class DirectoryRestApiTest extends TestBase { @Value("classpath:directory/PutDeleteAlias.json") private Resource putDeleteAliasJSON; - @Autowired - RoomService roomService; + @MockBean + RoomUtils utils; - @Before + @Override + @BeforeEach public void setup() { super.setup(); - RoomUtils utils = mock(RoomUtils.class); when(utils.generateRoomId()).thenReturn("!IhCdHhojjFFBLrJKSn:swarmcom.org"); - ((RoomServiceImpl) roomService).utils = utils; } @Test - public void testRoomAlias() throws Exception { + void testRoomAlias() throws Exception { postAndCompareResult("/_matrix/client/api/v1/createRoom", createRoomJSON, createRoomResponseJSON); getAndCompareResult("/_matrix/client/api/v1/directory/room/alias", getAliasJSON); putAndCheckStatus("/_matrix/client/api/v1/directory/room/new_alias", putDeleteAliasJSON, HttpStatus.OK); diff --git a/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/MessageRestApiTest.java b/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/MessageRestApiTest.java index 7221dcd..928be33 100644 --- a/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/MessageRestApiTest.java +++ b/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/MessageRestApiTest.java @@ -17,24 +17,18 @@ package org.swarmcom.jsynapse.controller.client.api.v1; -import org.junit.Before; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.Resource; import org.springframework.http.HttpStatus; import org.swarmcom.jsynapse.TestBase; -import org.swarmcom.jsynapse.service.room.RoomService; -import org.swarmcom.jsynapse.service.room.RoomServiceImpl; import org.swarmcom.jsynapse.service.room.RoomUtils; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class MessageRestApiTest extends TestBase { - - @Autowired - RoomService roomService; +class MessageRestApiTest extends TestBase { @Value("classpath:room/CreateRoom.json") private Resource createRoomJSON; @@ -51,15 +45,18 @@ public class MessageRestApiTest extends TestBase { @Value("classpath:messages/GetMessage.json") private Resource getMessageJSON; - @Before + @MockBean + RoomUtils utils; + + @Override + @BeforeEach public void setup() { super.setup(); - RoomUtils utils = mock(RoomUtils.class); when(utils.generateRoomId()).thenReturn("!IhCdHhojjFFBLrJKSn:swarmcom.org"); - ((RoomServiceImpl) roomService).utils = utils; } + @Test - public void sendAndGetMessageTest() throws Exception { + void sendAndGetMessageTest() throws Exception { postAndCompareResult("/_matrix/client/api/v1/createRoom", createRoomJSON, createRoomResponseJSON); postAndCheckStatus("/_matrix/client/api/v1/rooms/!IhCdHhojjFFBLrJKSn:swarmcom.org/send/m.room.message", sendMessageJSON, HttpStatus.OK); postAndCheckStatus("/_matrix/client/api/v1/rooms/!IhCdHhojjFFBLrJKSn:swarmcom.org/send/m.room.message", sendMessage1JSON, HttpStatus.OK); diff --git a/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/RoomRestApiTest.java b/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/RoomRestApiTest.java index ded17fe..092a6bf 100644 --- a/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/RoomRestApiTest.java +++ b/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/RoomRestApiTest.java @@ -16,20 +16,18 @@ */ package org.swarmcom.jsynapse.controller.client.api.v1; -import org.junit.Before; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.Resource; import org.springframework.http.HttpStatus; import org.swarmcom.jsynapse.TestBase; -import org.swarmcom.jsynapse.service.room.RoomService; -import org.swarmcom.jsynapse.service.room.RoomServiceImpl; import org.swarmcom.jsynapse.service.room.RoomUtils; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.when; -public class RoomRestApiTest extends TestBase { +class RoomRestApiTest extends TestBase { @Value("classpath:room/CreateRoom.json") private Resource createRoomJSON; @@ -52,19 +50,18 @@ public class RoomRestApiTest extends TestBase { @Value("classpath:room/GetRoomAliases.json") private Resource getRoomAliasesJSON; - @Autowired - RoomService roomService; + @MockBean + RoomUtils utils; - @Before + @Override + @BeforeEach public void setup() { super.setup(); - RoomUtils utils = mock(RoomUtils.class); when(utils.generateRoomId()).thenReturn("!IhCdHhojjFFBLrJKSn:swarmcom.org"); - ((RoomServiceImpl) roomService).utils = utils; } @Test - public void testRoom() throws Exception { + void testRoom() throws Exception { postAndCompareResult("/_matrix/client/api/v1/createRoom", createRoomJSON, createRoomResponseJSON); putAndCheckStatus("/_matrix/client/api/v1/rooms/!IhCdHhojjFFBLrJKSn:swarmcom.org/state/m.room.topic", putTopicRoomJSON, HttpStatus.OK); diff --git a/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/UserRestApiTest.java b/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/UserRestApiTest.java index 00a9a89..109180e 100644 --- a/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/UserRestApiTest.java +++ b/src/test/java/org/swarmcom/jsynapse/controller/client/api/v1/UserRestApiTest.java @@ -17,22 +17,18 @@ package org.swarmcom.jsynapse.controller.client.api.v1; -import org.junit.Before; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.Resource; import org.springframework.http.HttpStatus; import org.swarmcom.jsynapse.TestBase; -import org.swarmcom.jsynapse.service.authentication.password.PasswordProvider; import org.swarmcom.jsynapse.service.user.UserUtils; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class UserRestApiTest extends TestBase { - @Autowired - private PasswordProvider provider; +class UserRestApiTest extends TestBase { @Value("classpath:user/PutDisplayName.json") private Resource putDisplayName; @@ -46,18 +42,20 @@ public class UserRestApiTest extends TestBase { @Value("classpath:auth/PostLoginResponse.json") private Resource postLoginResponse; - @Before + @MockBean + UserUtils utils; + + @Override + @BeforeEach public void setup() { super.setup(); - UserUtils utils = mock(UserUtils.class); when(utils.generateUserId("user_id")).thenReturn("@user:swarmcom.org"); when(utils.generateAccessToken()).thenReturn("abcdef0123456789"); - provider.userUtils = utils; } @Test - public void testUserProfile() throws Exception { - //try to set display name for non existing user + void testUserProfile() throws Exception { + //try to set display name for non-existing user putAndCheckStatus("/_matrix/client/api/v1/profile/@user:swarmcom.org/displayname?access_token=abcdef0123456789", putDisplayName, HttpStatus.FORBIDDEN); //try to set avatar for non existing user putAndCheckStatus("/_matrix/client/api/v1/profile/@user:swarmcom.org/avatar_url?access_token=abcdef0123456789", putAvatarUrl, HttpStatus.FORBIDDEN); diff --git a/src/test/java/org/swarmcom/jsynapse/service/message/MessageServiceTest.java b/src/test/java/org/swarmcom/jsynapse/service/message/MessageServiceTest.java index a7e027c..ff14a99 100644 --- a/src/test/java/org/swarmcom/jsynapse/service/message/MessageServiceTest.java +++ b/src/test/java/org/swarmcom/jsynapse/service/message/MessageServiceTest.java @@ -16,22 +16,21 @@ */ package org.swarmcom.jsynapse.service.message; -import org.junit.After; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.MongoTemplate; import org.swarmcom.jsynapse.TestBase; -import org.swarmcom.jsynapse.domain.Room; import org.swarmcom.jsynapse.domain.Message; +import org.swarmcom.jsynapse.domain.Room; import org.swarmcom.jsynapse.service.room.RoomService; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.swarmcom.jsynapse.domain.Message.MessageSummary; +import static org.swarmcom.jsynapse.domain.Message.MessageSummary.BODY; +import static org.swarmcom.jsynapse.domain.Message.MessageSummary.MSG_TYPE; import static org.swarmcom.jsynapse.domain.Message.Messages; -import static org.swarmcom.jsynapse.domain.Message.MessageSummary.*; -public class MessageServiceTest extends TestBase { +class MessageServiceTest extends TestBase { @Autowired MessageService messageService; @@ -39,7 +38,7 @@ public class MessageServiceTest extends TestBase { RoomService roomService; @Test - public void getRoomMessages() { + void getRoomMessages() { //create room Room room = new Room(); room.setName("My First Test Room"); diff --git a/src/test/java/org/swarmcom/jsynapse/service/room/RoomAliasServiceTest.java b/src/test/java/org/swarmcom/jsynapse/service/room/RoomAliasServiceTest.java index 99a8f33..0449b25 100644 --- a/src/test/java/org/swarmcom/jsynapse/service/room/RoomAliasServiceTest.java +++ b/src/test/java/org/swarmcom/jsynapse/service/room/RoomAliasServiceTest.java @@ -16,19 +16,21 @@ */ package org.swarmcom.jsynapse.service.room; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import org.swarmcom.jsynapse.TestBase; import org.swarmcom.jsynapse.domain.Room; import org.swarmcom.jsynapse.domain.RoomAlias; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import java.util.List; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.when; -public class RoomAliasServiceTest extends TestBase { +class RoomAliasServiceTest extends TestBase { @Autowired RoomServiceImpl roomService; @@ -40,19 +42,22 @@ public class RoomAliasServiceTest extends TestBase { @Autowired RoomAliasService roomAliasService; - @Before + @MockBean + RoomUtils utils; + + @Override + @BeforeEach public void setup() { super.setup(); - RoomUtils utils = mock(RoomUtils.class); + when(utils.generateRoomId()).thenReturn("abcdef0123456789:swarmcom.org"); - roomService.utils = utils; Room room = new Room(); room.setName("Test_room_with_alias"); room.setAlias("Room_alias"); room.setTopic("Room_topic_with_alias"); createdRoomWithAlias = roomService.createRoom(room); + when(utils.generateRoomId()).thenReturn("0123456789abcdef:swarmcom.org"); - roomService.utils = utils; room = new Room(); room.setName("Test_room_without_alias"); room.setTopic("Room_topic_without"); @@ -60,17 +65,17 @@ public void setup() { } @Test - public void createFindAlias() { + void createFindAlias() { RoomAlias alias = roomAliasService.createAlias("abcdef0123456789:swarmcom.org", "Room_alias_2"); assertEquals("Room_alias_2", alias.getAlias()); assertEquals("abcdef0123456789:swarmcom.org", alias.getRoomId()); assertEquals("swarmcom.org", alias.getServer()); RoomAlias.RoomAliases aliases = roomAliasService.findByRoomId("abcdef0123456789:swarmcom.org"); - assertEquals("[#Room_alias:swarmcom.org, #Room_alias_2:swarmcom.org]", aliases.getAliases()); + assertArrayEquals(List.of("#Room_alias:swarmcom.org", "#Room_alias_2:swarmcom.org").toArray(), aliases.getAliases().toArray()); } @Test - public void deleteAlias() { + void deleteAlias() { } } diff --git a/src/test/java/org/swarmcom/jsynapse/service/room/RoomServiceTest.java b/src/test/java/org/swarmcom/jsynapse/service/room/RoomServiceTest.java index ec28741..330b459 100644 --- a/src/test/java/org/swarmcom/jsynapse/service/room/RoomServiceTest.java +++ b/src/test/java/org/swarmcom/jsynapse/service/room/RoomServiceTest.java @@ -16,29 +16,30 @@ */ package org.swarmcom.jsynapse.service.room; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import org.swarmcom.jsynapse.TestBase; import org.swarmcom.jsynapse.domain.Room; -import org.swarmcom.jsynapse.domain.RoomAlias; import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class RoomServiceTest extends TestBase { +class RoomServiceTest extends TestBase { + @MockBean + RoomUtils utils; + @Autowired RoomServiceImpl roomService; Room createdRoom; - @Before + @Override + @BeforeEach public void setup() { super.setup(); - RoomUtils utils = mock(RoomUtils.class); when(utils.generateRoomId()).thenReturn("abcdef0123456789:swarmcom.org"); - roomService.utils = utils; Room room = new Room(); room.setName("Test room"); room.setAlias("Room alias"); @@ -47,38 +48,38 @@ public void setup() { } @Test - public void createRoom() { + void createRoom() { assertEquals("abcdef0123456789:swarmcom.org", createdRoom.getRoomId()); } @Test - public void findRoomByAlias() { + void findRoomByAlias() { Room foundRoom = roomService.findRoomByAlias("Room alias"); assertEquals("Room alias", foundRoom.getAlias()); } @Test - public void deleteAlias() { + void deleteAlias() { roomService.deleteAlias("abcdef0123456789:swarmcom.org", "Room alias"); Room room = roomService.findRoomById("abcdef0123456789:swarmcom.org"); assertEquals("", room.getAlias()); } @Test - public void findRoomById() { + void findRoomById() { Room room = roomService.findRoomById("abcdef0123456789:swarmcom.org"); assertEquals("abcdef0123456789:swarmcom.org", room.getRoomId()); } @Test - public void saveTopic() { + void saveTopic() { Room room = roomService.saveTopic("abcdef0123456789:swarmcom.org", "Room Topic"); assertEquals("Room Topic", room.getTopic()); } @Test - public void saveName() { + void saveName() { Room room = roomService.saveName("abcdef0123456789:swarmcom.org", "New Test room"); assertEquals("New Test room", room.getName()); } diff --git a/src/test/java/org/swarmcom/jsynapse/util/UserUtilsTest.java b/src/test/java/org/swarmcom/jsynapse/util/UserUtilsTest.java index 5593436..b948079 100644 --- a/src/test/java/org/swarmcom/jsynapse/util/UserUtilsTest.java +++ b/src/test/java/org/swarmcom/jsynapse/util/UserUtilsTest.java @@ -17,27 +17,27 @@ package org.swarmcom.jsynapse.util; import org.apache.commons.lang3.StringUtils; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.swarmcom.jsynapse.TestBase; import org.swarmcom.jsynapse.service.user.UserUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static org.swarmcom.jsynapse.JSynapseServer.DOMAIN; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; +import static org.junit.Assert.*; -public class UserUtilsTest extends TestBase { +class UserUtilsTest extends TestBase { + @Value("${jsynapse.domain}") + private String domain; @Autowired private UserUtils userUtils; @Test - public void userIdTest() { - String userIdRegular = String.format("^@\\S*:%s$", StringUtils.replace(DOMAIN, ".", "\\.")); + void userIdTest() { + String userIdRegular = String.format("^@\\S*:%s$", StringUtils.replace(domain, ".", "\\.")); Pattern p = Pattern.compile(userIdRegular); Matcher m = p.matcher("@john.doe:swarmcom.org"); assertTrue(m.matches()); @@ -56,7 +56,7 @@ public void userIdTest() { } @Test - public void generateUserIdTest() { + void generateUserIdTest() { //generate user id given localpart String userId = userUtils.generateUserId("john.doe"); assertEquals("@john.doe:swarmcom.org", userId); diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties index 8ecd204..847dd36 100644 --- a/src/test/resources/application-test.properties +++ b/src/test/resources/application-test.properties @@ -1,4 +1,4 @@ -spring.data.mongodb.uri=mongodb://localhost:27017/matrix_test +#spring.data.mongodb.uri=mongodb://localhost:27017/matrix_test server.port=4444 recaptcha.private.key= token.expire.seconds=120 \ No newline at end of file diff --git a/src/test/resources/auth/GetAuthSchemas.json b/src/test/resources/auth/GetAuthSchemas.json index 0f5c6e1..7215f4a 100644 --- a/src/test/resources/auth/GetAuthSchemas.json +++ b/src/test/resources/auth/GetAuthSchemas.json @@ -1,10 +1,10 @@ { "flows": [ { - "type": "m.login.recaptcha" + "type": "m.login.password" }, { - "type": "m.login.password" + "type": "m.login.recaptcha" } ] } \ No newline at end of file diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml new file mode 100644 index 0000000..5f47996 --- /dev/null +++ b/src/test/resources/logback-test.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file