diff --git a/scm-core/src/main/java/sonia/scm/web/filter/PermissionFilter.java b/scm-core/src/main/java/sonia/scm/web/filter/PermissionFilter.java index 181c743232..a584c821e5 100644 --- a/scm-core/src/main/java/sonia/scm/web/filter/PermissionFilter.java +++ b/scm-core/src/main/java/sonia/scm/web/filter/PermissionFilter.java @@ -35,6 +35,7 @@ package sonia.scm.web.filter; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.Splitter; import com.google.inject.Provider; import org.slf4j.Logger; @@ -49,12 +50,15 @@ import sonia.scm.security.ScmSecurityException; import sonia.scm.user.User; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; +import sonia.scm.util.Util; import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ import java.io.IOException; +import java.util.Iterator; + import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -172,6 +176,17 @@ public abstract class PermissionFilter extends HttpFilter response.sendError(HttpServletResponse.SC_NOT_FOUND); } } + catch (IllegalStateException ex) + { + if (logger.isWarnEnabled()) + { + logger.warn( + "wrong request at ".concat(request.getRequestURI()).concat( + " send redirect"), ex); + } + + response.sendRedirect(getRepositoryRootHelpUrl(request)); + } catch (ScmSecurityException ex) { if (logger.isWarnEnabled()) @@ -193,6 +208,29 @@ public abstract class PermissionFilter extends HttpFilter } } + /** + * Method description + * + * + * @param request + * + * @return + */ + private String extractType(HttpServletRequest request) + { + Iterator it = Splitter.on( + HttpUtil.SEPARATOR_PATH).omitEmptyStrings().split( + request.getRequestURI()).iterator(); + String type = it.next(); + + if (Util.isNotEmpty(request.getContextPath())) + { + type = it.next(); + } + + return type; + } + /** * Method description * @@ -217,6 +255,25 @@ public abstract class PermissionFilter extends HttpFilter //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @param request + * + * @return + */ + private String getRepositoryRootHelpUrl(HttpServletRequest request) + { + String type = extractType(request); + String helpUrl = HttpUtil.getCompleteUrl(request, + "/api/rest/help/repository-root/"); + + helpUrl = helpUrl.concat(type).concat(".html"); + + return helpUrl; + } + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java b/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java index e1b233f5ab..6d9abe73b1 100644 --- a/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java +++ b/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java @@ -35,8 +35,14 @@ package sonia.scm.web.filter; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.Throwables; import com.google.inject.Provider; +import com.google.inject.ProvisionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.config.ScmConfiguration; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider; import sonia.scm.web.security.WebSecurityContext; @@ -44,7 +50,6 @@ import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ import javax.servlet.http.HttpServletRequest; -import sonia.scm.config.ScmConfiguration; /** * @@ -54,10 +59,20 @@ import sonia.scm.config.ScmConfiguration; public abstract class ProviderPermissionFilter extends PermissionFilter { + /** + * the logger for ProviderPermissionFilter + */ + private static final Logger logger = + LoggerFactory.getLogger(ProviderPermissionFilter.class); + + //~--- constructors --------------------------------------------------------- + /** * Constructs ... * * + * + * @param configuration * @param securityContextProvider * @param repositoryProvider */ @@ -83,7 +98,24 @@ public abstract class ProviderPermissionFilter extends PermissionFilter @Override protected Repository getRepository(HttpServletRequest request) { - return repositoryProvider.get(); + Repository repository = null; + + try + { + repository = repositoryProvider.get(); + } + catch (ProvisionException ex) + { + Throwables.propagateIfInstanceOf(ex.getCause(), + IllegalStateException.class); + + if (logger.isErrorEnabled()) + { + logger.error("could not get repository from request", ex); + } + } + + return repository; } //~--- fields ---------------------------------------------------------------