diff --git a/assembly/assembly-ide-war/src/main/java/org/eclipse/che/DashboardRedirectionFilter.java b/assembly/assembly-ide-war/src/main/java/org/eclipse/che/DashboardRedirectionFilter.java index 7b854d8d20..cb7c302855 100644 --- a/assembly/assembly-ide-war/src/main/java/org/eclipse/che/DashboardRedirectionFilter.java +++ b/assembly/assembly-ide-war/src/main/java/org/eclipse/che/DashboardRedirectionFilter.java @@ -29,7 +29,7 @@ import java.util.regex.Pattern; */ public class DashboardRedirectionFilter implements Filter { - private static Pattern projectPattern = Pattern.compile("^/ide/[^/]+?/.+"); + private static Pattern projectPattern = Pattern.compile("^/[^/]+?/.+"); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { diff --git a/assembly/assembly-ide-war/src/main/webapp/IDE.jsp b/assembly/assembly-ide-war/src/main/webapp/IDE.jsp index e7c6c07adf..fad68840a5 100644 --- a/assembly/assembly-ide-war/src/main/webapp/IDE.jsp +++ b/assembly/assembly-ide-war/src/main/webapp/IDE.jsp @@ -16,7 +16,7 @@ Eclipse Che - + - - + + diff --git a/assembly/assembly-main/src/assembly/webapps/ROOT/META-INF/context.xml b/assembly/assembly-ide-war/src/main/webapp/META-INF/context.xml similarity index 100% rename from assembly/assembly-main/src/assembly/webapps/ROOT/META-INF/context.xml rename to assembly/assembly-ide-war/src/main/webapp/META-INF/context.xml diff --git a/assembly/assembly-main/src/assembly/webapps/ROOT/WEB-INF/rewrite.config b/assembly/assembly-ide-war/src/main/webapp/WEB-INF/rewrite.config similarity index 58% rename from assembly/assembly-main/src/assembly/webapps/ROOT/WEB-INF/rewrite.config rename to assembly/assembly-ide-war/src/main/webapp/WEB-INF/rewrite.config index 10652b1916..90fb3d1a25 100644 --- a/assembly/assembly-main/src/assembly/webapps/ROOT/WEB-INF/rewrite.config +++ b/assembly/assembly-ide-war/src/main/webapp/WEB-INF/rewrite.config @@ -1,3 +1,2 @@ RewriteRule ^/api/(.*)$ /wsmaster/api/$1 [L] -RewriteRule ^/$ /dashboard [R] diff --git a/assembly/assembly-ide-war/src/test/java/org/eclipse/che/DashboardRedirectionFilterTest.java b/assembly/assembly-ide-war/src/test/java/org/eclipse/che/DashboardRedirectionFilterTest.java index dea91df288..f114c15f10 100644 --- a/assembly/assembly-ide-war/src/test/java/org/eclipse/che/DashboardRedirectionFilterTest.java +++ b/assembly/assembly-ide-war/src/test/java/org/eclipse/che/DashboardRedirectionFilterTest.java @@ -54,8 +54,8 @@ public class DashboardRedirectionFilterTest { public void shouldSkipRequestToProject() throws Exception { //given when(request.getMethod()).thenReturn("GET"); - when(request.getRequestURI()).thenReturn("/ide/namespace/ws-id/project1"); - when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/ide/namespace/ws-id/project1")); + when(request.getRequestURI()).thenReturn("/namespace/ws-id/project1"); + when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/namespace/ws-id/project1")); EnvironmentContext context = new EnvironmentContext(); context.setWorkspaceId("ws-id"); EnvironmentContext.setCurrent(context); @@ -88,8 +88,8 @@ public class DashboardRedirectionFilterTest { @DataProvider(name = "nonNamespacePathProvider") public Object[][] nonProjectPathProvider() { - return new Object[][]{{"/ws-id/", "http://localhost:8080/ide/ws-id123123/"}, - {"/wsname", "http://localhost:8080/ide/wsname_only"}, + return new Object[][]{{"/ws-id/", "http://localhost:8080/ws-id123123/"}, + {"/wsname", "http://localhost:8080/wsname_only"}, }; } @@ -97,8 +97,8 @@ public class DashboardRedirectionFilterTest { public void shouldSkipNotGETRequest(String method) throws Exception { //given when(request.getMethod()).thenReturn(method); - when(request.getRequestURI()).thenReturn("/ide/ws-id/project1"); - when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/ide/ws-id/project1")); + when(request.getRequestURI()).thenReturn("/ws-id/project1"); + when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/ws-id/project1")); EnvironmentContext context = new EnvironmentContext(); context.setWorkspaceId("ws-id"); EnvironmentContext.setCurrent(context); diff --git a/assembly/assembly-main/src/assembly/assembly.xml b/assembly/assembly-main/src/assembly/assembly.xml index 6dd110f9ac..4de6bfd277 100644 --- a/assembly/assembly-main/src/assembly/assembly.xml +++ b/assembly/assembly-main/src/assembly/assembly.xml @@ -23,7 +23,7 @@ false false tomcat/webapps - ide.war + ROOT.war org.eclipse.che:assembly-ide-war diff --git a/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/codenvy/che.properties b/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/codenvy/che.properties index abeb18a6b6..e1d4b27305 100644 --- a/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/codenvy/che.properties +++ b/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/codenvy/che.properties @@ -27,10 +27,6 @@ che.machine.projects.internal.storage=/projects # Che stores various internal data objects as JSON on the file system. che.conf.storage=${che.home}/storage -# The dashboard uses this to manage direction of requests to the IDE -# Generally, do not modify. -che.ide.context=ide - ### Configuration of embedded templates and samples # Folder that contains JSON files with code templates and samples project.template_description.location_dir=${che.home}/templates diff --git a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/BrowserQueryFieldRenderer.java b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/BrowserQueryFieldRenderer.java index 71352bf197..5761abb2f0 100644 --- a/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/BrowserQueryFieldRenderer.java +++ b/ide/che-core-ide-app/src/main/java/org/eclipse/che/ide/context/BrowserQueryFieldRenderer.java @@ -29,10 +29,10 @@ import org.eclipse.che.ide.collections.Jso; @Singleton public class BrowserQueryFieldRenderer { - private static final int WORKSPACE_ORDER_IN_URL = 3; - private static final int NAMESPACE_ORDER_IN_URL = 2; + private static final int WORKSPACE_ORDER_IN_URL = 2; + private static final int NAMESPACE_ORDER_IN_URL = 1; //Used in the JSNI methods follow - private static final int AMOUNT_URL_PARTS = 5; + private static final int AMOUNT_URL_PARTS = 4; //Used in the JSNI methods follow private final ProductInfoDataProvider productInfoDataProvider; @@ -148,9 +148,9 @@ public class BrowserQueryFieldRenderer { var browserUrl = window.location.pathname; var urlParts = browserUrl.split('/'); - urlParts[2] = namespace; - urlParts[3] = workspaceName; - urlParts[4] = projectName; + urlParts[1] = namespace; + urlParts[2] = workspaceName; + urlParts[3] = projectName; var sliceIndex = @org.eclipse.che.ide.context.BrowserQueryFieldRenderer::AMOUNT_URL_PARTS; if (namespace == null || namespace.length == 0) { diff --git a/wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/UserManager.java b/wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/UserManager.java index 54cc273d65..6f1da2d75b 100644 --- a/wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/UserManager.java +++ b/wsmaster/che-core-api-user/src/main/java/org/eclipse/che/api/user/server/UserManager.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.che.api.user.server; +import com.google.common.collect.Sets; + import org.eclipse.che.api.core.ConflictException; import org.eclipse.che.api.core.NotFoundException; import org.eclipse.che.api.core.ServerException; @@ -22,9 +24,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; +import javax.inject.Named; import java.util.HashMap; import java.util.Map; +import java.util.Set; import static com.google.common.base.MoreObjects.firstNonNull; import static java.lang.String.format; @@ -45,15 +49,17 @@ public class UserManager { private final UserDao userDao; private final UserProfileDao profileDao; private final PreferenceDao preferenceDao; - + private final Set reservedNames; @Inject public UserManager(UserDao userDao, UserProfileDao profileDao, - PreferenceDao preferenceDao) { + PreferenceDao preferenceDao, + @Named("user.reserved_names") String[] reservedNames) { this.userDao = userDao; this.profileDao = profileDao; this.preferenceDao = preferenceDao; + this.reservedNames = Sets.newHashSet(reservedNames); } @@ -68,6 +74,9 @@ public class UserManager { * when any other error occurs */ public void create(User user, boolean isTemporary) throws ConflictException, ServerException { + if (reservedNames.contains(user.getName().toLowerCase())) { + throw new ConflictException(String.format("Username \"%s\" is reserved", user.getName())); + } user.withId(generate("user", ID_LENGTH)) .withPassword(firstNonNull(user.getPassword(), generate("", PASSWORD_LENGTH))); userDao.create(user); diff --git a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/UserManagerTest.java b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/UserManagerTest.java index 81262fbc1a..a6769e8880 100644 --- a/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/UserManagerTest.java +++ b/wsmaster/che-core-api-user/src/test/java/org/eclipse/che/api/user/server/UserManagerTest.java @@ -10,15 +10,15 @@ *******************************************************************************/ package org.eclipse.che.api.user.server; -import org.eclipse.che.api.core.BadRequestException; +import org.eclipse.che.api.core.ConflictException; import org.eclipse.che.api.user.server.dao.PreferenceDao; import org.eclipse.che.api.user.server.dao.Profile; import org.eclipse.che.api.user.server.dao.User; import org.eclipse.che.api.user.server.dao.UserDao; import org.eclipse.che.api.user.server.dao.UserProfileDao; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.testng.MockitoTestNGListener; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Listeners; import org.testng.annotations.Test; @@ -26,7 +26,6 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyMapOf; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; /** @@ -45,12 +44,17 @@ public class UserManagerTest { @Mock PreferenceDao preferenceDao; - @InjectMocks UserManager manager; + @BeforeMethod + public void setUp() { + manager = new UserManager(userDao, profileDao, preferenceDao, new String[0]); + } + @Test public void shouldCreateProfileAndPreferencesOnUserCreation() throws Exception { final User user = new User().withEmail("test@email.com").withName("testName"); + manager.create(user, false); verify(profileDao).create(any(Profile.class)); @@ -60,8 +64,16 @@ public class UserManagerTest { @Test public void shouldGeneratedPasswordWhenCreatingUserAndItIsMissing() throws Exception { final User user = new User().withEmail("test@email.com").withName("testName"); + manager.create(user, false); verify(userDao).create(eq(user.withPassword(""))); } + + @Test(expectedExceptions = ConflictException.class) + public void shouldThrowConflictExceptionOnCreationIfUserNameIsReserved() throws Exception { + final User user = new User().withEmail("test@email.com").withName("reserved"); + + new UserManager(userDao, profileDao, preferenceDao, new String[] {"reserved"}).create(user, false); + } } diff --git a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceServiceLinksInjector.java b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceServiceLinksInjector.java index 4b66774f0a..f14175235f 100644 --- a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceServiceLinksInjector.java +++ b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/WorkspaceServiceLinksInjector.java @@ -62,13 +62,10 @@ public class WorkspaceServiceLinksInjector { //TODO: we need keep IDE context in some property to have possibility configure it because context is different in Che and Hosted packaging //TODO: not good solution do it here but critical for this task https://jira.codenvycorp.com/browse/IDEX-3619 - private final String ideContext; private final MachineServiceLinksInjector machineLinksInjector; @Inject - public WorkspaceServiceLinksInjector(@Named("che.ide.context") String ideContext, - MachineServiceLinksInjector machineLinksInjector) { - this.ideContext = ideContext; + public WorkspaceServiceLinksInjector(MachineServiceLinksInjector machineLinksInjector) { this.machineLinksInjector = machineLinksInjector; } @@ -113,7 +110,7 @@ public class WorkspaceServiceLinksInjector { //TODO here we add url to IDE with workspace name not good solution do it here but critical for this task https://jira.codenvycorp.com/browse/IDEX-3619 final URI ideUri = uriBuilder.clone() - .replacePath(ideContext) + .replacePath("") .path(workspace.getNamespace()) .path(workspace.getConfig().getName()) .build(); diff --git a/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/WorkspaceServiceTest.java b/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/WorkspaceServiceTest.java index c499e07476..6001e5ab15 100644 --- a/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/WorkspaceServiceTest.java +++ b/wsmaster/che-core-api-workspace/src/test/java/org/eclipse/che/api/workspace/server/WorkspaceServiceTest.java @@ -112,7 +112,6 @@ public class WorkspaceServiceTest { private static final ApiExceptionMapper MAPPER = new ApiExceptionMapper(); private static final String NAMESPACE = "user"; private static final String USER_ID = "user123"; - private static final String IDE_CONTEXT = "ws"; @SuppressWarnings("unused") private static final EnvironmentFilter FILTER = new EnvironmentFilter(); @@ -130,7 +129,7 @@ public class WorkspaceServiceTest { service = new WorkspaceService(wsManager, machineManager, validator, - new WorkspaceServiceLinksInjector(IDE_CONTEXT, new MachineServiceLinksInjector())); + new WorkspaceServiceLinksInjector(new MachineServiceLinksInjector())); } @Test