From 500ee347f3559b5264f4e825bbf7b37adc9ac283 Mon Sep 17 00:00:00 2001 From: Fabrizzio Araya <37148755+fabrizzio-dotCMS@users.noreply.github.com> Date: Fri, 23 Aug 2024 16:26:57 -0600 Subject: [PATCH 1/6] fix(FlakeyTest) Refs:#28136 (#29710) ### Proposed Changes * We're going to try a more robust test using Awaitility --- .../java/com/dotcms/api/ContentTypeAPIIT.java | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/tools/dotcms-cli/api-data-model/src/test/java/com/dotcms/api/ContentTypeAPIIT.java b/tools/dotcms-cli/api-data-model/src/test/java/com/dotcms/api/ContentTypeAPIIT.java index f48655c19cf7..f954386bab3d 100644 --- a/tools/dotcms-cli/api-data-model/src/test/java/com/dotcms/api/ContentTypeAPIIT.java +++ b/tools/dotcms-cli/api-data-model/src/test/java/com/dotcms/api/ContentTypeAPIIT.java @@ -1,5 +1,7 @@ package com.dotcms.api; +import static org.testcontainers.shaded.org.awaitility.Awaitility.await; + import com.dotcms.DotCMSITProfile; import com.dotcms.api.client.model.RestClientFactory; import com.dotcms.api.client.model.ServiceManager; @@ -34,6 +36,7 @@ import io.quarkus.test.junit.TestProfile; import jakarta.inject.Inject; import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.WebApplicationException; import java.io.IOException; import java.net.URL; import java.util.Date; @@ -41,6 +44,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.concurrent.TimeUnit; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -237,35 +241,34 @@ void Test_Create_Then_Update_Then_Delete_Content_Type() { ContentType newContentType = contentTypes.get(0); Assertions.assertNotNull(newContentType.id()); Assertions.assertEquals("_var_"+identifier, newContentType.variable()); - //We make sure the CT exists because the following line does not throw 404 + + // We make sure the CT exists because the following line does not throw 404 client.getContentType(newContentType.variable(), 1L, true); - //Now lets test update + + // Now lets test update final ImmutableSimpleContentType updatedContentType = ImmutableSimpleContentType.builder().from(newContentType).description("Updated").build(); final SaveContentTypeRequest request = SaveContentTypeRequest.builder(). from(updatedContentType).build(); final ResponseEntityView responseEntityView = client.updateContentType( request.variable(), request); Assertions.assertEquals("Updated", responseEntityView.entity().description()); - //And finally test delete + + // And finally test delete final ResponseEntityView responseStringEntity = client.delete(updatedContentType.variable()); Assertions.assertTrue(responseStringEntity.entity().contains("deleted")); - try { - //a small wait to make sure the CT is deleted - //a simple Thread.sleep would do the trick but Sonar says it's not a good practice - int count = 0; - while (null != client.getContentType(updatedContentType.variable(), 1L, true)){ - //We wait for the CT to be deleted - System.out.println("Waiting for CT to be deleted"); - count++; - if(count > 10){ - Assertions.fail("CT was not deleted"); - } + // Use Awaitility to wait until the ContentType is actually deleted + await().atMost(20, TimeUnit.SECONDS).until(() -> { + try { + client.getContentType(updatedContentType.variable(), 1L, true); + return false; // If this succeeds, the ContentType still exists + } catch (WebApplicationException e) { + if (e.getResponse().getStatus() == 404) { + return true; // ContentType was successfully deleted + } + throw e; // Rethrow any unexpected exceptions } - //This should throw 404 but under certain circumstances it does throw 400 - }catch(jakarta.ws.rs.WebApplicationException e){ - // Not relevant here - } + }); } /** From 473a80643f5e59a206fef450146ce57b696c3fd2 Mon Sep 17 00:00:00 2001 From: waqasakramdot <102758033+waqasakramdot@users.noreply.github.com> Date: Sat, 24 Aug 2024 04:37:18 +0500 Subject: [PATCH 2/6] Removed the hack code from SecureLinkTool for old browsers (#29734) close #26514 ### Proposed Changes * Removed SecureLinkTool code that was used for older browsers --- .../apache/velocity/tools/struts/SecureLinkTool.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/dotCMS/src/main/java/org/apache/velocity/tools/struts/SecureLinkTool.java b/dotCMS/src/main/java/org/apache/velocity/tools/struts/SecureLinkTool.java index 8c1bd3788d4b..38927b46aecb 100644 --- a/dotCMS/src/main/java/org/apache/velocity/tools/struts/SecureLinkTool.java +++ b/dotCMS/src/main/java/org/apache/velocity/tools/struts/SecureLinkTool.java @@ -144,18 +144,6 @@ public String computeURL(HttpServletRequest request, !desiredPort.equals(usingPort)) { url.insert(0, startNewUrlString(request, desiredScheme, desiredPort)); - - // This is a hack to help us overcome the problem that some - // older browsers do not share sessions between http & https - // If this feature is diabled, session ID could still be added - // the previous call to the RequestUtils.computeURL() method, - // but only if needed due to cookies disabled, etc. - if (securePlugin.getSslExtAddSession() && url.toString().indexOf(";jsessionid=") < 0) - { - // Add the session identifier - url = new StringBuilder(toEncoded(url.toString(), - request.getSession().getId())); - } } } } From 65e440c65381f7f0eef0ce3798aa881963d74a68 Mon Sep 17 00:00:00 2001 From: Neehakethi-dotcms <139247809+Neehakethi@users.noreply.github.com> Date: Fri, 23 Aug 2024 18:38:44 -0500 Subject: [PATCH 3/6] issue-29238 Modification to fix files attachement (#29721) - The feature to attach files in the workflow task is malfunctioning. Files are getting updated but are unreachable when clicked on. - Fix https://github.com/user-attachments/assets/04ac9ed0-5477-4e00-9e5d-e9428b258256 Co-authored-by: Neeha2383 --- .../html/portlet/ext/workflows/view_workflow_task.jsp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/dotCMS/src/main/webapp/html/portlet/ext/workflows/view_workflow_task.jsp b/dotCMS/src/main/webapp/html/portlet/ext/workflows/view_workflow_task.jsp index 92857299d137..2db293fd148b 100644 --- a/dotCMS/src/main/webapp/html/portlet/ext/workflows/view_workflow_task.jsp +++ b/dotCMS/src/main/webapp/html/portlet/ext/workflows/view_workflow_task.jsp @@ -406,13 +406,11 @@ public String getGravatar(String postedBy){ x++; %> > - -   + + <%= file.getFileName() %> + - <%= file.getFileName() %> - - - + From 1c414a16e2702bdef4af83c11d0ff5e4528ddac1 Mon Sep 17 00:00:00 2001 From: spbolton Date: Sat, 24 Aug 2024 01:36:53 +0100 Subject: [PATCH 4/6] fix: revert session manager jar location change from PR #29694 (#23631) (#29746) ### Proposed Changes * Fix classloader issue with session manager introduced in PR #29694 * Use CATALINA_HOME in setenv scripts instead of TOMCAT_HOME. The first is always available, the second is only set within the docker startup scripts Instructions for Log4j require the classes to be added to the system classloader when tomcat loads by adding to the main java CLASSPATH. These logging jars do not need to reference any of the tomcat jars the session manager jars do need to reference the tomcat jars e.g. catalina.jar in the main lib folder. This is what is called the common.loader and is defined in catalina.properties file. the session manager jars either need to be in a folder referenced in this common.loader property or as before dropped into the existing lib folder. There is no need to change the old behaviour at this time so we can just change the install location back. --- dotCMS/pom.xml | 2 +- dotCMS/src/main/resources/container/tomcat9/bin/setenv.bat | 6 +++--- dotCMS/src/main/resources/container/tomcat9/bin/setenv.sh | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dotCMS/pom.xml b/dotCMS/pom.xml index f7fa0c97edfd..bc5557037e7f 100644 --- a/dotCMS/pom.xml +++ b/dotCMS/pom.xml @@ -26,7 +26,7 @@ dotserver/tomcat-${tomcat.version} ${assembly-directory}/${tomcat-dist-folder}/lib ${assembly-directory}/${tomcat-dist-folder}/log4j2/lib - ${assembly-directory}/${tomcat-dist-folder}/session-manager/lib + ${tomcat-lib-folder} ${project.basedir}/src/main/resources/container/tomcat9 ${assembly-directory}/${tomcat-dist-folder}/webapps/ROOT ${project.build.directory}/${project.build.finalName}-war.war diff --git a/dotCMS/src/main/resources/container/tomcat9/bin/setenv.bat b/dotCMS/src/main/resources/container/tomcat9/bin/setenv.bat index 907b1ad54e3d..3eb097ec102f 100644 --- a/dotCMS/src/main/resources/container/tomcat9/bin/setenv.bat +++ b/dotCMS/src/main/resources/container/tomcat9/bin/setenv.bat @@ -33,8 +33,8 @@ set "CATALINA_OPTS=%CATALINA_OPTS% -Dorg.apache.tomcat.util.digester.PROPERTY_SO rem Check if log4j2.configurationFile is already set echo %CATALINA_OPTS% | findstr /C:"-Dlog4j2.configurationFile" >nul if %errorlevel% neq 0 ( - echo Setting log4j2.configurationFile=%TOMCAT_HOME%\webapps\ROOT\WEB-INF\log4j\log4j2.xml - set "CATALINA_OPTS=%CATALINA_OPTS% -Dlog4j2.configurationFile=%TOMCAT_HOME%\webapps\ROOT\WEB-INF\log4j\log4j2.xml" + echo Setting log4j2.configurationFile=%CATALINA_HOME%\webapps\ROOT\WEB-INF\log4j\log4j2.xml + set "CATALINA_OPTS=%CATALINA_OPTS% -Dlog4j2.configurationFile=%CATALINA_HOME%\webapps\ROOT\WEB-INF\log4j\log4j2.xml" ) else ( echo Log4j configuration already set ) @@ -49,7 +49,7 @@ if %errorlevel% neq 0 ( ) rem Set the CLASSPATH -set "ADDITIONAL_CLASSPATH=%CATALINA_HOME%\log4j2\lib\*;%CATALINA_HOME%\session-manager\lib\*" +set "ADDITIONAL_CLASSPATH=%CATALINA_HOME%\log4j2\lib\*" if "%CLASSPATH%" neq "" ( set "CLASSPATH=%CLASSPATH%;%ADDITIONAL_CLASSPATH%" ) else ( diff --git a/dotCMS/src/main/resources/container/tomcat9/bin/setenv.sh b/dotCMS/src/main/resources/container/tomcat9/bin/setenv.sh index 1d6d02d4ad80..08cdacb27f73 100644 --- a/dotCMS/src/main/resources/container/tomcat9/bin/setenv.sh +++ b/dotCMS/src/main/resources/container/tomcat9/bin/setenv.sh @@ -34,8 +34,8 @@ export CATALINA_OPTS="$CATALINA_OPTS -Dorg.apache.tomcat.util.digester.PROPERTY_ if echo "$CATALINA_OPTS" | grep -q '\-Dlog4j2\.configurationFile'; then echo "Log4j configuration already set" else - echo "Setting log4j2.configurationFile=$TOMCAT_HOME/webapps/ROOT/WEB-INF/log4j/log4j2.xml" - export CATALINA_OPTS="$CATALINA_OPTS -Dlog4j2.configurationFile=$TOMCAT_HOME/webapps/ROOT/WEB-INF/log4j/log4j2.xml" + echo "Setting log4j2.configurationFile=$CATALINA_HOME/webapps/ROOT/WEB-INF/log4j/log4j2.xml" + export CATALINA_OPTS="$CATALINA_OPTS -Dlog4j2.configurationFile=$CATALINA_HOME/webapps/ROOT/WEB-INF/log4j/log4j2.xml" fi if echo "$CATALINA_OPTS" | grep -q '\-DLog4jContextSelector'; then @@ -45,7 +45,7 @@ else export CATALINA_OPTS="$CATALINA_OPTS -DLog4jContextSelector=org.apache.logging.log4j.core.async.BasicAsyncLoggerContextSelector" fi -ADDITIONAL_CLASSPATH="$CATALINA_HOME/log4j2/lib/*:$CATALINA_HOME/session-manager/lib/*" +ADDITIONAL_CLASSPATH="$CATALINA_HOME/log4j2/lib/*" if [ -n "$CLASSPATH" ]; then CLASSPATH="$CLASSPATH:$ADDITIONAL_CLASSPATH" From a56e0196f4a60577f12105a80140afdf17c4a7c3 Mon Sep 17 00:00:00 2001 From: Valentino Giardino <77643678+valentinogiardino@users.noreply.github.com> Date: Sat, 24 Aug 2024 11:41:19 -0300 Subject: [PATCH 5/6] [Logging] Fix Null Pointer Exception (NPE) in Shorty Servlet #29165 (#29725) ### Proposed Changes * Ensure that the `Contentlet` retrieved from `contentletApi` is not null before attempting to access its properties. This change aims to prevent potential `NullPointerException` #### Additional Info This PR fixes #29165 QA report. The exception is not related to UVE or vanity URLs. The issue was reproducible with the `20240807` starter, which lacks vanity URLs pointing to the pages where the exception occurs. Specifically, the problem arises in the `ShortyServlet` when it tries to retrieve the `inodePath` of an image. It fails because some images in the starter have a `null` `liveInode`, while the method assumes the presence of a live version, leading to the failure. #### Steps to Reproduce the current NPE 1. Start a new dotCMS instance using the `20240807` starter. 2. Open an incognito tab. 3. Navigate to `/` or `/index`. 4. Inspect the dotCMS logs to observe the null pointer exception. ### Screenshots Original | Updated :-------------------------:|:-------------------------: image|image --- .../java/com/dotmarketing/servlets/ShortyServlet.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/dotCMS/src/main/java/com/dotmarketing/servlets/ShortyServlet.java b/dotCMS/src/main/java/com/dotmarketing/servlets/ShortyServlet.java index d84a0bf6d0cf..f17548d4534a 100644 --- a/dotCMS/src/main/java/com/dotmarketing/servlets/ShortyServlet.java +++ b/dotCMS/src/main/java/com/dotmarketing/servlets/ShortyServlet.java @@ -2,6 +2,7 @@ import com.dotcms.variant.business.web.VariantWebAPI.RenderContext; import java.io.IOException; +import java.util.Objects; import java.util.Optional; import java.util.StringTokenizer; import java.util.regex.Matcher; @@ -521,9 +522,11 @@ protected final String inodePath(final Contentlet contentlet, final String inode = live ? contentletVersionInfo.get().getLiveInode() : contentletVersionInfo.get().getWorkingInode(); - final Contentlet imageContentlet = APILocator.getContentletAPI() + final Contentlet imageContentlet = APILocator.getContentletAPI() .find(inode, APILocator.systemUser(), false); + validateContentlet(imageContentlet, live, inode); + final String fieldVar = imageContentlet.isDotAsset() ? DotAssetContentType.ASSET_FIELD_VAR : FILE_ASSET_DEFAULT; @@ -536,6 +539,12 @@ protected final String inodePath(final Contentlet contentlet, .append(StringPool.FORWARD_SLASH).append(field.variable()).toString(); } + private void validateContentlet(final Contentlet contentlet, final boolean live, final String inode) throws DotDataException { + if (Objects.isNull(contentlet)) { + final String versionType = live ? PageMode.LIVE.name() : PageMode.WORKING.name(); + throw new DotDataException(String.format("No contentlet found for %s inode %s", versionType, inode)); + } + } protected final Optional resolveField(final Contentlet contentlet, final String tryField) { From 36f72e40607262775449de9a8d8dc5168b2e666e Mon Sep 17 00:00:00 2001 From: Gavriella Date: Sat, 24 Aug 2024 08:54:03 -0600 Subject: [PATCH 6/6] issue-29616-authentication-endpoint-documentation (#29617) ### Proposed Changes * `v1/authentication` endpoint documentation * `v1/authentication/api-token` documentation * `v1/authentication/logInUser` documentation ### Checklist - [ ] Tests - [ ] Translations - [ ] Security Implications Contemplated (add notes if applicable) ### Additional Info ** any additional useful context or info ** ### Screenshots Original | Updated :-------------------------:|:-------------------------: ** original screenshot ** | ** updated screenshot ** --- .../AuthenticationResource.java | 63 ++++++++++++++++++- .../CreateJsonWebTokenResource.java | 13 ++++ .../ResponseEntityUserMapView.java | 9 +++ .../ResponseEntityUserView.java | 9 +++ 4 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/ResponseEntityUserMapView.java create mode 100644 dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/ResponseEntityUserView.java diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/AuthenticationResource.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/AuthenticationResource.java index 35b6b1c59a7f..2a25bc99df80 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/AuthenticationResource.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/AuthenticationResource.java @@ -26,6 +26,16 @@ import com.liferay.portal.model.User; import com.liferay.portal.util.WebKeys; import com.liferay.util.LocaleUtil; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.ExternalDocumentation; import java.io.Serializable; import java.util.Date; import java.util.List; @@ -34,6 +44,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -52,8 +63,15 @@ * @version 3.7 * @since Jul 7, 2016 */ + + @SuppressWarnings("serial") @Path("/v1/authentication") +@Tag(name = "Authentication", + description = "Endpoints that perform operations related to user authentication", + externalDocs = @ExternalDocumentation(description = "Additional Authentication API information", + url = "https://www.dotcms.com/docs/latest/rest-api-authentication")) + public class AuthenticationResource implements Serializable { static final String USER = "user"; @@ -90,8 +108,37 @@ protected AuthenticationResource(final LoginServiceAPI loginService, @JSONP @NoCache @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) - public final Response authentication(@Context final HttpServletRequest request, + @Consumes({MediaType.APPLICATION_JSON}) + @Operation(operationId = "postAuthentication", + summary = "Verifies user or application authentication", + description = "Takes a user's login ID and password and checks them against the user rolls.\n\n" + + "If the user is found and authenticated, a session is created.\n\n" + + "Otherwise the system will return an 'authentication failed' message.\n\n", + tags = {"Authentication"}, + responses = { + @ApiResponse(responseCode = "200", description = "User authentication successful", + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = ResponseEntityUserMapView.class))), + @ApiResponse(responseCode = "401", description = "User not authenticated"), + @ApiResponse(responseCode = "403", description = "Forbidden request"), + @ApiResponse(responseCode = "500", description = "Unexpected error") + } + ) + public final Response authentication( + @Context final HttpServletRequest request, @Context final HttpServletResponse response, + @RequestBody(description = "This method takes a user's credentials and language preferences to authenticate them.\n\n" + + "Requires a POST body consisting of a JSON object containing the following properties:\n\n" + + "| **Property** | **Value** | **Description** |\n" + + "|--------------|-----------|-----------------------------------------------|\n" + + "| `userId` | String | **Required.** ID of user attempting to log in |\n" + + "| `password` | String | User password |\n" + + "| `language` | String | Preferred language for user |\n" + + "| `country` | String | Country where user is located |\n", + required = true, + content = @Content( + schema = @Schema(implementation = AuthenticationForm.class) + )) final AuthenticationForm authenticationForm) { Response res = null; @@ -168,6 +215,20 @@ public final Response authentication(@Context final HttpServletRequest request, @JSONP @NoCache @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) + @Operation(operationId = "getLogInUser", + summary = "Retrieves user data", + description = "Provides information about any users that are currently in a session.\n\n" + + "This retrieved data will be formatted into a JSON response body.\n\n", + tags = {"Authentication"}, + responses = { + @ApiResponse(responseCode = "200", description = "User data successfully collected", + content = @Content( + schema = @Schema(implementation = ResponseEntityUserView.class) + )), + @ApiResponse(responseCode = "400", description = "Bad request"), + @ApiResponse(responseCode = "401", description = "Unauthorized request"), + @ApiResponse(responseCode = "404", description = "User not found") + }) @Path("logInUser") public final Response getLoginUser(@Context final HttpServletRequest request){ Response res = null; diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/CreateJsonWebTokenResource.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/CreateJsonWebTokenResource.java index 29b67bc1cb94..bc07561ac923 100644 --- a/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/CreateJsonWebTokenResource.java +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/CreateJsonWebTokenResource.java @@ -32,6 +32,17 @@ import com.liferay.portal.model.User; import com.liferay.portal.util.PortalUtil; import com.liferay.util.LocaleUtil; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.ExternalDocumentation; import org.elasticsearch.common.collect.Map; import org.glassfish.jersey.server.JSONP; @@ -98,6 +109,8 @@ protected CreateJsonWebTokenResource(final LoginServiceAPI loginService, @JSONP @NoCache @Produces({MediaType.APPLICATION_JSON, "application/javascript"}) + @Deprecated + @Hidden //not shown in API playground public final Response getApiToken(@Context final HttpServletRequest request, @Context final HttpServletResponse response, final CreateTokenForm createTokenForm) { diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/ResponseEntityUserMapView.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/ResponseEntityUserMapView.java new file mode 100644 index 000000000000..296f8c8e00e3 --- /dev/null +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/ResponseEntityUserMapView.java @@ -0,0 +1,9 @@ +package com.dotcms.rest.api.v1.authentication; + +import com.dotcms.rest.ResponseEntityView; + +public class ResponseEntityUserMapView extends ResponseEntityView { + public ResponseEntityUserMapView(AuthenticationForm entity) { + super(entity); + } +} diff --git a/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/ResponseEntityUserView.java b/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/ResponseEntityUserView.java new file mode 100644 index 000000000000..bf967536a7b3 --- /dev/null +++ b/dotCMS/src/main/java/com/dotcms/rest/api/v1/authentication/ResponseEntityUserView.java @@ -0,0 +1,9 @@ +package com.dotcms.rest.api.v1.authentication; + +import com.dotcms.rest.ResponseEntityView; + +public class ResponseEntityUserView extends ResponseEntityView { + public ResponseEntityUserView(AuthenticationForm entity) { + super(entity); + } +}